diff --git a/api/views.py b/api/views.py index a6351e3..11beff4 100644 --- a/api/views.py +++ b/api/views.py @@ -31,23 +31,24 @@ class DataApi(APIView): model_operation = request.data.get('operation') model_name = request.data.get('model_name') data = request.data.get('data') - - print(f"/data {model_operation} {model_name}") + store_id = request.data.get('store_id') + print(f"DataApi post > {model_operation} {model_name}") serializer_class = build_serializer_class(model_name) model = apps.get_model(app_label='tournaments', model_name=model_name) 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': - 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 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') - 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: print('>>> return 203') return Response(serializer.data, status=status.HTTP_203_NON_AUTHORITATIVE_INFORMATION) @@ -58,50 +59,54 @@ class DataApi(APIView): print('>>> insert') serializer = serializer_class(data=data, context={'request': request}) 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: 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() self.create_and_save_model_log( user=request.user, model_operation=model_operation, 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) - 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) + print(model) try: - instance = model.objects.get(id=data.id) + instance = model.objects.get(id=data_id) instance.delete() except model.DoesNotExist: 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 - ModelLog.objects.filter(model_id=instance.id).delete() + ModelLog.objects.filter(model_id=data_id).delete() self.create_and_save_model_log( user=request.user, model_operation=model_operation, model_name=model_name, - model_id=instance.id + model_id=data_id, + store_id=store_id ) 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.user = user model_log.operation = model_operation model_log.date = timezone.localtime(timezone.now()) model_log.model_name = model_name model_log.model_id = model_id + model_log.store_id = store_id model_log.save() def get(self, request, *args, **kwargs): @@ -121,7 +126,7 @@ class DataApi(APIView): logs = ModelLog.objects.filter(date__gt=last_update).order_by('date') updates = defaultdict(dict) - deletions = defaultdict(set) + deletions = defaultdict(list) for log in logs: 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 pass 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 for model_name in updates: @@ -144,7 +149,7 @@ class DataApi(APIView): # Convert deletions set to list for each model for model_name in deletions: - deletions[model_name] = list(deletions[model_name]) + deletions[model_name] = deletions[model_name] # local_time = timezone.localtime(timezone.now()) # print(local_time.isoformat(timespec='seconds')) diff --git a/tournaments/admin.py b/tournaments/admin.py index 50d1f19..f44b95e 100644 --- a/tournaments/admin.py +++ b/tournaments/admin.py @@ -96,6 +96,7 @@ class DeviceTokenAdmin(admin.ModelAdmin): class ModelLogAdmin(admin.ModelAdmin): list_display = ['user', 'date', 'operation', 'model_id', 'model_name'] list_filter = ['user'] + ordering = ['-date'] admin.site.register(CustomUser, CustomUserAdmin) admin.site.register(Club, ClubAdmin) diff --git a/tournaments/migrations/0091_modellog_store_id.py b/tournaments/migrations/0091_modellog_store_id.py new file mode 100644 index 0000000..11f71ce --- /dev/null +++ b/tournaments/migrations/0091_modellog_store_id.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1 on 2024-10-30 08:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tournaments', '0090_dynamic_store_id'), + ] + + operations = [ + migrations.AddField( + model_name='modellog', + name='store_id', + field=models.CharField(blank=True, max_length=200, null=True), + ), + ] diff --git a/tournaments/models/model_log.py b/tournaments/models/model_log.py index d29a84e..9bc15f1 100644 --- a/tournaments/models/model_log.py +++ b/tournaments/models/model_log.py @@ -9,4 +9,4 @@ class ModelLog(models.Model): operation = models.CharField(choices=ModelOperation.choices, max_length=50) date = models.DateTimeField() model_name = models.CharField(max_length=50) - # store_id = models.CharField(max_length=200, blank=True, null=True) + store_id = models.CharField(max_length=200, blank=True, null=True)