Skip to content

Commit

Permalink
Feat sep grades (#957)
Browse files Browse the repository at this point in the history
* feat: separate unsatisfact and unset grades

* refactor: todo doc

* feat: add after review

* test
  • Loading branch information
cin-bun authored Mar 7, 2025
1 parent ce4a743 commit c6b4fc9
Show file tree
Hide file tree
Showing 9 changed files with 13 additions and 10 deletions.
4 changes: 2 additions & 2 deletions apps/learning/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ def __init__(self, branch, **kwargs):
self.branch = branch

def get_queryset(self):
exclude_grades = GradeTypes.unsatisfactory_grades
exclude_grades = [*GradeTypes.unsatisfactory_grades, *GradeTypes.unset_grades]
enrollments_prefetch = get_enrollments_progress(
lookup="user__enrollment_set", filters=[~Q(grade__in=exclude_grades)]
)
Expand Down Expand Up @@ -544,7 +544,7 @@ def generate(self, queryset=None) -> DataFrame:
return DataFrame.from_records(columns=headers, data=data, index="ID")

def get_queryset(self):
exclude_grades = GradeTypes.unsatisfactory_grades
exclude_grades = [*GradeTypes.unsatisfactory_grades, *GradeTypes.unset_grades]
exclude_project_grades = [
ProjectGradeTypes.UNSATISFACTORY,
ProjectGradeTypes.NOT_GRADED,
Expand Down
2 changes: 1 addition & 1 deletion apps/learning/services/enrollment_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ def is_course_failed_by_student(course: Course, student: User,
from learning.models import Enrollment
if course.is_club_course or not course.is_completed:
return False
failed_course_grades = [grade for grade in GradeTypes.unsatisfactory_grades if grade != GradeTypes.WITHOUT_GRADE]
failed_course_grades = [grade for grade in [*GradeTypes.unsatisfactory_grades, GradeTypes.NOT_GRADED]]
if enrollment:
return enrollment.grade in failed_course_grades
return (Enrollment.active
Expand Down
4 changes: 2 additions & 2 deletions apps/learning/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ class GradeTypes(DjangoChoices):
good_grades = {GOOD.value, SEVEN.value, EIGHT.value}
satisfactory_grades = {CREDIT.value, RE_CREDIT.value, GOOD.value, EXCELLENT.value,
FOUR.value, FIVE.value, SIX.value, SEVEN.value, EIGHT.value, NINE.value, TEN.value}
unsatisfactory_grades = {NOT_GRADED.value, UNSATISFACTORY.value, WITHOUT_GRADE.value,
ONE.value, TWO.value, THREE.value}
unsatisfactory_grades = {UNSATISFACTORY.value, ONE.value, TWO.value, THREE.value}
unset_grades = {NOT_GRADED.value, WITHOUT_GRADE.value}
default_grades = (
(NOT_GRADED.value, NOT_GRADED.label),
(WITHOUT_GRADE.value, WITHOUT_GRADE.label),
Expand Down
2 changes: 2 additions & 0 deletions apps/learning/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ def grade_to_base_system(grade: str):
return GradeTypes.CREDIT
elif grade in GradeTypes.unsatisfactory_grades:
return GradeTypes.UNSATISFACTORY
elif grade in GradeTypes.unset_grades:
return GradeTypes.NOT_GRADED


def is_negative_grade(grade) -> bool:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from users.constants import Roles
from users.models import User


# TODO TOTALLY DEPRICATED
class Command(BaseCommand):
help = """
Shows list of teachers who participated in learning students with
Expand Down
2 changes: 1 addition & 1 deletion apps/staff/views/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ def get_context_data(self, **kwargs):

class FutureGraduateStatsView(CuratorOnlyMixin, generic.TemplateView):
template_name = "staff/diplomas_stats.html"
BAD_GRADES = GradeTypes.unsatisfactory_grades
BAD_GRADES = [*GradeTypes.unsatisfactory_grades, *GradeTypes.unset_grades]
BAD_PROJECT_GRADES = [
ProjectGradeTypes.UNSATISFACTORY,
ProjectGradeTypes.NOT_GRADED,
Expand Down
1 change: 1 addition & 0 deletions apps/stats/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ def get_interviewers(self):


# TODO: move to learning or users app
# TODO SEEMS LIKE DEPRICATED
class AlumniStats(APIView):
def get(self, request, graduation_year, format=None):
filters = (Q(status=StudentStatuses.GRADUATE) &
Expand Down
4 changes: 2 additions & 2 deletions apps/users/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,12 @@ def courses_filter(self, queryset, name, value):
courses_total=
# Remove unsuccessful grades, then distinctly count by pk
Count(Case(
When(user__enrollment__grade__in=GradeTypes.unsatisfactory_grades,
When(user__enrollment__grade__in=[*GradeTypes.unsatisfactory_grades, *GradeTypes.unset_grades],
then=Value(None)),
default=F("user__enrollment__course__meta_course_id")
), distinct=True) +
Count(Case(
When(user__shadcourserecord__grade__in=GradeTypes.unsatisfactory_grades,
When(user__shadcourserecord__grade__in=[*GradeTypes.unsatisfactory_grades, *GradeTypes.unset_grades],
then=Value(None)),
default=F("user__shadcourserecord")
), distinct=True) +
Expand Down
2 changes: 1 addition & 1 deletion apps/users/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ def filter_enrollments(self, enrollments):
def get_context_data(self, **kwargs):
from learning.reports import ProgressReport
student_info = (User.objects
.student_progress(exclude_grades=[*GradeTypes.unsatisfactory_grades, GradeTypes.RE_CREDIT],
.student_progress(exclude_grades=[*GradeTypes.unsatisfactory_grades, *GradeTypes.unset_grades, GradeTypes.RE_CREDIT],
exclude_invisible_courses=True)
.get(pk=self.object.student_profile.user_id))
courses_qs = (ProgressReport().get_courses_queryset((student_info,)))
Expand Down

0 comments on commit c6b4fc9

Please sign in to comment.