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):
# 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')
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)
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():
instance = serializer.save()
instance._device_id = device_id
return Response(serializer.data, status=status.HTTP_201_CREATED)
result = serializer.data
response_status = status.HTTP_201_CREATED
else:
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':
data_id = data.get('id')
instance = get_data(model_name, data_id)
@ -118,28 +124,42 @@ class SynchronizationApi(HierarchyApiView):
serializer = serializer_class(instance, data=data, context={'request': request})
if serializer.is_valid():
if instance.last_update <= serializer.validated_data.get('last_update'):
# print('>>> update')
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
result = serializer.data
response_status = status.HTTP_200_OK
else:
print('>>> return 203')
return Response(serializer.data, status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION)
result = serializer.data
response_status = status.HTTP_203_NON_AUTHORITATIVE_INFORMATION
else:
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':
data_id = data.get('id')
try:
instance = get_data(model_name, data_id)
instance._device_id = device_id
instance.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
response_status = status.HTTP_204_NO_CONTENT
except model.DoesNotExist: # POST
delete = ModelLog.objects.filter(model_id=data_id, operation=model_operation).first()
if delete:
return Response(status=status.HTTP_208_ALREADY_REPORTED)
response_status = status.HTTP_208_ALREADY_REPORTED
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):
last_update_str = request.query_params.get('last_update')
@ -170,7 +190,7 @@ class SynchronizationApi(HierarchyApiView):
last_log_date = None
for log in logs:
print(f'log date = {log.date}')
# print(f'log date = {log.date}')
last_log_date = log.date
try:
if log.operation in ['POST', 'PUT']:

Loading…
Cancel
Save