app.memos.serializers

  1from drf_spectacular.utils import extend_schema_serializer, OpenApiExample
  2from rest_framework import serializers
  3from .models import Memo, MemoEvents, MemoSnapshot
  4from accounts.models import Role, Hospital
  5from django.shortcuts import get_object_or_404
  6
  7@extend_schema_serializer(
  8    examples=[
  9        OpenApiExample(
 10            'Memo Snapshot Example',
 11            value={
 12                "memoId": "123e4567-e89b-12d3-a456-426614174000",
 13                "created_at": "2025-09-20T12:34:56Z",
 14                "latest_snapshot": {"title": "Test Memo", "status": "pending"}
 15            }
 16        )
 17    ]
 18)
 19class MemoSerializer(serializers.ModelSerializer):
 20    """
 21    Serializer for listing memo snapshots with basic info.
 22
 23    Fields:
 24        - memoId: UUID of the memo.
 25        - created_at: Timestamp when the memo was created.
 26        - latest_snapshot: JSON field with latest snapshot info.
 27    """
 28    memoId = serializers.CharField(source='memo.memoId', read_only=True)
 29    latest_snapshot = serializers.JSONField(source='info', read_only=True)
 30    created_at = serializers.DateTimeField(source='memo.created_at', read_only=True)
 31    class Meta:
 32        model = MemoSnapshot
 33        fields = ['memoId','created_at','latest_snapshot']
 34
 35@extend_schema_serializer(
 36    examples=[
 37        OpenApiExample(
 38            'Create Memo Example',
 39            value={
 40                "hospital": 1,
 41                "uuid": "123e4567-e89b-12d3-a456-426614174000",
 42                "payload": {"title": "Test Memo", "description": "Details"},
 43                "metadata": {"priority": "high"}
 44            }
 45        )
 46    ]
 47)
 48class MemoCreateSerializer(serializers.Serializer):
 49    """
 50    Serializer for creating and deleting memos.
 51
 52    Fields:
 53        - hospital: Hospital ID.
 54        - uuid: Memo UUID.
 55        - payload: JSON field with memo details.
 56        - metadata: JSON field with additional metadata.
 57
 58    Methods:
 59        - create(): Creates a Memo and logs a 'created' event.
 60        - delete(): Soft-deletes a Memo and logs a 'deleted' event.
 61    """
 62    hospital = serializers.PrimaryKeyRelatedField(queryset=Hospital.objects.all())
 63    uuid = serializers.CharField()
 64    payload = serializers.JSONField()
 65    metadata = serializers.JSONField()
 66    
 67    def create(self, validated_data):
 68        """Create a Memo instance and log a 'created' event."""
 69        request = self.context["request"]
 70        instance = Memo.objects.create(
 71            hospital=validated_data["hospital"],
 72            memoId=validated_data["uuid"],
 73        )
 74        # log event
 75        MemoEvents.objects.create(
 76            memo=instance,
 77            event_type="created",
 78            event_by=request.user,
 79            metadata=validated_data["metadata"],
 80            payload=validated_data["payload"],
 81        )
 82        return instance
 83
 84    def delete(self, validated_data):
 85        """Soft-delete a Memo and log a 'deleted' event."""
 86        request = self.context["request"]
 87        obj = get_object_or_404(
 88            Memo,
 89            hospital=validated_data["hospital"],
 90            memoId=validated_data["uuid"],
 91        )
 92        obj.is_deleted = True
 93        obj.save()
 94        MemoEvents.objects.create(
 95            memo=obj,
 96            event_type="deleted",
 97            event_by=request.user,
 98            metadata=validated_data["metadata"],
 99        )
