diff --git a/smash/web/forms.py b/smash/web/forms.py index 3b2d60066bc7cbd41e727477aa84e93610b24c4f..657306be52cc1b95579e8fc59c288ba75bad35ab 100644 --- a/smash/web/forms.py +++ b/smash/web/forms.py @@ -49,6 +49,11 @@ def validate_subject_country(self, cleaned_data): self.add_error('country', "Select valid country") +def validate_subject_resign_reason(self, cleaned_data): + if cleaned_data['resigned'] and cleaned_data['resign_reason'] == '': + self.add_error('resign_reason', "Resign reason cannot be empty") + + def validate_subject_mpower_number(self, cleaned_data): if cleaned_data['mpower_id'] != "": subjects_from_db = Subject.objects.filter(mpower_id=cleaned_data['mpower_id']) @@ -71,7 +76,7 @@ class SubjectAddForm(ModelForm): class Meta: model = Subject fields = '__all__' - exclude = ['dead', 'resigned'] + exclude = ['dead', 'resigned', 'resign_reason'] def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) @@ -174,6 +179,7 @@ class SubjectEditForm(ModelForm): validate_subject_nd_number(self, self.cleaned_data) validate_subject_mpower_number(self, self.cleaned_data) validate_subject_country(self, self.cleaned_data) + validate_subject_resign_reason(self, self.cleaned_data) class Meta: model = Subject diff --git a/smash/web/migrations/0062_subject_resign_reason.py b/smash/web/migrations/0062_subject_resign_reason.py new file mode 100644 index 0000000000000000000000000000000000000000..cb3ba4eb4443605f591c9a44ff5e36256513da19 --- /dev/null +++ b/smash/web/migrations/0062_subject_resign_reason.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-10-31 12:14 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0061_remove_subject_country'), + ] + + operations = [ + migrations.AddField( + model_name='subject', + name='resign_reason', + field=models.TextField(blank=True, max_length=2000, verbose_name=b'Resign reason'), + ), + ] diff --git a/smash/web/models/subject.py b/smash/web/models/subject.py index e87f3ab83e3f274ec8d40845e318b8d3868bf1d1..c16e7330a7ff76ff1ff93f1816691ddd01b26f93 100644 --- a/smash/web/models/subject.py +++ b/smash/web/models/subject.py @@ -171,6 +171,10 @@ class Subject(models.Model): default=False, editable=True ) + resign_reason = models.TextField(max_length=2000, + blank=True, + verbose_name='Resign reason' + ) def __str__(self): return "%s %s" % (self.first_name, self.last_name) diff --git a/smash/web/templates/subjects/edit.html b/smash/web/templates/subjects/edit.html index ec809187f951314173831d76475bcbdf3e6b7234..609cfbe22dab89900bfeb0343eeacf2bb54dbe3c 100644 --- a/smash/web/templates/subjects/edit.html +++ b/smash/web/templates/subjects/edit.html @@ -154,6 +154,11 @@ }); var dead_was_checked = $("#id_dead").is(":checked"); var resigned_was_checked = $("#id_resigned").is(":checked"); + $("#id_resign_reason").prop('disabled', !resigned_was_checked); + $("#id_resigned").on("click", function(){ + var checked = $("#id_resigned").is(":checked"); + $("#id_resign_reason").prop('disabled', !checked); + }); $("form").submit(function () { if (confirmed) { return true; diff --git a/smash/web/tests/view/test_subjects.py b/smash/web/tests/view/test_subjects.py index fae555669992cc0910070a1196be4faa015af6e3..834ba8d09d950625bd64d32465753c74ce3b2e9f 100644 --- a/smash/web/tests/view/test_subjects.py +++ b/smash/web/tests/view/test_subjects.py @@ -43,6 +43,22 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): self.assertEqual(response.status_code, 200) self.assertTrue("Add visit" in response.content) + def test_save_subject_edit_when_resigned_without_reason(self): + subject = create_subject() + form_subject = SubjectEditForm(instance=subject) + form_data = {} + for key, value in form_subject.initial.items(): + if value is not None: + form_data[key] = value + + form_data['dead'] = "True" + form_data['resigned'] = "True" + response = self.client.post( + reverse('web.views.subject_edit', kwargs={'id': subject.id}), data=form_data) + + self.assertEqual(response.status_code, 200) + self.assertTrue("Resign reason cannot be empty" in response.content) + def test_save_subject_edit(self): subject = create_subject() form_subject = SubjectEditForm(instance=subject) @@ -53,6 +69,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): form_data['dead'] = "True" form_data['resigned'] = "True" + form_data['resign_reason'] = "doesn't want to participate" response = self.client.post( reverse('web.views.subject_edit', kwargs={'id': subject.id}), data=form_data) diff --git a/smash/web/views/subject.py b/smash/web/views/subject.py index 09509ef2af1e53055f848353a924845ead5c4655..dfc0c2bc0cb57991c3f49210e49a38787e3c2136 100644 --- a/smash/web/views/subject.py +++ b/smash/web/views/subject.py @@ -68,6 +68,8 @@ def subject_edit(request, id): if '_continue' in request.POST: return redirect('web.views.subject_edit', id=the_subject.id) return redirect('web.views.subjects') + else: + messages.add_message(request, messages.ERROR, 'Invalid data. Please fix data and try again.') else: form = SubjectEditForm(instance=the_subject, was_dead=was_dead, was_resigned=was_resigned)