Skip to content
Snippets Groups Projects
Commit 1e61664d authored by Valentin Groues's avatar Valentin Groues :eyes:
Browse files

use location or patient type to generate screening number - fixes #96

parent 382c81bc
No related branches found
No related tags found
No related merge requests found
Pipeline #
......@@ -5,7 +5,7 @@ from django.forms import ModelForm, Form
from django.utils.dates import MONTHS
from models import Subject, Worker, Appointment, Visit, AppointmentType, ContactAttempt
from models.constants import SUBJECT_TYPE_CHOICES
from models.constants import SUBJECT_TYPE_CHOICES, SCREENING_NUMBER_PREFIXES_FOR_TYPE
"""
Possible redundancy, but if need arises, contents of forms can be easily customized
......@@ -26,12 +26,11 @@ DATETIMEPICKER_DATE_ATTRS = {
START_YEAR_STATISTICS = 2015
def validate_subject_nd_number(self):
subject = self.cleaned_data
if subject['nd_number'] != "":
subjects_from_db = Subject.objects.filter(nd_number=subject['nd_number'])
def validate_subject_nd_number(self, cleaned_data):
if cleaned_data['nd_number'] != "":
subjects_from_db = Subject.objects.filter(nd_number=cleaned_data['nd_number'])
if subjects_from_db:
if subjects_from_db[0].screening_number != subject.get('screening_number', ''):
if subjects_from_db[0].screening_number != cleaned_data.get('screening_number', ''):
self.add_error('nd_number', "ND number already in use")
......@@ -42,9 +41,9 @@ class SubjectAddForm(ModelForm):
)
datetime_contact_reminder = forms.DateTimeField(label="Contact on",
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
required=False
)
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
required=False
)
class Meta:
model = Subject
......@@ -60,24 +59,41 @@ class SubjectAddForm(ModelForm):
raise TypeError("Worker not defined for: " + user.username)
super(ModelForm, self).__init__(*args, **kwargs)
def clean_screening_number(self):
screening_number = self.cleaned_data['screening_number']
prefix_screening_number = get_prefix_screening_number(self.user)
if screening_number == prefix_screening_number:
screening_number = get_new_screening_number(prefix_screening_number)
self.fields['screening_number'].required = False
def build_screening_number(self, cleaned_data):
screening_number = cleaned_data.get('screening_number', None)
if not screening_number:
prefix_screening_number = self.get_prefix_screening_number()
if prefix_screening_number is not None:
screening_number = get_new_screening_number(prefix_screening_number)
return screening_number
def clean(self):
subject = self.cleaned_data
screening_number = subject.get('screening_number', '')
subjects_from_db = Subject.objects.filter(screening_number=screening_number)
if len(subjects_from_db) > 0:
self.add_error('screening_number', "Screening number already in use")
validate_subject_nd_number(self)
cleaned_data = super(SubjectAddForm, self).clean()
screening_number = self.build_screening_number(cleaned_data)
if screening_number is not None:
cleaned_data['screening_number'] = screening_number
subjects_from_db = Subject.objects.filter(screening_number=screening_number)
if len(subjects_from_db) > 0:
self.add_error('screening_number', "Screening number already in use")
validate_subject_nd_number(self, cleaned_data)
return cleaned_data
def get_prefix_screening_number(self):
default_location = self.cleaned_data.get('default_location', None)
screening_number_prefix = None
if default_location is not None and default_location.prefix is not None:
screening_number_prefix = default_location.prefix
else:
subject_type = self.cleaned_data.get('type', None)
if subject_type is not None:
screening_number_prefix = SCREENING_NUMBER_PREFIXES_FOR_TYPE[subject_type]
if screening_number_prefix is None:
return None
prefix_screening_number = screening_number_prefix + "-"
return prefix_screening_number
def get_new_screening_number(screening_number_prefix):
......@@ -97,13 +113,6 @@ def get_new_screening_number(screening_number_prefix):
return screening_number_prefix + str(result_number + 1).zfill(3)
def get_prefix_screening_number(user):
prefix_screening_number = ''
if (user is not None) and (user.screening_number_prefix is not None) and (user.screening_number_prefix != ""):
prefix_screening_number = user.screening_number_prefix + "-"
return prefix_screening_number
class SubjectDetailForm(ModelForm):
class Meta:
model = Subject
......@@ -112,9 +121,9 @@ class SubjectDetailForm(ModelForm):
class SubjectEditForm(ModelForm):
datetime_contact_reminder = forms.DateTimeField(label="Contact on",
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
required=False
)
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
required=False
)
date_born = forms.DateField(label="Date of birth",
widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
required=False
......@@ -137,7 +146,7 @@ class SubjectEditForm(ModelForm):
self.fields['resigned'].disabled = True
def clean(self):
validate_subject_nd_number(self)
validate_subject_nd_number(self, self.cleaned_data)
class Meta:
model = Subject
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-04-20 14:35
from __future__ import unicode_literals
from django.db import migrations, models
def add_prefixes(apps, schema_editor):
Location = apps.get_model("web", "Location")
updates_to_perform = [
("LIH", "L"),
("PRC", "P"),
]
for update_to_perform in updates_to_perform:
name, prefix = update_to_perform
location = Location.objects.filter(name=name).first()
if location is not None:
location.prefix = prefix
location.save()
class Migration(migrations.Migration):
dependencies = [
('web', '0034_mail_templates'),
]
operations = [
migrations.RemoveField(
model_name='worker',
name='screening_number_prefix',
),
migrations.AddField(
model_name='location',
name='prefix',
field=models.CharField(max_length=1, null=True),
),
migrations.RunPython(add_prefixes, reverse_code=lambda x, y: None),
]
......@@ -9,10 +9,16 @@ SEX_CHOICES = (
(SEX_CHOICES_FEMALE, 'Female'),
)
SUBJECT_TYPE_CHOICES_CONTROL = 'C'
SUBJECT_TYPE_CHOICES_PATIENT = 'P'
SUBJECT_TYPE_CHOICES = {
SUBJECT_TYPE_CHOICES_CONTROL: 'CONTROL',
'P': 'PATIENT',
SUBJECT_TYPE_CHOICES_PATIENT: 'PATIENT',
}
SCREENING_NUMBER_PREFIXES_FOR_TYPE = {
SUBJECT_TYPE_CHOICES_CONTROL: "L",
SUBJECT_TYPE_CHOICES_PATIENT: "P",
}
APPOINTMENT_TYPE_DEFAULT_COLOR = '#cfc600'
APPOINTMENT_TYPE_DEFAULT_FONT_COLOR = '#00000'
......
......@@ -13,6 +13,8 @@ class Location(models.Model):
blank=True,
default="")
prefix = models.CharField(max_length=1, null=True)
def __str__(self):
return "%s" % self.name
......
......@@ -110,7 +110,7 @@ class Subject(models.Model):
)
screening_number = models.CharField(max_length=50,
unique=True,
verbose_name='Screening number'
verbose_name='Screening number', blank=False, null=False
)
nd_number = models.CharField(max_length=6,
blank=True,
......
......@@ -36,11 +36,6 @@ class Worker(models.Model):
email = models.EmailField(
verbose_name='E-mail'
)
screening_number_prefix = models.CharField(max_length=1,
null=True,
blank=True,
verbose_name='Default screening number prefix',
)
ROLE_CHOICES_SECRETARY = "SECRETARY"
ROLE_CHOICES = (
......
from django.contrib.auth.models import User
from django.test import TestCase
from django.test import Client
from django.test import TestCase
from functions import get_test_location, create_subject, create_worker
from web.forms import SubjectAddForm, get_new_screening_number
......@@ -61,15 +61,6 @@ class SubjectAddFormTests(TestCase):
self.assertFalse(validation_status)
self.assertTrue("nd_number" in form2.errors)
def test_invalid_3(self):
form_data = self.sample_data
form_data['screening_number'] = ""
form = SubjectAddForm(data=form_data, user=self.user)
validation_status = form.is_valid()
self.assertFalse(validation_status)
self.assertTrue("screening_number" in form.errors)
def test_get_new_screening_number(self):
prefix = "X-"
subject = create_subject()
......@@ -88,15 +79,6 @@ class SubjectAddFormTests(TestCase):
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()
......
......@@ -8,7 +8,7 @@ from django.urls import reverse
from functions import create_subject, create_visit, create_appointment, create_worker, get_test_location
from web.forms import SubjectAddForm, SubjectEditForm
from web.models import Subject
from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL
from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT
from web.views.notifications import get_today_midnight_date
......@@ -24,15 +24,11 @@ class SubjectsViewTests(TestCase):
self.client.login(username=username, password=password)
def test_subjects_add(self):
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_render_subject_edit(self):
subject = create_subject()
......@@ -66,8 +62,6 @@ class SubjectsViewTests(TestCase):
self.assertTrue(updated_subject.resigned)
def test_subjects_add_2(self):
self.worker.screening_number_prefix = "X"
self.worker.save()
form = SubjectAddForm(user=self.user)
form_data = {}
......@@ -75,7 +69,6 @@ class SubjectsViewTests(TestCase):
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"
......@@ -88,7 +81,57 @@ class SubjectsViewTests(TestCase):
self.assertContains(response, "Subject created")
subject = Subject.objects.all()[0]
self.assertEqual("X-001", subject.screening_number)
self.assertEqual("L-001", subject.screening_number,
"prefix should start by L as default location prefix is not defined and subject type is control")
def test_subjects_add_patient(self):
form = SubjectAddForm(user=self.user)
form_data = {}
for key, value in form.initial.items():
if value is not None:
form_data[key] = value
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_PATIENT
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)
response = self.client.get(response.url)
self.assertContains(response, "Subject created")
subject = Subject.objects.all()[0]
self.assertEqual("P-001", subject.screening_number,
"prefix should start by P as default location prefix is not defined and subject type is patient")
def test_subjects_add_with_prefixed_location(self):
form = SubjectAddForm(user=self.user)
form_data = {}
for key, value in form.initial.items():
if value is not None:
form_data[key] = value
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_PATIENT
location = get_test_location()
location.prefix = 'X'
location.save()
form_data["default_location"] = location.id
response = self.client.post(reverse('web.views.subject_add'), data=form_data)
self.assertEqual(response.status_code, 302)
response = self.client.get(response.url)
self.assertContains(response, "Subject created")
subject = Subject.objects.all()[0]
self.assertEqual("X-001", subject.screening_number,
"prefix should start by X as default location prefix is equal to 'X'")
def test_render_subjects(self):
create_subject()
......
......@@ -3,8 +3,8 @@ from django.contrib import messages
from django.shortcuts import redirect, get_object_or_404
from . import wrap_response
from ..forms import SubjectAddForm, SubjectEditForm, VisitDetailForm, get_prefix_screening_number
from ..models import Subject, Worker, MailTemplate
from ..forms import SubjectAddForm, SubjectEditForm, VisitDetailForm
from ..models import Subject, MailTemplate
SUBJECT_LIST_GENERIC = "GENERIC"
SUBJECT_LIST_NO_VISIT = "NO_VISIT"
......@@ -26,8 +26,7 @@ def subject_add(request):
messages.add_message(request, messages.SUCCESS, 'Subject created')
return redirect('web.views.subject_edit', id=form.instance.id)
else:
worker = Worker.get_by_user(request.user)
form = SubjectAddForm(user=request.user, initial={'screening_number': get_prefix_screening_number(worker)})
form = SubjectAddForm(user=request.user)
return wrap_response(request, 'subjects/add.html', {'form': form})
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment