Change sync POST service to handle multiple operations

sync
Laurent 10 months ago
parent ff91b3023e
commit 0c437c5468
  1. 52
      sync/views.py

@ -88,13 +88,17 @@ class SynchronizationApi(HierarchyApiView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
# unfold content
model_operation = request.data.get('operation')
model_name = request.data.get('model_name')
data = request.data.get('data')
device_id = request.data.get('device_id') device_id = request.data.get('device_id')
print(f"DataApi post > device: {device_id}")
print(f"DataApi post > {model_operation} {model_name}, device: {device_id}") operations = request.data['operations']
results = []
for op in operations:
try:
model_operation = op.get('operation')
model_name = op.get('model_name')
data = op.get('data')
serializer_class = build_serializer_class(model_name) serializer_class = build_serializer_class(model_name)
data['last_updated_by'] = request.user.id # always refresh the user performing the operation data['last_updated_by'] = request.user.id # always refresh the user performing the operation
@ -107,10 +111,12 @@ class SynchronizationApi(HierarchyApiView):
if serializer.is_valid(): if serializer.is_valid():
instance = serializer.save() instance = serializer.save()
instance._device_id = device_id instance._device_id = device_id
return Response(serializer.data, status=status.HTTP_201_CREATED) result = serializer.data
response_status = status.HTTP_201_CREATED
else: else:
print(f'Data invalid ! {serializer.errors}') print(f'Data invalid ! {serializer.errors}')
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) result = serializer.errors
response_status = status.HTTP_400_BAD_REQUEST
elif model_operation == 'PUT': elif model_operation == 'PUT':
data_id = data.get('id') data_id = data.get('id')
instance = get_data(model_name, data_id) instance = get_data(model_name, data_id)
@ -118,28 +124,42 @@ class SynchronizationApi(HierarchyApiView):
serializer = serializer_class(instance, data=data, context={'request': request}) serializer = serializer_class(instance, data=data, context={'request': request})
if serializer.is_valid(): if serializer.is_valid():
if instance.last_update <= serializer.validated_data.get('last_update'): if instance.last_update <= serializer.validated_data.get('last_update'):
# print('>>> update')
serializer.save() serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK) result = serializer.data
response_status = status.HTTP_200_OK
else: else:
print('>>> return 203') result = serializer.data
return Response(serializer.data, status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION) response_status = status.HTTP_203_NON_AUTHORITATIVE_INFORMATION
else: else:
print(f'Data invalid ! {serializer.errors}') print(f'Data invalid ! {serializer.errors}')
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) response_status = status.HTTP_400_BAD_REQUEST
elif model_operation == 'DELETE': elif model_operation == 'DELETE':
data_id = data.get('id') data_id = data.get('id')
try: try:
instance = get_data(model_name, data_id) instance = get_data(model_name, data_id)
instance._device_id = device_id instance._device_id = device_id
instance.delete() instance.delete()
return Response(status=status.HTTP_204_NO_CONTENT) response_status = status.HTTP_204_NO_CONTENT
except model.DoesNotExist: # POST except model.DoesNotExist: # POST
delete = ModelLog.objects.filter(model_id=data_id, operation=model_operation).first() delete = ModelLog.objects.filter(model_id=data_id, operation=model_operation).first()
if delete: if delete:
return Response(status=status.HTTP_208_ALREADY_REPORTED) response_status = status.HTTP_208_ALREADY_REPORTED
else: else:
return Response(status=status.HTTP_404_NOT_FOUND) response_status = status.HTTP_404_NOT_FOUND
except Exception as e:
response_status = 'error'
result = str(e)
results.append({
'api_call_id': op.get('api_call_id'),
'status': response_status,
'data': result
})
return Response({
'results': results
}, status=207) # Multi-Status
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
last_update_str = request.query_params.get('last_update') last_update_str = request.query_params.get('last_update')
@ -170,7 +190,7 @@ class SynchronizationApi(HierarchyApiView):
last_log_date = None last_log_date = None
for log in logs: for log in logs:
print(f'log date = {log.date}') # print(f'log date = {log.date}')
last_log_date = log.date last_log_date = log.date
try: try:
if log.operation in ['POST', 'PUT']: if log.operation in ['POST', 'PUT']:

Loading…
Cancel
Save