from django.db import models from django.shortcuts import get_object_or_404 from django.utils import timezone from decimal import Decimal from django.urls import reverse, reverse_lazy class Classroom(models.Model): name = models.CharField(max_length=40, blank=True, null=True) def __str__(self): return self.name class Student(models.Model): first_name = models.CharField(max_length=30, blank=True) last_name = models.CharField(max_length=30, blank=True) classroom = models.ForeignKey(Classroom, on_delete=models.DO_NOTHING, blank=True, null=True) tution_fee = models.DecimalField(decimal_places=2, max_digits=12, default=0) paid_all = models.BooleanField(default=False) active = models.BooleanField(default=True) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) class Meta: ordering = ('first_name',) def __str__(self): return self.full_name @property def full_name(self): "Returns the person's full name." return f'{self.first_name} {self.last_name}' @property def get_tuition_fee(self): return self.tution_fee @property def get_total_paid_fee(self): return sum(student.payment for student in self.student_fee.all()) @property def get_remaining_fee(self): total_fee = self.get_tuition_fee total_paid = self.get_total_paid_fee return total_fee - total_paid class StudentFee(models.Model): PaymentTypes = ( ('monthly', 'Monthly'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly'), ) student = models.ForeignKey(Student, related_name='student_fee', on_delete=models.CASCADE) payment_date = models.DateField(default=timezone.now) payment_type = models.CharField(max_length=10, choices=PaymentTypes) payment = models.DecimalField(decimal_places=2, max_digits=12) class Meta: ordering = ('-payment_date',) def get_absolute_url(self): return reverse_lazy('student_detail', kwargs={'pk': self.student_id}) def save(self, *args, **kwargs): # save the studentfee record first before updating master table i.e. Student super().save(*args, **kwargs) # fee = self.student.get_remaining_fee() fee = self.student.get_remaining_fee try: student_instance = Student.objects.get(id=self.student_id) if fee <= 0: student_instance.paid_all = True else: student_instance.paid_all = False student_instance.save() except Exception as e: print(e)