remove many to many relationship between ModelLog and Users

sync
Laurent 9 months ago
parent 8b8e0eb9d5
commit ce52aa2502
  1. 10
      sync/admin.py
  2. 12
      sync/migrations/0001_initial.py
  3. 18
      sync/migrations/0002_alter_modellog_date.py
  4. 10
      sync/models/model_log.py
  5. 4
      sync/signals.py
  6. 4
      sync/views.py

@ -20,14 +20,14 @@ class SyncedObjectAdmin(admin.ModelAdmin):
queryset.delete() queryset.delete()
class ModelLogAdmin(admin.ModelAdmin): class ModelLogAdmin(admin.ModelAdmin):
list_display = ['id', 'get_users', 'formatted_time', 'operation', 'model_id', 'model_name', 'count'] list_display = ['user', 'formatted_time', 'operation', 'model_id', 'model_name', 'count']
list_filter = ['users', 'operation', 'model_name'] list_filter = ['user', 'operation', 'model_name']
ordering = ['-date'] ordering = ['-date']
search_fields = ['model_id'] search_fields = ['model_id']
@admin.display(description='Users') # @admin.display(description='Users')
def get_users(self, obj): # def get_users(self, obj):
return ", ".join([str(item) for item in obj.users.all()]) # return ", ".join([str(item) for item in obj.users.all()])
class DataAccessAdmin(SyncedObjectAdmin): class DataAccessAdmin(SyncedObjectAdmin):
list_display = ['related_user', 'get_shared_users', 'model_name', 'model_id'] list_display = ['related_user', 'get_shared_users', 'model_name', 'model_id']

@ -1,4 +1,4 @@
# Generated by Django 5.1 on 2025-02-06 11:23 # Generated by Django 5.1 on 2025-02-06 16:26
import django.db.models.deletion import django.db.models.deletion
import django.utils.timezone import django.utils.timezone
@ -36,15 +36,19 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='ModelLog', name='ModelLog',
fields=[ fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)), ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('model_id', models.UUIDField()), ('model_id', models.UUIDField()),
('operation', models.CharField(choices=[('POST', 'POST'), ('PUT', 'PUT'), ('DELETE', 'DELETE'), ('GRANT_ACCESS', 'GRANT_ACCESS'), ('REVOKE_ACCESS', 'REVOKE_ACCESS')], max_length=50)), ('operation', models.CharField(choices=[('POST', 'POST'), ('PUT', 'PUT'), ('DELETE', 'DELETE'), ('GRANT_ACCESS', 'GRANT_ACCESS'), ('REVOKE_ACCESS', 'REVOKE_ACCESS')], max_length=50)),
('date', models.DateTimeField()), ('date', models.DateTimeField(auto_now_add=True)),
('model_name', models.CharField(max_length=50)), ('model_name', models.CharField(max_length=50)),
('store_id', models.CharField(blank=True, max_length=200, null=True)), ('store_id', models.CharField(blank=True, max_length=200, null=True)),
('device_id', models.CharField(blank=True, max_length=200, null=True)), ('device_id', models.CharField(blank=True, max_length=200, null=True)),
('count', models.IntegerField(default=0)), ('count', models.IntegerField(default=0)),
('users', models.ManyToManyField(blank=True, related_name='model_logs', to=settings.AUTH_USER_MODEL)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='model_logs', to=settings.AUTH_USER_MODEL)),
], ],
options={
'ordering': ['-date'],
'indexes': [models.Index(fields=['date', 'user'], name='sync_modell_date_2bc081_idx'), models.Index(fields=['date', 'user', 'device_id'], name='sync_modell_date_77b4d0_idx')],
},
), ),
] ]

@ -1,18 +0,0 @@
# Generated by Django 5.1 on 2025-02-06 13:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sync', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='modellog',
name='date',
field=models.DateTimeField(auto_now_add=True),
),
]

@ -2,6 +2,7 @@ from django.db import models
from django.conf import settings from django.conf import settings
import uuid import uuid
from tkinter.constants import CASCADE
class ModelOperation(models.TextChoices): class ModelOperation(models.TextChoices):
@ -13,9 +14,10 @@ class ModelOperation(models.TextChoices):
class ModelLog(models.Model): class ModelLog(models.Model):
# id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True) # id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True)
id = models.BigAutoField(primary_key=True) # id = models.BigAutoField(primary_key=True)
users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='model_logs', blank=True) # users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='model_logs', blank=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='model_logs')
model_id = models.UUIDField() model_id = models.UUIDField()
operation = models.CharField(choices=ModelOperation.choices, max_length=50) operation = models.CharField(choices=ModelOperation.choices, max_length=50)
date = models.DateTimeField(auto_now_add=True) date = models.DateTimeField(auto_now_add=True)
@ -26,6 +28,10 @@ class ModelLog(models.Model):
class Meta: class Meta:
ordering = ['-date'] ordering = ['-date']
indexes = [
models.Index(fields=['date', 'user']),
models.Index(fields=['date', 'user', 'device_id']),
]
def formatted_time(self): def formatted_time(self):
return self.date.strftime('%H:%M:%S.%f') return self.date.strftime('%H:%M:%S.%f')

@ -121,15 +121,15 @@ def save_model_log_if_possible(instance, signal, created, device_id):
def save_model_log(users, model_operation, model_name, model_id, store_id, device_id): def save_model_log(users, model_operation, model_name, model_id, store_id, device_id):
with transaction.atomic(): with transaction.atomic():
for user in users:
model_log = ModelLog() model_log = ModelLog()
model_log.user = user
model_log.operation = model_operation model_log.operation = model_operation
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.store_id = store_id
model_log.device_id = device_id model_log.device_id = device_id
# model_log.date = timezone.now()
model_log.save() model_log.save()
model_log.users.set(users)
# print(f'ML users = {len(users)}') # print(f'ML users = {len(users)}')
# existing_log = ModelLog.objects.filter(users__in=users, model_id=model_id, operation=model_operation).first() # existing_log = ModelLog.objects.filter(users__in=users, model_id=model_id, operation=model_operation).first()

@ -268,10 +268,10 @@ class SynchronizationApi(HierarchyApiView):
return Response(response_data, status=status.HTTP_200_OK) return Response(response_data, status=status.HTTP_200_OK)
def query_model_logs(self, last_update, user, device_id): def query_model_logs(self, last_update, user, device_id):
log_query = Q(date__gt=last_update, users=user) log_query = Q(date__gt=last_update, user=user)
if device_id: if device_id:
log_query &= ~Q(device_id=device_id) # exclude query log_query &= ~Q(device_id=device_id) # exclude query
return ModelLog.objects.filter(log_query).order_by('date') return ModelLog.objects.filter(log_query)
class UserDataAccessApi(HierarchyApiView): class UserDataAccessApi(HierarchyApiView):
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]

Loading…
Cancel
Save