diff --git a/api/serializers.py b/api/serializers.py index b72d7a2..134e8be 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers from tournaments.models.court import Court -from tournaments.models import Club, LiveMatch, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration, Purchase, FailedApiCall, DateInterval +from tournaments.models import Club, LiveMatch, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration, Purchase, FailedApiCall, DateInterval, Log from django.contrib.auth import password_validation from django.utils.translation import gettext_lazy as _ # email @@ -202,3 +202,8 @@ class FailedApiCallSerializer(serializers.ModelSerializer): class Meta: model = FailedApiCall fields = '__all__' + +class LogSerializer(serializers.ModelSerializer): + class Meta: + model = Log + fields = '__all__' diff --git a/api/urls.py b/api/urls.py index 5564292..375dc20 100644 --- a/api/urls.py +++ b/api/urls.py @@ -19,6 +19,7 @@ router.register(r'purchases', views.PurchaseViewSet) router.register(r'courts', views.CourtViewSet) router.register(r'date-intervals', views.DateIntervalViewSet) router.register(r'failed-api-calls', views.FailedApiCallViewSet) +router.register(r'logs', views.LogViewSet) urlpatterns = [ path('', include(router.urls)), diff --git a/api/views.py b/api/views.py index 5ea3dd5..a32054a 100644 --- a/api/views.py +++ b/api/views.py @@ -1,5 +1,5 @@ -from .serializers import ClubSerializer, CourtSerializer, DateIntervalSerializer, TournamentSerializer, UserSerializer, ChangePasswordSerializer, EventSerializer, RoundSerializer, GroupStageSerializer, MatchSerializer, TeamScoreSerializer, TeamRegistrationSerializer, PlayerRegistrationSerializer, LiveMatchSerializer, PurchaseSerializer, UserUpdateSerializer, FailedApiCallSerializer -from tournaments.models import Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration, Court, DateInterval, Purchase, FailedApiCall +from .serializers import ClubSerializer, CourtSerializer, DateIntervalSerializer, TournamentSerializer, UserSerializer, ChangePasswordSerializer, EventSerializer, RoundSerializer, GroupStageSerializer, MatchSerializer, TeamScoreSerializer, TeamRegistrationSerializer, PlayerRegistrationSerializer, LiveMatchSerializer, PurchaseSerializer, UserUpdateSerializer, FailedApiCallSerializer, LogSerializer +from tournaments.models import Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration, Court, DateInterval, Purchase, FailedApiCall, Log from rest_framework import viewsets, permissions from rest_framework.authtoken.models import Token @@ -187,3 +187,14 @@ class FailedApiCallViewSet(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(user=self.request.user) + +class LogViewSet(viewsets.ModelViewSet): + queryset = Log.objects.all() + serializer_class = LogSerializer + permission_classes = [] # Log are public whereas the other requests are only for logged users + + def get_queryset(self): + return [] + + def perform_create(self, serializer): + serializer.save(user=self.request.user) diff --git a/tournaments/admin.py b/tournaments/admin.py index a868392..8aef1c3 100644 --- a/tournaments/admin.py +++ b/tournaments/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from tournaments.models import team_registration -from .models import Club, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration, Purchase, Court, DateInterval, FailedApiCall +from .models import Club, TeamScore, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamRegistration, PlayerRegistration, Purchase, Court, DateInterval, FailedApiCall, Log from django.contrib.auth.admin import UserAdmin from django.contrib.auth.forms import UserCreationForm, UserChangeForm @@ -82,6 +82,10 @@ class FailedApiCallAdmin(admin.ModelAdmin): list_display = ['date', 'user', 'type', 'error'] list_filter = ['user'] +class LogAdmin(admin.ModelAdmin): + list_display = ['date', 'user', 'message'] + list_filter = ['user'] + admin.site.register(CustomUser, CustomUserAdmin) admin.site.register(Club, ClubAdmin) admin.site.register(Event, EventAdmin) @@ -96,3 +100,4 @@ admin.site.register(Purchase, PurchaseAdmin) admin.site.register(Court, CourtAdmin) admin.site.register(DateInterval, DateIntervalAdmin) admin.site.register(FailedApiCall, FailedApiCallAdmin) +admin.site.register(Log, LogAdmin) diff --git a/tournaments/migrations/0072_log.py b/tournaments/migrations/0072_log.py new file mode 100644 index 0000000..1be6ece --- /dev/null +++ b/tournaments/migrations/0072_log.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.11 on 2024-07-03 08:56 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('tournaments', '0071_alter_event_club'), + ] + + operations = [ + migrations.CreateModel( + name='Log', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), + ('date', models.DateTimeField()), + ('message', models.TextField(blank=True, null=True)), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/tournaments/models/__init__.py b/tournaments/models/__init__.py index 718dbb2..3944e1d 100644 --- a/tournaments/models/__init__.py +++ b/tournaments/models/__init__.py @@ -14,3 +14,4 @@ from .player_registration import PlayerRegistration from .team_score import TeamScore from .purchase import Purchase from .failed_api_call import FailedApiCall +from .log import Log diff --git a/tournaments/models/log.py b/tournaments/models/log.py new file mode 100644 index 0000000..dec2d94 --- /dev/null +++ b/tournaments/models/log.py @@ -0,0 +1,19 @@ +from django.db import models +from . import CustomUser +import uuid + +class Log(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True) + date = models.DateTimeField() + user = models.ForeignKey(CustomUser, blank=True, null=True, on_delete=models.SET_NULL) + message = models.TextField(blank=True, null=True) + + def __str__(self): + datetime = self.date.strftime("%Y-%m-%d %H:%M") + if self.user: + return f"{datetime} | {self.user.username} | {self.message}" + else: + return f"{datetime} | {self.message}" + + def discord_string(self): + return str(self)