|
|
|
@ -31,23 +31,24 @@ class DataApi(APIView): |
|
|
|
model_operation = request.data.get('operation') |
|
|
|
model_operation = request.data.get('operation') |
|
|
|
model_name = request.data.get('model_name') |
|
|
|
model_name = request.data.get('model_name') |
|
|
|
data = request.data.get('data') |
|
|
|
data = request.data.get('data') |
|
|
|
|
|
|
|
store_id = request.data.get('store_id') |
|
|
|
print(f"/data {model_operation} {model_name}") |
|
|
|
print(f"DataApi post > {model_operation} {model_name}") |
|
|
|
|
|
|
|
|
|
|
|
serializer_class = build_serializer_class(model_name) |
|
|
|
serializer_class = build_serializer_class(model_name) |
|
|
|
|
|
|
|
|
|
|
|
model = apps.get_model(app_label='tournaments', model_name=model_name) |
|
|
|
model = apps.get_model(app_label='tournaments', model_name=model_name) |
|
|
|
try: |
|
|
|
try: |
|
|
|
instance = model.objects.get(id=data.get('id')) |
|
|
|
data_id = data.get('id') |
|
|
|
|
|
|
|
instance = model.objects.get(id=data_id) |
|
|
|
|
|
|
|
|
|
|
|
if model_operation == 'DELETE': |
|
|
|
if model_operation == 'DELETE': |
|
|
|
return self.delete_and_save_log(request, data, model_operation, model_name) |
|
|
|
return self.delete_and_save_log(request, data_id, model_operation, model_name, store_id) |
|
|
|
else: # POST/PUT |
|
|
|
else: # POST/PUT |
|
|
|
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') |
|
|
|
print('>>> update') |
|
|
|
return self.save_and_create_log(request, serializer, model_operation, model_name) |
|
|
|
return self.save_and_create_log(request, serializer, model_operation, model_name, store_id) |
|
|
|
else: |
|
|
|
else: |
|
|
|
print('>>> return 203') |
|
|
|
print('>>> return 203') |
|
|
|
return Response(serializer.data, status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION) |
|
|
|
return Response(serializer.data, status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION) |
|
|
|
@ -58,50 +59,54 @@ class DataApi(APIView): |
|
|
|
print('>>> insert') |
|
|
|
print('>>> insert') |
|
|
|
serializer = serializer_class(data=data, context={'request': request}) |
|
|
|
serializer = serializer_class(data=data, context={'request': request}) |
|
|
|
if serializer.is_valid(): |
|
|
|
if serializer.is_valid(): |
|
|
|
return self.save_and_create_log(request, serializer, model_operation, model_name) |
|
|
|
return self.save_and_create_log(request, serializer, model_operation, model_name, store_id) |
|
|
|
else: |
|
|
|
else: |
|
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
|
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
|
|
|
|
|
|
|
|
|
|
|
def save_and_create_log(self, request, serializer, model_operation, model_name): |
|
|
|
def save_and_create_log(self, request, serializer, model_operation, model_name, store_id): |
|
|
|
instance = serializer.save() |
|
|
|
instance = serializer.save() |
|
|
|
|
|
|
|
|
|
|
|
self.create_and_save_model_log( |
|
|
|
self.create_and_save_model_log( |
|
|
|
user=request.user, |
|
|
|
user=request.user, |
|
|
|
model_operation=model_operation, |
|
|
|
model_operation=model_operation, |
|
|
|
model_name=model_name, |
|
|
|
model_name=model_name, |
|
|
|
model_id=instance.id |
|
|
|
model_id=instance.id, |
|
|
|
|
|
|
|
store_id=store_id |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
return Response(serializer.data, status=status.HTTP_201_CREATED) |
|
|
|
return Response(serializer.data, status=status.HTTP_201_CREATED) |
|
|
|
|
|
|
|
|
|
|
|
def delete_and_save_log(self, request, data, model_operation, model_name): |
|
|
|
def delete_and_save_log(self, request, data_id, model_operation, model_name, store_id): |
|
|
|
|
|
|
|
|
|
|
|
model = apps.get_model(app_label='tournaments', model_name=model_name) |
|
|
|
model = apps.get_model(app_label='tournaments', model_name=model_name) |
|
|
|
|
|
|
|
print(model) |
|
|
|
try: |
|
|
|
try: |
|
|
|
instance = model.objects.get(id=data.id) |
|
|
|
instance = model.objects.get(id=data_id) |
|
|
|
instance.delete() |
|
|
|
instance.delete() |
|
|
|
except model.DoesNotExist: |
|
|
|
except model.DoesNotExist: |
|
|
|
return Response({"detail": "Not found."}, status=status.HTTP_404_NOT_FOUND) |
|
|
|
return Response({"detail": "Not found."}, status=status.HTTP_404_NOT_FOUND) |
|
|
|
|
|
|
|
|
|
|
|
# we delete all logs linked to the instance because they won't be needed anymore |
|
|
|
# we delete all logs linked to the instance because they won't be needed anymore |
|
|
|
ModelLog.objects.filter(model_id=instance.id).delete() |
|
|
|
ModelLog.objects.filter(model_id=data_id).delete() |
|
|
|
|
|
|
|
|
|
|
|
self.create_and_save_model_log( |
|
|
|
self.create_and_save_model_log( |
|
|
|
user=request.user, |
|
|
|
user=request.user, |
|
|
|
model_operation=model_operation, |
|
|
|
model_operation=model_operation, |
|
|
|
model_name=model_name, |
|
|
|
model_name=model_name, |
|
|
|
model_id=instance.id |
|
|
|
model_id=data_id, |
|
|
|
|
|
|
|
store_id=store_id |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
return Response(status=status.HTTP_204_NO_CONTENT) |
|
|
|
return Response(status=status.HTTP_204_NO_CONTENT) |
|
|
|
|
|
|
|
|
|
|
|
def create_and_save_model_log(self, user, model_operation, model_name, model_id): |
|
|
|
def create_and_save_model_log(self, user, model_operation, model_name, model_id, store_id): |
|
|
|
model_log = ModelLog() |
|
|
|
model_log = ModelLog() |
|
|
|
model_log.user = user |
|
|
|
model_log.user = user |
|
|
|
model_log.operation = model_operation |
|
|
|
model_log.operation = model_operation |
|
|
|
model_log.date = timezone.localtime(timezone.now()) |
|
|
|
model_log.date = timezone.localtime(timezone.now()) |
|
|
|
model_log.model_name = model_name |
|
|
|
model_log.model_name = model_name |
|
|
|
model_log.model_id = model_id |
|
|
|
model_log.model_id = model_id |
|
|
|
|
|
|
|
model_log.store_id = store_id |
|
|
|
model_log.save() |
|
|
|
model_log.save() |
|
|
|
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs): |
|
|
|
def get(self, request, *args, **kwargs): |
|
|
|
@ -121,7 +126,7 @@ class DataApi(APIView): |
|
|
|
logs = ModelLog.objects.filter(date__gt=last_update).order_by('date') |
|
|
|
logs = ModelLog.objects.filter(date__gt=last_update).order_by('date') |
|
|
|
|
|
|
|
|
|
|
|
updates = defaultdict(dict) |
|
|
|
updates = defaultdict(dict) |
|
|
|
deletions = defaultdict(set) |
|
|
|
deletions = defaultdict(list) |
|
|
|
|
|
|
|
|
|
|
|
for log in logs: |
|
|
|
for log in logs: |
|
|
|
model = apps.get_model(app_label='tournaments', model_name=log.model_name) |
|
|
|
model = apps.get_model(app_label='tournaments', model_name=log.model_name) |
|
|
|
@ -136,7 +141,7 @@ class DataApi(APIView): |
|
|
|
# If the instance doesn't exist, it might have been deleted after this log was created |
|
|
|
# If the instance doesn't exist, it might have been deleted after this log was created |
|
|
|
pass |
|
|
|
pass |
|
|
|
elif log.operation == 'DELETE': |
|
|
|
elif log.operation == 'DELETE': |
|
|
|
deletions[log.model_name].add(log.model_id) |
|
|
|
deletions[log.model_name].append({'model_id': log.model_id, 'store_id': log.store_id}) |
|
|
|
|
|
|
|
|
|
|
|
# Convert updates dict to list for each model |
|
|
|
# Convert updates dict to list for each model |
|
|
|
for model_name in updates: |
|
|
|
for model_name in updates: |
|
|
|
@ -144,7 +149,7 @@ class DataApi(APIView): |
|
|
|
|
|
|
|
|
|
|
|
# Convert deletions set to list for each model |
|
|
|
# Convert deletions set to list for each model |
|
|
|
for model_name in deletions: |
|
|
|
for model_name in deletions: |
|
|
|
deletions[model_name] = list(deletions[model_name]) |
|
|
|
deletions[model_name] = deletions[model_name] |
|
|
|
|
|
|
|
|
|
|
|
# local_time = timezone.localtime(timezone.now()) |
|
|
|
# local_time = timezone.localtime(timezone.now()) |
|
|
|
# print(local_time.isoformat(timespec='seconds')) |
|
|
|
# print(local_time.isoformat(timespec='seconds')) |
|
|
|
|