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

when adding worker role is defined by worker type

parent 88a2c13f
No related branches found
No related tags found
1 merge request!117Resolve "extend worker class"
from forms import WorkerAddForm, \ from forms import WorkerForm, AppointmentDetailForm, AppointmentEditForm, AppointmentAddForm, VisitDetailForm, \
WorkerEditForm, AppointmentDetailForm, AppointmentEditForm, AppointmentAddForm, VisitDetailForm, VisitAddForm, \ VisitAddForm, ContactAttemptForm, ContactAttemptEditForm, KitRequestForm, StatisticsForm, AvailabilityAddForm, \
ContactAttemptForm, ContactAttemptEditForm, KitRequestForm, StatisticsForm, AvailabilityAddForm, \
AvailabilityEditForm, HolidayAddForm AvailabilityEditForm, HolidayAddForm
from study_subject_forms import StudySubjectAddForm, StudySubjectDetailForm, StudySubjectEditForm from study_subject_forms import StudySubjectAddForm, StudySubjectDetailForm, StudySubjectEditForm
from subject_forms import SubjectAddForm, SubjectEditForm, SubjectDetailForm from subject_forms import SubjectAddForm, SubjectEditForm, SubjectDetailForm
from voucher_forms import VoucherTypeForm, VoucherTypePriceForm, VoucherForm from voucher_forms import VoucherTypeForm, VoucherTypePriceForm, VoucherForm
__all__ = [StudySubjectAddForm, StudySubjectDetailForm, StudySubjectEditForm, WorkerAddForm, WorkerEditForm, __all__ = [StudySubjectAddForm, StudySubjectDetailForm, StudySubjectEditForm, WorkerForm,
AppointmentDetailForm, AppointmentEditForm, AppointmentAddForm, VisitDetailForm, VisitAddForm, AppointmentDetailForm, AppointmentEditForm, AppointmentAddForm, VisitDetailForm, VisitAddForm,
ContactAttemptForm, ContactAttemptEditForm, KitRequestForm, StatisticsForm, AvailabilityAddForm, ContactAttemptForm, ContactAttemptEditForm, KitRequestForm, StatisticsForm, AvailabilityAddForm,
AvailabilityEditForm, HolidayAddForm, SubjectAddForm, SubjectEditForm, SubjectDetailForm, VoucherTypeForm, AvailabilityEditForm, HolidayAddForm, SubjectAddForm, SubjectEditForm, SubjectDetailForm, VoucherTypeForm,
......
...@@ -6,9 +6,11 @@ from django import forms ...@@ -6,9 +6,11 @@ from django import forms
from django.forms import ModelForm, Form from django.forms import ModelForm, Form
from django.utils.dates import MONTHS from django.utils.dates import MONTHS
from web.models.constants import GLOBAL_STUDY_ID
from web.models import StudySubject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \ from web.models import StudySubject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \
Availability, Holiday Availability, Holiday
from web.models.constants import SUBJECT_TYPE_CHOICES from web.models.constants import SUBJECT_TYPE_CHOICES
from web.models.worker_study_role import STUDY_ROLE_CHOICES, WorkerStudyRole
from web.views.notifications import get_filter_locations from web.views.notifications import get_filter_locations
""" """
...@@ -49,16 +51,23 @@ def get_worker_from_args(kwargs): ...@@ -49,16 +51,23 @@ def get_worker_from_args(kwargs):
return result return result
class WorkerAddForm(ModelForm): class WorkerForm(ModelForm):
class Meta: class Meta:
model = Worker model = Worker
exclude = ['appointments'] exclude = ['appointments']
def __init__(self, *args, **kwargs):
choices = kwargs.pop('role_choices', STUDY_ROLE_CHOICES)
super(WorkerForm, self).__init__(*args, **kwargs)
self.fields['role'] = forms.ChoiceField(label='Role', choices=choices)
class WorkerEditForm(ModelForm): def save(self, commit=True):
class Meta: instance = super(WorkerForm, self).save(commit)
model = Worker roles = WorkerStudyRole.objects.filter(worker=instance, study_id=GLOBAL_STUDY_ID)
fields = '__all__' if roles.count() > 0:
roles.update(role=self.cleaned_data['role'])
else:
WorkerStudyRole.objects.create(worker=instance, study_id=GLOBAL_STUDY_ID, role=self.cleaned_data['role'])
class AppointmentDetailForm(ModelForm): class AppointmentDetailForm(ModelForm):
...@@ -88,7 +97,7 @@ class AppointmentEditForm(ModelForm): ...@@ -88,7 +97,7 @@ class AppointmentEditForm(ModelForm):
self.user = Worker.get_by_user(user) self.user = Worker.get_by_user(user)
if self.user is None: if self.user is None:
raise TypeError("Worker not defined for: " + user.username) raise TypeError("Worker not defined for: " + user.username)
super(ModelForm, self).__init__(*args, **kwargs) super(AppointmentEditForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs: if 'instance' in kwargs:
initial_appointment_types = AppointmentTypeLink.objects.filter(appointment=kwargs['instance']).values_list( initial_appointment_types = AppointmentTypeLink.objects.filter(appointment=kwargs['instance']).values_list(
'appointment_type', flat=True) 'appointment_type', flat=True)
...@@ -385,5 +394,3 @@ class HolidayAddForm(ModelForm): ...@@ -385,5 +394,3 @@ class HolidayAddForm(ModelForm):
availabilities = worker.availability_set.all() availabilities = worker.availability_set.all()
for availability in availabilities: for availability in availabilities:
validate_availability_conflict(self, self.cleaned_data, availability) validate_availability_conflict(self, self.cleaned_data, availability)
...@@ -22,11 +22,20 @@ STUDY_ROLE_CHOICES = ( ...@@ -22,11 +22,20 @@ STUDY_ROLE_CHOICES = (
(ROLE_CHOICES_SECRETARY, 'Secretary') (ROLE_CHOICES_SECRETARY, 'Secretary')
) )
ROLE_CHOICES = STUDY_ROLE_CHOICES + ( HEALTH_PARTNER_ROLE_CHOICES = (
(ROLE_CHOICES_HEALTH_PARTNER, "Health Partner"), (ROLE_CHOICES_HEALTH_PARTNER, "Health Partner"),
)
VOUCHER_PARTNER_ROLE_CHOICES = (
(ROLE_CHOICES_VOUCHER_PARTNER, "Voucher Partner"), (ROLE_CHOICES_VOUCHER_PARTNER, "Voucher Partner"),
) )
ROLE_CHOICES = STUDY_ROLE_CHOICES + HEALTH_PARTNER_ROLE_CHOICES + VOUCHER_PARTNER_ROLE_CHOICES
WORKER_STAFF = "STAFF"
WORKER_HEALTH_PARTNER = "HEALTH_PARTNER"
WORKER_VOUCHER_PARTNER = "VOUCHER_PARTNER"
class WorkerStudyRole(models.Model): class WorkerStudyRole(models.Model):
class Meta: class Meta:
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
{% block maincontent %} {% block maincontent %}
<div> <div>
<a href="{% url 'web.views.worker_add' %}" class="btn btn-app"> <a href="{% url 'web.views.worker_add' worker_type %}" class="btn btn-app">
<i class="fa fa-plus"></i> <i class="fa fa-plus"></i>
Add new worker</a> Add new worker</a>
</div> </div>
......
...@@ -2,16 +2,17 @@ import logging ...@@ -2,16 +2,17 @@ import logging
from django.urls import reverse from django.urls import reverse
from web.tests.functions import create_language, create_location, create_availability from web.forms import WorkerForm
from web.forms import WorkerAddForm
from web.tests import create_worker
from web.models import Worker from web.models import Worker
from web.models.worker_study_role import WORKER_STAFF, ROLE_CHOICES_DOCTOR
from web.tests import create_worker
from web.tests.functions import create_language, create_location, create_availability
from .. import LoggedInTestCase from .. import LoggedInTestCase
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class DoctorViewTests(LoggedInTestCase): class WorkerViewTests(LoggedInTestCase):
def test_render_workers_list_request(self): def test_render_workers_list_request(self):
create_worker() create_worker()
...@@ -21,7 +22,7 @@ class DoctorViewTests(LoggedInTestCase): ...@@ -21,7 +22,7 @@ class DoctorViewTests(LoggedInTestCase):
def test_render_add_worker_request(self): def test_render_add_worker_request(self):
create_worker() create_worker()
response = self.client.get(reverse('web.views.worker_add')) response = self.client.get(reverse('web.views.worker_add', kwargs={'worker_type': WORKER_STAFF}))
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):
...@@ -30,7 +31,7 @@ class DoctorViewTests(LoggedInTestCase): ...@@ -30,7 +31,7 @@ class DoctorViewTests(LoggedInTestCase):
location = create_location() location = create_location()
count = Worker.objects.all().count() count = Worker.objects.all().count()
form = WorkerAddForm() form = WorkerForm()
form_data = {} form_data = {}
for key, value in form.initial.items(): for key, value in form.initial.items():
if value is not None: if value is not None:
...@@ -43,8 +44,10 @@ class DoctorViewTests(LoggedInTestCase): ...@@ -43,8 +44,10 @@ class DoctorViewTests(LoggedInTestCase):
form_data["specialization"] = "tester" form_data["specialization"] = "tester"
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
response = self.client.post(reverse('web.views.worker_add'), data=form_data) response = self.client.post(reverse('web.views.worker_add', kwargs={'worker_type': WORKER_STAFF}),
data=form_data)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
......
...@@ -99,9 +99,10 @@ urlpatterns = [ ...@@ -99,9 +99,10 @@ urlpatterns = [
# DOCTORS # # DOCTORS #
#################### ####################
url(r'^doctors$', views.worker.worker_list, name='web.views.workers'), url(r'^doctors/$', views.worker.worker_list, name='web.views.workers'),
url(r'^doctors/add$', views.worker.worker_add, name='web.views.worker_add'), url(r'^doctors/(?P<worker_type>[A-z]+)$', views.worker.worker_list, name='web.views.workers'),
url(r'^doctors/edit/(?P<doctor_id>\d+)$', views.worker.worker_edit, name='web.views.worker_edit'), url(r'^doctors/add/(?P<worker_type>[A-z]+)$', views.worker.worker_add, name='web.views.worker_add'),
url(r'^doctors/edit/(?P<worker_id>\d+)$', views.worker.worker_edit, name='web.views.worker_edit'),
url(r'^doctors/disable/(?P<doctor_id>\d+)$', views.worker.doctor_disable, name='web.views.worker_disable'), url(r'^doctors/disable/(?P<doctor_id>\d+)$', views.worker.doctor_disable, name='web.views.worker_disable'),
url(r'^doctors/(?P<doctor_id>\d+)/availability/add$', views.worker.worker_availability_add, url(r'^doctors/(?P<doctor_id>\d+)/availability/add$', views.worker.worker_availability_add,
......
# coding=utf-8 # coding=utf-8
import logging
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import redirect, get_object_or_404
from web.models.worker_study_role import STUDY_ROLE_CHOICES, HEALTH_PARTNER_ROLE_CHOICES, VOUCHER_PARTNER_ROLE_CHOICES, \
WORKER_STAFF, WORKER_HEALTH_PARTNER, WORKER_VOUCHER_PARTNER
from . import wrap_response from . import wrap_response
from ..forms import WorkerAddForm, WorkerEditForm, AvailabilityAddForm, AvailabilityEditForm, HolidayAddForm from ..forms import WorkerForm, AvailabilityAddForm, AvailabilityEditForm, HolidayAddForm
from ..models import Worker, Availability, Holiday from ..models import Worker, Availability, Holiday
from ..models.constants import WEEKDAY_CHOICES from ..models.constants import WEEKDAY_CHOICES, GLOBAL_STUDY_ID
logger = logging.getLogger(__name__)
def worker_list(request): def worker_list(request, worker_type=WORKER_STAFF):
doctors_list = Worker.objects.order_by('-last_name') doctors_list = Worker.objects.order_by('-last_name')
context = { context = {
'doctors_list': doctors_list 'doctors_list': doctors_list,
'worker_type': worker_type
} }
return wrap_response(request, "doctors/index.html", context) return wrap_response(request, "doctors/index.html", context)
def worker_add(request): def role_choices_by_worker_type(worker_type):
logger.debug(worker_type)
if worker_type == WORKER_STAFF:
return STUDY_ROLE_CHOICES
elif worker_type == WORKER_HEALTH_PARTNER:
return HEALTH_PARTNER_ROLE_CHOICES
elif worker_type == WORKER_VOUCHER_PARTNER:
return VOUCHER_PARTNER_ROLE_CHOICES
else:
return ()
def worker_add(request, worker_type):
if request.method == 'POST': if request.method == 'POST':
form = WorkerAddForm(request.POST, request.FILES) form = WorkerForm(request.POST, request.FILES, role_choices=role_choices_by_worker_type(worker_type))
if form.is_valid(): if form.is_valid():
form.save() form.save()
return redirect('web.views.workers') return redirect('web.views.workers')
else: else:
form = WorkerAddForm() form = WorkerForm(role_choices=role_choices_by_worker_type(worker_type))
return wrap_response(request, 'doctors/add.html', {'form': form}) return wrap_response(request, 'doctors/add.html', {'form': form})
def worker_edit(request, doctor_id): def role_choices_by_worker(worker):
the_doctor = get_object_or_404(Worker, id=doctor_id) roles = worker.roles.filter(study=GLOBAL_STUDY_ID)
if roles.count() == 0:
return STUDY_ROLE_CHOICES
role = roles[0]
for role_type, role_name in STUDY_ROLE_CHOICES.items():
if role_type == role:
return STUDY_ROLE_CHOICES
for role_type, role_name in HEALTH_PARTNER_ROLE_CHOICES.items():
if role_type == role:
return HEALTH_PARTNER_ROLE_CHOICES
for role_type, role_name in VOUCHER_PARTNER_ROLE_CHOICES.items():
if role_type == role:
return VOUCHER_PARTNER_ROLE_CHOICES
return STUDY_ROLE_CHOICES
def worker_edit(request, worker_id):
worker = get_object_or_404(Worker, id=worker_id)
if request.method == 'POST': if request.method == 'POST':
form = WorkerEditForm(request.POST, request.FILES, instance=the_doctor) form = WorkerForm(request.POST, request.FILES, instance=worker, role_choices=role_choices_by_worker(worker))
if form.is_valid(): if form.is_valid():
form.save() form.save()
return redirect('web.views.workers') return redirect('web.views.workers')
else: else:
form = WorkerEditForm(instance=the_doctor) form = WorkerForm(instance=worker)
availabilities = Availability.objects.filter(person=doctor_id).order_by('day_number', 'available_from') availabilities = Availability.objects.filter(person=worker_id).order_by('day_number', 'available_from')
holidays = Holiday.objects.filter(person=doctor_id).order_by('-datetime_start') holidays = Holiday.objects.filter(person=worker_id).order_by('-datetime_start')
return wrap_response(request, 'doctors/edit.html', return wrap_response(request, 'doctors/edit.html',
{ {
'form': form, 'form': form,
'availabilities': availabilities, 'availabilities': availabilities,
'holidays': holidays, 'holidays': holidays,
'doctor_id': doctor_id, 'doctor_id': worker_id,
'weekdays': WEEKDAY_CHOICES 'weekdays': WEEKDAY_CHOICES
}) })
......
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