mirror of
https://github.com/ramvignesh-b/pi-ku.git
synced 2026-05-04 08:56:52 +00:00
feat: update letter patch to check for type change to sent and auto set time
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import uuid
|
import uuid
|
||||||
|
from datetime import UTC, datetime
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
@@ -39,6 +40,16 @@ class Letter(models.Model):
|
|||||||
if self.type == Letter.Type.VAULT and self.status == Letter.Status.SEALED and not self.unlock_at:
|
if self.type == Letter.Type.VAULT and self.status == Letter.Status.SEALED and not self.unlock_at:
|
||||||
raise ValidationError("A sealed VAULT letter must have an unlock_date.")
|
raise ValidationError("A sealed VAULT letter must have an unlock_date.")
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Override save method to auto set BURNED and SEALED timestamps.
|
||||||
|
"""
|
||||||
|
if self.status == Letter.Status.BURNED:
|
||||||
|
self.burned_at = datetime.now(UTC)
|
||||||
|
if self.status == Letter.Status.SEALED:
|
||||||
|
self.sealed_at = datetime.now(UTC)
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.type} - {self.status}"
|
return f"{self.type} - {self.status}"
|
||||||
|
|
||||||
|
|||||||
@@ -270,15 +270,43 @@ class LetterAPITest(APITestCase):
|
|||||||
"encrypted_dek": "enc_dek_new==",
|
"encrypted_dek": "enc_dek_new==",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
response_burn = self.client.patch(self.url + letter.public_id + "/", {"status": "BURNED"})
|
|
||||||
|
|
||||||
self.assertEqual(response_update_content.status_code, 400)
|
self.assertEqual(response_update_content.status_code, 400)
|
||||||
self.assertEqual(response_update_content.data["error"], "Sealed letters can only be burned.")
|
self.assertEqual(response_update_content.data["error"], "Sealed letters can only be burned or sent.")
|
||||||
self.assertEqual(Letter.objects.get().encrypted_content, "enc_content==")
|
self.assertEqual(Letter.objects.get().encrypted_content, "enc_content==")
|
||||||
|
|
||||||
|
from datetime import UTC, datetime
|
||||||
|
|
||||||
|
from freezegun import freeze_time
|
||||||
|
|
||||||
|
current_time = datetime.now(UTC)
|
||||||
|
with freeze_time(current_time):
|
||||||
|
response_burn = self.client.patch(self.url + letter.public_id + "/", {"status": "BURNED"})
|
||||||
|
|
||||||
self.assertEqual(response_burn.status_code, 200)
|
self.assertEqual(response_burn.status_code, 200)
|
||||||
self.assertEqual(Letter.objects.count(), 1)
|
self.assertEqual(Letter.objects.count(), 1)
|
||||||
self.assertEqual(Letter.objects.get().status, "BURNED")
|
self.assertEqual(Letter.objects.get().status, "BURNED")
|
||||||
|
self.assertEqual(Letter.objects.get().burned_at, current_time)
|
||||||
|
|
||||||
|
def test_send_sealed_letter(self):
|
||||||
|
"""
|
||||||
|
Test that a sealed letter can be sent.
|
||||||
|
"""
|
||||||
|
letter = Letter.objects.create(
|
||||||
|
user=self.user,
|
||||||
|
type="KEPT",
|
||||||
|
status="SEALED",
|
||||||
|
public_id="4281edcc-5459-4ff2-bb5e-669fb44e0757",
|
||||||
|
encrypted_content="enc_content==",
|
||||||
|
encrypted_metadata="enc_meta==",
|
||||||
|
encrypted_dek="enc_dek==",
|
||||||
|
)
|
||||||
|
|
||||||
|
response_sent = self.client.patch(self.url + letter.public_id + "/", {"type": "SENT"})
|
||||||
|
|
||||||
|
self.assertEqual(response_sent.status_code, 200)
|
||||||
|
self.assertEqual(Letter.objects.count(), 1)
|
||||||
|
self.assertEqual(Letter.objects.get().type, "SENT")
|
||||||
|
|
||||||
|
|
||||||
class LetterImageModelTest(TestCase):
|
class LetterImageModelTest(TestCase):
|
||||||
|
|||||||
@@ -66,13 +66,17 @@ class LetterDetailView(generics.RetrieveUpdateDestroyAPIView):
|
|||||||
def patch(self, request, public_id):
|
def patch(self, request, public_id):
|
||||||
"""
|
"""
|
||||||
Updates an existing letter.
|
Updates an existing letter.
|
||||||
|
Can update type and status only when sealed, sent and burned.
|
||||||
"""
|
"""
|
||||||
letter = Letter.objects.get(public_id=public_id, user=request.user)
|
letter = Letter.objects.get(public_id=public_id, user=request.user)
|
||||||
|
|
||||||
if letter.status == Letter.Status.SEALED and (
|
if letter.status == Letter.Status.SEALED:
|
||||||
len(request.data) > 1 or request.data.get("status") != Letter.Status.BURNED
|
if (
|
||||||
|
len(request.data) > 1
|
||||||
|
or (request.data.get("status") != Letter.Status.BURNED and request.data.get("status") is not None)
|
||||||
|
or (request.data.get("type") != Letter.Type.SENT and request.data.get("type") is not None)
|
||||||
):
|
):
|
||||||
return Response({"error": "Sealed letters can only be burned."}, status=400)
|
return Response({"error": "Sealed letters can only be burned or sent."}, status=400)
|
||||||
|
|
||||||
write_serializer = self.get_serializer(letter, data=request.data, partial=True)
|
write_serializer = self.get_serializer(letter, data=request.data, partial=True)
|
||||||
write_serializer.is_valid(raise_exception=True)
|
write_serializer.is_valid(raise_exception=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user