100        return obj
101
102@extend_schema_serializer(
103    examples=[
104        OpenApiExample(
105            'Memo Snapshot Example',
106            value={
107                "id": 1,
108                "memo": 1,
109                "attendee_otp": "123456",
110                "completion_otp": "654321",
111                "created_at": "2025-09-20T12:34:56Z",
112                # ...other fields...
113            }
114        )
115    ]
116)
117class MemoSnapshotSerializer(serializers.ModelSerializer):
118    """
119    Serializer for memo snapshot details including OTPs.
120
121    Fields:
122        - attendee_otp: OTP for attendee verification.
123        - completion_otp: OTP for completion verification.
124        - created_at: Timestamp when the memo was created.
125        - All other fields from MemoSnapshot model.
126    """
127    attendee_otp = serializers.CharField(read_only=True)
128    completion_otp = serializers.CharField(read_only=True)
129    created_at = serializers.CharField(source='memo.created_at',read_only=True)
130    class Meta:
131        model = MemoSnapshot
132        fields = '__all__'
133
134from .models import AttendeeETA
135
136@extend_schema_serializer(
137    examples=[
138        OpenApiExample(
139            'Attendee ETA Example',
140            value={
141                "id": 1,
142                "memo": 1,
143                "attendee": 2,
144                "attendee_name": "John Doe",
145                "eta": "2025-09-20T13:00:00Z",
146                "created_at": "2025-09-20T12:00:00Z",
147                "updated_at": "2025-09-20T12:30:00Z",
148                "updated_count": 1
149            }
150        )
151    ]
152)
153class AttendeeETASerializer(serializers.ModelSerializer):
154    """
155    Serializer for attendee ETA records.
156
157    Fields:
158        - attendee: User ID of the attendee.
159        - attendee_name: Username of the attendee.
160        - eta: Estimated time of arrival.
161        - created_at: Timestamp when ETA was created.
162        - updated_at: Timestamp when ETA was last updated.
163        - updated_count: Number of times ETA was updated.
164    """
165    attendee = serializers.PrimaryKeyRelatedField(read_only=True)
166    attendee_name = serializers.CharField(source='attendee.username', read_only=True)
167    eta = serializers.DateTimeField()
168    class Meta:
169        model = AttendeeETA
170        fields = ['id', 'memo', 'attendee', 'attendee_name', 'eta', 'created_at', 'updated_at', 'updated_count']
171
172@extend_schema_serializer(
173    examples=[
174        OpenApiExample(
175            'Memo Event Example',
176            value={
177                "id": 1,
178                "memo": 1,
179                "event_type": "created",
180                "event_by": 1,
181                "metadata": {"key": "value"},
182                "payload": {"title": "Test Memo", "description": "Details"},
183                "created_at": "2025-09-20T12:34:56Z"
184            }
185        )
186    ]
187)
188class MemoEventsSerializer(serializers.ModelSerializer):
189    """
190    Serializer for memo event logs.
191
192    Fields:
193        - All fields from MemoEvents model.
194    """
195    class Meta:
196        model = MemoEvents
197        fields = '__all__'
@extend_schema_serializer(examples=[OpenApiExample('Memo Snapshot Example', value={'memoId': '123e4567-e89b-12d3-a456-426614174000', 'created_at': '2025-09-20T12:34:56Z', 'latest_snapshot': {'title': 'Test Memo', 'status': 'pending'}})])
class MemoSerializer(rest_framework.serializers.ModelSerializer):
 8@extend_schema_serializer(
 9    examples=[
10        OpenApiExample(
11            'Memo Snapshot Example',
12            value={
13                "memoId": "123e4567-e89b-12d3-a456-426614174000",
14                "created_at": "2025-09-20T12:34:56Z",
15                "latest_snapshot": {"title": "Test Memo", "status": "pending"}
16            }
17        )
18    ]
19)
20class MemoSerializer(serializers.ModelSerializer):
21    """
22    Serializer for listing memo snapshots with basic info.
23
24    Fields:
25        - memoId: UUID of the memo.
26        - created_at: Timestamp when the memo was created.
27        - latest_snapshot: JSON field with latest snapshot info.
28    """
29    memoId = serializers.CharField(source='memo.memoId', read_only=True)
30    latest_snapshot = serializers.JSONField(source='info', read_only=True)
31    created_at = serializers.DateTimeField(source='memo.created_at', read_only=True)
32    class Meta:
33        model = MemoSnapshot
34        fields = ['memoId','created_at','latest_snapshot']

Serializer for listing memo snapshots with basic info.

Fields: - memoId: UUID of the memo. - created_at: Timestamp when the memo was created. - latest_snapshot: JSON field with latest snapshot info.

