diff --git a/smash/web/migrations/0154_add_permission_to_existing_workers.py b/smash/web/migrations/0154_add_permission_to_existing_workers.py new file mode 100644 index 0000000000000000000000000000000000000000..76d2ca30d1e461f10b09a110f1b3d66d036dff4f --- /dev/null +++ b/smash/web/migrations/0154_add_permission_to_existing_workers.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2020-03-19 13:01 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0153_auto_20200320_0932'), + ] + + operations = [ + migrations.RunSQL("insert into web_workerstudyrole_permissions(workerstudyrole_id, permission_id) " + "select web_workerstudyrole.id, auth_permission.id from web_workerstudyrole,auth_permission " + "where codename='add_subject';"), + + ] diff --git a/smash/web/templates/subjects/index.html b/smash/web/templates/subjects/index.html index cfe954bcc1251c81a64dffee7c12a18b62893bda..29a4d2308145826a49e5d49091eb949a3157b524 100644 --- a/smash/web/templates/subjects/index.html +++ b/smash/web/templates/subjects/index.html @@ -31,7 +31,7 @@ padding-left: 2px; } .visit_row > span > a{ - color: inherit; + color: inherit; } .appointment_type_list{ margin-top: 10px; @@ -57,7 +57,11 @@ {% block maincontent %} <div> - <a href="{% url 'web.views.subject_add' %}" class="btn btn-app"> + <a href="{% url 'web.views.subject_add' %}" class="btn btn-app" + {% if not "add_subject" in permissions %} + disabled + {% endif %} + > <i class="fa fa-plus"></i> Add new subject </a> diff --git a/smash/web/tests/view/test_study.py b/smash/web/tests/view/test_study.py index 6b7f18b6e90f2190f03ea9ef233a390807c668af..40df2f29ea6df924021cb5f854c40e6731562b1d 100644 --- a/smash/web/tests/view/test_study.py +++ b/smash/web/tests/view/test_study.py @@ -10,9 +10,9 @@ from web.tests.functions import get_test_study, format_form_field logger = logging.getLogger(__name__) -class SubjectsViewTests(LoggedInWithWorkerTestCase): +class StudyViewTests(LoggedInWithWorkerTestCase): def setUp(self): - super(SubjectsViewTests, self).setUp() + super(StudyViewTests, self).setUp() self.study = get_test_study() def test_render_study_edit(self): diff --git a/smash/web/tests/view/test_subjects.py b/smash/web/tests/view/test_subjects.py index c1a99e76530f7aa12f79e6edb0edd5b08d00ef4a..71f0d3e773fa9cfba8d2cd6c5c3d5988c9bf6eaf 100644 --- a/smash/web/tests/view/test_subjects.py +++ b/smash/web/tests/view/test_subjects.py @@ -1,6 +1,7 @@ import datetime import logging +from django.contrib.auth.models import Permission from django.core.files.uploadedfile import SimpleUploadedFile from django.urls import reverse @@ -23,6 +24,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): self.study = get_test_study() def test_render_subjects_add(self): + self.worker.roles.all()[0].permissions.add(Permission.objects.get(codename="add_subject")) self.worker.save() response = self.client.get(reverse('web.views.subject_add')) @@ -161,6 +163,8 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): return form_data def test_subjects_add_2(self): + self.worker.roles.all()[0].permissions.add(Permission.objects.get(codename="add_subject")) + self.worker.save() form_data = self.create_add_form_data_for_study_subject() form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_CONTROL @@ -176,6 +180,8 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): " as default location prefix is not defined and subject type is control") def test_subjects_add_with_referral_letter_file(self): + self.worker.roles.all()[0].permissions.add(Permission.objects.get(codename="add_subject")) + self.worker.save() StudyColumns.objects.all().update(referral_letter=True) form_data = self.create_add_form_data_for_study_subject() @@ -213,6 +219,8 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): form_data["study_subject-last_name"] = "Doe" def test_subjects_add_patient(self): + self.worker.roles.all()[0].permissions.add(Permission.objects.get(codename="add_subject")) + self.worker.save() form_data = self.create_add_form_data_for_study_subject() form_data["study_subject-default_location"] = get_test_location().id @@ -227,6 +235,8 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): " as default location prefix is not defined and subject type is patient") def test_subjects_add_invalid(self): + self.worker.roles.all()[0].permissions.add(Permission.objects.get(codename="add_subject")) + self.worker.save() form_data = self.create_add_form_data_for_study_subject() form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_CONTROL form_data["study_subject-default_location"] = get_test_location().id @@ -237,6 +247,8 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): self.assertTrue("Invalid data" in response.content) def test_subjects_add_with_prefixed_location(self): + self.worker.roles.all()[0].permissions.add(Permission.objects.get(codename="add_subject")) + self.worker.save() form_data = self.create_add_form_data_for_study_subject() form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_CONTROL diff --git a/smash/web/views/subject.py b/smash/web/views/subject.py index cb8cf69d285f57f1496dd66e092e08bf9365cc1d..ef65d5f486e0aa018a762fa8deb0091a09fdf72a 100644 --- a/smash/web/views/subject.py +++ b/smash/web/views/subject.py @@ -4,6 +4,7 @@ import logging from django.contrib import messages from django.shortcuts import redirect, get_object_or_404 +from web.decorators import PermissionDecorator from . import wrap_response from ..forms import VisitDetailForm, SubjectAddForm, SubjectEditForm, StudySubjectAddForm, StudySubjectEditForm from ..models import StudySubject, MailTemplate, Worker, Study, Provenance, Subject @@ -27,6 +28,7 @@ def subjects(request): return subject_list(request, SUBJECT_LIST_GENERIC) +@PermissionDecorator('add_subject', 'subject') def subject_add(request): study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0] if request.method == 'POST':