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

test checking if export of custom fields is working

addditionally export url requires study_id
parent 0d9bf5d2
No related branches found
No related tags found
1 merge request!265Resolve "configurable study fields"
......@@ -68,10 +68,10 @@
</ul>
</div>
<ul>
<li><a onclick="addFields(this, 'subject_fields')" href="{% url 'web.views.export_to_excel' 'subjects' %}"><i class="fa fa-file-excel-o"></i> XLS -
<li><a onclick="addFields(this, 'subject_fields')" href="{% url 'web.views.export_to_excel' study_id 'subjects' %}"><i class="fa fa-file-excel-o"></i> XLS -
Excel</a>
</li>
<li><a onclick="addFields(this, 'subject_fields')" href="{% url 'web.views.export_to_csv' 'subjects' %}"><i class="fa fa-file-text-o"></i> CSV -
<li><a onclick="addFields(this, 'subject_fields')" href="{% url 'web.views.export_to_csv' study_id 'subjects' %}"><i class="fa fa-file-text-o"></i> CSV -
Text based</a></li>
</ul>
<h3>Appointments</h3>
......@@ -87,9 +87,9 @@
</ul>
</div>
<ul>
<li><a onclick="addFields(this, 'appointment_fields')" href="{% url 'web.views.export_to_excel' 'appointments' %}"><i class="fa fa-file-excel-o"></i> XLS -
<li><a onclick="addFields(this, 'appointment_fields')" href="{% url 'web.views.export_to_excel' study_id 'appointments' %}"><i class="fa fa-file-excel-o"></i> XLS -
Excel</a></li>
<li><a onclick="addFields(this, 'appointment_fields')" href="{% url 'web.views.export_to_csv' 'appointments' %}"><i class="fa fa-file-text-o"></i> CSV -
<li><a onclick="addFields(this, 'appointment_fields')" href="{% url 'web.views.export_to_csv' study_id 'appointments' %}"><i class="fa fa-file-text-o"></i> CSV -
Text based</a></li>
</ul>
</div>
......
......@@ -26,12 +26,12 @@
{% endif %}
{% if "change_worker" in permissions %}
<li data-desc="workers">
<a href="{% url 'web.views.workers' %}">
<i class="fa fa-user-md"></i>
<span>Worker</span>
</a>
</li>
<li data-desc="workers">
<a href="{% url 'web.views.workers' %}">
<i class="fa fa-user-md"></i>
<span>Worker</span>
</a>
</li>
{% endif %}
{% if equipment_perms %}
......@@ -85,57 +85,59 @@
{% if "export_subjects" in permissions %}
<li data-desc="export">
<a href="{% url 'web.views.export' %}">
<a href="{% url 'web.views.export' study_id %}">
<i class="fa fa-file-excel-o"></i>
<span>Export</span>
</a>
</li>
{% endif %}
{% if study.has_vouchers and "change_voucher" in permissions%}
<li data-desc="vouchers">
<a href="{% url 'web.views.vouchers' %}">
<i class="fa fa-user-md"></i>
<span>Vouchers</span>
</a>
</li>
{% if study.has_vouchers and "change_voucher" in permissions %}
<li data-desc="vouchers">
<a href="{% url 'web.views.vouchers' %}">
<i class="fa fa-user-md"></i>
<span>Vouchers</span>
</a>
</li>
{% endif %}
{% if conf_perms %}
<li data-desc="configuration" class="treeview">
<a href="#">
<i class="fa fa-wrench"></i> <span>Configuration</span>
<span class="pull-right-container">
<li data-desc="configuration" class="treeview">
<a href="#">
<i class="fa fa-wrench"></i> <span>Configuration</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
{% if "change_configurationitem" in permissions %}
<li data-desc="settings"><a href="{% url 'web.views.configuration' %}">General</a></li>
{% endif %}
{% if "change_language" in permissions %}
<li data-desc="languages"><a href="{% url 'web.views.languages' %}">Languages</a></li>
{% endif %}
{% if study.has_voucher_types and "change_vouchertype" in permissions %}
<li data-desc="voucher_types"><a href="{% url 'web.views.voucher_types' %}">Voucher types</a></li>
{% endif %}
{% if study.has_vouchers and "change_worker" in permissions %}
<li data-desc="voucher_partner"><a href="{% url 'web.views.workers' 'VOUCHER_PARTNER' %}">Voucher partners</a></li>
{% endif %}
{% if "change_worker" in permissions %}
<li data-desc="health_partner"><a href="{% url 'web.views.workers' 'HEALTH_PARTNER' %}">Health partners</a></li>
{% endif %}
{% if "change_study" in permissions %}
<li data-desc="study_conf"><a href="{% url 'web.views.edit_study' study_id %}">Study</a></li>
{% endif %}
</ul>
</li>
</a>
<ul class="treeview-menu">
{% if "change_configurationitem" in permissions %}
<li data-desc="settings"><a href="{% url 'web.views.configuration' %}">General</a></li>
{% endif %}
{% if "change_language" in permissions %}
<li data-desc="languages"><a href="{% url 'web.views.languages' %}">Languages</a></li>
{% endif %}
{% if study.has_voucher_types and "change_vouchertype" in permissions %}
<li data-desc="voucher_types"><a href="{% url 'web.views.voucher_types' %}">Voucher types</a></li>
{% endif %}
{% if study.has_vouchers and "change_worker" in permissions %}
<li data-desc="voucher_partner"><a href="{% url 'web.views.workers' 'VOUCHER_PARTNER' %}">Voucher
partners</a></li>
{% endif %}
{% if "change_worker" in permissions %}
<li data-desc="health_partner"><a href="{% url 'web.views.workers' 'HEALTH_PARTNER' %}">Health
partners</a></li>
{% endif %}
{% if "change_study" in permissions %}
<li data-desc="study_conf"><a href="{% url 'web.views.edit_study' study_id %}">Study</a></li>
{% endif %}
</ul>
</li>
{% endif %}
......
......@@ -2,50 +2,59 @@
from django.urls import reverse
from web.models import Appointment, AppointmentTypeLink
from web.models.constants import CUSTOM_FIELD_TYPE_TEXT
from web.models.custom_data import CustomStudySubjectField
from web.models.custom_data.custom_study_subject_field import get_study_subject_field_id
from web.tests import LoggedInTestCase
from web.tests.functions import create_study_subject, create_appointment, create_visit, create_appointment_type
from web.views.export import subject_to_row_for_fields, DROP_OUT_FIELD
from web.tests.functions import create_study_subject, create_appointment, create_visit, create_appointment_type, \
get_test_study
from web.views.export import subject_to_row_for_fields, DROP_OUT_FIELD, get_subjects_as_array
class TestExportView(LoggedInTestCase):
def test_export_subjects_to_csv(self):
self.login_as_admin()
create_study_subject()
response = self.client.get(reverse('web.views.export_to_csv', kwargs={'data_type': "subjects"}))
response = self.client.get(
reverse('web.views.export_to_csv', kwargs={'study_id': get_test_study().id, 'data_type': "subjects"}))
self.assertEqual(response.status_code, 200)
def test_export_subjects_to_csv_without_permission(self):
self.client.get(reverse("web.views.mail_templates"))
create_study_subject()
response = self.client.get(reverse('web.views.export_to_csv', kwargs={'data_type': "subjects"}))
response = self.client.get(
reverse('web.views.export_to_csv', kwargs={'study_id': get_test_study().id, 'data_type': "subjects"}))
self.assertEqual(response.status_code, 302)
def test_render_export(self):
self.login_as_admin()
create_study_subject()
response = self.client.get(reverse('web.views.export'))
response = self.client.get(reverse('web.views.export', kwargs={'study_id': get_test_study().id}))
self.assertEqual(response.status_code, 200)
def test_render_export_without_permission(self):
create_study_subject()
response = self.client.get(reverse('web.views.export'))
response = self.client.get(reverse('web.views.export', kwargs={'study_id': get_test_study().id}))
self.assertEqual(response.status_code, 302)
def test_export_appointments_to_csv(self):
self.login_as_admin()
create_appointment()
response = self.client.get(reverse('web.views.export_to_csv', kwargs={'data_type': "appointments"}))
response = self.client.get(
reverse('web.views.export_to_csv', kwargs={'study_id': get_test_study().id, 'data_type': "appointments"}))
self.assertEqual(response.status_code, 200)
def test_export_subjects_to_excel(self):
self.login_as_admin()
create_study_subject()
response = self.client.get(reverse('web.views.export_to_excel', kwargs={'data_type': "subjects"}))
response = self.client.get(
reverse('web.views.export_to_excel', kwargs={'study_id': get_test_study().id, 'data_type': "subjects"}))
self.assertEqual(response.status_code, 200)
def test_export_subjects_to_excel_without_permission(self):
create_study_subject()
response = self.client.get(reverse('web.views.export_to_excel', kwargs={'data_type': "subjects"}))
response = self.client.get(
reverse('web.views.export_to_excel', kwargs={'study_id': get_test_study().id, 'data_type': "subjects"}))
self.assertEqual(response.status_code, 302)
def test_export_appointments_to_excel(self):
......@@ -55,7 +64,8 @@ class TestExportView(LoggedInTestCase):
appointment.save()
AppointmentTypeLink.objects.create(appointment=appointment, appointment_type=create_appointment_type())
response = self.client.get(reverse('web.views.export_to_excel', kwargs={'data_type': "appointments"}))
response = self.client.get(
reverse('web.views.export_to_excel', kwargs={'study_id': get_test_study().id, 'data_type': "appointments"}))
self.assertEqual(response.status_code, 200)
def test_subject_to_row_for_fields_when_not_resigned(self):
......@@ -86,3 +96,11 @@ class TestExportView(LoggedInTestCase):
result = subject_to_row_for_fields(subject, [DROP_OUT_FIELD])
self.assertTrue(result[0])
def test_subject_with_custom_field(self):
subject = create_study_subject()
field = CustomStudySubjectField.objects.create(study=subject.study, name='HW', type=CUSTOM_FIELD_TYPE_TEXT)
subject.set_custom_data_value(field, 'bbb')
subjects = get_subjects_as_array(get_test_study(), get_study_subject_field_id(field))
self.assertEqual('bbb', subjects[1][0])
......@@ -256,9 +256,9 @@ urlpatterns = [
# EXPORT #
####################
url(r'^export$', views.export.export, name='web.views.export'),
url(r'^export/csv/(?P<data_type>[A-z]+)$', views.export.export_to_csv, name='web.views.export_to_csv'),
url(r'^export/xls/(?P<data_type>[A-z]+)$', views.export.export_to_excel, name='web.views.export_to_excel'),
url(r'^study/(?P<study_id>\d+)export$', views.export.export, name='web.views.export'),
url(r'^study/(?P<study_id>\d+)export/csv/(?P<data_type>[A-z]+)$', views.export.export_to_csv, name='web.views.export_to_csv'),
url(r'^study/(?P<study_id>\d+)export/xls/(?P<data_type>[A-z]+)$', views.export.export_to_excel, name='web.views.export_to_excel'),
####################
# CONFIGURATION #
......
......@@ -5,10 +5,11 @@ from distutils.util import strtobool
import django_excel as excel
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from web.decorators import PermissionDecorator
from web.models import Subject, StudySubject, Appointment, ConfigurationItem
from web.models.constants import VISIT_SHOW_VISIT_NUMBER_FROM_ZERO, GLOBAL_STUDY_ID
from web.models import Subject, StudySubject, Appointment, ConfigurationItem, Study
from web.models.constants import VISIT_SHOW_VISIT_NUMBER_FROM_ZERO
from web.models.custom_data import CustomStudySubjectField
from web.models.custom_data.custom_study_subject_field import get_study_subject_field_id
from web.templatetags.filters import display_visit_number
......@@ -17,7 +18,8 @@ from .notifications import get_today_midnight_date
@PermissionDecorator('export_subjects', 'subject')
def export_to_csv(request, data_type="subjects"):
def export_to_csv(request, study_id, data_type="subjects"):
study = get_object_or_404(Study, id=study_id)
# Create the HttpResponse object with the appropriate CSV header.
selected_fields = request.GET.get('fields', None)
response = HttpResponse(content_type='text/csv; charset=utf-8')
......@@ -25,7 +27,7 @@ def export_to_csv(request, data_type="subjects"):
"%Y-%m-%d") + '.csv"'
if data_type == "subjects":
data = get_subjects_as_array(selected_fields=selected_fields)
data = get_subjects_as_array(study, selected_fields=selected_fields)
elif data_type == "appointments":
data = get_appointments_as_array(selected_fields=selected_fields)
else:
......@@ -38,11 +40,12 @@ def export_to_csv(request, data_type="subjects"):
@PermissionDecorator('export_subjects', 'subject')
def export_to_excel(request, data_type="subjects"):
def export_to_excel(request, study_id, data_type="subjects"):
study = get_object_or_404(Study, id=study_id)
selected_fields = request.GET.get('fields', None)
filename = data_type + '-' + get_today_midnight_date().strftime("%Y-%m-%d") + ".xls"
if data_type == "subjects":
data = get_subjects_as_array(selected_fields=selected_fields)
data = get_subjects_as_array(study, selected_fields=selected_fields)
elif data_type == "appointments":
data = get_appointments_as_array(selected_fields=selected_fields)
else:
......@@ -94,7 +97,7 @@ def filter_fields_from_selected_fields(fields, selected_fields):
return [field for field in fields if field.name in selected_fields]
def get_default_subject_fields():
def get_default_subject_fields(study: Study):
visit_from_zero = ConfigurationItem.objects.get(type=VISIT_SHOW_VISIT_NUMBER_FROM_ZERO).value
visit_from_zero = strtobool(visit_from_zero)
subject_fields = []
......@@ -113,15 +116,15 @@ def get_default_subject_fields():
number = int(match.groups()[0])
field.verbose_name = 'Virus {} RT-PCR date'.format(display_visit_number(number))
subject_fields.append(field)
for custom_field in CustomStudySubjectField.objects.filter(study__id=GLOBAL_STUDY_ID).all():
for custom_field in CustomStudySubjectField.objects.filter(study=study).all():
subject_fields.append(
CustomField({'verbose_name': custom_field.name, 'name': get_study_subject_field_id(custom_field)}))
return subject_fields
def get_subjects_as_array(selected_fields=None):
def get_subjects_as_array(study: Study, selected_fields: str = None):
result = []
subject_fields = get_default_subject_fields()
subject_fields = get_default_subject_fields(study)
subject_fields = filter_fields_from_selected_fields(subject_fields, selected_fields)
field_names = [field.verbose_name for field in subject_fields] # faster than loop
......@@ -136,7 +139,7 @@ def get_subjects_as_array(selected_fields=None):
def subject_to_row_for_fields(study_subject: StudySubject, subject_fields):
row = []
custom_fields = CustomStudySubjectField.objects.filter(study__id=GLOBAL_STUDY_ID).all()
custom_fields = CustomStudySubjectField.objects.filter(study=study_subject.study).all()
for field in subject_fields:
cell = None
......@@ -223,8 +226,10 @@ def get_appointments_as_array(selected_fields=None):
@PermissionDecorator('export_subjects', 'subject')
def export(request):
def export(request, study_id):
study = get_object_or_404(Study, id=study_id)
return wrap_response(request, 'export/index.html', {
'subject_fields': get_default_subject_fields(),
'appointment_fields': get_appointment_fields()[0]
'subject_fields': get_default_subject_fields(study),
'appointment_fields': get_appointment_fields()[0],
'study_id': study_id
})
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