Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Generated by Django 6.0.4 on 2026-05-01 08:32

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("academics", "0003_remove_departments_institution_colleges_and_more"),
("evaluations", "0004_auto_20260429_2011"),
]

operations = [
migrations.AddField(
model_name="evaluations",
name="college",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="academics.colleges",
),
),
migrations.AddField(
model_name="finalresults",
name="college",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="academics.colleges",
),
),
]
20 changes: 19 additions & 1 deletion logify-backend/apps/evaluations/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from apps.academics.models import Institutions, Programmes
from apps.academics.models import Colleges, Institutions, Programmes
from apps.accounts.models import User
from apps.placements.models import InternshipPlacements
from django.db import models
Expand Down Expand Up @@ -98,8 +98,17 @@ class Evaluations(models.Model):
submitted_at = models.DateTimeField(null=True, blank=True)
updated_at = models.DateTimeField(auto_now=True)
total_score = models.FloatField()
college = models.ForeignKey(Colleges, on_delete=models.CASCADE, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)

def save(self, *args, **kwargs):
if not self.college_id and self.placement_id:
try:
self.college = self.placement.programme.department.college
except Exception:
pass
super().save(*args, **kwargs)

def __str__(self):
return f"Evaluation by {self.evaluator.email} " f"for {self.placement.internship_title}"

Expand Down Expand Up @@ -146,7 +155,16 @@ class FinalResults(models.Model):
final_score = models.FloatField()
final_grade = models.CharField(max_length=255)
remarks = models.TextField(blank=True, null=True)
college = models.ForeignKey(Colleges, on_delete=models.CASCADE, null=True, blank=True)
computed_at = models.DateTimeField(auto_now_add=True)

def save(self, *args, **kwargs):
if not self.college_id and self.placement_id:
try:
self.college = self.placement.programme.department.college
except Exception:
pass
super().save(*args, **kwargs)

def __str__(self):
return f"Final Result for {self.placement.internship_title}"
36 changes: 23 additions & 13 deletions logify-backend/apps/evaluations/views.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
from apps.accounts.access import (
get_programme_ids_for_college,
get_user_college_id,
get_user_institution_id,
)
from apps.accounts.access import get_user_college_id, get_user_institution_id
from apps.accounts.models import User
from apps.accounts.permissions import (
IsAcademicSupervisor,
Expand Down Expand Up @@ -62,13 +58,9 @@ def get_admin_college_placement_filter(user):
if institution_id is None or admin_college_id is None:
return None

programme_ids = get_programme_ids_for_college(admin_college_id)
if not programme_ids:
return None

return {
"placement__institution_id": institution_id,
"placement__programme_id__in": programme_ids,
"college_id": admin_college_id,
}


Expand Down Expand Up @@ -118,7 +110,13 @@ def get_queryset(self):
if user.role == User.STUDENT: # type: ignore
return Evaluations.objects.filter(placement__intern=user)
elif user.role == User.ACADEMIC_SUPERVISOR: # type: ignore
return Evaluations.objects.filter(placement__academic_supervisor=user)
college_id = get_user_college_id(user)
if college_id is None:
return Evaluations.objects.none()
return Evaluations.objects.filter(
placement__academic_supervisor=user,
college_id=college_id,
)
elif user.role == User.WORKPLACE_SUPERVISOR: # type: ignore
return Evaluations.objects.filter(placement__workplace_supervisor=user)
elif user.role == User.INTERNSHIP_ADMIN: # type: ignore
Expand All @@ -144,7 +142,13 @@ def get_queryset(self):
elif user.role == User.STUDENT:
queryset = queryset.filter(evaluation__placement__intern=user)
elif user.role == User.ACADEMIC_SUPERVISOR:
queryset = queryset.filter(evaluation__placement__academic_supervisor=user)
college_id = get_user_college_id(user)
if college_id is None:
return EvaluationScores.objects.none()
queryset = queryset.filter(
evaluation__placement__academic_supervisor=user,
evaluation__college_id=college_id,
)
elif user.role == User.WORKPLACE_SUPERVISOR:
queryset = queryset.filter(evaluation__placement__workplace_supervisor=user)
elif user.role == User.INTERNSHIP_ADMIN:
Expand Down Expand Up @@ -177,7 +181,13 @@ def get_queryset(self):
if user_role == User.STUDENT:
return FinalResults.objects.filter(placement__intern=user)
elif user_role == User.ACADEMIC_SUPERVISOR:
return FinalResults.objects.filter(placement__academic_supervisor=user)
college_id = get_user_college_id(user)
if college_id is None:
return FinalResults.objects.none()
return FinalResults.objects.filter(
placement__academic_supervisor=user,
college_id=college_id,
)
elif user_role == User.WORKPLACE_SUPERVISOR:
return FinalResults.objects.filter(placement__workplace_supervisor=user)
elif user_role == User.INTERNSHIP_ADMIN:
Expand Down
Loading