From 73b4f7bc06ded7ab5b712828f53a13aa77516ed6 Mon Sep 17 00:00:00 2001 From: rutvikrj26 Date: Sat, 20 Apr 2024 19:54:10 -0400 Subject: [PATCH] Updating the query set logic to include the expiry check for course based trainings --- physionet-django/user/managers.py | 32 ++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/physionet-django/user/managers.py b/physionet-django/user/managers.py index d92b0040f7..f925dd0f5e 100644 --- a/physionet-django/user/managers.py +++ b/physionet-django/user/managers.py @@ -1,30 +1,48 @@ -from django.db.models import DateTimeField, ExpressionWrapper, QuerySet, F, Q +from django.db.models import (DateTimeField, ExpressionWrapper, QuerySet, F, Q, + OuterRef, Subquery, Case, When) from django.utils import timezone -from user.enums import TrainingStatus - +from user.enums import TrainingStatus, RequiredField +from training.models import Course class TrainingQuerySet(QuerySet): def get_review(self): return self.filter(status=TrainingStatus.REVIEW) def get_valid(self): + course_duration = Course.objects.filter(trainings=OuterRef('pk')).values('valid_duration')[:1] + return self.filter( Q(status=TrainingStatus.ACCEPTED), Q(training_type__valid_duration__isnull=True) - | Q(process_datetime__gte=timezone.now() - F('training_type__valid_duration')), + | Q(process_datetime__gte=timezone.now() - Case( + When(training_type__required_field=RequiredField.PLATFORM, then=Subquery(course_duration)), + default=F('training_type__valid_duration') + )), ).annotate( valid_datetime=ExpressionWrapper( - F('process_datetime') + F('training_type__valid_duration'), output_field=DateTimeField() + F('process_datetime') + Case( + When(training_type__required_field=RequiredField.PLATFORM, then=Subquery(course_duration)), + default=F('training_type__valid_duration') + ), output_field=DateTimeField() ) ) def get_expired(self): + course_duration = Course.objects.filter(trainings=OuterRef('pk')).values('valid_duration')[:1] + return self.filter( - status=TrainingStatus.ACCEPTED, process_datetime__lt=timezone.now() - F('training_type__valid_duration') + Q(status=TrainingStatus.ACCEPTED), + Q(process_datetime__lt=timezone.now() - Case( + When(training_type__required_field=RequiredField.PLATFORM, then=Subquery(course_duration)), + default=F('training_type__valid_duration') + )), ).annotate( valid_datetime=ExpressionWrapper( - F('process_datetime') + F('training_type__valid_duration'), output_field=DateTimeField() + F('process_datetime') + Case( + When(training_type__required_field=RequiredField.PLATFORM, then=Subquery(course_duration)), + default=F('training_type__valid_duration') + ), output_field=DateTimeField() ) )