diff --git a/api/views.py b/api/views.py index a64e162..f2dea6c 100644 --- a/api/views.py +++ b/api/views.py @@ -26,6 +26,8 @@ from collections import defaultdict from .permissions import IsClubOwner from .utils import is_valid_email +from sync.models import Device + @method_decorator(csrf_exempt, name='dispatch') class CustomAuthToken(APIView): permission_classes = [] @@ -52,6 +54,8 @@ class CustomAuthToken(APIView): user.device_id = device_id user.save() + self.create_or_update_device(user, device_id) + token, created = Token.objects.get_or_create(user=user) return Response({'token': token.key}) else: @@ -60,6 +64,14 @@ class CustomAuthToken(APIView): else: return Response({'error': 'L\'utilisateur et le mot de passe de correspondent pas'}, status=status.HTTP_401_UNAUTHORIZED) + def create_or_update_device(self, user, device_id): + Device.objects.update_or_create( + id=device_id, + defaults={ + 'user': user + } + ) + def get_username_from_email(self, email): try: user = CustomUser.objects.get(email=email) diff --git a/sync/admin.py b/sync/admin.py index 33e702c..6b6f4c8 100644 --- a/sync/admin.py +++ b/sync/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import BaseModel, ModelLog, DataAccess +from .models import BaseModel, ModelLog, DataAccess, Device from django.utils import timezone @@ -25,9 +25,9 @@ class ModelLogAdmin(admin.ModelAdmin): ordering = ['-date'] search_fields = ['model_id'] - # @admin.display(description='Users') - # def get_users(self, obj): - # return ", ".join([str(item) for item in obj.users.all()]) +class DeviceAdmin(admin.ModelAdmin): + list_display = ['user', 'last_login', 'id'] + readonly_fields = ('last_login',) class DataAccessAdmin(SyncedObjectAdmin): list_display = ['related_user', 'get_shared_users', 'model_name', 'model_id'] @@ -41,3 +41,4 @@ class DataAccessAdmin(SyncedObjectAdmin): # Register your models here. admin.site.register(ModelLog, ModelLogAdmin) admin.site.register(DataAccess, DataAccessAdmin) +admin.site.register(Device, DeviceAdmin) diff --git a/sync/migrations/0003_device.py b/sync/migrations/0003_device.py new file mode 100644 index 0000000..a5c07b6 --- /dev/null +++ b/sync/migrations/0003_device.py @@ -0,0 +1,25 @@ +# Generated by Django 5.1 on 2025-02-13 17:00 + +import django.db.models.deletion +import uuid +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sync', '0002_alter_modellog_options'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Device', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('last_login', models.DateTimeField(auto_now=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='devices', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/sync/models/__init__.py b/sync/models/__init__.py index 4b08618..c09b42f 100644 --- a/sync/models/__init__.py +++ b/sync/models/__init__.py @@ -1,3 +1,4 @@ from .base import BaseModel, SideStoreModel from .model_log import ModelLog, ModelOperation from .data_access import DataAccess +from .device import Device diff --git a/sync/models/device.py b/sync/models/device.py new file mode 100644 index 0000000..fa0bf0d --- /dev/null +++ b/sync/models/device.py @@ -0,0 +1,11 @@ +from django.db import models +import uuid +from django.conf import settings + +class Device(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='devices') + last_login = models.DateTimeField(auto_now=True) + + def __str__(self): + return f"{self.id} > {self.user.username}" diff --git a/tournaments/migrations/0110_remove_failedapicall_creation_date_and_more.py b/tournaments/migrations/0110_remove_failedapicall_creation_date_and_more.py new file mode 100644 index 0000000..7ee8520 --- /dev/null +++ b/tournaments/migrations/0110_remove_failedapicall_creation_date_and_more.py @@ -0,0 +1,56 @@ +# Generated by Django 5.1 on 2025-02-13 17:00 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tournaments', '0109_special_store_id'), + ] + + operations = [ + migrations.RemoveField( + model_name='failedapicall', + name='creation_date', + ), + migrations.RemoveField( + model_name='failedapicall', + name='last_update', + ), + migrations.RemoveField( + model_name='failedapicall', + name='last_updated_by', + ), + migrations.RemoveField( + model_name='failedapicall', + name='related_user', + ), + migrations.RemoveField( + model_name='log', + name='creation_date', + ), + migrations.RemoveField( + model_name='log', + name='last_update', + ), + migrations.RemoveField( + model_name='log', + name='last_updated_by', + ), + migrations.RemoveField( + model_name='log', + name='related_user', + ), + migrations.AlterField( + model_name='unregisteredplayer', + name='unregistered_team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unregistered_players', to='tournaments.unregisteredteam'), + ), + migrations.AlterField( + model_name='unregisteredteam', + name='tournament', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='unregistered_teams', to='tournaments.tournament'), + ), + ] diff --git a/tournaments/models/device_token.py b/tournaments/models/device_token.py index d350376..7198e2c 100644 --- a/tournaments/models/device_token.py +++ b/tournaments/models/device_token.py @@ -1,7 +1,5 @@ from django.db import models from . import CustomUser -import uuid -from . import BaseModel class DeviceToken(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='device_tokens')