memoId
latest_snapshot
created_at
class MemoSerializer.Meta:
32    class Meta:
33        model = MemoSnapshot
34        fields = ['memoId','created_at','latest_snapshot']
model = <class 'app.memos.models.MemoSnapshot'>
fields = ['memoId', 'created_at', 'latest_snapshot']
@extend_schema_serializer(examples=[OpenApiExample('Create Memo Example', value={'hospital': 1, 'uuid': '123e4567-e89b-12d3-a456-426614174000', 'payload': {'title': 'Test Memo', 'description': 'Details'}, 'metadata': {'priority': 'high'}})])
class MemoCreateSerializer(rest_framework.serializers.Serializer):
 36@extend_schema_serializer(
 37    examples=[
 38        OpenApiExample(
 39            'Create Memo Example',
 40            value={
 41                "hospital": 1,
 42                "uuid": "123e4567-e89b-12d3-a456-426614174000",
 43                "payload": {"title": "Test Memo", "description": "Details"},
 44                "metadata": {"priority": "high"}
 45            }
 46        )
 47    ]
 48)
 49class MemoCreateSerializer(serializers.Serializer):
 50    """
 51    Serializer for creating and deleting memos.
 52
 53    Fields:
 54        - hospital: Hospital ID.
 55        - uuid: Memo UUID.
 56        - payload: JSON field with memo details.
 57        - metadata: JSON field with additional metadata.
 58
 59    Methods:
 60        - create(): Creates a Memo and logs a 'created' event.
 61        - delete(): Soft-deletes a Memo and logs a 'deleted' event.
 62    """
 63    hospital = serializers.PrimaryKeyRelatedField(queryset=Hospital.objects.all())
 64    uuid = serializers.CharField()
 65    payload = serializers.JSONField()
 66    metadata = serializers.JSONField()
 67    
 68    def create(self, validated_data):
 69        """Create a Memo instance and log a 'created' event."""
 70        request = self.context["request"]
 71        instance = Memo.objects.create(
 72            hospital=validated_data["hospital"],
 73            memoId=validated_data["uuid"],
 74        )
 75        # log event
 76        MemoEvents.objects.create(
 77            memo=instance,
 78            event_type="created",
 79            event_by=request.user,
 80            metadata=validated_data["metadata"],
 81            payload=validated_data["payload"],
 82        )
 83        return instance
 84
 85    def delete(self, validated_data):
 86        """Soft-delete a Memo and log a 'deleted' event."""
 87        request = self.context["request"]
 88        obj = get_object_or_404(
 89            Memo,
 90            hospital=validated_data["hospital"],
 91            memoId=validated_data["uuid"],
 92        )
 93        obj.is_deleted = True
 94        obj.save()
 95        MemoEvents.objects.create(
 96            memo=obj,
 97            event_type="deleted",
 98            event_by=request.user,
 99            metadata=validated_data["metadata"],
100        )
101        return obj

Serializer for creating and deleting memos.

Fields: - hospital: Hospital ID. - uuid: Memo UUID. - payload: JSON field with memo details. - metadata: JSON field with additional metadata.

Methods: - create(): Creates a Memo and logs a 'created' event. - delete(): Soft-deletes a Memo and logs a 'deleted' event.

hospital
uuid
payload
metadata
def create(self, validated_data):
68    def create(self, validated_data):
69        """Create a Memo instance and log a 'created' event."""
70        request = self.context["request"]
71        instance = Memo.objects.create(
72            hospital=validated_data["hospital"],
73            memoId=validated_data["uuid"],
74        )
75        # log event
76        MemoEvents.objects.create(
77            memo=instance,
78            event_type="created",
79            event_by=request.user,
80            metadata=validated_data["metadata"],
81            payload=validated_data["payload"],
82        )
83        return instance

Create a Memo instance and log a 'created' event.

def delete(self, validated_data):
 85    def delete(self, validated_data):
 86        """Soft-delete a Memo and log a 'deleted' event."""
 87        request = self.context["request"]
 88        obj = get_object_or_404(
 89            Memo,
 90            hospital=validated_data["hospital"],
 91            memoId=validated_data["uuid"],
 92        )
 93        obj.is_deleted = True
 94        obj.save()
 95        MemoEvents.objects.create(
 96            memo=obj,
 97            event_type="deleted",
 98            event_by=request.user,
 99            metadata=validated_data["metadata"],
100        )
101        return obj

Soft-delete a Memo and log a 'deleted' event.

@extend_schema_serializer(examples=[OpenApiExample('Memo Snapshot Example', value={'id': 1, 'memo': 1, 'attendee_otp': '123456', 'completion_otp': '654321', 'created_at': '2025-09-20T12:34:56Z'})])
class MemoSnapshotSerializer(rest_framework.serializers.ModelSerializer):
103@extend_schema_serializer(
104    examples=[
105        OpenApiExample(
106            'Memo Snapshot Example',
107            value={
108                "id": 1,
109                "memo": 1,
110                "attendee_otp": "123456",
111                "completion_otp": "654321",
112                "created_at": "2025-09-20T12:34:56Z",
113                # ...other fields...
114            }
115        )
116    ]
117)
118class MemoSnapshotSerializer(serializers.ModelSerializer):
119    """
120    Serializer for memo snapshot details including OTPs.
121
122    Fields:
123        - attendee_otp: OTP for attendee verification.
124        - completion_otp: OTP for completion verification.
125        - created_at: Timestamp when the memo was created.
126        - All other fields from MemoSnapshot model.
127    """
128    attendee_otp = serializers.CharField(read_only=True)
129    completion_otp = serializers.CharField(read_only=True)
130    created_at = serializers.CharField(source='memo.created_at',read_only=True)
131    class Meta:
132        model = MemoSnapshot
133        fields = '__all__'

