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

Merge branch 'bump-requirements' into 'master'

Bump requirements

Closes #350

See merge request NCER-PD/scheduling-system!279
parents 1f530b23 419a4b40
No related branches found
No related tags found
1 merge request!279Bump requirements
Pipeline #34798 passed
coverage==5.3 coverage==5.3
django-debug-toolbar==1.11 django-debug-toolbar==2.2
mockito==1.2.2 mockito==1.2.2
parameterized==0.7.4 parameterized==0.7.4
pycurl==7.43.0.2 pycurl==7.43.0.2
asn1crypto==0.24.0 asn1crypto==1.4.0
Babel==2.6.0 Babel==2.9.0
backports.functools-lru-cache==1.5 backports.functools-lru-cache==1.6.1
certifi==2018.8.24 certifi==2020.11.8
cffi==1.14.2 cffi==1.14.4
chardet==3.0.4 chardet==3.0.4
coverage==5.3 coverage==5.3
cryptography==2.3.1 cryptography==3.2.1
cycler==0.10.0 cycler==0.10.0
Django==2.0.13 Django==3.1.3
django-cleanup==4.0.0 django-cleanup==5.1.0
django-common-helpers==0.9.2 django-common-helpers==0.9.2
django-cron==0.5.0 django-cron==0.5.1
django-excel==0.0.9 django-excel==0.0.10
django-formtools==2.2 django-formtools==2.2
django-otp==0.9.4 django-otp==1.0.2
django-phonenumber-field==1.3.0 django-phonenumber-field==5.0.0
django-stronghold==0.4.0 django-stronghold==0.4.0
django-two-factor-auth==1.11 django-two-factor-auth==1.13
enum34==1.1.6 enum34==1.1.10
Faker==0.9.2 Faker==4.17.1
funcsigs==1.0.2 funcsigs==1.0.2
gunicorn==19.6.0 gunicorn==20.0.4
idna==2.7 idna==2.10
ipaddress==1.0.22 ipaddress==1.0.23
kiwisolver==1.0.1 kiwisolver==1.3.1
lml==0.0.4 lml==0.1.0
luhn==0.2.0 luhn==0.2.0
lxml==4.5.2 lxml==4.6.1
matplotlib==2.2.3 matplotlib==3.3.3
mockito==1.2.2 mockito==1.2.2
nexmo==2.3.0 nexmo==2.5.2
numpy==1.19.2 numpy==1.19.4
pandas==1.1.3 pandas==1.1.4
django-datatables-view==1.19.1 django-datatables-view==1.19.1
phonenumberslite==8.9.14 phonenumberslite==8.12.13
Pillow==8.0.1 Pillow==3.4.2
psycopg2==2.8.6 psycopg2==2.8.6
pycparser==2.19 pycparser==2.20
pyexcel==0.6.4 pyexcel==0.6.6
pyexcel-io==0.5.19 pyexcel-io==0.6.4
pyexcel-webio==0.1.4 pyexcel-webio==0.1.4
pyexcel-xls==0.5.9 pyexcel-xls==0.6.1
PyJWT==1.6.4 PyJWT==1.7.1
pyparsing==2.2.2 pyparsing==2.4.7
python-dateutil==2.7.3 python-dateutil==2.8.1
python-docx==0.8.6 python-docx==0.8.10
pytz==2017.2 pytz==2020.4
qrcode==4.0.4 qrcode==6.1
requests==2.19.1 requests==2.25.0
six==1.15.0 six==1.15.0
sqlparse==0.2.4 sqlparse==0.4.1
subprocess32==3.5.2 subprocess32==3.5.4
text-unidecode==1.2 text-unidecode==1.3
texttable==1.4.0 texttable==1.6.3
timeout-decorator==0.4.0 timeout-decorator==0.5.0
Unidecode==1.0.22 urllib3==1.26.2
urllib3==1.23
whitenoise==5.2.0 whitenoise==5.2.0
xlrd==1.1.0 xlrd==1.2.0
xlwt==1.3.0 xlwt==1.3.0
parameterized==0.7.4 parameterized==0.7.4
\ No newline at end of file setuptools==50.3.2
\ No newline at end of file
...@@ -31,7 +31,6 @@ from numpy.random import choice ...@@ -31,7 +31,6 @@ from numpy.random import choice
from faker import Faker from faker import Faker
import platform import platform
import tempfile import tempfile
import unidecode
from shutil import copyfile from shutil import copyfile
...@@ -40,7 +39,7 @@ class smashProvider(BaseProvider): ...@@ -40,7 +39,7 @@ class smashProvider(BaseProvider):
__provider__ = 'smash' __provider__ = 'smash'
__lang__ = 'fr_FR' __lang__ = 'fr_FR'
fake = Faker() fake = Faker()
fake.seed(4321) Faker.seed(4321)
specialists = ['Psychiatrist', 'Radiologist', 'Immunologist', 'Anesthesiologist', specialists = ['Psychiatrist', 'Radiologist', 'Immunologist', 'Anesthesiologist',
'Surgeon', 'Pediatrician', 'Neurologist', 'Medical examiner'] 'Surgeon', 'Pediatrician', 'Neurologist', 'Medical examiner']
...@@ -477,7 +476,7 @@ class smashProvider(BaseProvider): ...@@ -477,7 +476,7 @@ class smashProvider(BaseProvider):
getAlreadyCreatedSmashLanguages = languages[0] getAlreadyCreatedSmashLanguages = languages[0]
if phone_number is None: if phone_number is None:
phone_number = self.fake.phone_number() phone_number = self.fake.phone_number()[:20]
if social_security_number is None: if social_security_number is None:
social_security_number = '' social_security_number = ''
...@@ -529,11 +528,11 @@ class smashProvider(BaseProvider): ...@@ -529,11 +528,11 @@ class smashProvider(BaseProvider):
last_name = self.fake.last_name().lower() last_name = self.fake.last_name().lower()
if username is None: if username is None:
username = '{}_{}'.format(first_name, last_name) username = '{}_{}'.format(first_name, last_name)
username = unidecode.unidecode(username).lower().replace(' ', '_') username = username.lower().replace(' ', '_')
if email is None: if email is None:
email = '{}.{}@smash.lu'.format(first_name, last_name) email = '{}.{}@smash.lu'.format(first_name, last_name)
email = unidecode.unidecode(email) email = email
# create user # create user
defaults = {'email': email, 'password': password} defaults = {'email': email, 'password': password}
user, _ = User.objects.update_or_create( user, _ = User.objects.update_or_create(
...@@ -589,7 +588,7 @@ class smashProvider(BaseProvider): ...@@ -589,7 +588,7 @@ class smashProvider(BaseProvider):
unit = self.getSmashUnit() unit = self.getSmashUnit()
if phone_number is None: if phone_number is None:
phone_number = self.fake.phone_number() phone_number = self.fake.phone_number()[:20]
if role is None: if role is None:
role = self.getWorkerRole() role = self.getWorkerRole()
...@@ -608,6 +607,7 @@ class smashProvider(BaseProvider): ...@@ -608,6 +607,7 @@ class smashProvider(BaseProvider):
defaults = {'first_name': first_name, 'last_name': last_name, defaults = {'first_name': first_name, 'last_name': last_name,
'email': email, 'unit': unit, 'specialization': specialization, 'email': email, 'unit': unit, 'specialization': specialization,
'phone_number': phone_number, 'user': user} 'phone_number': phone_number, 'user': user}
worker, _ = Worker.objects.update_or_create(first_name=first_name, worker, _ = Worker.objects.update_or_create(first_name=first_name,
last_name=last_name, defaults=defaults) last_name=last_name, defaults=defaults)
...@@ -721,7 +721,7 @@ if __name__ == "__main__": ...@@ -721,7 +721,7 @@ if __name__ == "__main__":
if not os.path.exists(MEDIA_ROOT): if not os.path.exists(MEDIA_ROOT):
os.makedirs(MEDIA_ROOT) os.makedirs(MEDIA_ROOT)
fake = Faker() fake = Faker()
fake.seed(4321) Faker.seed(4321)
fake.add_provider(smashProvider) fake.add_provider(smashProvider)
fake.createSmashFlyingTeams() fake.createSmashFlyingTeams()
fake.createSmashItems() fake.createSmashItems()
......
from django.contrib.auth.views import logout
from web.models.constants import GLOBAL_STUDY_ID from web.models.constants import GLOBAL_STUDY_ID
from web.models import Worker, Study from web.models import Worker, Study
from django.contrib import messages from django.contrib import messages
...@@ -21,7 +19,7 @@ class PrivacyNoticeMiddleware(MiddlewareMixin): ...@@ -21,7 +19,7 @@ class PrivacyNoticeMiddleware(MiddlewareMixin):
if request.user.is_authenticated \ if request.user.is_authenticated \
and not view_func == privacy_notice_accept \ and not view_func == privacy_notice_accept \
and not request.user.is_superuser \ and not request.user.is_superuser \
and not view_func == logout: and not request.path == reverse('logout'):
study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0] study = Study.objects.filter(id=GLOBAL_STUDY_ID)[0]
worker = Worker.get_by_user(request.user) worker = Worker.get_by_user(request.user)
if worker is None: if worker is None:
......
...@@ -27,7 +27,8 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase): ...@@ -27,7 +27,8 @@ class StudySubjectAddFormTests(LoggedInWithWorkerTestCase):
'type': SUBJECT_TYPE_CHOICES_CONTROL, 'type': SUBJECT_TYPE_CHOICES_CONTROL,
'default_location': location.id, 'default_location': location.id,
'screening_number': "123", 'screening_number': "123",
'subject': self.subject.id 'subject': self.subject.id,
'postponed': False
} }
def test_validation(self): def test_validation(self):
......
...@@ -26,7 +26,8 @@ class StudySubjectEditFormTests(LoggedInWithWorkerTestCase): ...@@ -26,7 +26,8 @@ class StudySubjectEditFormTests(LoggedInWithWorkerTestCase):
'screening_number': self.study_subject.screening_number, 'screening_number': self.study_subject.screening_number,
'nd_number': self.study_subject.nd_number, 'nd_number': self.study_subject.nd_number,
'subject': self.study_subject.subject.id, 'subject': self.study_subject.subject.id,
'id': self.study_subject.id 'id': self.study_subject.id,
'postponed': False
} }
def tearDown(self): def tearDown(self):
......
...@@ -15,8 +15,8 @@ class VisitAddFormTests(TestCase): ...@@ -15,8 +15,8 @@ class VisitAddFormTests(TestCase):
self.sample_data = {'datetime_begin': "2017-01-01", self.sample_data = {'datetime_begin': "2017-01-01",
'datetime_end': "2017-02-02", 'datetime_end': "2017-02-02",
'subject': self.subject.id, 'subject': self.subject.id,
'appointment_types': '' 'appointment_types': '',
'post_mail_sent': False
} }
def test_validation(self): def test_validation(self):
......
...@@ -194,6 +194,14 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): ...@@ -194,6 +194,14 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
self.worker.save() self.worker.save()
form_data = self.create_add_form_data_for_study_subject() form_data = self.create_add_form_data_for_study_subject()
form = SubjectAddForm(data=form_data, prefix="subject")
print(form.errors)
self.assertTrue(form.is_valid())
form = StudySubjectAddForm(data=form_data, prefix="study_subject", user=self.user, study=self.study)
print(form.errors)
self.assertTrue(form.is_valid())
form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_CONTROL form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_CONTROL
response = self.client.post(reverse('web.views.subject_add', kwargs={'study_id': self.study.id}), response = self.client.post(reverse('web.views.subject_add', kwargs={'study_id': self.study.id}),
data=form_data) data=form_data)
...@@ -215,6 +223,13 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): ...@@ -215,6 +223,13 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_CONTROL form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_CONTROL
form_data["study_subject-referral_letter"] = SimpleUploadedFile("file.txt", b"file_content") form_data["study_subject-referral_letter"] = SimpleUploadedFile("file.txt", b"file_content")
form = SubjectAddForm(data=form_data, prefix="subject")
self.assertTrue(form.is_valid())
form = StudySubjectAddForm(data=form_data, prefix="study_subject", user=self.user, study=self.study)
self.assertTrue(form.is_valid())
response = self.client.post(reverse('web.views.subject_add', kwargs={'study_id': self.study.id}), response = self.client.post(reverse('web.views.subject_add', kwargs={'study_id': self.study.id}),
data=form_data) data=form_data)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
...@@ -239,6 +254,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase): ...@@ -239,6 +254,7 @@ class SubjectsViewTests(LoggedInWithWorkerTestCase):
form_data["subject-sex"] = SEX_CHOICES_MALE form_data["subject-sex"] = SEX_CHOICES_MALE
form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_PATIENT form_data["study_subject-type"] = SUBJECT_TYPE_CHOICES_PATIENT
form_data["study_subject-subject"] = self.study_subject.id form_data["study_subject-subject"] = self.study_subject.id
form_data["study_subject-postponed"] = False
# TODO remove after refactoring # TODO remove after refactoring
form_data["study_subject-country"] = COUNTRY_AFGHANISTAN_ID form_data["study_subject-country"] = COUNTRY_AFGHANISTAN_ID
......
...@@ -4,7 +4,7 @@ import logging ...@@ -4,7 +4,7 @@ import logging
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from web.forms import VisitDetailForm from web.forms import VisitDetailForm, VisitAddForm
from web.models import Visit, MailTemplate from web.models import Visit, MailTemplate
from web.models.constants import MAIL_TEMPLATE_CONTEXT_VISIT from web.models.constants import MAIL_TEMPLATE_CONTEXT_VISIT
from web.tests import LoggedInTestCase from web.tests import LoggedInTestCase
...@@ -82,6 +82,10 @@ class VisitViewTests(LoggedInTestCase): ...@@ -82,6 +82,10 @@ class VisitViewTests(LoggedInTestCase):
form_data["datetime_begin"] = "2017-01-01" form_data["datetime_begin"] = "2017-01-01"
form_data["datetime_end"] = "2017-04-01" form_data["datetime_end"] = "2017-04-01"
form_data["subject"] = subject.id form_data["subject"] = subject.id
form_data["post_mail_sent"] = False
form = VisitAddForm(data=form_data)
self.assertTrue(form.is_valid())
response = self.client.post(reverse('web.views.visit_add', kwargs={'subject_id': subject.id}), data=form_data) response = self.client.post(reverse('web.views.visit_add', kwargs={'subject_id': subject.id}), data=form_data)
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
......
...@@ -16,7 +16,7 @@ Including another URLconf ...@@ -16,7 +16,7 @@ Including another URLconf
from django.conf import settings from django.conf import settings
from django.conf.urls import include from django.conf.urls import include
from django.conf.urls import url from django.conf.urls import url
from django.contrib.auth.views import logout from django.contrib.auth.views import LogoutView
from django.views.defaults import page_not_found from django.views.defaults import page_not_found
from web import views from web import views
...@@ -297,7 +297,7 @@ urlpatterns = [ ...@@ -297,7 +297,7 @@ urlpatterns = [
# url(r'^login$', views.auth.login, name='web.views.login'), # url(r'^login$', views.auth.login, name='web.views.login'),
# url(r'^logout$', views.auth.logout, name='web.views.logout'), # url(r'^logout$', views.auth.logout, name='web.views.logout'),
url(r'^logout$', logout, name='logout'), url(r'^logout$', LogoutView.as_view(), name='logout'),
url(r'^$', views.index, name='web.views.index') url(r'^$', views.index, name='web.views.index')
] ]
......
...@@ -16,11 +16,11 @@ class SecuredFileWidget(forms.FileInput): ...@@ -16,11 +16,11 @@ class SecuredFileWidget(forms.FileInput):
attrs = {} attrs = {}
super(SecuredFileWidget, self).__init__(attrs) super(SecuredFileWidget, self).__init__(attrs)
def render(self, name, value, attrs=None): def render(self, name, value, attrs=None, renderer=None):
output = [] output = []
if value and hasattr(value, "url"): if value and hasattr(value, "url"):
url = reverse('web.views.uploaded_files') + '?file=' + str(value) url = reverse('web.views.uploaded_files') + '?file=' + str(value)
out = '<a href="{}">{}</a><br />{} ' out = '<a href="{}">{}</a><br />{} '
output.append(out.format(url, _('Download'), _('Change:'))) output.append(out.format(url, _('Download'), _('Change:')))
output.append(super(SecuredFileWidget, self).render(name, value, attrs)) output.append(super(SecuredFileWidget, self).render(name, value, attrs, renderer=renderer))
return mark_safe(''.join(output)) return mark_safe(''.join(output))
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