diff --git a/smash/web/forms.py b/smash/web/forms.py index ee7d125774ba686dede8a5c6da27a43ee4122af1..928f594c7c980f226bbcaa156e52405484dd12f5 100644 --- a/smash/web/forms.py +++ b/smash/web/forms.py @@ -139,7 +139,7 @@ class AppointmentEditForm(ModelForm): class AppointmentAddForm(ModelForm): class Meta: model = Appointment - exclude = ['is_finished'] + exclude = ['status'] datetime_when = forms.DateTimeField(label='Appointment on (YYYY-MM-DD HH:MM)', widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS) diff --git a/smash/web/models.py b/smash/web/models.py index 2de5fe18f0332705220e344e9e625f62e3e65a6b..08c37e9e4a3625276734df6f58fa59f0e6c15e68 100644 --- a/smash/web/models.py +++ b/smash/web/models.py @@ -232,20 +232,6 @@ class Visit(models.Model): datetime_end = visit_finished+time_to_next_visit+datetime.timedelta(days=93) ) - - def end_if_appointments_were_finished(self): - the_appointments = self.appointment_set.all() - finished = True - - for appointment in the_appointments: - if appointment.is_finished == False: - finished = False - - if finished: - self.is_finished = True - self.save() - - class Item (models.Model): is_fixed = models.BooleanField( default=False, @@ -480,6 +466,15 @@ class Holiday(models.Model): class Appointment(models.Model): + APPOINTMENT_STATUS_SCHEDULED = 'SCHEDULED'; + APPOINTMENT_STATUS_FINISHED = 'FINISHED'; + APPOINTMENT_STATUS_CHOICES = ( + (APPOINTMENT_STATUS_SCHEDULED, 'Scheduled'), + ('FINISHED', 'Finished'), + ('CANCELLED', 'Cancelled'), + ('NO_SHOW', 'No Show'), + ) + flying_team = models.ForeignKey(FlyingTeam, verbose_name='Flying team (if applicable)', null=True, blank=True @@ -511,14 +506,15 @@ class Appointment(models.Model): length = models.IntegerField( verbose_name='Appointment length (in minutes)' )#Potentially redundant; but can be used to manually adjust appointment's length - is_finished = models.BooleanField( - verbose_name='Has the appointment ended?', - default=False, - editable=False + + status = models.CharField(max_length=20, choices=APPOINTMENT_STATUS_CHOICES, + verbose_name='Status', + editable=False, + default=APPOINTMENT_STATUS_SCHEDULED ) def mark_as_finished(self): - self.is_finished = True + self.status = Appointment.APPOINTMENT_STATUS_FINISHED self.save() def datetime_until(self): diff --git a/smash/web/templates/subjects/visitdetails.html b/smash/web/templates/subjects/visitdetails.html index c3432d99fe5f918a15f0e8327ec11ecb9afba38c..48e83c48efbb7eaf8126a427c62051a4bffeb5be 100644 --- a/smash/web/templates/subjects/visitdetails.html +++ b/smash/web/templates/subjects/visitdetails.html @@ -94,11 +94,11 @@ {% endif %} </td> <td> - {% if app.is_finished %} - FINISHED - {% else %} + {% ifequal app.status "SCHEDULED" %} <a href="{% url 'web.views.appointment_edit' app.id %}" type="button" class="btn btn-block btn-default">Edit</a> - {% endif %} + {% else %} + {{ app.status }} + {% endifequal %} </td> </tr> {% endfor %} diff --git a/smash/web/templates/visits/details.html b/smash/web/templates/visits/details.html index 7385a5102267d52079bd736eb289a1a6cbeaa865..ae9ae29df2b6f2511bd7aa09e0adbccccab4c509 100644 --- a/smash/web/templates/visits/details.html +++ b/smash/web/templates/visits/details.html @@ -119,11 +119,11 @@ {% endif %} </td> <td> - {% if app.is_finished %} - FINISHED - {% else %} + {% ifequal app.status "SCHEDULED" %} <a href="{% url 'web.views.appointment_edit' app.id %}" type="button" class="btn btn-block btn-default">Edit</a> - {% endif %} + {% else %} + {{ app.status }} + {% endifequal %} </td> </tr> {% endfor %} diff --git a/smash/web/tests/functions.py b/smash/web/tests/functions.py new file mode 100644 index 0000000000000000000000000000000000000000..88918cd9fa73739ea8309c224d86e893a67698c1 --- /dev/null +++ b/smash/web/tests/functions.py @@ -0,0 +1,12 @@ +from datetime import timedelta + +from web.models import * + +def create_user(): + return Subject.objects.create(first_name="Piotr", last_name="Gawron", sex= Subject.SEX_CHOICES_MALE) + +def create_visit(subject): + return Visit.objects.create(datetime_begin="2017-01-01",datetime_end="2017-04-01", subject =subject) + +def create_appointment(visit): + return Appointment.objects.create(visit = visit, length = 30) diff --git a/smash/web/tests/test_view_appointments.py b/smash/web/tests/test_view_appointments.py new file mode 100644 index 0000000000000000000000000000000000000000..25ac1d077f0244d4603e956146421633e7ac9f81 --- /dev/null +++ b/smash/web/tests/test_view_appointments.py @@ -0,0 +1,18 @@ +from django.contrib.auth.models import User +from django.test import TestCase, RequestFactory +from django.urls import reverse + +from web.views import * + +class AppointmentsViewTests(TestCase): + def setUp(self): + # Every test needs access to the request factory. + self.factory = RequestFactory() + self.user = User.objects.create_user( + username='piotr', email='jacob@bla', password='top_secret') + + def test_appointments_list_request(self): + request = self.factory.get(reverse('web.views.appointments')); + request.user = self.user + response = appointments(request); + self.assertEqual(response.status_code, 200) diff --git a/smash/web/tests/test_view_visit.py b/smash/web/tests/test_view_visit.py new file mode 100644 index 0000000000000000000000000000000000000000..5c8e1a642dfad927f067704d3aed0f2cf45b41f3 --- /dev/null +++ b/smash/web/tests/test_view_visit.py @@ -0,0 +1,26 @@ +from django.contrib.auth.models import User +from django.test import TestCase, RequestFactory +from django.urls import reverse + +from web.views import * + +from web.models import * + +from web.tests.functions import * + +class VisitViewTests(TestCase): + def setUp(self): + # Every test needs access to the request factory. + self.factory = RequestFactory() + self.user = User.objects.create_user( + username='piotr', email='jacob@bla', password='top_secret') + + def test_visit_details_request(self): + subject = create_user() + visit = create_visit(subject) + appointment = create_appointment(visit) + + request = self.factory.get(reverse('web.views.visit_details', args=[visit.id])); + request.user = self.user + response = visit_details(request, visit.id); + self.assertEqual(response.status_code, 200) diff --git a/smash/web/views.py b/smash/web/views.py index 99aa99903befe437ab2250e772219adf384e6fb3..12bdd5d4b06ebd26f1148af566466c3151a5faac 100644 --- a/smash/web/views.py +++ b/smash/web/views.py @@ -96,7 +96,7 @@ def visit_details(request, id): listOfAppointments = displayedVisit.appointment_set.all() canFinish=True for appointment in listOfAppointments: - if not appointment.is_finished: + if appointment.status == Appointment.APPOINTMENT_STATUS_SCHEDULED: canFinish=False; vform = VisitDetailForm(instance=displayedVisit) sform = SubjectDetailForm(instance=displayedSubject) @@ -319,13 +319,13 @@ def suggest_details(Appointment appoint): def appointments(request): - futureDate = datetime.datetime.now()+datetime.timedelta(days=93) + futureDate = datetime.datetime.now() + datetime.timedelta(days=93) planning_list = Appointment.objects.filter(datetime_when__isnull=True, visit__datetime_begin__lt = futureDate) today = datetime.datetime.now() today_midnight = datetime.datetime(today.year,today.month,today.day) - month_ago = today +datetime.timedelta(days=-31) - approaching_list = Appointment.objects.filter(datetime_when__gt = today_midnight, is_finished = False).order_by('datetime_when') + month_ago = today + datetime.timedelta(days=-31) + approaching_list = Appointment.objects.filter(datetime_when__gt = today_midnight, status = Appointment.APPOINTMENT_STATUS_SCHEDULED).order_by('datetime_when') full_list = Appointment.objects.filter(datetime_when__gt = month_ago).order_by('datetime_when') @@ -373,7 +373,6 @@ def appointment_edit(request, id): data = form.cleaned_data vis = data['visit'] visit = get_object_or_404(Visit, id=vis.id) - visit.end_if_appointments_were_finished() return redirect(appointments) else: