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

refactor of export to csv

common data extraction code extracted
parent 4e67260d
No related branches found
No related tags found
1 merge request!60Resolve "Export to Excel"
......@@ -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>
......
# 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)
......@@ -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 #
......
......@@ -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):
......
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