Change sync POST service to handle multiple operations

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

@ -88,58 +88,78 @@ 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 = []
serializer_class = build_serializer_class(model_name)
data['last_updated_by'] = request.user.id # always refresh the user performing the operation for op in operations:
# model = apps.get_model(app_label='tournaments', model_name=model_name)
model = sync_registry.get_model(model_name)
if model_operation == 'POST':
serializer = serializer_class(data=data, context={'request': request})
if serializer.is_valid():
instance = serializer.save()
instance._device_id = device_id
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
print(f'Data invalid ! {serializer.errors}')
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif model_operation == 'PUT':
data_id = data.get('id')
instance = get_data(model_name, data_id)
instance._device_id = device_id
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)
else:
print('>>> return 203')
return Response(serializer.data, status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION)
else:
print(f'Data invalid ! {serializer.errors}')
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif model_operation == 'DELETE':
data_id = data.get('id')
try: try:
instance = get_data(model_name, data_id) model_operation = op.get('operation')
instance._device_id = device_id model_name = op.get('model_name')
instance.delete() data = op.get('data')
return Response(status=status.HTTP_204_NO_CONTENT)
except model.DoesNotExist: # POST serializer_class = build_serializer_class(model_name)
delete = ModelLog.objects.filter(model_id=data_id, operation=model_operation).first() data['last_updated_by'] = request.user.id # always refresh the user performing the operation
if delete:
return Response(status=status.HTTP_208_ALREADY_REPORTED) # model = apps.get_model(app_label='tournaments', model_name=model_name)
else: model = sync_registry.get_model(model_name)
return Response(status=status.HTTP_404_NOT_FOUND)
if model_operation == 'POST':
serializer = serializer_class(data=data, context={'request': request})
if serializer.is_valid():
instance = serializer.save()
instance._device_id = device_id
result = serializer.data
response_status = status.HTTP_201_CREATED
else:
print(f'Data invalid ! {serializer.errors}')
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)
instance._device_id = device_id
serializer = serializer_class(instance, data=data, context={'request': request})
if serializer.is_valid():
if instance.last_update <= serializer.validated_data.get('last_update'):
serializer.save()
result = serializer.data
response_status = status.HTTP_200_OK
else:
result = serializer.data
response_status = status.HTTP_203_NON_AUTHORITATIVE_INFORMATION
else:
print(f'Data invalid ! {serializer.errors}')
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()
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:
response_status = status.HTTP_208_ALREADY_REPORTED
else:
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