diff --git a/physionet-django/user/managers.py b/physionet-django/user/managers.py index d92b0040f..f925dd0f5 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() ) )