From 0c437c546851fdb6293ccbec3efe415f212215c1 Mon Sep 17 00:00:00 2001 From: Laurent Date: Mon, 6 Jan 2025 15:38:21 +0100 Subject: [PATCH] Change sync POST service to handle multiple operations --- sync/views.py | 120 +++++++++++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 50 deletions(-) diff --git a/sync/views.py b/sync/views.py index b1caf34..69a3a46 100644 --- a/sync/views.py +++ b/sync/views.py @@ -88,58 +88,78 @@ 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}") - - serializer_class = build_serializer_class(model_name) - data['last_updated_by'] = request.user.id # always refresh the user performing the operation - - # 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') + operations = request.data['operations'] + results = [] + + for op in operations: try: - instance = get_data(model_name, data_id) - instance._device_id = device_id - instance.delete() - return 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) - else: - return Response(status=status.HTTP_404_NOT_FOUND) + 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 + + # 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 + 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): 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']: