diff --git a/smash/web/tests/test_view_notifications.py b/smash/web/tests/test_view_notifications.py index 2c9113fbafd1fbeb47656f7d4a9bc449defa07a1..f313714203b6abc9b5193a0ea4f0781f98a3029d 100644 --- a/smash/web/tests/test_view_notifications.py +++ b/smash/web/tests/test_view_notifications.py @@ -106,3 +106,46 @@ class NotificationViewTests(TestCase): notification = get_approaching_visits_without_appointments_count() self.assertEquals(original_notification.count + 1, notification.count) + + def test_get_subject_with_no_visit_notifications_count(self): + original_notification = get_subject_with_no_visit_notifications_count() + subject = create_subject() + + notification = get_subject_with_no_visit_notifications_count() + self.assertEquals(original_notification.count + 1, notification.count) + + def test_get_subject_with_no_visit_notifications_count_2(self): + original_notification = get_subject_with_no_visit_notifications_count() + subject = create_subject() + + visit = create_visit(subject) + visit.is_finished=True + visit.save() + + notification = get_subject_with_no_visit_notifications_count() + self.assertEquals(original_notification.count + 1, notification.count) + + def test_get_subject_with_no_visit_notifications_count_3(self): + original_notification = get_subject_with_no_visit_notifications_count() + subject = create_subject() + + visit = create_visit(subject) + + notification = get_subject_with_no_visit_notifications_count() + self.assertEquals(original_notification.count, notification.count) + def test_get_subject_with_no_visit_notifications_count_4(self): + original_notification = get_subject_with_no_visit_notifications_count() + subject = create_subject() + subject.dead = True + subject.save() + + notification = get_subject_with_no_visit_notifications_count() + self.assertEquals(original_notification.count, notification.count) + def test_get_subject_with_no_visit_notifications_count_5(self): + original_notification = get_subject_with_no_visit_notifications_count() + subject = create_subject() + subject.resigned = True + subject.save() + + notification = get_subject_with_no_visit_notifications_count() + self.assertEquals(original_notification.count, notification.count) diff --git a/smash/web/views.py b/smash/web/views.py index a8d50376e13aa94dfd262497dbc9cd9c997e6a2e..2069b46153787bad38b72dd413b114486ae80c61 100644 --- a/smash/web/views.py +++ b/smash/web/views.py @@ -12,6 +12,9 @@ from django.shortcuts import render from django.db.models import Q import collections import datetime +from django.db.models import Count +from django.db.models import Case +from django.db.models import When # See https://docs.djangoproject.com/en/1.10/topics/http/views/#customizing-error-views # They should work ONLY in production! (DEBUG=False) @@ -68,77 +71,63 @@ class NotificationCount(object): self.style = style self.type = type +def get_exceeded_visits(): + return Visit.objects.filter(datetime_end__lt = get_today_midnight_date(), is_finished = False).order_by('datetime_begin') + def get_exceeded_visit_notifications_count(): - notification = NotificationCount("exceeded visit time",0 , "fa fa-thermometer-4 text-red", 'web.views.exceeded_visits') - today = get_today_midnight_date() - count = Visit.objects.filter(datetime_end__lt = today, is_finished = False).count() - notification.count = count + notification = NotificationCount( + title = "exceeded visit time", + count = get_exceeded_visits().count(), + style = "fa fa-thermometer-4 text-red", + type = 'web.views.exceeded_visits') + return notification + + +def get_subjects_with_no_visit(): + return Subject.objects.annotate(my_count=Count(Case(When(visit__is_finished=False, then=1)))).filter(dead=False, resigned=False, my_count=0) + +def get_subject_with_no_visit_notifications_count(): + notification = NotificationCount( + title = "subject without visit", + count = get_subjects_with_no_visit().count(), + style = "fa fa-users text-aqua", + type = 'web.views.subject_no_visits') return notification -def get_exceeded_visits(): - return Visit.objects.filter(datetime_end__lt = get_today_midnight_date(), is_finished = False).order_by('datetime_begin') def get_visits_without_appointments_count(): - notification = NotificationCount("unfinished visits ",0 , "fa fa-user-times text-yellow", 'web.views.unfinished_visits') - today = get_today_midnight_date() - count = 0 - #visits in progress - visits = Visit.objects.filter(datetime_begin__lt = today, datetime_end__gt = today, is_finished = False) - for visit in visits: - app_count = Appointment.objects.filter(visit = visit, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count() - if app_count==0: - count+=1 - - notification.count = count + notification = NotificationCount( + title = "unfinished visits ", + count = get_unfinished_visits().count(), + style = "fa fa-user-times text-yellow", + type = 'web.views.unfinished_visits') return notification def get_unfinished_visits(): today = get_today_midnight_date() - result = []; - #visits in progress - visits = Visit.objects.filter(datetime_begin__lt = today, datetime_end__gt = today, is_finished = False) - for visit in visits: - app_count = Appointment.objects.filter(visit = visit, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count() - if app_count==0: - result.append(visit) - return result + #list visits that have no scheduled appointments and taking place now + return Visit.objects.annotate(my_count=Count(Case(When(appointment__status=Appointment.APPOINTMENT_STATUS_SCHEDULED, then=1)))).filter(datetime_begin__lt = today, datetime_end__gt = today, is_finished = False, my_count=0) def get_approaching_visits_without_appointments_count(): - notification = NotificationCount("approaching visits ",0 , "fa fa-users text-aqua",'web.views.approaching_visits_without_appointments') - today = get_today_midnight_date() - today_plus_two_months =today+datetime.timedelta(days=62) - count = 0 - #visits in near future (2 months) - visits = Visit.objects.filter(datetime_begin__gt = today, datetime_begin__lt = today_plus_two_months, is_finished = False) - for visit in visits: - app_count = Appointment.objects.filter(visit = visit, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count() - if app_count==0: - count+=1 - - notification.count = count + notification = NotificationCount( + title = "approaching visits ", + count = get_approaching_visits_without_appointments().count(), + style = "fa fa-users text-aqua", + type = 'web.views.approaching_visits_without_appointments') return notification def get_approaching_visits_without_appointments(): today = get_today_midnight_date() today_plus_two_months =today+datetime.timedelta(days=62) - result = []; - #visits in progress - visits = Visit.objects.filter(datetime_begin__gt = today, datetime_begin__lt = today_plus_two_months, is_finished = False) - for visit in visits: - app_count = Appointment.objects.filter(visit = visit, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count() - if app_count==0: - result.append(visit) - return result + return Visit.objects.annotate(my_count=Count(Case(When(appointment__status=Appointment.APPOINTMENT_STATUS_SCHEDULED, then=1)))).filter(datetime_begin__gt = today, datetime_begin__lt = today_plus_two_months, is_finished = False, my_count=0) def get_unfinished_appointments_count(): - notification = NotificationCount("unfinished appointments ",0 , "fa fa-history text-yellow",'web.views.unfinished_appointments') - today = get_today_midnight_date() - - count = Appointment.objects.filter(datetime_when__lt = today, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).count() - - notification.count = count - return notification + return NotificationCount( + title = "unfinished appointments ", + count = get_unfinished_appointments(), + style = "fa fa-history text-yellow", + type = 'web.views.unfinished_appointments') def get_unfinished_appointments(): return Appointment.objects.filter(datetime_when__lt = get_today_midnight_date(), status = Appointment.APPOINTMENT_STATUS_SCHEDULED) @@ -154,6 +143,7 @@ def get_notifications(the_user): notifications.append(get_visits_without_appointments_count()) notifications.append(get_approaching_visits_without_appointments_count()) notifications.append(get_unfinished_appointments_count()) + notifications.append(get_subject_with_no_visit_notifications_count()) for notification in notifications: count += notification.count return (count, notifications)