Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
5dd7aa1
- Disabled too-many-ancestors warning: irrelevant when using django-r…
MikaTech-dev Jan 3, 2026
04cd6c8
fixed disable not taking effect dude to parsing error
MikaTech-dev Jan 3, 2026
0a928bb
Fixed linting and FK specificity related errors in views.py
MikaTech-dev Jan 3, 2026
c8f516a
Altered pylint to fail only when under a score of 8 because i'm not G…
MikaTech-dev Jan 3, 2026
1e96410
Merge branch 'bug/linter-fixes' into feat/models
MikaTech-dev Jan 3, 2026
57bb7be
Merge pull request #8 from MikaTech-dev/feat/models
MikaTech-dev Jan 3, 2026
de9d8c8
Update README to include cmd to run pylint successfully in a venv
MikaTech-dev Jan 3, 2026
9023370
feat: add URL routing and database seeding command
MikaTech-dev Jan 5, 2026
c740c7d
removed trainling space for linting
MikaTech-dev Jan 5, 2026
46fe007
feat/grading
MikaTech-dev Jan 5, 2026
417771c
add requirements.txt (production) and dev-requirements.txt
MikaTech-dev Jan 6, 2026
cbe8556
- Removed transitive dependencies
MikaTech-dev Jan 6, 2026
cef94c5
Merge branch 'bug/linter-fixes' into development
MikaTech-dev Jan 6, 2026
0f8cd9b
Merge branch 'feat/grading' into development
MikaTech-dev Jan 6, 2026
110b76a
- Integrated AI feedback generation for each SA (Short answer question)
MikaTech-dev Jan 6, 2026
eda2860
- Increased exam quantity in seeder to 3
MikaTech-dev Jan 6, 2026
5732456
Merge branch 'feat/grading' into development
MikaTech-dev Jan 6, 2026
251135d
Integrate drf-spectacular for Swagger API documentation and update se…
MikaTech-dev Jan 6, 2026
05ef9d6
Merge branch 'main' into development
MikaTech-dev Jan 6, 2026
865e8f1
-Finalize Changes to readme
MikaTech-dev Jan 6, 2026
7b2a174
Fixed minor linting issues
MikaTech-dev Jan 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
superusername=admin
superuserpass=admin123

studentusername=student
student=password123

