|
|
|
|
@ -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']: |
|
|
|
|
|