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

Merge remote-tracking branch 'origin/devel_1.0.x' into...

Merge remote-tracking branch 'origin/devel_1.0.x' into 377-in-appointments-the-workers-are-not-visible
parents e39e37df 153434f9
No related branches found
No related tags found
3 merge requests!316Merge 1.0.1,!3151.0.1 into master,!312Resolve "in Appointments the Workers are not visible"
Pipeline #38451 passed
smasch (1.0.1-1) stable; urgency=low
* bug fix: gunicorn request length extended so dynamic table allows for more
columns (#381)
* bug fix: unfinish visit button was always disabled (#386)
* bug fix: generating documents for templates did not work for subjects
created before custom field was added to the study (#388)
* bug fix: readonly custom Date Field was improperly persisted in forms
(#383)
* bug fix: worker initials were not visible after changing appointments
calendar view from month to week (#377)
......
......@@ -8,7 +8,7 @@ User=smasch
Group=smasch
WorkingDirectory=/usr/lib/smasch
ExecStart=/usr/lib/smasch/env/bin/gunicorn -b :8888 --pid /run/smasch/pid smash.wsgi --error-logfile /var/log/smasch/gunicorn.log --log-level DEBUG --capture-output --limit-request-line 8192
ExecStart=/usr/lib/smasch/env/bin/gunicorn -b :8888 --pid /run/smasch/pid smash.wsgi --error-logfile /var/log/smasch/gunicorn.log --log-level DEBUG --capture-output --limit-request-line 16384
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
......
......@@ -26,23 +26,27 @@ def process_file(path_to_docx, path_to_new_docx, changes_to_apply):
doc.save(path_to_new_docx)
def merge_files(files, path_to_new_docx):
'''
When combining templates into a new Document object, python-docx does not properly copy the information of the images, then Word is not able to locate the original content referred by the XML tag in the document. To fix this problem (see #234 ) the first file is loaded and the rest of templates are concatenated to this. This way, the original image content and rId match and the images are shown adequately.
"""
When combining templates into a new Document object, python-docx does not properly copy the information of the
images, then Word is not able to locate the original content referred by the XML tag in the document. To fix this
problem (see #234 ) the first file is loaded and the rest of templates are concatenated to this. This way, the
original image content and rId match and the images are shown adequately.
See issue #235
'''
"""
first_file = files[0]
files = files[1:]
merged_document = Document(first_file) #first file
merged_document = Document(first_file) # first file
if len(files) > 0:
merged_document.add_page_break()
for index, file in enumerate(files): #rest of files if any
for index, file in enumerate(files): # rest of files if any
sub_doc = Document(file)
if index < len(files) - 1:
sub_doc.add_page_break()
for element in sub_doc.element.body:
merged_document.element.body.append(element)
merged_document.save(path_to_new_docx)
\ No newline at end of file
merged_document.save(path_to_new_docx)
......@@ -7,8 +7,8 @@ from django.forms import ModelForm
from web.forms.forms import DATETIMEPICKER_DATE_ATTRS, get_worker_from_args, DATEPICKER_DATE_ATTRS
from web.models import StudySubject, Study, StudyColumns, VoucherType, Worker
from web.models.constants import SCREENING_NUMBER_PREFIXES_FOR_TYPE, CUSTOM_FIELD_TYPE_TEXT, CUSTOM_FIELD_TYPE_BOOLEAN, \
CUSTOM_FIELD_TYPE_INTEGER, CUSTOM_FIELD_TYPE_DOUBLE, \
from web.models.constants import SCREENING_NUMBER_PREFIXES_FOR_TYPE, CUSTOM_FIELD_TYPE_TEXT, \
CUSTOM_FIELD_TYPE_BOOLEAN, CUSTOM_FIELD_TYPE_INTEGER, CUSTOM_FIELD_TYPE_DOUBLE, \
CUSTOM_FIELD_TYPE_DATE, CUSTOM_FIELD_TYPE_SELECT_LIST, CUSTOM_FIELD_TYPE_FILE
from web.models.custom_data import CustomStudySubjectField, CustomStudySubjectValue
from web.models.custom_data.custom_study_subject_field import get_study_subject_field_id
......@@ -158,8 +158,9 @@ class StudySubjectAddForm(StudySubjectForm):
instance = super(StudySubjectAddForm, self).save(commit)
# we can add custom values only after object exists in the database
for field_type in CustomStudySubjectField.objects.filter(study=self.study):
self.instance.set_custom_data_value(field_type, get_study_subject_field_value(field_type, self[
get_study_subject_field_id(field_type)]))
if not field_type.readonly:
self.instance.set_custom_data_value(field_type, get_study_subject_field_value(field_type, self[
get_study_subject_field_id(field_type)]))
return instance
def build_screening_number(self, cleaned_data):
......@@ -289,8 +290,9 @@ class StudySubjectEditForm(StudySubjectForm):
def save(self, commit=True) -> StudySubject:
for field_type in CustomStudySubjectField.objects.filter(study=self.study):
self.instance.set_custom_data_value(field_type, get_study_subject_field_value(field_type, self[
get_study_subject_field_id(field_type)]))
if not field_type.readonly:
self.instance.set_custom_data_value(field_type, get_study_subject_field_value(field_type, self[
get_study_subject_field_id(field_type)]))
return super(StudySubjectForm, self).save(commit)
class Meta:
......
......@@ -338,13 +338,13 @@ class MailTemplate(models.Model):
"##S_ADDRESS##": study_subject.subject.address,
"##S_CITY##": study_subject.subject.city,
"##S_COUNTRY##": str(study_subject.subject.country),
"##S_DIAGNOSIS_YEAR##": study_subject.get_custom_field_value('Year of diagnosis'),
"##S_DIAGNOSIS_YEAR##": str(study_subject.get_custom_field_value('Year of diagnosis')),
"##S_DATE_ADDED##": date_to_str(study_subject.date_added, DATE_FORMAT_SHORT),
"##S_DATE_BORN##": date_born,
"##S_DIAGNOSIS##": study_subject.get_custom_field_value('Diagnosis'),
"##S_DIAGNOSIS##": str(study_subject.get_custom_field_value('Diagnosis')),
"##S_EMAIL##": str(study_subject.subject.email),
"##S_SEX##": study_subject.subject.get_sex_display(),
"##S_MPOWER_ID##": study_subject.get_custom_field_value('MPower ID'),
"##S_MPOWER_ID##": str(study_subject.get_custom_field_value('MPower ID')),
"##S_ND_NUMBER##": study_subject.nd_number,
"##S_PHONE_NUMBER##": str(study_subject.subject.phone_number),
"##S_PHONE_NUMBER_2##": str(study_subject.subject.phone_number_2),
......
......@@ -70,7 +70,7 @@
<div class="col-md-6 form-group">
<label class="col-sm-4 control-label">
{% if visFinished %}
<i title="Only visits with one inmediate future visit (without appointments) can be unfinished." class="fa fa-info-circle"></i>
<i title="Only visits with one immediate future visit (without appointments) can be unfinished." class="fa fa-info-circle"></i>
{% endif %}
Visit finished
</label>
......@@ -95,7 +95,7 @@
{% if visFinished %}
<div class="col-sm-1">
{% if "unfinish_visit" not in permissions %}
{% if "delete_visit" not in permissions %}
<div title="You don't have permissions to unfinish visits." class="btn btn-block btn-warning disabled">
<i class="fa fa-undo"></i>
</div>
......
......@@ -4,13 +4,14 @@ import io
from django.test import TestCase
from docx import Document
from web.models import MailTemplate
from web.models import MailTemplate, StudySubject, Language
from web.models.constants import MAIL_TEMPLATE_CONTEXT_APPOINTMENT, MAIL_TEMPLATE_CONTEXT_VISIT, \
MAIL_TEMPLATE_CONTEXT_SUBJECT, MAIL_TEMPLATE_CONTEXT_VOUCHER
MAIL_TEMPLATE_CONTEXT_SUBJECT, MAIL_TEMPLATE_CONTEXT_VOUCHER, CUSTOM_FIELD_TYPE_TEXT
from web.models.custom_data import CustomStudySubjectField
from web.models.mail_template import DATE_FORMAT_SHORT
from web.tests.functions import create_language, get_resource_path, create_appointment, create_user, \
create_study_subject, \
create_visit, create_voucher, create_worker, create_flying_team
create_visit, create_voucher, create_worker, create_flying_team, get_test_study
class MailTemplateModelTests(TestCase):
......@@ -100,19 +101,32 @@ class MailTemplateModelTests(TestCase):
self.check_doc_contains(doc, [flying_team_name])
def test_apply_subject(self):
template_name_french = "test_fr"
subject = create_study_subject()
subject_template_french = MailTemplate(name=template_name_french, language=self.french_language,
context=MAIL_TEMPLATE_CONTEXT_SUBJECT,
template_file=self.template_file)
stream = io.BytesIO()
subject_template_french.apply(subject, self.user, stream)
doc = Document(stream)
doc = self.create_doc_for_subject(subject, self.french_language, MAIL_TEMPLATE_CONTEXT_SUBJECT)
worker_name = str(self.user.worker)
self.check_doc_contains(doc, [worker_name, str(subject), str(subject.subject.country), subject.nd_number,
subject.get_type_display()])
def test_apply_subject_with_non_existing_custom_field(self):
subject = create_study_subject()
field = CustomStudySubjectField.objects.create(name="Diagnosis", type=CUSTOM_FIELD_TYPE_TEXT,
study=get_test_study(), unique=True)
doc = self.create_doc_for_subject(subject, self.french_language, MAIL_TEMPLATE_CONTEXT_SUBJECT)
worker_name = str(self.user.worker)
self.check_doc_contains(doc, [worker_name, str(subject), str(subject.subject.country), subject.nd_number,
subject.get_type_display()])
def create_doc_for_subject(self, subject: StudySubject, language: Language, context: str):
subject_template_french = MailTemplate(name="test_fr", language=language,
context=context,
template_file=self.template_file)
stream = io.BytesIO()
subject_template_french.apply(subject, self.user, stream)
doc = Document(stream)
return doc
def test_apply_voucher(self):
template_name_french = "test_without_language"
subject = create_study_subject()
......
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