From 978f217216f20a43ebec15f2f9b79ecb476bba6a Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Tue, 28 Mar 2017 11:15:12 +0200
Subject: [PATCH] screening number is automatically added if applicable

---
 smash/web/tests/test_view_subjects.py | 116 ++++++++++++++++++++++++++
 smash/web/views/subject.py            |  29 ++++++-
 2 files changed, 141 insertions(+), 4 deletions(-)
 create mode 100644 smash/web/tests/test_view_subjects.py

diff --git a/smash/web/tests/test_view_subjects.py b/smash/web/tests/test_view_subjects.py
new file mode 100644
index 00000000..71023e28
--- /dev/null
+++ b/smash/web/tests/test_view_subjects.py
@@ -0,0 +1,116 @@
+from django.contrib.auth.models import User
+from django.test import Client
+from django.test import TestCase
+from django.urls import reverse
+
+from functions import create_subject, create_worker, get_test_location
+from web.forms import SubjectAddForm
+from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL
+from web.views.subject import get_new_screening_number
+
+
+class SubjectsViewTests(TestCase):
+    def setUp(self):
+        self.client = Client()
+        username = 'piotr'
+        password = 'top_secret'
+        self.user = User.objects.create_user(
+            username=username, email='jacob@bla', password=password)
+        self.client.login(username=username, password=password)
+
+    def test_subjects_add(self):
+        self.worker = create_worker(self.user)
+        self.worker.screening_number_prefix = "X"
+        self.worker.save()
+
+        response = self.client.get(reverse('web.views.subject_add'))
+        self.assertEqual(response.status_code, 200)
+
+        # check if screening number prefix is there
+        self.assertTrue("value=\"X-\"" in response.content)
+
+    def test_subjects_add_2(self):
+        self.worker = create_worker(self.user, True)
+
+        form = SubjectAddForm()
+        form_data = {}
+        for key, value in form.initial.items():
+            if value is not None:
+                form_data[key] = value
+
+        form_data["screening_number"] = "X-";
+        form_data["country"] = "Luxembourg";
+        form_data["first_name"] = "John";
+        form_data["last_name"] = "Doe";
+        form_data["sex"] = SEX_CHOICES_MALE;
+        form_data["type"] = SUBJECT_TYPE_CHOICES_CONTROL;
+        form_data["default_location"] = get_test_location().id;
+        response = self.client.post(reverse('web.views.subject_add'), data=form_data)
+        self.assertEqual(response.status_code, 302)
+
+
+    def test_get_new_screening_number(self):
+        prefix = "X-"
+        subject = create_subject()
+        subject.screening_number = prefix + "300"
+        subject.save()
+
+        new_screening_number = get_new_screening_number(prefix)
+        self.assertEqual(prefix + "301", new_screening_number)
+
+    def test_get_new_screening_number_2(self):
+        prefix = "X-"
+        subject = create_subject()
+        subject.screening_number = "L-1111; " + prefix + "300"
+        subject.save()
+
+        new_screening_number = get_new_screening_number(prefix)
+        self.assertEqual(prefix + "301", new_screening_number)
+
+    def test_get_new_screening_number_3(self):
+        prefix = "X-"
+        subject = create_subject()
+        subject.screening_number = prefix + "300" + "; L-1111"
+        subject.save()
+
+        new_screening_number = get_new_screening_number(prefix)
+        self.assertEqual(prefix + "301", new_screening_number)
+
+    def test_get_new_screening_number_3(self):
+        prefix = "X-"
+        subject = create_subject()
+        subject.screening_number = "P-1112; " + prefix + "300" + "; L-1111"
+        subject.save()
+
+        new_screening_number = get_new_screening_number(prefix)
+        self.assertEqual(prefix + "301", new_screening_number)
+
+    def test_get_new_screening_number_4(self):
+        prefix = "X-"
+        subject = create_subject()
+        subject.screening_number = "P-1112; "
+        subject.save()
+
+        new_screening_number = get_new_screening_number(prefix)
+        self.assertEqual(prefix + "1", new_screening_number)
+
+    def test_get_new_screening_number_5(self):
+        prefix = "X-"
+        subject = create_subject()
+        subject.screening_number = prefix + "100"
+        subject.save()
+
+        subject = create_subject()
+        subject.screening_number = prefix + "200"
+        subject.save()
+
+        subject = create_subject()
+        subject.screening_number = "Y-300"
+        subject.save()
+
+        subject = create_subject()
+        subject.screening_number = prefix + "20"
+        subject.save()
+
+        new_screening_number = get_new_screening_number(prefix)
+        self.assertEqual(prefix + "201", new_screening_number)
diff --git a/smash/web/views/subject.py b/smash/web/views/subject.py
index cfeddecd..0f667ba6 100644
--- a/smash/web/views/subject.py
+++ b/smash/web/views/subject.py
@@ -5,7 +5,7 @@ from django.shortcuts import redirect, get_object_or_404
 from notifications import get_subjects_with_no_visit, get_subjects_with_reminder
 from . import wrap_response
 from ..forms import SubjectAddForm, SubjectEditForm, VisitDetailForm
-from ..models import Subject
+from ..models import Subject, Worker
 
 
 def subjects(request):
@@ -17,17 +17,38 @@ def subjects(request):
     return wrap_response(request, 'subjects/index.html', context)
 
 
+def get_new_screening_number(screening_number_prefix):
+    result_number = 0
+    subjects = Subject.objects.filter(screening_number__contains=screening_number_prefix)
+    for subject in subjects:
+        screening_numbers = subject.screening_number.split(";")
+        for screening_number in screening_numbers:
+            screening_number = screening_number.strip()
+            if screening_number.startswith(screening_number_prefix):
+                number = screening_number[len(screening_number_prefix):]
+                result_number = max(result_number, int(number))
+
+    return screening_number_prefix + str(result_number + 1)
+
+
 def subject_add(request):
+    prefix_screening_number = ''
+
+    worker = Worker.get_by_user(request.user)
+    if (worker.screening_number_prefix is not None) and (worker.screening_number_prefix != ""):
+        prefix_screening_number = worker.screening_number_prefix + "-"
+
     if request.method == 'POST':
         form = SubjectAddForm(request.POST, request.FILES)
         if form.is_valid():
             screening_number = form.cleaned_data['screening_number']
-            if screening_number == '':
-                screening_number = get_new_screening_number()  # FIXME: method doesn't exist
+            if screening_number == prefix_screening_number:
+                form.cleaned_data['screening_number'] = get_new_screening_number(prefix_screening_number)
+
             form.save()
             return redirect('web.views.subjects')
     else:
-        form = SubjectAddForm()
+        form = SubjectAddForm(initial={'screening_number': prefix_screening_number})
 
     return wrap_response(request, 'subjects/add.html', {'form': form})
 
-- 
GitLab