Skip to content
Snippets Groups Projects
Commit 6663e24f authored by Piotr Gawron's avatar Piotr Gawron
Browse files

Merge branch '127-user-managment-page' into 'master'

Resolve "User managment page"

Closes #127

See merge request NCER-PD/scheduling-system!134
parents 85a9810c 52f62872
No related branches found
No related tags found
1 merge request!134Resolve "User managment page"
Pipeline #
import logging import logging
import re
from collections import OrderedDict
from django import forms from django import forms
from django.forms import ModelForm from django.forms import ModelForm
from django_common.auth_backends import User
from web.models import Worker, WorkerStudyRole from web.models import Worker, WorkerStudyRole
from web.models.constants import GLOBAL_STUDY_ID from web.models.constants import GLOBAL_STUDY_ID
...@@ -33,16 +36,68 @@ class WorkerForm(ModelForm): ...@@ -33,16 +36,68 @@ class WorkerForm(ModelForm):
self.fields['role'] = forms.ChoiceField(label='Role', choices=choices) self.fields['role'] = forms.ChoiceField(label='Role', choices=choices)
self.fields['role'].initial = initial_role self.fields['role'].initial = initial_role
del self.fields['user']
if worker_type == WORKER_STAFF: if worker_type == WORKER_STAFF:
del self.fields['voucher_types'] del self.fields['voucher_types']
else: else:
del self.fields['locations'] del self.fields['locations']
del self.fields['user']
fields = OrderedDict()
if worker_type == WORKER_STAFF:
if instance is None or instance.pk is None:
fields['login'] = forms.CharField(label='Login')
fields['password'] = forms.CharField(label='Password', widget=forms.PasswordInput)
fields['password2'] = forms.CharField(label='Repeat password', widget=forms.PasswordInput)
for key, value in self.fields.items():
fields[key] = value
self.fields = fields
def save(self, commit=True): def save(self, commit=True):
create_user = self.cleaned_data.get("login", None) is not None
user = None
if create_user:
user = User.objects.create_user(username=self.cleaned_data['login'],
email=self.cleaned_data['email'],
password=self.cleaned_data['password'])
instance = super(WorkerForm, self).save(commit) instance = super(WorkerForm, self).save(commit)
if create_user:
instance.user = user
instance.save()
roles = WorkerStudyRole.objects.filter(worker=instance, study_id=GLOBAL_STUDY_ID) roles = WorkerStudyRole.objects.filter(worker=instance, study_id=GLOBAL_STUDY_ID)
if roles.count() > 0: if roles.count() > 0:
roles.update(role=self.cleaned_data['role']) roles.update(role=self.cleaned_data['role'])
else: else:
WorkerStudyRole.objects.create(worker=instance, study_id=GLOBAL_STUDY_ID, role=self.cleaned_data['role']) WorkerStudyRole.objects.create(worker=instance, study_id=GLOBAL_STUDY_ID, role=self.cleaned_data['role'])
def clean(self):
cleaned_data = super(WorkerForm, self).clean()
if cleaned_data.get('password', None) is not None:
if cleaned_data['password'] != cleaned_data['password2']:
self.add_error('password', "Password don't match")
self.add_error('password2', "Password don't match")
password = cleaned_data['password']
min_length = 10
if len(password) < min_length:
self.add_error('password', 'Password must be at least ' + str(min_length) + ' characters long.')
# check for digit
if not any(char.isdigit() for char in password):
self.add_error('password', 'Password must contain at least 1 digit.')
# check for letter
if not any(char.isalpha() for char in password):
self.add_error('password', 'Password must contain at least 1 letter.')
if cleaned_data.get('login', None) is not None:
if not re.match('^[.a-zA-Z0-9]+$', cleaned_data['login']):
self.add_error('login', 'Login can contain only alphanumeric characters or dot.')
return cleaned_data
...@@ -222,7 +222,7 @@ class RedcapConnector(object): ...@@ -222,7 +222,7 @@ class RedcapConnector(object):
return result return result
def create_redcap_link(self, pid, redcap_version, subject): def create_redcap_link(self, pid, redcap_version, subject):
return self.base_url + "/redcap_v" + redcap_version + "/DataEntry/index.php?pid=" + pid + "&id=" + \ return self.base_url + "/redcap_v" + redcap_version + "/DataEntry/index.php?pid=" + str(pid) + "&id=" + \
subject.nd_number + "&page=demographics" subject.nd_number + "&page=demographics"
def get_red_cap_subjects(self): def get_red_cap_subjects(self):
......
import logging import logging
from django.urls import reverse from django.urls import reverse
from django_common.auth_backends import User
from web.forms import WorkerForm from web.forms import WorkerForm
from web.models import Worker from web.models import Worker
...@@ -28,6 +29,8 @@ class WorkerViewTests(LoggedInTestCase): ...@@ -28,6 +29,8 @@ class WorkerViewTests(LoggedInTestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_render_worker_added_request(self): def test_render_worker_added_request(self):
self.assertEqual(1, User.objects.all().count())
language = create_language() language = create_language()
location = create_location() location = create_location()
...@@ -35,11 +38,11 @@ class WorkerViewTests(LoggedInTestCase): ...@@ -35,11 +38,11 @@ class WorkerViewTests(LoggedInTestCase):
response = self.client.post(reverse('web.views.worker_add', kwargs={'worker_type': WORKER_STAFF}), response = self.client.post(reverse('web.views.worker_add', kwargs={'worker_type': WORKER_STAFF}),
data=form_data) data=form_data)
logger.debug(response.content)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertEqual(1, Worker.objects.all().count()) self.assertEqual(1, Worker.objects.all().count())
self.assertEqual(2, User.objects.all().count())
def create_add_worker_form_data(self, language, location): def create_add_worker_form_data(self, language, location):
form_data = self.get_form_data(Worker()) form_data = self.get_form_data(Worker())
...@@ -49,6 +52,9 @@ class WorkerViewTests(LoggedInTestCase): ...@@ -49,6 +52,9 @@ class WorkerViewTests(LoggedInTestCase):
form_data["unit"] = "TEST DEPARTMENT" form_data["unit"] = "TEST DEPARTMENT"
form_data["email"] = "john.doe@unknown.domain.com" form_data["email"] = "john.doe@unknown.domain.com"
form_data["specialization"] = "tester" form_data["specialization"] = "tester"
form_data["login"] = "tester.login"
form_data["password"] = "123qweasdzxc"
form_data["password2"] = "123qweasdzxc"
form_data["languages"] = [language.id] form_data["languages"] = [language.id]
form_data["locations"] = [location.id] form_data["locations"] = [location.id]
form_data["role"] = ROLE_CHOICES_DOCTOR form_data["role"] = ROLE_CHOICES_DOCTOR
......
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