591 lines
18 KiB
Python
591 lines
18 KiB
Python
# Standard library imports
|
|
import django.db
|
|
|
|
# Third-party app imports
|
|
from rest_framework import serializers
|
|
|
|
# Local app imports
|
|
from app.firebase import FCMDevice
|
|
from app.models import (
|
|
Attendance,
|
|
AttendanceRecord,
|
|
Batch,
|
|
Course,
|
|
CourseTracking,
|
|
Institute,
|
|
InstituteFeedback,
|
|
Notice,
|
|
Parent,
|
|
ParentFeedback,
|
|
ParentInstituteFeedback,
|
|
Routine,
|
|
Staff,
|
|
StaffInstituteFeedback,
|
|
StaffLeave,
|
|
Student,
|
|
StudentFeedback,
|
|
StudentLeave,
|
|
Subject,
|
|
SubjectFile,
|
|
TeacherParentMeeting,
|
|
TOTPSecret,
|
|
ResetToken,
|
|
)
|
|
|
|
|
|
class FCMDeviceSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = FCMDevice
|
|
fields = ["id", "token"]
|
|
|
|
|
|
class InstituteSerializer(serializers.ModelSerializer):
|
|
logo_url = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Institute
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"phone",
|
|
"email",
|
|
"address",
|
|
"pan_no",
|
|
"reg_no",
|
|
"logo",
|
|
"logo_url",
|
|
"description",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_logo_url(self, obj):
|
|
if obj.logo:
|
|
return obj.logo.url
|
|
return None
|
|
|
|
|
|
class BatchSerializer(serializers.ModelSerializer):
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Batch
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"year",
|
|
"is_active",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class CourseSerializer(serializers.ModelSerializer):
|
|
subjects = serializers.SerializerMethodField()
|
|
batches = BatchSerializer(many=True, read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Course
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"code",
|
|
"duration",
|
|
"duration_type",
|
|
"description",
|
|
"is_active",
|
|
"subjects",
|
|
"batches",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_subjects(self, obj):
|
|
from app.serializers import SubjectSerializer
|
|
subjects = obj.subjects.all()
|
|
return SubjectSerializer(subjects, many=True).data
|
|
|
|
|
|
class SubjectSerializer(serializers.ModelSerializer):
|
|
course = CourseSerializer(read_only=True)
|
|
syllabus_pdf_url = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Subject
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"code",
|
|
"course",
|
|
"period_or_year",
|
|
"syllabus_pdf",
|
|
"syllabus_pdf_url",
|
|
"is_active",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_syllabus_pdf_url(self, obj):
|
|
if obj.syllabus_pdf:
|
|
return obj.syllabus_pdf.url
|
|
return None
|
|
|
|
|
|
class StudentSerializer(serializers.ModelSerializer):
|
|
batches = BatchSerializer(many=True, read_only=True)
|
|
course = CourseSerializer(read_only=True)
|
|
image_url = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Student
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"status",
|
|
"gender",
|
|
"birth_date",
|
|
"email",
|
|
"phone",
|
|
"temporary_address",
|
|
"permanent_address",
|
|
"marital_status",
|
|
"parent_name",
|
|
"parent_phone",
|
|
"citizenship_no",
|
|
"image",
|
|
"image_url",
|
|
"batches",
|
|
"course",
|
|
"current_period",
|
|
"joining_date",
|
|
"fcm_token",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_image_url(self, obj):
|
|
if obj.image:
|
|
return obj.image.url
|
|
return None
|
|
|
|
|
|
class StaffSerializer(serializers.ModelSerializer):
|
|
image_url = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Staff
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"gender",
|
|
"designation",
|
|
"birth_date",
|
|
"phone",
|
|
"email",
|
|
"temporary_address",
|
|
"permanent_address",
|
|
"marital_status",
|
|
"parent_name",
|
|
"parent_phone",
|
|
"citizenship_no",
|
|
"passport",
|
|
"image",
|
|
"image_url",
|
|
"joining_date",
|
|
"is_active",
|
|
"fcm_token",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_image_url(self, obj):
|
|
if obj.image:
|
|
return obj.image.url
|
|
return None
|
|
|
|
|
|
class RoutineSerializer(serializers.ModelSerializer):
|
|
course = CourseSerializer(read_only=True)
|
|
subject = SubjectSerializer(read_only=True)
|
|
teacher = StaffSerializer(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Routine
|
|
fields = [
|
|
"id",
|
|
"course",
|
|
"subject",
|
|
"teacher",
|
|
"start_time",
|
|
"end_time",
|
|
"period_or_year",
|
|
"is_active",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class AttendanceSerializer(serializers.ModelSerializer):
|
|
routine = RoutineSerializer(read_only=True)
|
|
teacher = StaffSerializer(read_only=True)
|
|
records = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Attendance
|
|
fields = [
|
|
"id",
|
|
"date",
|
|
"routine",
|
|
"teacher",
|
|
"teacher_attend",
|
|
"class_status",
|
|
"records",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_records(self, obj):
|
|
from app.serializers import AttendanceRecordSerializer
|
|
records = obj.records.all()
|
|
return AttendanceRecordSerializer(records, many=True).data
|
|
|
|
|
|
class AttendanceRecordSerializer(serializers.ModelSerializer):
|
|
student = StudentSerializer(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = AttendanceRecord
|
|
fields = [
|
|
"id",
|
|
"attendance",
|
|
"student",
|
|
"student_attend",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class NoticeSerializer(serializers.ModelSerializer):
|
|
image_url = serializers.SerializerMethodField()
|
|
file_url = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Notice
|
|
fields = [
|
|
"id",
|
|
"title",
|
|
"image",
|
|
"image_url",
|
|
"message",
|
|
"file",
|
|
"file_url",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_image_url(self, obj):
|
|
if obj.image:
|
|
return obj.image.url
|
|
return None
|
|
|
|
def get_file_url(self, obj):
|
|
if obj.file:
|
|
return obj.file.url
|
|
return None
|
|
|
|
|
|
class StaffLeaveSerializer(serializers.ModelSerializer):
|
|
staff = StaffSerializer(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = StaffLeave
|
|
fields = [
|
|
"id",
|
|
"staff",
|
|
"start_date",
|
|
"end_date",
|
|
"message",
|
|
"status",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class StudentLeaveSerializer(serializers.ModelSerializer):
|
|
student = StudentSerializer(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = StudentLeave
|
|
fields = [
|
|
"id",
|
|
"student",
|
|
"start_date",
|
|
"end_date",
|
|
"message",
|
|
"status",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class StudentFeedbackSerializer(serializers.ModelSerializer):
|
|
student = StudentSerializer(read_only=True)
|
|
teacher = StaffSerializer(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = StudentFeedback
|
|
fields = [
|
|
"id",
|
|
"student",
|
|
"teacher",
|
|
"rating",
|
|
"feedback_text",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class ParentFeedbackSerializer(serializers.ModelSerializer):
|
|
parent = serializers.SerializerMethodField()
|
|
teacher = StaffSerializer(read_only=True)
|
|
student = StudentSerializer(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = ParentFeedback
|
|
fields = [
|
|
"id",
|
|
"parent",
|
|
"teacher",
|
|
"student",
|
|
"rating",
|
|
"feedback_text",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_parent(self, obj):
|
|
from app.serializers import ParentSerializer
|
|
return ParentSerializer(obj.parent).data
|
|
|
|
|
|
class InstituteFeedbackSerializer(serializers.ModelSerializer):
|
|
institute = InstituteSerializer(read_only=True)
|
|
user = StudentSerializer(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = InstituteFeedback
|
|
fields = [
|
|
"id",
|
|
"institute",
|
|
"user",
|
|
"feedback_type",
|
|
"rating",
|
|
"feedback_text",
|
|
"is_anonymous",
|
|
"is_public",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class StaffInstituteFeedbackSerializer(serializers.ModelSerializer):
|
|
institute = InstituteSerializer(read_only=True)
|
|
staff = StaffSerializer(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = StaffInstituteFeedback
|
|
fields = [
|
|
"id",
|
|
"institute",
|
|
"staff",
|
|
"feedback_type",
|
|
"rating",
|
|
"feedback_text",
|
|
"is_anonymous",
|
|
"is_public",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
|
|
class ParentInstituteFeedbackSerializer(serializers.ModelSerializer):
|
|
institute = InstituteSerializer(read_only=True)
|
|
parent = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = ParentInstituteFeedback
|
|
fields = [
|
|
"id",
|
|
"institute",
|
|
"parent",
|
|
"feedback_type",
|
|
"rating",
|
|
"feedback_text",
|
|
"is_anonymous",
|
|
"is_public",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_parent(self, obj):
|
|
from app.serializers import ParentSerializer
|
|
return ParentSerializer(obj.parent).data
|
|
|
|
|
|
class CourseTrackingSerializer(serializers.ModelSerializer):
|
|
student = StudentSerializer(read_only=True)
|
|
course = CourseSerializer(read_only=True)
|
|
current_period_display = serializers.CharField(read_only=True)
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = CourseTracking
|
|
fields = [
|
|
"id",
|
|
"student",
|
|
"course",
|
|
"enrollment_date",
|
|
"start_date",
|
|
"expected_end_date",
|
|
"actual_end_date",
|
|
"progress_status",
|
|
"completion_percentage",
|
|
"current_period",
|
|
"current_period_display",
|
|
"period_start_date",
|
|
"period_end_date",
|
|
"notes",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at", "current_period_display"]
|
|
|
|
|
|
class SubjectFileSerializer(serializers.ModelSerializer):
|
|
file_url = serializers.SerializerMethodField()
|
|
uploaded_by = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = SubjectFile
|
|
fields = [
|
|
"id",
|
|
"subject",
|
|
"title",
|
|
"description",
|
|
"file",
|
|
"file_url",
|
|
"uploaded_by",
|
|
"uploaded_at",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at", "uploaded_at"]
|
|
|
|
def get_file_url(self, obj):
|
|
if obj.file:
|
|
return obj.file.url
|
|
return None
|
|
|
|
def get_uploaded_by(self, obj):
|
|
from app.serializers import StaffSerializer
|
|
if obj.uploaded_by:
|
|
return StaffSerializer(obj.uploaded_by).data
|
|
return None
|
|
|
|
|
|
class TOTPSecretSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = TOTPSecret
|
|
fields = ["id", "identifier", "secret_key", "created_at", "expires_at"]
|
|
read_only_fields = ["id", "created_at"]
|
|
|
|
|
|
class ResetTokenSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = ResetToken
|
|
fields = ["id", "token", "identifier", "created_at", "expires_at"]
|
|
read_only_fields = ["id", "created_at"]
|
|
|
|
|
|
class ParentSerializer(serializers.ModelSerializer):
|
|
students = StudentSerializer(many=True, read_only=True)
|
|
image_url = serializers.SerializerMethodField()
|
|
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
|
|
|
|
class Meta:
|
|
model = Parent
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"phone",
|
|
"email",
|
|
"address",
|
|
"students",
|
|
"image",
|
|
"image_url",
|
|
"fcm_token",
|
|
"is_active",
|
|
"created_at",
|
|
"updated_at",
|
|
]
|
|
read_only_fields = ["id", "created_at", "updated_at"]
|
|
|
|
def get_image_url(self, obj):
|
|
if obj.image:
|
|
return obj.image.url
|
|
return None
|