Serializer for memo snapshot details including OTPs.

Fields: - attendee_otp: OTP for attendee verification. - completion_otp: OTP for completion verification. - created_at: Timestamp when the memo was created. - All other fields from MemoSnapshot model.

attendee_otp
completion_otp
created_at
class MemoSnapshotSerializer.Meta:
131    class Meta:
132        model = MemoSnapshot
133        fields = '__all__'
model = <class 'app.memos.models.MemoSnapshot'>
fields = '__all__'
@extend_schema_serializer(examples=[OpenApiExample('Attendee ETA Example', value={'id': 1, 'memo': 1, 'attendee': 2, 'attendee_name': 'John Doe', 'eta': '2025-09-20T13:00:00Z', 'created_at': '2025-09-20T12:00:00Z', 'updated_at': '2025-09-20T12:30:00Z', 'updated_count': 1})])
class AttendeeETASerializer(rest_framework.serializers.ModelSerializer):
137@extend_schema_serializer(
138    examples=[
139        OpenApiExample(
140            'Attendee ETA Example',
141            value={
142                "id": 1,
143                "memo": 1,
144                "attendee": 2,
145                "attendee_name": "John Doe",
146                "eta": "2025-09-20T13:00:00Z",
147                "created_at": "2025-09-20T12:00:00Z",
148                "updated_at": "2025-09-20T12:30:00Z",
149                "updated_count": 1
150            }
151        )
152    ]
153)
154class AttendeeETASerializer(serializers.ModelSerializer):
155    """
156    Serializer for attendee ETA records.
157
158    Fields:
159        - attendee: User ID of the attendee.
160        - attendee_name: Username of the attendee.
161        - eta: Estimated time of arrival.
162        - created_at: Timestamp when ETA was created.
163        - updated_at: Timestamp when ETA was last updated.
164        - updated_count: Number of times ETA was updated.
165    """
166    attendee = serializers.PrimaryKeyRelatedField(read_only=True)
167    attendee_name = serializers.CharField(source='attendee.username', read_only=True)
168    eta = serializers.DateTimeField()
169    class Meta:
170        model = AttendeeETA
171        fields = ['id', 'memo', 'attendee', 'attendee_name', 'eta', 'created_at', 'updated_at', 'updated_count']

Serializer for attendee ETA records.

Fields: - attendee: User ID of the attendee. - attendee_name: Username of the attendee. - eta: Estimated time of arrival. - created_at: Timestamp when ETA was created. - updated_at: Timestamp when ETA was last updated. - updated_count: Number of times ETA was updated.

attendee
attendee_name
eta
class AttendeeETASerializer.Meta:
169    class Meta:
170        model = AttendeeETA
171        fields = ['id', 'memo', 'attendee', 'attendee_name', 'eta', 'created_at', 'updated_at', 'updated_count']
model = <class 'app.memos.models.AttendeeETA'>
fields = ['id', 'memo', 'attendee', 'attendee_name', 'eta', 'created_at', 'updated_at', 'updated_count']
@extend_schema_serializer(examples=[OpenApiExample('Memo Event Example', value={'id': 1, 'memo': 1, 'event_type': 'created', 'event_by': 1, 'metadata': {'key': 'value'}, 'payload': {'title': 'Test Memo', 'description': 'Details'}, 'created_at': '2025-09-20T12:34:56Z'})])
class MemoEventsSerializer(rest_framework.serializers.ModelSerializer):
173@extend_schema_serializer(
174    examples=[
175        OpenApiExample(
176            'Memo Event Example',
177            value={
178                "id": 1,
179                "memo": 1,
180                "event_type": "created",
181                "event_by": 1,
182                "metadata": {"key": "value"},
183                "payload": {"title": "Test Memo", "description": "Details"},
184                "created_at": "2025-09-20T12:34:56Z"
185            }
186        )
187    ]
188)
189class MemoEventsSerializer(serializers.ModelSerializer):
190    """
191    Serializer for memo event logs.
192
193    Fields:
194        - All fields from MemoEvents model.
195    """
196    class Meta:
197        model = MemoEvents
198        fields = '__all__'

Serializer for memo event logs.

Fields: - All fields from MemoEvents model.

class MemoEventsSerializer.Meta:
196    class Meta:
197        model = MemoEvents
198        fields = '__all__'
model = <class 'app.memos.models.MemoEvents'>
fields = '__all__'