diff --git a/smash/web/api_views/subject.py b/smash/web/api_views/subject.py index a30d4c198348f47bf26f6672e4c323ae352d83d3..f5eed511a6803c18a79d89643ae294ae40b30da8 100644 --- a/smash/web/api_views/subject.py +++ b/smash/web/api_views/subject.py @@ -199,11 +199,11 @@ def filter_by_visit(result, visit_number, visit_type): elif visit_type == "EXCEED": result = result.filter(**{datetime_begin_filter + "__lt": get_today_midnight_date()}). \ filter(**{is_finished_filter: 0}). \ + filter(**{scheduled_appointments_filter: 0}). \ filter(**{datetime_end_filter + "__lt": get_today_midnight_date()}) elif visit_type == "IN_PROGRESS": result = result.filter(**{datetime_begin_filter + "__lt": get_today_midnight_date()}). \ filter(**{is_finished_filter: 0}). \ - filter(**{datetime_end_filter + "__gt": get_today_midnight_date()}). \ filter(**{scheduled_appointments_filter + "__gt": 0}) elif visit_type == "SHOULD_BE_IN_PROGRESS": result = result.filter(**{datetime_begin_filter + "__lt": get_today_midnight_date()}). \ @@ -330,7 +330,12 @@ def serialize_subject(study_subject): else: status = "MISSED" elif visit.datetime_end < get_today_midnight_date(): - status = "EXCEEDED" + scheduled_appointments_count = visit.appointment_set.filter( + status=Appointment.APPOINTMENT_STATUS_SCHEDULED).count() + if scheduled_appointments_count > 0: + status = "IN_PROGRESS" + else: + status = "EXCEEDED" else: scheduled_appointments_count = visit.appointment_set.filter( status=Appointment.APPOINTMENT_STATUS_SCHEDULED).count() diff --git a/smash/web/tests/view/test_notifications.py b/smash/web/tests/view/test_notifications.py index de8c59457b9d5a26106e4dafccf4c99fc899725f..93864779089f07f88ee827fecc0cba60126843e8 100644 --- a/smash/web/tests/view/test_notifications.py +++ b/smash/web/tests/view/test_notifications.py @@ -183,6 +183,45 @@ class NotificationViewTests(LoggedInTestCase): self.assertTrue(visits[0].datetime_begin < visits[1].datetime_begin) self.assertTrue(visits[1].datetime_begin < visits[2].datetime_begin) + def test_get_exceeded_visits(self): + subject = create_study_subject() + + visit = create_visit(subject) + visit.datetime_begin = get_today_midnight_date() + datetime.timedelta(days=-12) + visit.datetime_end = get_today_midnight_date() + datetime.timedelta(days=-10) + visit.visit_number = 1 + visit.is_finished = True + visit.save() + + visit = create_visit(subject) + visit.datetime_begin = get_today_midnight_date() + datetime.timedelta(days=-10) + visit.datetime_end = get_today_midnight_date() + datetime.timedelta(days=-8) + visit.visit_number = 2 + visit.save() + + visits = get_exceeded_visits(self.user) + self.assertEquals(1, visits.count()) + + def test_get_exceeded_visits_with_scheduled_appointment(self): + subject = create_study_subject() + + visit = create_visit(subject) + visit.datetime_begin = get_today_midnight_date() + datetime.timedelta(days=-12) + visit.datetime_end = get_today_midnight_date() + datetime.timedelta(days=-10) + visit.visit_number = 1 + visit.is_finished = True + visit.save() + + visit = create_visit(subject) + visit.datetime_begin = get_today_midnight_date() + datetime.timedelta(days=-10) + visit.datetime_end = get_today_midnight_date() + datetime.timedelta(days=-8) + visit.visit_number = 2 + visit.save() + create_appointment(visit) + + visits = get_exceeded_visits(self.user) + self.assertEquals(0, visits.count()) + def test_get_approaching_visits_without_appointments_count(self): original_notification = get_approaching_visits_without_appointments_count(self.user) subject = create_study_subject() diff --git a/smash/web/views/notifications.py b/smash/web/views/notifications.py index aa56fe879701094a32241315203628b61305e01b..b54ca23303a37c3ed4aba60cf4c275119a577845 100644 --- a/smash/web/views/notifications.py +++ b/smash/web/views/notifications.py @@ -244,7 +244,9 @@ def get_exceeded_visits(user): ).filter( # by default any visit where visit number is bigger than 1 # or in case of first visit - visits that had some successful appointment - Q(visit_number__gt=1) | Q(appointment__status=Appointment.APPOINTMENT_STATUS_FINISHED)).order_by( + Q(visit_number__gt=1) | Q(appointment__status=Appointment.APPOINTMENT_STATUS_FINISHED)).filter( + # visits that have scheduled appointments should be excluded + ~Q(appointment__status=Appointment.APPOINTMENT_STATUS_SCHEDULED)).order_by( 'datetime_begin')