From d1c934aa571abe8db0f4487fb5b063d254709146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Grou=C3=A8s?= <valentin.groues@uni.lu> Date: Thu, 23 Mar 2017 15:47:18 +0100 Subject: [PATCH] display appointment status as select - #69 --- smash/web/forms.py | 1 - smash/web/models/appointment.py | 4 +-- smash/web/templates/appointments/edit.html | 18 +---------- smash/web/tests/test_AppointmentEditForm.py | 14 ++++----- smash/web/tests/test_view_appointments.py | 33 ++------------------- smash/web/urls.py | 5 +--- smash/web/views/appointment.py | 27 ++++------------- 7 files changed, 20 insertions(+), 82 deletions(-) diff --git a/smash/web/forms.py b/smash/web/forms.py index 5033f1a1..768a5e8f 100644 --- a/smash/web/forms.py +++ b/smash/web/forms.py @@ -146,7 +146,6 @@ class AppointmentEditForm(ModelForm): raise TypeError("Worker not defined for: " + user.username) super(ModelForm, self).__init__(*args, **kwargs) - self.fields.pop('visit') def clean_location(self): location = self.cleaned_data['location'] diff --git a/smash/web/models/appointment.py b/smash/web/models/appointment.py index 62e42d9a..bebf0265 100644 --- a/smash/web/models/appointment.py +++ b/smash/web/models/appointment.py @@ -45,7 +45,8 @@ class Appointment(models.Model): verbose_name='Location', ) visit = models.ForeignKey(Visit, - verbose_name='Visit ID' + verbose_name='Visit ID', + editable=False, ) comment = models.TextField(max_length=1024, verbose_name='Comment', @@ -62,7 +63,6 @@ class Appointment(models.Model): status = models.CharField(max_length=20, choices=APPOINTMENT_STATUS_CHOICES.items(), verbose_name='Status', - editable=False, default=APPOINTMENT_STATUS_SCHEDULED ) diff --git a/smash/web/templates/appointments/edit.html b/smash/web/templates/appointments/edit.html index 24c4c735..d3a79191 100644 --- a/smash/web/templates/appointments/edit.html +++ b/smash/web/templates/appointments/edit.html @@ -51,26 +51,10 @@ </div> {% if field.errors %} - <span class="help-block"> - {{ field.errors }} - </span> + <span class="help-block">{{ field.errors }}</span> {% endif %} </div> {% endfor %} - <div class="col-md-6 form-group"> - <label for="{# TODO #}" class="col-sm-4 control-label"> - Status: - </label> - <div class="btn-group-vertical col-sm-8"> - <label class="btn btn-primary">{{ appointment.status }}</label> - <a href="{% url 'web.views.appointment_mark' id 'finished' %}" - class="btn btn-warning btn-block">Mark as finished</a> - <a href="{% url 'web.views.appointment_mark' id 'cancelled' %}" - class="btn btn-warning btn-block">Mark as cancelled</a> - <a href="{% url 'web.views.appointment_mark' id 'no_show' %}" - class="btn btn-warning btn-block">Mark as no show</a> - </div> - </div> </div><!-- /.box-body --> diff --git a/smash/web/tests/test_AppointmentEditForm.py b/smash/web/tests/test_AppointmentEditForm.py index e4b9bee9..d81a31bb 100644 --- a/smash/web/tests/test_AppointmentEditForm.py +++ b/smash/web/tests/test_AppointmentEditForm.py @@ -22,23 +22,23 @@ class AppointmentEditFormTests(TestCase): 'location': location.id, 'datetime_when': "2020-01-01", } - - self.sample_data_with_visit = self.sample_data - self.sample_data_with_visit['visit'] = self.visit.id - add_form = AppointmentAddForm(user=self.user, data=self.sample_data_with_visit) + self.sample_data_with_status = self.sample_data + self.sample_data_with_status['status'] = 'NO_SHOW' + add_form = AppointmentAddForm(user=self.user, data=self.sample_data) + add_form.instance.visit_id = self.visit.id self.appointment = add_form.save() def test_validation(self): - form = AppointmentEditForm(user=self.user, data=self.sample_data) + form = AppointmentEditForm(user=self.user, data=self.sample_data_with_status) self.assertTrue(form.is_valid()) def test_no_visit_field(self): - form = AppointmentEditForm(user=self.user, data=self.sample_data) + form = AppointmentEditForm(user=self.user, data=self.sample_data_with_status) self.assertNotIn('visit', form.fields) def test_validation_invalid_location(self): self.sample_data['location'] = create_location(name="xxx").id - form = AppointmentEditForm(user=self.user, data=self.sample_data) + form = AppointmentEditForm(user=self.user, data=self.sample_data_with_status) self.assertFalse(form.is_valid()) self.assertTrue("location" in form.errors) diff --git a/smash/web/tests/test_view_appointments.py b/smash/web/tests/test_view_appointments.py index e92bb096..1cbbf138 100644 --- a/smash/web/tests/test_view_appointments.py +++ b/smash/web/tests/test_view_appointments.py @@ -29,6 +29,7 @@ class AppointmentsViewTests(TestCase): appointment = create_appointment(visit, when=datetime.datetime.now()) create_worker(self.user, True) new_comment = 'new comment' + new_status = appointment.APPOINTMENT_STATUS_NO_SHOW new_last_name = "new last name" form_appointment = AppointmentEditForm(user=self.user, instance=appointment, prefix="appointment") form_subject = SubjectEditForm(instance=subject, prefix="subject") @@ -40,6 +41,7 @@ class AppointmentsViewTests(TestCase): if value is not None: form_data['subject-{}'.format(key)] = value form_data["appointment-comment"] = new_comment + form_data["appointment-status"] = new_status form_data["subject-last_name"] = new_last_name response = self.client.post( reverse('web.views.appointment_edit', kwargs={'id': appointment.id}), data=form_data) @@ -47,34 +49,5 @@ class AppointmentsViewTests(TestCase): updated_appointment = Appointment.objects.filter(id=appointment.id)[0] updated_subject = Subject.objects.filter(id=subject.id)[0] self.assertEqual(new_comment, updated_appointment.comment) + self.assertEqual(new_status, updated_appointment.status) self.assertEqual(new_last_name, updated_subject.last_name) - - def test_mark_as_finished(self): - subject = create_subject() - visit = create_visit(subject) - appointment = create_appointment(visit) - response = self.client.get( - reverse('web.views.appointment_mark', kwargs={'id': appointment.id, 'as_what': 'finished'})) - self.assertEqual(response.status_code, 302) - update_appointment = Appointment.objects.filter(id=appointment.id)[0] - self.assertEqual(update_appointment.status, Appointment.APPOINTMENT_STATUS_FINISHED) - - def test_mark_as_cancelled(self): - subject = create_subject() - visit = create_visit(subject) - appointment = create_appointment(visit) - response = self.client.get( - reverse('web.views.appointment_mark', kwargs={'id': appointment.id, 'as_what': 'cancelled'})) - self.assertEqual(response.status_code, 302) - update_appointment = Appointment.objects.filter(id=appointment.id)[0] - self.assertEqual(update_appointment.status, Appointment.APPOINTMENT_STATUS_CANCELLED) - - def test_mark_as_no_show(self): - subject = create_subject() - visit = create_visit(subject) - appointment = create_appointment(visit) - response = self.client.get( - reverse('web.views.appointment_mark', kwargs={'id': appointment.id, 'as_what': 'no_show'})) - self.assertEqual(response.status_code, 302) - update_appointment = Appointment.objects.filter(id=appointment.id)[0] - self.assertEqual(update_appointment.status, Appointment.APPOINTMENT_STATUS_NO_SHOW) diff --git a/smash/web/urls.py b/smash/web/urls.py index 0d0d0b63..6392138c 100644 --- a/smash/web/urls.py +++ b/smash/web/urls.py @@ -25,13 +25,10 @@ urlpatterns = [ name='web.views.unfinished_appointments'), url(r'^appointments/details/(?P<id>\d+)$', views.appointment.appointment_details, name='web.views.appointment_details'), - url(r'^appointments/add/(?P<id>\d+)$', views.appointment.appointment_add, name='web.views.appointment_add'), + url(r'^appointments/add/(?P<visit_id>\d+)$', views.appointment.appointment_add, name='web.views.appointment_add'), url(r'^appointments/edit/(?P<id>\d+)$', views.appointment.appointment_edit, name='web.views.appointment_edit'), url(r'^appointments/edit_datetime/(?P<id>\d+)$', views.appointment.appointment_edit_datetime, name='web.views.appointment_edit_datetime'), - url(r'^appointments/mark/(?P<id>\d+)/(?P<as_what>[A-z]+)$', views.appointment.appointment_mark, - name='web.views.appointment_mark'), - url(r'^visits$', views.visit.visits, name='web.views.visits'), url(r'^visits/exceeded$', views.visit.exceeded_visits, name='web.views.exceeded_visits'), url(r'^visits/unfinished$', views.visit.unfinished_visits, name='web.views.unfinished_visits'), diff --git a/smash/web/views/appointment.py b/smash/web/views/appointment.py index 471f33c2..0f138035 100644 --- a/smash/web/views/appointment.py +++ b/smash/web/views/appointment.py @@ -1,29 +1,15 @@ # coding=utf-8 -from django.forms import HiddenInput from django.shortcuts import get_object_or_404, redirect from notifications import get_today_midnight_date, get_filter_locations, get_calendar_full_appointments, \ get_unfinished_appointments -from . import e500_error, wrap_response +from . import wrap_response from ..forms import AppointmentDetailForm, AppointmentAddForm, AppointmentEditForm, SubjectEditForm from ..models import Appointment __author__ = 'Valentin Grouès' -def appointment_mark(request, id, as_what): - appointment = get_object_or_404(Appointment, id=id) - if as_what == 'finished': - appointment.mark_as_finished() - elif as_what == 'cancelled': - appointment.mark_as_cancelled() - elif as_what == 'no_show': - appointment.mark_as_no_show() - else: - return e500_error(request) - return redirect('web.views.visit_details', id=appointment.visit.id) - - def appointments(request): approaching_list = Appointment.objects.filter( datetime_when__gt=get_today_midnight_date(), @@ -56,20 +42,19 @@ def appointment_details(request, id): return wrap_response(request, 'appointments/details.html', {'form': form}) -def appointment_add(request, id): +def appointment_add(request, visit_id): full_list = get_calendar_full_appointments(request.user) if request.method == 'POST': form = AppointmentAddForm(request.POST, request.FILES, user=request.user) - form.fields['visit'].widget = HiddenInput() if form.is_valid(): + form.instance.visit_id = visit_id form.save() - return redirect('web.views.visit_details', id=id) + return redirect('web.views.visit_details', id=visit_id) else: - form = AppointmentAddForm(initial={'visit': id}, user=request.user) - form.fields['visit'].widget = HiddenInput() + form = AppointmentAddForm(user=request.user) return wrap_response(request, 'appointments/add.html', - {'form': form, 'visitID': id, 'full_appointment_list': full_list}) + {'form': form, 'visitID': visit_id, 'full_appointment_list': full_list}) def appointment_edit(request, id): -- GitLab