From 78e26258833f6dec94f2dc57746c14fb19d05119 Mon Sep 17 00:00:00 2001 From: ramvignesh-b Date: Sat, 18 Apr 2026 04:39:18 +0530 Subject: [PATCH] refactor: handle exception on vault unlock date check for validation --- ...tter_notified_at_alter_letter_unlock_at.py | 22 +++++++++++++++++++ backend/letters/serializers.py | 15 ++++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 backend/letters/migrations/0009_alter_letter_notified_at_alter_letter_unlock_at.py diff --git a/backend/letters/migrations/0009_alter_letter_notified_at_alter_letter_unlock_at.py b/backend/letters/migrations/0009_alter_letter_notified_at_alter_letter_unlock_at.py new file mode 100644 index 0000000..b3e2ee3 --- /dev/null +++ b/backend/letters/migrations/0009_alter_letter_notified_at_alter_letter_unlock_at.py @@ -0,0 +1,22 @@ +# Generated by Django 6.0.4 on 2026-04-17 18:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("letters", "0008_letter_notified_at"), + ] + + operations = [ + migrations.AlterField( + model_name="letter", + name="notified_at", + field=models.DateTimeField(blank=True, db_index=True, null=True), + ), + migrations.AlterField( + model_name="letter", + name="unlock_at", + field=models.DateTimeField(blank=True, db_index=True, null=True), + ), + ] diff --git a/backend/letters/serializers.py b/backend/letters/serializers.py index 455c805..aad04c1 100644 --- a/backend/letters/serializers.py +++ b/backend/letters/serializers.py @@ -39,11 +39,14 @@ class LetterSerializer(serializers.ModelSerializer): def to_representation(self, instance): fields = super().to_representation(instance) if fields["type"] == Letter.Type.VAULT and fields["status"] == Letter.Status.SEALED: - unlock_datetime = datetime.fromisoformat(fields["unlock_at"]).replace(tzinfo=UTC) - if unlock_datetime - datetime.now(tz=UTC) > timedelta(seconds=0): - fields["encrypted_content"] = None - fields["images"] = None - fields["encrypted_dek"] = None + try: + unlock_datetime = datetime.fromisoformat(fields["unlock_at"]).replace(tzinfo=UTC) + if unlock_datetime - datetime.now(tz=UTC) > timedelta(seconds=0): + fields["encrypted_content"] = None + fields["images"] = None + fields["encrypted_dek"] = None + except (ValueError, TypeError): + pass return fields def validate(self, data): @@ -54,4 +57,6 @@ class LetterSerializer(serializers.ModelSerializer): raise serializers.ValidationError( "encrypted_dek is required when encrypted_content and encrypted_metadata are present" ) + if data.get("type") == Letter.Type.VAULT and not data.get("unlock_at"): + raise serializers.ValidationError("unlock_at is required for vault letters") return data