diff --git a/attendance/apps.py b/attendance/apps.py index 177ba15..56b6faa 100644 --- a/attendance/apps.py +++ b/attendance/apps.py @@ -3,3 +3,6 @@ from django.apps import AppConfig class AttendanceConfig(AppConfig): name = 'attendance' + + def ready(self): + import attendance.signals diff --git a/attendance/models.py b/attendance/models.py index 2e1c889..0770a29 100644 --- a/attendance/models.py +++ b/attendance/models.py @@ -2,8 +2,7 @@ from datetime import datetime from django.db import models from django.urls import reverse from accounts.models import Student -from django.db.models.signals import post_save -from django.dispatch import receiver + class Code(models.Model): student = models.ForeignKey(Student, on_delete=models.CASCADE) @@ -48,10 +47,3 @@ class Period(models.Model): if self.clocked_out != None: self.duration = self.clocked_out - self.clocked_in super(Period, self).save(*args, **kwargs) - -@receiver(post_save, sender=Period) -def auto_clockin_student(sender, instance, created, **kwargs): - if created: - instance.student.is_clocked_in = True - instance.student.current_period_id = instance.pk - instance.student.save() diff --git a/attendance/signals.py b/attendance/signals.py new file mode 100644 index 0000000..a1c814b --- /dev/null +++ b/attendance/signals.py @@ -0,0 +1,24 @@ +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver +from .models import Period + +@receiver(post_save, sender=Period) +def student_period_created_updated(sender, instance, created, **kwargs): + if created and not instance.clocked_out: + instance.student.is_clocked_in = True + instance.student.current_period_id = instance.pk + instance.student.save() + elif not created and not instance.clocked_out: + instance.student.is_clocked_in = True + instance.student.current_period_id = instance.pk + instance.student.save() + elif instance.clocked_out and not created: + instance.student.is_clocked_in = False + instance.student.save() + +@receiver(post_delete, sender=Period) +def student_period_deleted(sender, instance, **kwargs): + if instance.student.current_period_id == instance.pk: + instance.student.is_clocked_in = False + instance.student.current_period_id = None + instance.student.save() diff --git a/attendance/views.py b/attendance/views.py index 2fcbd10..6dec82f 100644 --- a/attendance/views.py +++ b/attendance/views.py @@ -12,6 +12,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMix from django.utils import timezone from django.contrib import messages from django.contrib.auth.models import User +from django.shortcuts import get_object_or_404 from accounts.models import Instructor, Student from .models import Code, Period from .forms import AttendanceUpdateForm, PeriodForm @@ -123,14 +124,6 @@ class PeriodUpdateView(LoginRequiredMixin, UpdateView): form_class = PeriodForm template_name = 'attendance/period_form.html' - # When editing a period, check if it matches the current period of the student and clock them out - def form_valid(self, form): - student = form.instance.student - if form.instance.id == student.current_period_id: - student.is_clocked_in = False - student.save() - return super().form_valid(form) - def get_success_url(self): pk = self.kwargs["pk"] return reverse('period-detail', kwargs={'pk': pk})