The Academics module is the educational backbone of the NAMETS platform. It manages tutorial and Islamiyya courses, session timetables, study materials, exam results, peer resource submissions, Islamiyya enrolment with payment verification, and inter-association competition results.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Muhammadbugaje/NAMETS_Website/llms.txt
Use this file to discover all available pages before exploring further.
Data Models
Tutor
Tutor
Represents an individual who teaches one or more courses.
Ordered alphabetically by
| Field | Type | Notes |
|---|---|---|
name | CharField | Full name, max 200 chars |
bio | TextField | Optional background information |
is_active | BooleanField | Controls appearance in listings |
name. Related to Course via a many-to-many relationship.Course
Course
The central academic unit. Can be a regular tutorial or an Islamiyya course.
| Field | Type | Notes |
|---|---|---|
name | CharField | Course name, max 200 chars |
slug | SlugField | Unique URL identifier |
description | TextField | Detailed course overview |
course_type | CharField | tutorial or islamiyya |
is_active | BooleanField | Hides course from public views when False |
tutors | M2M → Tutor | One or more assigned tutors |
created_at | DateTimeField | Auto-set on creation |
TutorEvaluation
TutorEvaluation
Anonymous or named student feedback for a tutor within a specific course.
Evaluations are only accessible when
| Field | Type | Notes |
|---|---|---|
course | ForeignKey | The course being evaluated |
tutor | ForeignKey | The tutor being rated |
student_name | CharField | Optional — leave blank for anonymous |
rating | IntegerField | Scale 1–5 |
comments | TextField | Free-text feedback |
submitted_at | DateTimeField | Auto-set on submission |
SiteSettings.tutor_evaluations_open is True.Session
Session
A scheduled class meeting within a course.
Ordered by
| Field | Type | Notes |
|---|---|---|
course | ForeignKey | Parent course |
title | CharField | Optional session title |
date | DateField | Session date |
start_time | TimeField | Session start |
end_time | TimeField | Session end |
location | CharField | Venue (optional) |
is_active | BooleanField | Controls visibility |
date then start_time.Material
Material
A study resource attached to a course. Supports direct file upload or a Google Drive link.
The
| Field | Type | Notes |
|---|---|---|
course | ForeignKey | Parent course |
title | CharField | Material title |
description | TextField | Optional summary |
file | CloudinaryField | Uploaded to Cloudinary materials/ folder |
drive_link | URLField | Google Drive share link (alternative) |
is_active | BooleanField | Controls public availability |
is_featured | BooleanField | Shown on the course list page when True |
uploaded_at | DateTimeField | Auto-set on upload |
download_material view redirects to the Cloudinary URL with a forced download flag, or falls back to the Drive link.Evaluation & Result
Evaluation & Result
Evaluation — an exam or test event for a course.
Result — an individual student’s score for an evaluation.
| Field | Type | Notes |
|---|---|---|
course | ForeignKey | Parent course |
title | CharField | Exam name |
date | DateField | Date of exam |
total_marks | PositiveIntegerField | Maximum possible score |
is_featured | BooleanField | Show on course list page |
| Field | Type | Notes |
|---|---|---|
evaluation | ForeignKey | Parent evaluation |
student_name | CharField | Full name |
registration_number | CharField | Matric or student ID |
student_email | EmailField | Optional |
marks_obtained | DecimalField | Score (max 5 digits, 2 dp) |
grade | CharField | Letter grade (e.g., A, B) |
remarks | TextField | Optional comments |
TimetableEntry
TimetableEntry
A recurring schedule slot in the weekly timetable.
Entries are ordered by
| Field | Type | Notes |
|---|---|---|
day | IntegerField | 1 = Monday … 7 = Sunday |
time_start | TimeField | Slot start |
time_end | TimeField | Slot end |
course_name | CharField | Display name for this slot |
venue | CharField | Optional location |
entry_type | CharField | tutorial or islamiyya |
level | CharField | level1 or level2 (see below) |
is_active | BooleanField | Hides slot from timetable |
order | PositiveIntegerField | Manual sort within a day |
entry_type → level → day → time_start → order.Level meanings:level1— First-year / beginner group (displayed on the Level 1 timetable tab)level2— Second-year / advanced group (displayed on the Level 2 timetable tab)
IslamiyyaCourse & IslamiyyaRegistration
IslamiyyaCourse & IslamiyyaRegistration
IslamiyyaCourse — a simple list of available Islamiyya subject names (e.g., Tajweed, Fiqh).IslamiyyaRegistration — a student’s enrolment record.
The
| Field | Type | Notes |
|---|---|---|
name | CharField | Full name |
registration_number | CharField | University matric / student ID |
gender | CharField | M or F |
photo | CloudinaryField | Stored in islamiyya_photos/ |
department | CharField | Faculty department |
email | EmailField | Unique per registration |
phone | CharField | Contact phone |
level | CharField | beginner, intermediate, or advanced |
courses | M2M | Selected IslamiyyaCourse records |
application_id | CharField | Auto-generated; format ISL-YYYY-XXXX |
is_verified | BooleanField | Set by admin after payment confirmed |
verified_at | DateTimeField | Auto-set when is_verified first becomes True |
whatsapp_link | URLField | Per-student group link (shown post-verification) |
is_active | BooleanField | Deactivate expired enrolments |
application_id is generated automatically using the pattern ISL-<year>-<sequence> (e.g., ISL-2025-0001).UserResourceSubmission
UserResourceSubmission
Peer-contributed study materials awaiting admin review.
Allowed file types:
| Field | Type | Notes |
|---|---|---|
title | CharField | Resource title |
description | TextField | What the resource covers |
file | CloudinaryField | Stored in user_resources/ |
submitted_by | CharField | Optional submitter name |
email | EmailField | Optional — for review notification |
status | CharField | pending, approved, or rejected |
submitted_at | DateTimeField | Auto-set on submission |
reviewed_at | DateTimeField | Set when admin acts on the submission |
download_count | PositiveIntegerField | Incremented on each download |
email_sent | BooleanField | Tracks whether submitter was notified |
pdf, doc, docx, jpg, jpeg, png, zip, pptx.CompetitionResult
CompetitionResult
Records outcomes from NAMETS-organised competitions (e.g., Musabaqah, Quiz).
Results are grouped by
| Field | Type | Notes |
|---|---|---|
event_name | CharField | e.g., NAMETS Week 2024 |
category | CharField | e.g., Musabaqah 60 Hizb, Quiz |
position | CharField | e.g., 1st, 2nd, participant |
participant_name | CharField | Full name of the participant |
department | CharField | Optional faculty/department |
points | DecimalField | Score (optional) |
year | CharField | Academic session, e.g., 2025/2026 |
is_active | BooleanField | Controls public display |
order | PositiveIntegerField | Lower numbers appear first within category |
event_name – category on the public page and can be filtered by event, category, and year.URL Routes
All routes are under/academics/ (app namespace: academics).
| Name | URL Pattern | Description |
|---|---|---|
course_list | /academics/ | Overview of tutorial & Islamiyya counts |
tutorial_list | /academics/tutorials/ | Tutorial courses + timetable |
islamia_list | /academics/islamiyya/ | Islamiyya courses + timetable |
course_detail | /academics/courses/<slug>/ | Single course details |
course_results | /academics/courses/<slug>/results/ | Student results for a course |
evaluate_tutor | /academics/courses/<slug>/evaluate/ | Submit a tutor evaluation |
student_search | /academics/students/search/ | Search results by name or reg number |
materials_list | /academics/courses/<slug>/materials/ | Course materials listing |
exams_list | /academics/courses/<slug>/exams/ | Exams for a specific course |
exam_list | /academics/exams/ | All active exams (filterable by course) |
exam_detail | /academics/exams/<int:exam_id>/ | Results for a specific exam |
all_results | /academics/results/ | All results (filterable) |
download_material | /academics/material/<int:material_id>/download/ | Redirect to Cloudinary or Drive link |
islamiyya_register | /academics/islamiyya/register/ | Islamiyya enrolment form |
islamiyya_check_status | /academics/islamiyya/status/ | Look up registration by email or reg no |
islamiyya_dashboard | /academics/islamiyya/dashboard/ | Registration summary + WhatsApp link |
resources | /academics/resources/ | Browse approved peer resources |
submit_resource | /academics/submit-resource/ | Submit a resource for admin review |
download_resource | /academics/download/<int:pk>/ | Increment counter and redirect to file |
competition_results | /academics/competition-results/ | Filtered competition results |
Islamiyya Registration Flow
Admin opens registration
In the Django admin,
SiteSettings.islamiyya_registration_open must be set to True. If closed, visitors see a closed-registration page.Student submits the registration form
The student fills in personal details, selects their level (beginner / intermediate / advanced), and chooses one or more
IslamiyyaCourse options at /academics/islamiyya/register/.Application ID is generated
On save, the model auto-generates an
application_id following the format ISL-YYYY-XXXX (e.g., ISL-2025-0003). The student is redirected to their dashboard.Student makes payment
The student pays the enrolment fee through the designated channel and keeps their
application_id handy.Admin verifies payment
In the admin, the admin locates the registration by
application_id or email and ticks is_verified = True. The system auto-sets verified_at to the current timestamp.WhatsApp links expire after 365 days from
verified_at. Once expired, the link is hidden from the dashboard and expired = True is passed to the template.UserResourceSubmission Approval Workflow
Student submits a resource
Using the form at
/academics/submit-resource/, the student uploads a file (PDF, DOCX, PPTX, ZIP, or image). The record is saved with status = 'pending'.Admin reviews the submission
In the Django admin, the admin opens the
UserResourceSubmission record, previews the file, and changes status to either approved or rejected. The reviewed_at timestamp is set at this point.Resource becomes public (if approved)
Approved resources appear in the paginated listing at
/academics/resources/ and are searchable by title and description.