This commit is contained in:
sankalp committed 2025-01-08 21:15:45 +05:45
1 parent aaf2a1b2f6
commit 29680072a0
30 files changed
+1297 -123

No files matched your search

+259 -53
View File
@@ -5,6 +5,7 @@ from django.contrib.auth.hashers import make_password
import random
from decimal import Decimal
from datetime import time, timedelta, datetime
from django.core.validators import MinValueValidator, MaxValueValidator
# Abstract BaseUser Model
@@ -19,7 +20,6 @@ class BaseUser(models.Model):
)
username = models.CharField(max_length=255, unique=True, blank=True, null=True)
password = models.CharField(max_length=255)
address = models.CharField(max_length=255)
group = models.ManyToManyField(Group, blank=True)
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
@@ -42,7 +42,6 @@ class BaseUser(models.Model):
email=self.email,
first_name=self.first_name,
last_name=self.last_name,
address=self.address,
is_staff=True,
is_active=self.active_status,
password=self.password,
@@ -52,7 +51,6 @@ class BaseUser(models.Model):
self.user.email = self.email
self.user.first_name = self.first_name
self.user.last_name = self.last_name
self.user.address = self.address
self.user.is_active = self.active_status
self.user.is_staff = True
self.user.password = self.password
@@ -103,6 +101,7 @@ class Teacher(BaseUser):
class Student(BaseUser):
date_of_birth = models.DateField(blank=False)
gender = models.CharField(max_length=1, choices=[("M", "Male"), ("F", "Female")])
address = models.CharField(max_length=255)
course = models.ForeignKey("Course", on_delete=models.CASCADE)
academic_year = models.ForeignKey("AcademicYear", on_delete=models.CASCADE)
father_name = models.CharField(max_length=100)
@@ -111,17 +110,17 @@ class Student(BaseUser):
)
father_email = models.EmailField(blank=True, null=True)
father_occupation_choice = (
("Agriculture", "Agriculture"),
("Banker", "Banker"),
("Business", "Business"),
("Doctor", "Doctor"),
("Farmer", "Farmer"),
("Fisherman", "Fisherman"),
("Public Service", "Public Service"),
("Private Service", "Private Service"),
("Shopkeeper", "Shopkeeper"),
("Driver", "Driver"),
("Worker", "Worker"),
("agriculture", "Agriculture"),
("banker", "Banker"),
("business", "Business"),
("doctor", "Doctor"),
("farmer", "Farmer"),
("fisherman", "Fisherman"),
("public service", "Public Service"),
("private service", "Private Service"),
("shopkeeper", "Shopkeeper"),
("driver", "Driver"),
("worker", "Worker"),
("N/A", "N/A"),
)
father_occupation = models.CharField(
@@ -136,18 +135,18 @@ class Student(BaseUser):
)
mother_email = models.EmailField(blank=True, null=True)
mother_occupation_choice = (
("Agriculture", "Agriculture"),
("Banker", "Banker"),
("Business", "Business"),
("Doctor", "Doctor"),
("Farmer", "Farmer"),
("Fisherman", "Fisherman"),
("Public Service", "Public Service"),
("Private Service", "Private Service"),
("Shopkeeper", "Shopkeeper"),
("Driver", "Driver"),
("HouseWife", "HouseWife"),
("Worker", "Worker"),
("agriculture", "Agriculture"),
("banker", "Banker"),
("business", "Business"),
("doctor", "Doctor"),
("farmer", "Farmer"),
("fisherman", "Fisherman"),
("public service", "Public Service"),
("private service", "Private Service"),
("shopkeeper", "Shopkeeper"),
("driver", "Driver"),
("houseWife", "HouseWife"),
("worker", "Worker"),
("N/A", "N/A"),
)
mother_occupation = models.CharField(
@@ -159,13 +158,13 @@ class Student(BaseUser):
)
guardian_email = models.EmailField(blank=True, null=True)
relationship_choice = (
("Father", "Father"),
("Mother", "Mother"),
("Brother", "Brother"),
("Sister", "Sister"),
("Uncle", "Uncle"),
("Aunt", "Aunt"),
("Grandfather", "Grandfather"),
("father", "Father"),
("mother", "Mother"),
("brother", "Brother"),
("sister", "Sister"),
("uncle", "Uncle"),
("aunt", "Aunt"),
("grandfather", "Grandfather"),
)
relationship_with_student = models.CharField(
choices=relationship_choice, max_length=45
@@ -182,13 +181,13 @@ class Staff(BaseUser):
position = models.CharField(
max_length=255,
choices=[
("Lab Assistant", "Lab Assistant"),
("Librarian", "Librarian"),
("Accountant", "Accountant"),
("Guard", "Guard"),
("Driver", "Driver"),
("Helper", "Helper"),
("Cleaner", "Cleaner"),
("lab Assistant", "Lab Assistant"),
("librarian", "Librarian"),
("accountant", "Accountant"),
("guard", "Guard"),
("driver", "Driver"),
("helper", "Helper"),
("cleaner", "Cleaner"),
],
)
address = models.CharField(max_length=255)
@@ -211,13 +210,13 @@ class Staff(BaseUser):
class Course(models.Model):
name = models.CharField(max_length=100)
level_choice = (
("Basic", "Basic"),
("Primary", "Primary"),
("Secondary", "Secondary"),
("Vocational Traning", "Vocational Traning"),
("Higher Secondary", "Higher Secondary"),
("Graduation", "Graduation"),
("Post Graduation", "Post Graduation"),
("basic", "Basic"),
("primary", "Primary"),
("secondary", "Secondary"),
("vocational traning", "Vocational Traning"),
("higher secondary", "Higher Secondary"),
("graduation", "Graduation"),
("post graduation", "Post Graduation"),
)
level = models.CharField(choices=level_choice, max_length=45)
course_type = models.CharField(
@@ -239,7 +238,7 @@ class AcademicYear(models.Model):
year = models.CharField(max_length=255, unique=True)
def __str__(self):
return self.batch
return self.year
class Meta:
verbose_name = "Academic Year"
@@ -271,15 +270,17 @@ class Subject(models.Model):
# NewsEvent model
class NewsEvent(models.Model):
class NewsEventType(models.TextChoices):
NEWS = "news", "News"
EVENT = "event", "Event"
title = models.CharField(max_length=255)
summary = models.TextField()
type = models.CharField(
max_length=5, choices=[("news", "News"), ("event", "Event")]
)
type = models.CharField(max_length=5, choices=NewsEventType.choices)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.title} ({self.get_type_display()})"
return f"{self.title} ({self.type})"
class Meta:
verbose_name = "News/Event"
@@ -337,7 +338,7 @@ class Library(models.Model):
category = models.CharField(max_length=255)
book_name = models.CharField(max_length=255)
description = models.CharField(max_length=255)
author = models.CharField(max_length=255)
publication = models.CharField(max_length=255)
publication_year = models.PositiveIntegerField()
quantity = models.PositiveIntegerField()
available = models.CharField(max_length=1, choices=[("Y", "Yes"), ("N", "NO")])
@@ -349,3 +350,208 @@ class Library(models.Model):
class Meta:
verbose_name = "Library"
verbose_name_plural = "Library"
class Certificate(models.Model):
id = models.AutoField(primary_key=True)
student = models.ForeignKey("Student", on_delete=models.CASCADE)
course = models.ForeignKey("Course", on_delete=models.CASCADE)
title = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
issue_date = models.DateField(auto_now_add=True)
class Meta:
verbose_name = "Certificate"
verbose_name_plural = "Certificate"
class Marksheet(models.Model):
student = models.ForeignKey(
"Student", on_delete=models.CASCADE, related_name="marksheets"
)
course = models.ForeignKey(
"Course", on_delete=models.CASCADE, related_name="marksheets"
)
total_marks = models.PositiveIntegerField(
validators=[MinValueValidator(1)],
default=Decimal("0.00"),
help_text="Total marks for the course",
# editable=False,
)
obtained_marks = models.PositiveIntegerField(
validators=[MinValueValidator(0)],
default=Decimal("0.00"),
help_text="Total marks obtained by the student",
# editable=False,
)
grade = models.CharField(
max_length=2,
choices=[
# ("A+", "Outstanding"),
# ("A", "Excellent"),
# ("B+", "Very Good"),
# ("B", "Good"),
# ("C+", "Above Average"),
# ("C", "Average"),
# ("D", "Below Average"),
# ("E", "Fail"),
("A+", "A+"),
("A", "A"),
("B+", "B+"),
("B", "B"),
("C+", "C+"),
("C", "C"),
("D", "D"),
("E", "E"),
],
blank=True,
null=True,
help_text="Grade assigned based on marks",
)
class Meta:
verbose_name = "Marksheet"
verbose_name_plural = "Marksheets"
unique_together = ("student", "course")
def calculate_totals(self):
subject_marks = self.subject_marks.all()
total_marks = sum(
subject.total_practical_marks + subject.total_theory_marks
for subject in subject_marks
) or Decimal("0.00")
obtained_marks = sum(
subject.obtained_practical_marks + subject.obtained_theory_marks
for subject in subject_marks
) or Decimal("0.00")
return total_marks, obtained_marks
def save(self, *args, **kwargs):
if not self.pk:
super().save(*args, **kwargs)
self.total_marks, self.obtained_marks = self.calculate_totals()
if self.total_marks > 0:
percentage = (self.obtained_marks / self.total_marks) * 100
if percentage >= 90:
self.grade = "A+"
elif percentage >= 80:
self.grade = "A"
elif percentage >= 70:
self.grade = "B+"
elif percentage >= 60:
self.grade = "B"
elif percentage >= 50:
self.grade = "C+"
elif percentage >= 40:
self.grade = "C"
elif percentage >= 30:
self.grade = "D"
else:
self.grade = "E"
super().save(*args, **kwargs)
def __str__(self):
return f"Marksheet: {self.student.first_name} {self.student.last_name}"
class SubjectMark(models.Model):
marksheet = models.ForeignKey(
Marksheet, on_delete=models.CASCADE, related_name="subject_marks"
)
subject = models.ForeignKey(
"Subject", on_delete=models.CASCADE, related_name="subject_marks"
)
obtained_practical_marks = models.DecimalField(
max_digits=5, decimal_places=2, default=Decimal("0.00")
)
total_practical_marks = models.DecimalField(
max_digits=5, decimal_places=2, default=Decimal("20.00")
)
obtained_theory_marks = models.DecimalField(
max_digits=5, decimal_places=2, default=Decimal("0.00")
)
total_theory_marks = models.DecimalField(
max_digits=5, decimal_places=2, default=Decimal("80.00")
)
total_marks = models.DecimalField(
max_digits=5, decimal_places=2, default=Decimal("0.00")
)
def get_total(self):
return Decimal(str(self.obtained_practical_marks or 0)) + Decimal(
str(self.obtained_theory_marks or 0)
)
def save(self, *args, **kwargs):
self.total_marks = self.get_total()
super().save(*args, **kwargs)
self.marksheet.save()
class Meta:
unique_together = ("marksheet", "subject")
def __str__(self):
return f"{self.subject.name} - {self.marksheet.student.first_name}"
# class Marksheet(models.Model):
# student = models.ForeignKey(
# "Student", on_delete=models.CASCADE, related_name="marksheets"
# )
# course = models.ForeignKey(
# "Course", on_delete=models.CASCADE, related_name="marksheets"
# )
# subj_result = models.ForeignKey(
# "Result", on_delete=models.CASCADE, related_name="marksheets", null=True
# )
# marks_obtained = models.PositiveIntegerField(
# validators=[MinValueValidator(0)], help_text="Marks obtained by the student"
# )
# total_marks = models.PositiveIntegerField(
# validators=[MinValueValidator(1)], help_text="Total marks for the subject"
# )
# grade = models.CharField(
# max_length=2,
# choices=[
# ("A+", "Excellent"),
# ("A", "Very Good"),
# ("B", "Good"),
# ("C", "Average"),
# ("D", "Below Average"),
# ("F", "Fail"),
# ],
# blank=True,
# null=True,
# help_text="Grade assigned based on marks",
# )
#
# class Meta:
# verbose_name = "Marksheet"
# verbose_name_plural = "Marksheets"
# unique_together = ("student", "course")
#
# def save(self, *args, **kwargs):
# percentage = (self.marks_obtained / self.total_marks) * 100
# if percentage >= 90:
# self.grade = "A+"
# elif percentage >= 80:
# self.grade = "A"
# elif percentage >= 70:
# self.grade = "B"
# elif percentage >= 60:
# self.grade = "C"
# elif percentage >= 50:
# self.grade = "D"
# else:
# self.grade = "F"
#
# super().save(*args, **kwargs)
#
# def __str__(self):
# return f"Marksheet: {self.student.first_name} {self.student.last_name}"