Merge branch 'main' into feature/auto-generate-credentials
This commit is contained in:
commit
c4ae370d5a
1
TODO.md
1
TODO.md
@ -10,7 +10,6 @@
|
|||||||
- **Integrate the dashboard with dynamic/live data**:
|
- **Integrate the dashboard with dynamic/live data**:
|
||||||
- Overall attendance
|
- Overall attendance
|
||||||
- School demographics
|
- School demographics
|
||||||
- Gender
|
|
||||||
- Lecturer qualification
|
- Lecturer qualification
|
||||||
- Students' level
|
- Students' level
|
||||||
- Students average grade per course:
|
- Students average grade per course:
|
||||||
|
|||||||
@ -9,7 +9,7 @@ from django.contrib.auth.forms import (
|
|||||||
)
|
)
|
||||||
from django.contrib.auth.forms import PasswordResetForm
|
from django.contrib.auth.forms import PasswordResetForm
|
||||||
from course.models import Program
|
from course.models import Program
|
||||||
from .models import User, Student, Parent, RELATION_SHIP, LEVEL
|
from .models import User, Student, Parent, RELATION_SHIP, LEVEL, GENDERS
|
||||||
|
|
||||||
|
|
||||||
class StaffAddForm(UserCreationForm):
|
class StaffAddForm(UserCreationForm):
|
||||||
@ -200,6 +200,15 @@ class StudentAddForm(UserCreationForm):
|
|||||||
label="Last name",
|
label="Last name",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
gender = forms.CharField(
|
||||||
|
widget=forms.Select(
|
||||||
|
choices=GENDERS,
|
||||||
|
attrs={
|
||||||
|
"class": "browser-default custom-select form-control",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
level = forms.CharField(
|
level = forms.CharField(
|
||||||
widget=forms.Select(
|
widget=forms.Select(
|
||||||
choices=LEVEL,
|
choices=LEVEL,
|
||||||
@ -266,6 +275,8 @@ class StudentAddForm(UserCreationForm):
|
|||||||
user.is_lecturer = True
|
user.is_lecturer = True
|
||||||
user.first_name = self.cleaned_data.get("first_name")
|
user.first_name = self.cleaned_data.get("first_name")
|
||||||
user.last_name = self.cleaned_data.get("last_name")
|
user.last_name = self.cleaned_data.get("last_name")
|
||||||
|
user.gender = self.cleaned_data.get("gender")
|
||||||
|
user.address = self.cleaned_data.get("address")
|
||||||
user.phone = self.cleaned_data.get("phone")
|
user.phone = self.cleaned_data.get("phone")
|
||||||
user.address = self.cleaned_data.get("address")
|
user.address = self.cleaned_data.get("address")
|
||||||
user.email = self.cleaned_data.get("email")
|
user.email = self.cleaned_data.get("email")
|
||||||
|
|||||||
18
accounts/migrations/0019_user_gender.py
Normal file
18
accounts/migrations/0019_user_gender.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 4.0.8 on 2024-01-31 21:17
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('accounts', '0018_rename_department_student_program'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='gender',
|
||||||
|
field=models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female')], max_length=1, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -55,11 +55,15 @@ class CustomUserManager(UserManager):
|
|||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
GENDERS = (("M", "Male"), ("F", "Female"))
|
||||||
|
|
||||||
|
|
||||||
class User(AbstractUser):
|
class User(AbstractUser):
|
||||||
is_student = models.BooleanField(default=False)
|
is_student = models.BooleanField(default=False)
|
||||||
is_lecturer = models.BooleanField(default=False)
|
is_lecturer = models.BooleanField(default=False)
|
||||||
is_parent = models.BooleanField(default=False)
|
is_parent = models.BooleanField(default=False)
|
||||||
is_dep_head = models.BooleanField(default=False)
|
is_dep_head = models.BooleanField(default=False)
|
||||||
|
gender = models.CharField(max_length=1, choices=GENDERS, blank=True, null=True)
|
||||||
phone = models.CharField(max_length=60, blank=True, null=True)
|
phone = models.CharField(max_length=60, blank=True, null=True)
|
||||||
address = models.CharField(max_length=60, blank=True, null=True)
|
address = models.CharField(max_length=60, blank=True, null=True)
|
||||||
picture = models.ImageField(
|
picture = models.ImageField(
|
||||||
@ -161,6 +165,13 @@ class Student(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.student.get_full_name
|
return self.student.get_full_name
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_gender_count(cls):
|
||||||
|
males_count = Student.objects.filter(student__gender="M").count()
|
||||||
|
females_count = Student.objects.filter(student__gender="F").count()
|
||||||
|
|
||||||
|
return {"M": males_count, "F": females_count}
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse("profile_single", kwargs={"id": self.id})
|
return reverse("profile_single", kwargs={"id": self.id})
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ from django.contrib.auth.decorators import login_required
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from accounts.decorators import admin_required, lecturer_required
|
from accounts.decorators import admin_required, lecturer_required
|
||||||
from accounts.models import User
|
from accounts.models import User, Student
|
||||||
from .forms import SessionForm, SemesterForm, NewsAndEventsForm
|
from .forms import SessionForm, SemesterForm, NewsAndEventsForm
|
||||||
from .models import *
|
from .models import *
|
||||||
|
|
||||||
@ -26,10 +26,13 @@ def home_view(request):
|
|||||||
@admin_required
|
@admin_required
|
||||||
def dashboard_view(request):
|
def dashboard_view(request):
|
||||||
logs = ActivityLog.objects.all().order_by("-created_at")[:10]
|
logs = ActivityLog.objects.all().order_by("-created_at")[:10]
|
||||||
|
gender_count = Student.get_gender_count()
|
||||||
context = {
|
context = {
|
||||||
"student_count": User.get_student_count(),
|
"student_count": User.get_student_count(),
|
||||||
"lecturer_count": User.get_lecturer_count(),
|
"lecturer_count": User.get_lecturer_count(),
|
||||||
"superuser_count": User.get_superuser_count(),
|
"superuser_count": User.get_superuser_count(),
|
||||||
|
"males_count": gender_count["M"],
|
||||||
|
"females_count": gender_count["F"],
|
||||||
"logs": logs,
|
"logs": logs,
|
||||||
}
|
}
|
||||||
return render(request, "core/dashboard.html", context)
|
return render(request, "core/dashboard.html", context)
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{{ form.first_name|as_crispy_field }}
|
{{ form.first_name|as_crispy_field }}
|
||||||
{{ form.last_name|as_crispy_field }}
|
{{ form.last_name|as_crispy_field }}
|
||||||
|
{{ form.gender|as_crispy_field }}
|
||||||
{{ form.email|as_crispy_field }}
|
{{ form.email|as_crispy_field }}
|
||||||
{{ form.address|as_crispy_field }}
|
{{ form.address|as_crispy_field }}
|
||||||
{{ form.phone|as_crispy_field }}
|
{{ form.phone|as_crispy_field }}
|
||||||
|
|||||||
@ -478,7 +478,7 @@
|
|||||||
],
|
],
|
||||||
datasets: [{
|
datasets: [{
|
||||||
label: "Students Gender Dataset",
|
label: "Students Gender Dataset",
|
||||||
data: [56, 44],
|
data: [{{ males_count }}, {{ females_count }}],
|
||||||
backgroundColor: [
|
backgroundColor: [
|
||||||
'rgb(255, 99, 132)',
|
'rgb(255, 99, 132)',
|
||||||
'rgb(54, 162, 235)'
|
'rgb(54, 162, 235)'
|
||||||
|
|||||||
@ -53,6 +53,10 @@
|
|||||||
<label for="last_name_id" class="form-label">{{ form.last_name.label }}</label>
|
<label for="last_name_id" class="form-label">{{ form.last_name.label }}</label>
|
||||||
{{ form.last_name }}
|
{{ form.last_name }}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="gender_id" class="form-label">{{ form.gender.label }}</label>
|
||||||
|
{{ form.gender }}
|
||||||
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="level_id" class="form-label">{{ form.level.label }}</label>
|
<label for="level_id" class="form-label">{{ form.level.label }}</label>
|
||||||
{{ form.level }}
|
{{ form.level }}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user