From 0fa4bca42c55604c270596df7f872356794edf43 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 15 Jun 2017 14:30:01 +0200
Subject: [PATCH] adding and modifing mpower number checks for uniqe values

---
 smash/web/forms.py                      | 10 ++++++++++
 smash/web/tests/test_SubjectAddForm.py  | 15 +++++++++++++++
 smash/web/tests/test_SubjectEditForm.py | 20 ++++++++++++++++++++
 3 files changed, 45 insertions(+)

diff --git a/smash/web/forms.py b/smash/web/forms.py
index ae861b87..7ff1bc1a 100644
--- a/smash/web/forms.py
+++ b/smash/web/forms.py
@@ -36,6 +36,14 @@ def validate_subject_nd_number(self, cleaned_data):
                 self.add_error('nd_number', "ND number already in use")
 
 
+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'])
+        if subjects_from_db:
+            if subjects_from_db[0].screening_number != cleaned_data.get('screening_number', ''):
+                self.add_error('mpower_id', "mPower number already in use")
+
+
 class SubjectAddForm(ModelForm):
     date_born = forms.DateField(label="Date of birth",
                                 widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
@@ -81,6 +89,7 @@ class SubjectAddForm(ModelForm):
             if len(subjects_from_db) > 0:
                 self.add_error('screening_number', "Screening number already in use")
         validate_subject_nd_number(self, cleaned_data)
+        validate_subject_mpower_number(self, cleaned_data)
         return cleaned_data
 
     def get_prefix_screening_number(self):
@@ -149,6 +158,7 @@ class SubjectEditForm(ModelForm):
 
     def clean(self):
         validate_subject_nd_number(self, self.cleaned_data)
+        validate_subject_mpower_number(self, self.cleaned_data)
 
     class Meta:
         model = Subject
diff --git a/smash/web/tests/test_SubjectAddForm.py b/smash/web/tests/test_SubjectAddForm.py
index bfdab7a8..77e9c6d6 100644
--- a/smash/web/tests/test_SubjectAddForm.py
+++ b/smash/web/tests/test_SubjectAddForm.py
@@ -62,6 +62,21 @@ class SubjectAddFormTests(TestCase):
         self.assertFalse(validation_status)
         self.assertTrue("nd_number" in form2.errors)
 
+    def test_invalid_mpower_id(self):
+        form_data = self.sample_data
+        form_data['mpower_id'] = "123"
+
+        form = SubjectAddForm(data=form_data, user=self.user)
+        form.is_valid()
+        self.assertTrue(form.is_valid())
+        form.save()
+
+        form_data['screening_number'] = "2"
+        form2 = SubjectAddForm(data=form_data, user=self.user)
+        validation_status = form2.is_valid()
+        self.assertFalse(validation_status)
+        self.assertTrue("mpower_id" in form2.errors)
+
     def test_get_new_screening_number(self):
         prefix = "X-"
         subject = create_subject()
diff --git a/smash/web/tests/test_SubjectEditForm.py b/smash/web/tests/test_SubjectEditForm.py
index f28c88e2..bf9fb731 100644
--- a/smash/web/tests/test_SubjectEditForm.py
+++ b/smash/web/tests/test_SubjectEditForm.py
@@ -57,3 +57,23 @@ class SubjectEditFormTests(TestCase):
 
         save_status = edit_form.is_valid()
         self.assertFalse(save_status)
+
+    def test_invalid_mpower_id_edit(self):
+        self.sample_data['screening_number'] = "001"
+        add_form = SubjectAddForm(data=self.sample_data, user=self.user)
+        subject = add_form.save()
+
+        self.sample_data['mpower_id'] = "mpower_002"
+        self.sample_data['nd_number'] = "nd_002"
+        self.sample_data['screening_number'] = "002"
+        add_form = SubjectAddForm(data=self.sample_data, user=self.user)
+        add_form.save()
+
+        self.sample_data['id'] = subject.id
+        self.sample_data['mpower_id'] = "mpower_002"
+        self.sample_data['nd_number'] = "nd_001"
+        self.sample_data['screening_number'] = "001"
+        edit_form = SubjectEditForm(self.sample_data)
+
+        save_status = edit_form.is_valid()
+        self.assertFalse(save_status)
-- 
GitLab