Skip to content

Commit 922c737

Browse files
committed
Not allowing to modify certain fields
1 parent 253b23a commit 922c737

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

tigaserver_app/serializers.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.contrib.auth.models import User
77
from tigaserver_app.questions_table import data as the_translation_key
88
from django.urls import reverse
9+
from django.db import models
910

1011
def score_label(score):
1112
if score > 66:
@@ -226,7 +227,25 @@ def update(self, instance, validated_data):
226227
# Adding _history_user
227228
validated_data['_history_user'] = validated_data.get('user')
228229

230+
# Do not updates on the following fields:
231+
# - fields marked as non editable
232+
# - fields Auto generated
233+
# - FKs
234+
# - PKs
235+
non_editable_fields = [
236+
field.name for field in Report._meta.get_fields() if (
237+
not field.editable
238+
or isinstance(field, models.AutoField)
239+
or isinstance(field, models.ForeignKey)
240+
or field.primary_key
241+
)
242+
]
243+
229244
responses_data = validated_data.pop('responses')
245+
for field in non_editable_fields:
246+
if field in validated_data:
247+
del validated_data[field]
248+
230249
instance = super().update(instance=instance, validated_data=validated_data)
231250

232251
# Updating responses

tigaserver_app/views.py

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,10 @@ def post_photo(request):
189189
* report: The version_UUID of the report to which this photo is attached.
190190
"""
191191
if request.method == 'POST':
192-
this_report = Report.objects.get(version_UUID=request.data['report'])
192+
try:
193+
this_report = Report.objects.get(version_UUID=request.data['report'])
194+
except Report.DoesNotExist:
195+
return Response()
193196
instance = Photo(photo=request.FILES['photo'], report=this_report)
194197
instance.save()
195198
return Response('uploaded')
@@ -316,24 +319,20 @@ def create(self, request, *args, **kwargs):
316319
# May raise a permission denied
317320
self.check_object_permissions(self.request, instance)
318321

319-
result_headers = None
320-
result_status = None
321-
result_data = None
322+
# NOTE: Always return 201
323+
# See: https://github.com/Mosquito-Alert/Mosquito-Alert-Mobile-App/blob/6c5993a230a86f958c8dca8bcfef2994a6b93ebe/lib/api/api.dart#L381
324+
result_status = status.HTTP_201_CREATED
322325
if version_number >= 0:
323326
serializer = self.get_serializer(instance, data=request.data)
324327
serializer.is_valid(raise_exception=True)
325328
serializer.save()
326329

327-
result_data = serializer.data
328-
329-
if version_number == 0:
330-
result_status = status.HTTP_201_CREATED
331-
result_headers = self.get_success_headers(serializer.data)
332-
333330
if version_number == -1:
334331
instance.soft_delete()
332+
serializer = self.get_serializer(instance)
335333

336-
result_status = status.HTTP_204_NO_CONTENT
334+
result_data = serializer.data
335+
result_headers = self.get_success_headers(serializer.data)
337336

338337
return Response(data=result_data, status=result_status, headers=result_headers)
339338

@@ -343,6 +342,25 @@ class PhotoViewSet(ReadWriteOnlyModelViewSet):
343342
queryset = Photo.objects.all()
344343
serializer_class = PhotoSerializer
345344

345+
def create(self, request, *args, **kwargs):
346+
response = super().create(request=request, *args, **kwargs)
347+
348+
# Always return 200
349+
# See: https://github.com/Mosquito-Alert/Mosquito-Alert-Mobile-App/blob/6c5993a230a86f958c8dca8bcfef2994a6b93ebe/lib/api/api.dart#L508
350+
response.status = status.HTTP_200_OK
351+
return response
352+
353+
def perform_create(self, serializer):
354+
# Restrict image saving to the initial report creation only.
355+
# Although the mobile app generates a new version_UUID for each
356+
# report update or deletion, the reports are versioned, and
357+
# only the original UUID is preserved. If the provided UUID is not
358+
# found, indicating an update/deletion, image saving is bypassed.
359+
if not Report.objects.filter(pk=serializer.report).exists():
360+
return
361+
else:
362+
super().perform_create(serializer=serializer)
363+
346364

347365
# For production version, substitute WriteOnlyModelViewSet
348366
class FixViewSet(ReadWriteOnlyModelViewSet):

0 commit comments

Comments
 (0)