From 2855d367286eda694a4040874bc4913e9bfe6e08 Mon Sep 17 00:00:00 2001 From: Advay Patil Date: Thu, 2 Jan 2025 22:02:34 -0800 Subject: [PATCH] Add `last_updated` field to `AttendanceStats` --- ...005_attendancesessionstats_last_updated.py | 19 +++++++++++++++++++ server/engagement/models.py | 1 + server/engagement/views.py | 8 ++++++-- .../commands/update_attendance_stats.py | 9 +++++++-- 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 server/engagement/migrations/0005_attendancesessionstats_last_updated.py diff --git a/server/engagement/migrations/0005_attendancesessionstats_last_updated.py b/server/engagement/migrations/0005_attendancesessionstats_last_updated.py new file mode 100644 index 0000000..5fc0094 --- /dev/null +++ b/server/engagement/migrations/0005_attendancesessionstats_last_updated.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.17 on 2025-01-03 06:02 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('engagement', '0004_attendancesessionstats'), + ] + + operations = [ + migrations.AddField( + model_name='attendancesessionstats', + name='last_updated', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + ] diff --git a/server/engagement/models.py b/server/engagement/models.py index e270edf..29a19ec 100644 --- a/server/engagement/models.py +++ b/server/engagement/models.py @@ -60,6 +60,7 @@ def __str__(self): class AttendanceSessionStats(models.Model): member = models.ForeignKey(User, on_delete=models.CASCADE) sessions_attended = models.PositiveIntegerField(default=0) + last_updated = models.DateTimeField(default=timezone.now) def __str__(self): return f"{self.member.username}: {self.sessions_attended}" diff --git a/server/engagement/views.py b/server/engagement/views.py index f34afc8..1411d0e 100644 --- a/server/engagement/views.py +++ b/server/engagement/views.py @@ -17,6 +17,7 @@ from .buffer import MessageBuffer, Message from .models import AttendanceSession, DiscordMessageStats, AttendanceSessionStats from .serializers import AttendanceSessionSerializer, MemberSerializer +from django.db import transaction logger = logging.getLogger(__name__) @@ -145,8 +146,11 @@ def post(self, request): stats, created = AttendanceSessionStats.objects.get_or_create( member=user ) - stats.sessions_attended += 1 - stats.save() + with transaction.atomic(): + stats.sessions_attended += 1 + stats.last_updated = timezone.now() + + stats.save() return Response(status=status.HTTP_201_CREATED) else: diff --git a/server/leaderboard/management/commands/update_attendance_stats.py b/server/leaderboard/management/commands/update_attendance_stats.py index 63411c4..4885949 100644 --- a/server/leaderboard/management/commands/update_attendance_stats.py +++ b/server/leaderboard/management/commands/update_attendance_stats.py @@ -2,6 +2,8 @@ from members.models import User from collections import defaultdict from engagement.models import AttendanceSessionStats +from django.db import transaction +from django.utils import timezone class Command(BaseCommand): @@ -18,8 +20,11 @@ def handle(self, *args, **options): user_stats, _ = AttendanceSessionStats.objects.get_or_create( member_id=user_id ) - user_stats.sessions_attended = attended_sessions - user_stats.save() + with transaction.atomic(): + user_stats.sessions_attended = attended_sessions + user_stats.last_updated = timezone.now() + + user_stats.save() self.stdout.write(self.style.SUCCESS(str(user_stats)))