From 6d4b485ca3ff1c511007f2e037ea3c4f409523af Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 2 Mar 2017 18:22:38 +0100
Subject: [PATCH] instead is_finished appointment has status (finished,
 cancelled, noshow, scheduled)

---
 smash/web/forms.py                            |  2 +-
 smash/web/models.py                           | 34 ++++++++-----------
 .../web/templates/subjects/visitdetails.html  |  8 ++---
 smash/web/templates/visits/details.html       |  8 ++---
 smash/web/tests/functions.py                  | 12 +++++++
 smash/web/tests/test_view_appointments.py     | 18 ++++++++++
 smash/web/tests/test_view_visit.py            | 26 ++++++++++++++
 smash/web/views.py                            |  9 +++--
 8 files changed, 84 insertions(+), 33 deletions(-)
 create mode 100644 smash/web/tests/functions.py
 create mode 100644 smash/web/tests/test_view_appointments.py
 create mode 100644 smash/web/tests/test_view_visit.py

diff --git a/smash/web/forms.py b/smash/web/forms.py
index ee7d1257..928f594c 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 2de5fe18..08c37e9e 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 c3432d99..48e83c48 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 7385a510..ae9ae29d 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 00000000..88918cd9
--- /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 00000000..25ac1d07
--- /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 00000000..5c8e1a64
--- /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 99aa9990..12bdd5d4 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:
-- 
GitLab