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

export to excel

parent 59cc8ac5
No related branches found
No related tags found
1 merge request!60Resolve "Export to Excel"
...@@ -6,6 +6,10 @@ smash/~/ ...@@ -6,6 +6,10 @@ smash/~/
# Disable python bytecode # Disable python bytecode
*.pyc *.pyc
#vim swap files
*.swp
#vim backup files
*~
# Disable local developer settings # Disable local developer settings
local_settings.py local_settings.py
......
...@@ -8,4 +8,8 @@ python-docx==0.8.6 ...@@ -8,4 +8,8 @@ python-docx==0.8.6
django-cleanup==0.4.2 django-cleanup==0.4.2
django_cron==0.5.0 django_cron==0.5.0
django-two-factor-auth==1.6.1 django-two-factor-auth==1.6.1
nexmo nexmo
\ No newline at end of file django-excel==0.0.9
pyexcel-xls==0.5.0
pyexcel==0.5.3
.cell {
display: table-cell;
border-bottom: 1px solid black;
border: 1px solid #BBBBBB;
padding:4px;
text-align: center;
vertical-align: middle;
}
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
{% block styles %} {% block styles %}
{{ block.super }} {{ block.super }}
<link rel="stylesheet" href="{% static 'css/export.css' %}">
{% endblock styles %} {% endblock styles %}
{% block ui_active_tab %}'export'{% endblock ui_active_tab %} {% block ui_active_tab %}'export'{% endblock ui_active_tab %}
...@@ -18,15 +19,21 @@ ...@@ -18,15 +19,21 @@
{% block maincontent %} {% block maincontent %}
<div> <div>
<a href="{% url 'web.views.export_to_csv' 'subjects' %}" class="btn btn-app"> <h3>Subjects</h3>
<i class="fa fa-download"></i> <ul>
Subjects <li><a href="{% url 'web.views.export_to_excel' 'subjects' %}"><i class="fa fa-file-excel-o"></i> XLS -
</a> Excel</a>
<br/> </li>
<a href="{% url 'web.views.export_to_csv' 'appointments' %}" class="btn btn-app"> <li><a href="{% url 'web.views.export_to_excel' 'appointments' %}"><i class="fa fa-file-text-o"></i> CSV -
<i class="fa fa-download"></i> Text based</a></li>
Appointments </ul>
</a> <h3>Appointments</h3>
<ul>
<li><a href="{% url 'web.views.export_to_csv' 'subjects' %}"><i class="fa fa-file-excel-o"></i> XLS -
Excel</a></li>
<li><a href="{% url 'web.views.export_to_csv' 'appointments' %}"><i class="fa fa-file-text-o"></i> CSV -
Text based</a></li>
</ul>
</div> </div>
<div class="box-body"> <div class="box-body">
......
...@@ -25,12 +25,6 @@ ...@@ -25,12 +25,6 @@
<a href="{% url 'web.views.visits' %}" class="btn btn-block btn-default">Cancel</a> <a href="{% url 'web.views.visits' %}" class="btn btn-block btn-default">Cancel</a>
</div> </div>
{% comment %}
<div class="box-header with-border">
<h3 class="box-title">Details of a visit</h3>
</div>
{% endcomment %}
<form method="post" action="" class="form-horizontal"> <form method="post" action="" class="form-horizontal">
{% csrf_token %} {% csrf_token %}
......
...@@ -6,12 +6,22 @@ from . import LoggedInTestCase ...@@ -6,12 +6,22 @@ from . import LoggedInTestCase
class TestExportView(LoggedInTestCase): class TestExportView(LoggedInTestCase):
def test_export_subjects(self): def test_export_subjects_to_csv(self):
create_subject() create_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={'data_type': "subjects"}))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_export_appointments(self): def test_export_appointments_to_csv(self):
create_appointment() 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={'data_type': "appointments"}))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_export_subjects_to_excel(self):
create_subject()
response = self.client.get(reverse('web.views.export_to_excel', kwargs={'data_type': "subjects"}))
self.assertEqual(response.status_code, 200)
def test_export_appointments_to_excel(self):
create_appointment()
response = self.client.get(reverse('web.views.export_to_excel', kwargs={'data_type': "appointments"}))
self.assertEqual(response.status_code, 200)
...@@ -160,7 +160,8 @@ urlpatterns = [ ...@@ -160,7 +160,8 @@ urlpatterns = [
#################### ####################
url(r'^export$', views.export.export, name='web.views.export'), url(r'^export$', views.export.export, name='web.views.export'),
url(r'^export/(?P<data_type>[A-z]+)$', views.export.export_to_csv, name='web.views.export_to_csv'), 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'),
#################### ####################
# CONFIGURATION # # CONFIGURATION #
......
# coding=utf-8 # coding=utf-8
import csv import csv
import django_excel as excel
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.http import HttpResponse from django.http import HttpResponse
...@@ -24,7 +25,23 @@ def export_to_csv(request, data_type="subjects"): ...@@ -24,7 +25,23 @@ def export_to_csv(request, data_type="subjects"):
return e500_error(request) return e500_error(request)
writer = csv.writer(response, quotechar=str(u'"'), quoting=csv.QUOTE_ALL) writer = csv.writer(response, quotechar=str(u'"'), quoting=csv.QUOTE_ALL)
for row in data: for row in data:
writer.writerow(row) writer.writerow([s.encode("utf-8") for s in row])
return response
@login_required
def export_to_excel(request, data_type="subjects"):
filename = data_type + '-' + get_today_midnight_date().strftime("%Y-%m-%d") + ".xls"
if data_type == "subjects":
data = get_subjects_as_array()
elif data_type == "appointments":
data = get_appointments_as_array()
else:
return e500_error(request)
response = excel.make_response_from_array(data, 'xls', file_name=filename)
response['Content-Disposition'] = 'attachment; filename="' + filename + '"'
return response return response
...@@ -46,8 +63,11 @@ def get_subjects_as_array(): ...@@ -46,8 +63,11 @@ def get_subjects_as_array():
for subject in subjects: for subject in subjects:
row = [] row = []
for field in subject_fields: for field in subject_fields:
row.append(getattr(subject, field.name)) cell = getattr(subject, field.name)
result.append([unicode(s).replace("\n", ";").replace("\r", ";").encode("utf-8") for s in row]) if cell is None:
cell = ""
row.append(cell)
result.append([unicode(s).replace("\n", ";").replace("\r", ";") for s in row])
return result return result
...@@ -69,15 +89,18 @@ def get_appointments_as_array(): ...@@ -69,15 +89,18 @@ def get_appointments_as_array():
appointments = Appointment.objects.order_by('-datetime_when') appointments = Appointment.objects.order_by('-datetime_when')
for appointment in appointments: for appointment in appointments:
row = [appointment.visit.subject.nd_number, appointment.visit.subject.last_name, if appointment.visit is not None:
appointment.visit.subject.first_name, appointment.visit.follow_up_title()] row = [appointment.visit.subject.nd_number, appointment.visit.subject.last_name,
appointment.visit.subject.first_name, appointment.visit.follow_up_title()]
else:
row = ["---", "---", "---", "---"]
for field in appointments_fields: for field in appointments_fields:
row.append(getattr(appointment, field.name)) row.append(getattr(appointment, field.name))
type_string = "" type_string = ""
for appointment_type in appointment.appointment_types.all(): for appointment_type in appointment.appointment_types.all():
type_string += appointment_type.code + "," type_string += appointment_type.code + ","
row.append(type_string) row.append(type_string)
result.append([unicode(s).replace("\n", ";").replace("\r", ";").encode("utf-8") for s in row]) result.append([unicode(s).replace("\n", ";").replace("\r", ";") for s in row])
return result return result
......
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