GEMINI_API_KEY=<your GEMINI_API_KEY here>
ENV=development
4 changes: 2 additions & 2 deletions .github/workflows/pylint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pylint-django djangorestframework django
pip install pylint-django djangorestframework django drf-spectacular
- name: Analysing the code with pylint (together with plugins)
run: |
pylint --load-plugins pylint_django --django-settings-module=assessment_engine.settings api/ assessment_engine/ api/
pylint --load-plugins pylint_django --django-settings-module=assessment_engine.settings api/ assessment_engine/
1 change: 1 addition & 0 deletions .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ disable=missing-module-docstring,
invalid-name,
imported-auth-user,
too-many-ancestors,
line-too-long
253 changes: 253 additions & 0 deletions DJango Assessment Engine.postman_collection.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,253 @@
{
"info": {
"_postman_id": "03abc79c-ae0e-4d4f-bb15-7a8cb56235be",
"name": "Django Assessment Engine (Pro)",
"description": "A complete API collection for the Mini Assessment Engine.\n\nIncludes endpoints for:\n- **Admin**: System management login.\n- **Student**: Exam listing, secure submissions, and history.\n- **Authentication**: Session/Basic auth handling with CSRF scripts included.",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "Admin",
"description": "Administrative endpoints for system management.",
"item": [
{
"name": "Admin Login",
"event": [
{
"listen": "test",
"script": {
"exec": [
"var xsrfCookie = postman.getResponseCookie(\"csrftoken\");",
"postman.setEnvironmentVariable('csrftoken', xsrfCookie.value);"
],
"type": "text/javascript"
}
}
],
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "formdata",
"formdata": [
{
"key": "username",
"value": "admin",
"type": "text"
},
{
"key": "password",
"value": "admin123",
"type": "text"
}
]
},
"url": {
"raw": "{{baseURL}}/admin/login/",
"host": ["{{baseURL}}"],
"path": ["admin", "login", ""]
},
"description": "Logs in the Superuser to access the Django Admin panel."
}
}
]
},
{
"name": "Student",
"description": "Main student workflow: Login -> View Exams -> Submit -> View Results.",
"item": [
{
"name": "Auth",
"item": [
{
"name": "Student Login",
"event": [
{
"listen": "test",
"script": {
"exec": [
"var xsrfCookie = postman.getResponseCookie(\"csrftoken\");",
"postman.setEnvironmentVariable('csrftoken', xsrfCookie.value);"
],
"type": "text/javascript"
}
}
],
"request": {
"auth": {
"type": "basic",
"basic": [
{
"key": "username",
"value": "student",
"type": "string"
},
{
"key": "password",
"value": "password123",
"type": "string"
}
]
},
"method": "POST",
"header": [],
"url": {
"raw": "{{baseURL}}/api-auth/login/",
"host": ["{{baseURL}}"],
"path": ["api-auth", "login", ""]
},
"description": "Authenticates a student and sets the session cookie."
}
}
]
},
{
"name": "Exams",
"description": "Read-only endpoints for viewing available assessments.",
"item": [
{
"name": "Get All Exams",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseURL}}/api/exams/",
"host": ["{{baseURL}}"],
"path": ["api", "exams", ""]
},
"description": "Lists all available exams with their associated questions."
}
},
{
"name": "Get Exam by ID",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseURL}}/api/exams/:id",
"host": ["{{baseURL}}"],
"path": ["api", "exams", ":id"],
"variable": [
{
"key": "id",
"value": "5",
"description": "The ID of the exam to retrieve."
}
]
},
"description": "Retrieves details for a specific exam."
}
}
]
},
{
"name": "Submissions",
"description": "Endpoints for submitting answers and viewing graded history.",
"item": [
{
"name": "Submit an Exam",
"event": [
{
"listen": "test",
"script": {
"exec": [
"var xsrfCookie = postman.getResponseCookie(\"csrftoken\");",
"postman.setEnvironmentVariable('csrftoken', xsrfCookie.value);"
],
"type": "text/javascript"
}
}
],
"request": {
"method": "POST",
"header": [
{
"key": "X-CSRFToken",
"value": "{{csrftoken}}",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n \"exam\": 5,\n \"answers\": [\n {\n \"question\": 13,\n \"student_answer\": {\n \"choice\": \"Newton\"\n }\n },\n {\n \"question\": 15,\n \"student_answer\": {\n \"text\": \"Velocity is speed with direction.\"\n }\n }\n ]\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseURL}}/api/submissions/",
"host": ["{{baseURL}}"],
"path": ["api", "submissions", ""]
},
"description": "Submits answers for grading. Triggers the AI feedback engine."
},
"response": [
{
"name": "Error: Invalid ID",
"originalRequest": {
"method": "POST",
"body": {
"mode": "raw",
"raw": "{\"exam\": 5, \"answers\": [{\"question\": 999, \"student_answer\": {\"choice\": \"A\"}}]}"
},
"url": "{{baseURL}}/api/submissions/"
},
"status": "Bad Request",
"code": 400,
"_postman_previewlanguage": "json",
"header": [],
"body": "{\"answers\": [{\"question\": [\"Invalid pk \\\"999\\\" - object does not exist.\"]}]}"
}
]
},
{
"name": "Get All Submissions",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseURL}}/api/submissions/",
"host": ["{{baseURL}}"],
"path": ["api", "submissions", ""]
},
"description": "Retrieves the logged-in student's submission history."
}
},
{
"name": "Get Submission by ID",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseURL}}/api/submissions/:id",
"host": ["{{baseURL}}"],
"path": ["api", "submissions", ":id"],
"variable": [
{
"key": "id",
"value": "1",
"description": "The ID of the submission to view."
}
]
},
"description": "Views the specific details, score, and AI feedback for one submission."
}
}
]
}
]
}
],
"variable": [
{
"key": "baseURL",
"value": "http://127.0.0.1:8000"
},
{
"key": "csrftoken",
"value": ""
}
]
}
Loading