from django.db import models from students.models import Student from teachers.models import Subject class Grade(models.Model): TERM_CHOICES = [('1', 'Term 1'), ('2', 'Term 2'), ('3', 'Term 3'), ('final', 'Final')] student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name='grades') subject = models.ForeignKey(Subject, on_delete=models.CASCADE, related_name='grades') term = models.CharField(max_length=10, choices=TERM_CHOICES, default='1') score = models.DecimalField(max_digits=5, decimal_places=2) max_score = models.DecimalField(max_digits=5, decimal_places=2, default=100) academic_year = models.CharField(max_length=20, default='2024-2025') remarks = models.TextField(blank=True) created_at = models.DateTimeField(auto_now_add=True) @property def percentage(self): if self.max_score > 0: return round((self.score / self.max_score) * 100, 1) return 0 @property def letter_grade(self): p = self.percentage if p >= 90: return 'A+' if p >= 80: return 'A' if p >= 70: return 'B' if p >= 60: return 'C' if p >= 50: return 'D' return 'F' def __str__(self): return f"{self.student} - {self.subject} - {self.term}" class Meta: ordering = ['-created_at']