Readd store_id for ModelLog to handle deletions

sync
Laurent 1 year ago
parent d98cb74e1a
commit 3783477768
  1. 37
      api/views.py
  2. 1
      tournaments/admin.py
  3. 18
      tournaments/migrations/0091_modellog_store_id.py
  4. 2
      tournaments/models/model_log.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'))

@ -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)

@ -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),
),
]

@ -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)

Loading…
Cancel
Save