diff --git a/smash/web/templates/export/index.html b/smash/web/templates/export/index.html index b1813ec7f47d6d675a61a633580272169aa20250..8c0501149511bc3e7704588e508de4128629503f 100644 --- a/smash/web/templates/export/index.html +++ b/smash/web/templates/export/index.html @@ -18,12 +18,12 @@ {% block maincontent %} <div> - <a href="{% url 'web.views.export_to_csv2' 'subjects' %}" class="btn btn-app"> + <a href="{% url 'web.views.export_to_csv' 'subjects' %}" class="btn btn-app"> <i class="fa fa-download"></i> Subjects </a> <br/> - <a href="{% url 'web.views.export_to_csv2' 'appointments' %}" class="btn btn-app"> + <a href="{% url 'web.views.export_to_csv' 'appointments' %}" class="btn btn-app"> <i class="fa fa-download"></i> Appointments </a> diff --git a/smash/web/tests/test_view_export.py b/smash/web/tests/test_view_export.py new file mode 100644 index 0000000000000000000000000000000000000000..1fc16657a5eb6e098f98869f2ca881c9e2d6ac14 --- /dev/null +++ b/smash/web/tests/test_view_export.py @@ -0,0 +1,17 @@ +# coding=utf-8 +from django.urls import reverse + +from functions import create_subject, create_appointment +from . import LoggedInTestCase + + +class TestExportView(LoggedInTestCase): + def test_export_subjects(self): + create_subject() + response = self.client.get(reverse('web.views.export_to_csv', kwargs={'data_type': "subjects"})) + self.assertEqual(response.status_code, 200) + + def test_export_appointments(self): + create_appointment() + response = self.client.get(reverse('web.views.export_to_csv', kwargs={'data_type': "appointments"})) + self.assertEqual(response.status_code, 200) diff --git a/smash/web/urls.py b/smash/web/urls.py index 332b57008700a272e3962fbc9ce23eceffa4bb75..c19857fc45b4fee3f2623fa800390c1d204c1025 100644 --- a/smash/web/urls.py +++ b/smash/web/urls.py @@ -160,7 +160,7 @@ urlpatterns = [ #################### url(r'^export$', views.export.export, name='web.views.export'), - url(r'^export/(?P<type>[A-z]+)$', views.export.export_to_csv2, name='web.views.export_to_csv2'), + url(r'^export/(?P<data_type>[A-z]+)$', views.export.export_to_csv, name='web.views.export_to_csv'), #################### # CONFIGURATION # diff --git a/smash/web/views/export.py b/smash/web/views/export.py index 6f98432d6a056091e83a53173d503d0692290f66..e5a250536e5d39f6e5c38ddc77623011de253d53 100644 --- a/smash/web/views/export.py +++ b/smash/web/views/export.py @@ -10,23 +10,27 @@ from ..models import Subject, Appointment @login_required -def export_to_csv2(request, type="subjects"): +def export_to_csv(request, data_type="subjects"): # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse(content_type='text/csv') - response['Content-Disposition'] = 'attachment; filename="' + type + '-' + get_today_midnight_date().strftime( + response['Content-Disposition'] = 'attachment; filename="' + data_type + '-' + get_today_midnight_date().strftime( "%Y-%m-%d") + '.csv"' - writer = csv.writer(response, quotechar=str(u'"'), quoting=csv.QUOTE_ALL) - if type == "subjects": - write_subjects_to_csv(writer) - elif type == "appointments": - write_appointments_to_csv(writer) + if data_type == "subjects": + data = get_subjects_as_array() + elif data_type == "appointments": + data = get_appointments_as_array() else: return e500_error(request) + writer = csv.writer(response, quotechar=str(u'"'), quoting=csv.QUOTE_ALL) + for row in data: + writer.writerow(row) + return response -def write_subjects_to_csv(writer): +def get_subjects_as_array(): + result = [] subject_fields = [] for field in Subject._meta.fields: if field.name != "ID": @@ -36,17 +40,19 @@ def write_subjects_to_csv(writer): for field in subject_fields: field_names.append(field.verbose_name) - writer.writerow(field_names) + result.append(field_names) subjects = Subject.objects.order_by('-last_name') for subject in subjects: row = [] for field in subject_fields: row.append(getattr(subject, field.name)) - writer.writerow([unicode(s).replace("\n", ";").replace("\r", ";").encode("utf-8") for s in row]) + result.append([unicode(s).replace("\n", ";").replace("\r", ";").encode("utf-8") for s in row]) + return result -def write_appointments_to_csv(writer): +def get_appointments_as_array(): + result = [] appointments_fields = [] for field in Appointment._meta.fields: if field.name != "visit" and field.name != "id" and \ @@ -58,7 +64,7 @@ def write_appointments_to_csv(writer): for field in appointments_fields: field_names.append(field.verbose_name) - writer.writerow(field_names) + result.append(field_names) appointments = Appointment.objects.order_by('-datetime_when') @@ -68,10 +74,11 @@ def write_appointments_to_csv(writer): for field in appointments_fields: row.append(getattr(appointment, field.name)) type_string = "" - for type in appointment.appointment_types.all(): - type_string += type.code + "," + for appointment_type in appointment.appointment_types.all(): + type_string += appointment_type.code + "," row.append(type_string) - writer.writerow([unicode(s).replace("\n", ";").replace("\r", ";").encode("utf-8") for s in row]) + result.append([unicode(s).replace("\n", ";").replace("\r", ";").encode("utf-8") for s in row]) + return result def export(request):