Skip to content

Commit 5cbe886

Browse files
committed
update
1 parent eebc2b8 commit 5cbe886

File tree

3 files changed

+89
-143
lines changed

3 files changed

+89
-143
lines changed

main/admin.py

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,18 @@
11
from django.contrib import admin
2-
from main.models import (
3-
Teacher,
4-
Student,
5-
Staff,
6-
Course,
7-
AcademicYear,
8-
Subject,
9-
NewsEvent,
10-
)
11-
12-
# Register your models here.
2+
from app.models import Teacher, Student, Staff, Course, AcademicYear, Subject, NewsEvent
133

144

5+
@admin.register(Teacher)
156
class TeacherAdmin(admin.ModelAdmin):
16-
list_display = ("first_name", "last_name", "email", "phone", "active_status")
17-
search_fields = ("first_name", "last_name", "email")
18-
list_filter = ("gender", "active_status")
7+
list_display = ("id", "first_name", "last_name", "email", "phone", "active_status")
8+
search_fields = ("first_name", "last_name", "email", "phone")
9+
list_filter = ("active_status", "gender", "group")
1910

2011

12+
@admin.register(Student)
2113
class StudentAdmin(admin.ModelAdmin):
2214
list_display = (
15+
"id",
2316
"first_name",
2417
"last_name",
2518
"email",
@@ -29,11 +22,13 @@ class StudentAdmin(admin.ModelAdmin):
2922
"active_status",
3023
)
3124
search_fields = ("first_name", "last_name", "email", "phone")
32-
list_filter = ("gender", "course", "academic_year", "active_status")
25+
list_filter = ("active_status", "gender", "course", "academic_year")
3326

3427

28+
@admin.register(Staff)
3529
class StaffAdmin(admin.ModelAdmin):
3630
list_display = (
31+
"id",
3732
"first_name",
3833
"last_name",
3934
"email",
@@ -42,37 +37,31 @@ class StaffAdmin(admin.ModelAdmin):
4237
"active_status",
4338
)
4439
search_fields = ("first_name", "last_name", "email", "phone")
45-
list_filter = ("position", "active_status")
40+
list_filter = ("active_status", "position", "group")
4641

4742

43+
@admin.register(Course)
4844
class CourseAdmin(admin.ModelAdmin):
49-
list_display = ("name", "course_type", "duration", "academic_year")
45+
list_display = ("id", "name", "course_type", "duration")
5046
search_fields = ("name",)
51-
list_filter = ("course_type", "academic_year")
47+
list_filter = ("course_type",)
5248

5349

50+
@admin.register(AcademicYear)
5451
class AcademicYearAdmin(admin.ModelAdmin):
55-
list_display = ("batch",)
52+
list_display = ("id", "batch")
5653
search_fields = ("batch",)
5754

5855

56+
@admin.register(Subject)
5957
class SubjectAdmin(admin.ModelAdmin):
60-
list_display = ("name", "course", "semester_or_year_number")
58+
list_display = ("id", "name", "course", "semester_or_year_number")
6159
search_fields = ("name", "course__name")
6260
list_filter = ("course", "semester_or_year_number")
6361

6462

63+
@admin.register(NewsEvent)
6564
class NewsEventAdmin(admin.ModelAdmin):
66-
list_display = ("title", "type", "created_at")
65+
list_display = ("id", "title", "type", "created_at")
6766
search_fields = ("title", "summary")
6867
list_filter = ("type", "created_at")
69-
70-
71-
# Register models with custom admin configurations
72-
admin.site.register(Teacher, TeacherAdmin)
73-
admin.site.register(Student, StudentAdmin)
74-
admin.site.register(Staff, StaffAdmin)
75-
admin.site.register(Course, CourseAdmin)
76-
admin.site.register(AcademicYear, AcademicYearAdmin)
77-
admin.site.register(Subject, SubjectAdmin)
78-
admin.site.register(NewsEvent, NewsEventAdmin)

main/migrations/0001_initial.py

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.1.4 on 2025-01-06 13:02
1+
# Generated by Django 5.1.4 on 2025-01-06 16:53
22

33
import django.core.validators
44
import django.db.models.deletion
@@ -17,14 +17,23 @@ class Migration(migrations.Migration):
1717
migrations.CreateModel(
1818
name='AcademicYear',
1919
fields=[
20-
('id', models.AutoField(primary_key=True, serialize=False)),
20+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
2121
('batch', models.CharField(max_length=255, unique=True)),
2222
],
2323
),
24+
migrations.CreateModel(
25+
name='Course',
26+
fields=[
27+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
28+
('name', models.CharField(max_length=100)),
29+
('course_type', models.CharField(choices=[('semester', 'Semester-based'), ('yearly', 'Yearly-based')], max_length=10)),
30+
('duration', models.PositiveIntegerField()),
31+
],
32+
),
2433
migrations.CreateModel(
2534
name='NewsEvent',
2635
fields=[
27-
('id', models.BigAutoField(primary_key=True, serialize=False)),
36+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
2837
('title', models.CharField(max_length=255)),
2938
('summary', models.TextField()),
3039
('type', models.CharField(choices=[('news', 'News'), ('event', 'Event')], max_length=5)),
@@ -34,67 +43,68 @@ class Migration(migrations.Migration):
3443
migrations.CreateModel(
3544
name='Staff',
3645
fields=[
37-
('id', models.AutoField(primary_key=True, serialize=False)),
46+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
3847
('first_name', models.CharField(max_length=255)),
3948
('last_name', models.CharField(max_length=255)),
40-
('position', models.CharField(choices=[('clerk', 'Clerk'), ('assistant', 'Assistant'), ('guard', 'Guard')], max_length=255)),
41-
('address', models.CharField(max_length=255)),
4249
('email', models.EmailField(max_length=255, unique=True)),
43-
('phone', models.CharField(max_length=15, validators=[django.core.validators.RegexValidator('^\\+?1?\\d{9,15}$', 'Enter a valid phone number.')])),
44-
('active_status', models.BooleanField(default=True)),
50+
('phone', models.CharField(max_length=15, validators=[django.core.validators.RegexValidator('^\\+?1?\\d{9,15}$')])),
4551
('username', models.CharField(blank=True, max_length=255, null=True, unique=True)),
4652
('password', models.CharField(max_length=255)),
53+
('active_status', models.BooleanField(default=True)),
54+
('position', models.CharField(choices=[('clerk', 'Clerk'), ('assistant', 'Assistant'), ('guard', 'Guard')], max_length=255)),
55+
('address', models.CharField(max_length=255)),
56+
('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='auth.group')),
4757
],
48-
),
49-
migrations.CreateModel(
50-
name='Course',
51-
fields=[
52-
('id', models.BigAutoField(primary_key=True, serialize=False)),
53-
('name', models.CharField(max_length=100)),
54-
('course_type', models.CharField(choices=[('semester', 'Semester-based'), ('yearly', 'Yearly-based')], max_length=10)),
55-
('duration', models.PositiveIntegerField(help_text='Number of semesters or years')),
56-
('academic_year', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.academicyear')),
57-
],
58+
options={
59+
'abstract': False,
60+
},
5861
),
5962
migrations.CreateModel(
6063
name='Student',
6164
fields=[
62-
('id', models.AutoField(primary_key=True, serialize=False)),
63-
('active_status', models.BooleanField(default=True)),
65+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
6466
('first_name', models.CharField(max_length=255)),
6567
('last_name', models.CharField(max_length=255)),
66-
('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1)),
67-
('phone', models.CharField(max_length=10, unique=True, validators=[django.core.validators.RegexValidator('^\\d{10}$', 'Enter a valid 10-digit phone number.')])),
6868
('email', models.EmailField(max_length=255, unique=True)),
69+
('phone', models.CharField(max_length=15, validators=[django.core.validators.RegexValidator('^\\+?1?\\d{9,15}$')])),
6970
('username', models.CharField(blank=True, max_length=255, null=True, unique=True)),
7071
('password', models.CharField(max_length=255)),
71-
('academic_year', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.academicyear')),
72-
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.course')),
72+
('active_status', models.BooleanField(default=True)),
73+
('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1)),
74+
('academic_year', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.academicyear')),
75+
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.course')),
76+
('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='auth.group')),
7377
],
78+
options={
79+
'abstract': False,
80+
},
7481
),
7582
migrations.CreateModel(
7683
name='Subject',
7784
fields=[
78-
('id', models.BigAutoField(primary_key=True, serialize=False)),
85+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
7986
('name', models.CharField(max_length=255)),
8087
('semester_or_year_number', models.PositiveIntegerField()),
81-
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='main.course')),
88+
('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subjects', to='app.course')),
8289
],
8390
),
8491
migrations.CreateModel(
8592
name='Teacher',
8693
fields=[
87-
('id', models.AutoField(primary_key=True, serialize=False)),
94+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
8895
('first_name', models.CharField(max_length=255)),
8996
('last_name', models.CharField(max_length=255)),
90-
('address', models.CharField(max_length=255)),
91-
('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1)),
9297
('email', models.EmailField(max_length=255, unique=True)),
93-
('phone', models.CharField(max_length=15, validators=[django.core.validators.RegexValidator('^\\+?1?\\d{9,15}$', 'Enter a valid phone number.')])),
94-
('active_status', models.BooleanField(default=True)),
98+
('phone', models.CharField(max_length=15, validators=[django.core.validators.RegexValidator('^\\+?1?\\d{9,15}$')])),
9599
('username', models.CharField(blank=True, max_length=255, null=True, unique=True)),
96100
('password', models.CharField(max_length=255)),
101+
('active_status', models.BooleanField(default=True)),
102+
('address', models.CharField(max_length=255)),
103+
('gender', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1)),
97104
('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='auth.group')),
98105
],
106+
options={
107+
'abstract': False,
108+
},
99109
),
100110
]

main/models.py

Lines changed: 28 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,118 +1,75 @@
11
from django.db import models
2-
import random
3-
from django.core.validators import RegexValidator
42
from django.contrib.auth.models import Group
5-
# Create your models here.
3+
from django.core.validators import RegexValidator
4+
from django.contrib.auth.hashers import make_password
5+
import random
66

77

8-
class Teacher(models.Model):
9-
id = models.AutoField(primary_key=True)
8+
class BaseUser(models.Model):
109
first_name = models.CharField(max_length=255)
1110
last_name = models.CharField(max_length=255)
12-
address = models.CharField(max_length=255)
13-
gender = models.CharField(max_length=1, choices=[("M", "Male"), ("F", "Female")])
1411
email = models.EmailField(max_length=255, unique=True)
1512
phone = models.CharField(
16-
max_length=15,
17-
validators=[RegexValidator(r"^\+?1?\d{9,15}$", "Enter a valid phone number.")],
13+
max_length=15, validators=[RegexValidator(r"^\+?1?\d{9,15}$")]
1814
)
19-
group = models.ForeignKey(Group, on_delete=models.SET_NULL, null=True, blank=True)
20-
active_status = models.BooleanField(default=True)
2115
username = models.CharField(max_length=255, unique=True, blank=True, null=True)
2216
password = models.CharField(max_length=255)
17+
active_status = models.BooleanField(default=True)
18+
group = models.ForeignKey(Group, on_delete=models.SET_NULL, null=True, blank=True)
19+
20+
class Meta:
21+
abstract = True
2322

2423
def save(self, *args, **kwargs):
2524
if not self.username:
26-
random_number = random.randint(1000, 9999)
27-
self.username = f"{self.first_name.lower()}_{random_number}"
25+
self.username = f"{self.first_name.lower()}_{random.randint(1000, 9999)}"
26+
if self._state.adding or not self.password.startswith("pbkdf2_"):
27+
self.password = make_password(self.password)
2828
super().save(*args, **kwargs)
2929

3030
def __str__(self):
3131
return f"{self.first_name} {self.last_name}"
3232

3333

34-
class Student(models.Model):
35-
id = models.AutoField(primary_key=True)
36-
active_status = models.BooleanField(default=True)
37-
first_name = models.CharField(max_length=255)
38-
last_name = models.CharField(max_length=255)
34+
class Teacher(BaseUser):
35+
address = models.CharField(max_length=255)
3936
gender = models.CharField(max_length=1, choices=[("M", "Male"), ("F", "Female")])
40-
phone = models.CharField(
41-
max_length=10,
42-
unique=True,
43-
validators=[
44-
RegexValidator(r"^\d{10}$", "Enter a valid 10-digit phone number.")
45-
],
46-
)
47-
email = models.EmailField(max_length=255, unique=True)
48-
course = models.ForeignKey("Course", on_delete=models.CASCADE)
49-
academic_year = models.ForeignKey("AcademicYear", on_delete=models.CASCADE)
50-
username = models.CharField(max_length=255, unique=True, blank=True, null=True)
51-
password = models.CharField(max_length=255)
5237

53-
def save(self, *args, **kwargs):
54-
if not self.username:
55-
random_number = random.randint(1000, 9999)
56-
self.username = f"{self.first_name.lower()}_{random_number}"
57-
super().save(*args, **kwargs)
5838

59-
def __str__(self):
60-
return f"{self.first_name} {self.last_name}"
39+
class Student(BaseUser):
40+
gender = models.CharField(max_length=1, choices=[("M", "Male"), ("F", "Female")])
41+
course = models.ForeignKey("Course", on_delete=models.CASCADE)
42+
academic_year = models.ForeignKey("AcademicYear", on_delete=models.CASCADE)
6143

6244

63-
class Staff(models.Model):
64-
id = models.AutoField(primary_key=True)
65-
first_name = models.CharField(max_length=255)
66-
last_name = models.CharField(max_length=255)
45+
class Staff(BaseUser):
6746
position = models.CharField(
6847
max_length=255,
6948
choices=[("clerk", "Clerk"), ("assistant", "Assistant"), ("guard", "Guard")],
7049
)
7150
address = models.CharField(max_length=255)
72-
email = models.EmailField(max_length=255, unique=True)
73-
phone = models.CharField(
74-
max_length=15,
75-
validators=[RegexValidator(r"^\+?1?\d{9,15}$", "Enter a valid phone number.")],
76-
)
77-
active_status = models.BooleanField(default=True)
78-
username = models.CharField(max_length=255, unique=True, blank=True, null=True)
79-
password = models.CharField(max_length=255)
80-
81-
def save(self, *args, **kwargs):
82-
if not self.username:
83-
random_number = random.randint(1000, 9999)
84-
self.username = f"{self.first_name.lower()}_{random_number}"
85-
super().save(*args, **kwargs)
86-
87-
def __str__(self):
88-
return f"{self.first_name} {self.last_name}"
8951

9052

9153
class Course(models.Model):
92-
id = models.BigAutoField(primary_key=True)
93-
COURSE_TYPE_CHOICES = [
94-
("semester", "Semester-based"),
95-
("yearly", "Yearly-based"),
96-
]
9754
name = models.CharField(max_length=100)
98-
academic_year = models.ForeignKey("AcademicYear", on_delete=models.CASCADE)
99-
course_type = models.CharField(max_length=10, choices=COURSE_TYPE_CHOICES)
100-
duration = models.PositiveIntegerField(help_text="Number of semesters or years")
55+
course_type = models.CharField(
56+
max_length=10,
57+
choices=[("semester", "Semester-based"), ("yearly", "Yearly-based")],
58+
)
59+
duration = models.PositiveIntegerField()
10160

10261
def __str__(self):
10362
return self.name
10463

10564

10665
class AcademicYear(models.Model):
107-
id = models.AutoField(primary_key=True)
10866
batch = models.CharField(max_length=255, unique=True)
10967

11068
def __str__(self):
11169
return f"Batch {self.batch}"
11270

11371

11472
class Subject(models.Model):
115-
id = models.BigAutoField(primary_key=True)
11673
name = models.CharField(max_length=255)
11774
course = models.ForeignKey(
11875
"Course", on_delete=models.CASCADE, related_name="subjects"
@@ -124,22 +81,12 @@ def __str__(self):
12481

12582

12683
class NewsEvent(models.Model):
127-
TYPE_CHOICES = [
128-
("news", "News"),
129-
("event", "Event"),
130-
]
131-
id = models.BigAutoField(primary_key=True)
13284
title = models.CharField(max_length=255)
13385
summary = models.TextField()
134-
type = models.CharField(max_length=5, choices=TYPE_CHOICES)
86+
type = models.CharField(
87+
max_length=5, choices=[("news", "News"), ("event", "Event")]
88+
)
13589
created_at = models.DateTimeField(auto_now_add=True)
13690

13791
def __str__(self):
13892
return f"{self.title} ({self.get_type_display()})"
139-
140-
141-
USER_CHOICES = [
142-
("staff", "Staff"),
143-
("teacher", "Teacher"),
144-
("student", "Student"),
145-
]

0 commit comments

Comments
 (0)