Commit c08c401471d4e0ca8906f1c937e8645bceb16dae
1 parent
af21a506
Exists in
master
and in
3 other branches
now report exports xls files properly, still has to see if my concurrent solution works
Showing
8 changed files
with
117 additions
and
21 deletions
Show diff stats
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10.4 on 2017-03-23 18:17 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.db import migrations, models | ||
6 | + | ||
7 | + | ||
8 | +class Migration(migrations.Migration): | ||
9 | + | ||
10 | + dependencies = [ | ||
11 | + ('reports', '0002_reportxls'), | ||
12 | + ] | ||
13 | + | ||
14 | + operations = [ | ||
15 | + migrations.AlterField( | ||
16 | + model_name='reportxls', | ||
17 | + name='xls_data', | ||
18 | + field=models.TextField(null=True), | ||
19 | + ), | ||
20 | + ] |
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10.4 on 2017-03-23 18:20 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.db import migrations, models | ||
6 | + | ||
7 | + | ||
8 | +class Migration(migrations.Migration): | ||
9 | + | ||
10 | + dependencies = [ | ||
11 | + ('reports', '0003_auto_20170323_1517'), | ||
12 | + ] | ||
13 | + | ||
14 | + operations = [ | ||
15 | + migrations.AlterField( | ||
16 | + model_name='reportxls', | ||
17 | + name='xls_data', | ||
18 | + field=models.TextField(), | ||
19 | + ), | ||
20 | + ] |
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10.4 on 2017-03-23 19:03 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.db import migrations, models | ||
6 | + | ||
7 | + | ||
8 | +class Migration(migrations.Migration): | ||
9 | + | ||
10 | + dependencies = [ | ||
11 | + ('reports', '0004_auto_20170323_1520'), | ||
12 | + ] | ||
13 | + | ||
14 | + operations = [ | ||
15 | + migrations.AlterField( | ||
16 | + model_name='reportxls', | ||
17 | + name='xls_data', | ||
18 | + field=models.FileField(upload_to='excel/'), | ||
19 | + ), | ||
20 | + ] |
@@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
1 | +# -*- coding: utf-8 -*- | ||
2 | +# Generated by Django 1.10.4 on 2017-03-23 19:29 | ||
3 | +from __future__ import unicode_literals | ||
4 | + | ||
5 | +from django.db import migrations, models | ||
6 | + | ||
7 | + | ||
8 | +class Migration(migrations.Migration): | ||
9 | + | ||
10 | + dependencies = [ | ||
11 | + ('reports', '0005_auto_20170323_1603'), | ||
12 | + ] | ||
13 | + | ||
14 | + operations = [ | ||
15 | + migrations.AlterField( | ||
16 | + model_name='reportxls', | ||
17 | + name='xls_data', | ||
18 | + field=models.FileField(upload_to='files/'), | ||
19 | + ), | ||
20 | + ] |
reports/models.py
@@ -17,7 +17,7 @@ class ReportCSV(models.Model): | @@ -17,7 +17,7 @@ class ReportCSV(models.Model): | ||
17 | class ReportXLS(models.Model): | 17 | class ReportXLS(models.Model): |
18 | 18 | ||
19 | user = models.ForeignKey(User) | 19 | user = models.ForeignKey(User) |
20 | - xls_data = models.TextField() | 20 | + xls_data = models.FileField(upload_to = 'files/') |
21 | 21 | ||
22 | class Meta: | 22 | class Meta: |
23 | verbose_name = "ReportCSV" | 23 | verbose_name = "ReportCSV" |
reports/templates/reports/view.html
@@ -65,10 +65,11 @@ | @@ -65,10 +65,11 @@ | ||
65 | <ul id="report-info"> | 65 | <ul id="report-info"> |
66 | <li> {{data.values|length}} {% trans "register(s)" %} </li> | 66 | <li> {{data.values|length}} {% trans "register(s)" %} </li> |
67 | <li> | 67 | <li> |
68 | - <a href="{% url 'subjects:reports:download_report_csv' %}"><i class="fa fa-download" aria-hidden="true"></i> {% trans "Interactions Data" %}</a> | 68 | + <a href="{% url 'subjects:reports:download_report_csv' %}"><i class="fa fa-download" aria-hidden="true"></i> {% trans "Interactions Data (.csv)" %}</a> |
69 | 69 | ||
70 | 70 | ||
71 | </li> | 71 | </li> |
72 | + <li><a href="{% url 'subjects:reports:download_report_xls' %}"><i class="fa fa-download" aria-hidden="true"></i> {% trans "Interactions Data (.xls)" %}</a></li> | ||
72 | </ul> | 73 | </ul> |
73 | 74 | ||
74 | 75 |
reports/urls.py
@@ -8,4 +8,5 @@ urlpatterns = [ | @@ -8,4 +8,5 @@ urlpatterns = [ | ||
8 | url(r'^get/resources/$', views.get_resources, name='get_resource_and_tags'), | 8 | url(r'^get/resources/$', views.get_resources, name='get_resource_and_tags'), |
9 | url(r'^get/tags/$', views.get_tags, name='get_tags'), | 9 | url(r'^get/tags/$', views.get_tags, name='get_tags'), |
10 | url(r'^post/download_report/$', views.download_report_csv, name="download_report_csv"), | 10 | url(r'^post/download_report/$', views.download_report_csv, name="download_report_csv"), |
11 | + url(r'^post/download_report/excel$', views.download_report_xls, name="download_report_xls"), | ||
11 | ] | 12 | ] |
12 | \ No newline at end of file | 13 | \ No newline at end of file |
reports/views.py
@@ -4,9 +4,9 @@ from django.utils.translation import ugettext_lazy as _ | @@ -4,9 +4,9 @@ from django.utils.translation import ugettext_lazy as _ | ||
4 | 4 | ||
5 | from django import forms | 5 | from django import forms |
6 | from django.core.urlresolvers import reverse_lazy | 6 | from django.core.urlresolvers import reverse_lazy |
7 | - | 7 | +from amadeus import settings |
8 | from django.contrib import messages | 8 | from django.contrib import messages |
9 | - | 9 | +from os.path import join |
10 | import django.views.generic as generic | 10 | import django.views.generic as generic |
11 | from mural.models import SubjectPost, Comment, MuralVisualizations | 11 | from mural.models import SubjectPost, Comment, MuralVisualizations |
12 | from django.db.models import Q | 12 | from django.db.models import Q |
@@ -20,6 +20,7 @@ from collections import OrderedDict | @@ -20,6 +20,7 @@ from collections import OrderedDict | ||
20 | from django.forms import formset_factory | 20 | from django.forms import formset_factory |
21 | from .models import ReportCSV, ReportXLS | 21 | from .models import ReportCSV, ReportXLS |
22 | import pandas as pd | 22 | import pandas as pd |
23 | +from io import BytesIO | ||
23 | 24 | ||
24 | class ReportView(LoginRequiredMixin, generic.FormView): | 25 | class ReportView(LoginRequiredMixin, generic.FormView): |
25 | template_name = "reports/create.html" | 26 | template_name = "reports/create.html" |
@@ -156,27 +157,32 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): | @@ -156,27 +157,32 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): | ||
156 | report.save() | 157 | report.save() |
157 | 158 | ||
158 | #for excel files | 159 | #for excel files |
159 | - """ if ReportXLS.objects.filter(user= self.request.user).count() > 0: | 160 | + if ReportXLS.objects.filter(user= self.request.user).count() > 0: |
160 | report = ReportXLS.objects.get(user=self.request.user) | 161 | report = ReportXLS.objects.get(user=self.request.user) |
161 | report.delete() | 162 | report.delete() |
162 | 163 | ||
163 | - df.drop(df.columns[[0]], axis=1, inplace=True) | ||
164 | - writer = pd.ExcelWriter('pandas_simple.xlsx') | ||
165 | - report = ReportXLS(user= self.request.user, xls_data = df.to_excel(writer)) | ||
166 | - report.save()""" | ||
167 | - | 164 | + path = join(settings.MEDIA_ROOT, 'files' , 'report'+str(self.request.user.id)+'.xls') |
165 | + writer = pd.ExcelWriter(path) | ||
166 | + df.to_excel(writer, sheet_name='first_sheet') | ||
167 | + writer.save() | ||
168 | + report = ReportXLS(user= self.request.user ) | ||
169 | + report.xls_data.name = path | ||
170 | + report.save() | ||
168 | 171 | ||
169 | return context | 172 | return context |
170 | 173 | ||
171 | - """ | ||
172 | - Subject: subject where the report is being created | ||
173 | - topics_query: it's either one of the topics or all of them | ||
174 | - init_date: When the reports filter of dates stars | ||
175 | - end_date: When the reports filter of dates end | ||
176 | - resources_type_names: resources subclasses name that were selected | ||
177 | - tags_id = ID of tag objects that were selected | ||
178 | - """ | 174 | + |
179 | def get_mural_data(self, subject, topics_query, init_date, end_date, resources_type_names, tags_id): | 175 | def get_mural_data(self, subject, topics_query, init_date, end_date, resources_type_names, tags_id): |
176 | + """ | ||
177 | + | ||
178 | + Process all the data to be brough by the report | ||
179 | + Subject: subject where the report is being created | ||
180 | + topics_query: it's either one of the topics or all of them | ||
181 | + init_date: When the reports filter of dates stars | ||
182 | + end_date: When the reports filter of dates end | ||
183 | + resources_type_names: resources subclasses name that were selected | ||
184 | + tags_id = ID of tag objects that were selected | ||
185 | + """ | ||
180 | data = {} | 186 | data = {} |
181 | students = subject.students.all() | 187 | students = subject.students.all() |
182 | formats = ["%d/%m/%Y", "%m/%d/%Y", "%Y-%m-%d"] #so it accepts english and portuguese date formats | 188 | formats = ["%d/%m/%Y", "%m/%d/%Y", "%Y-%m-%d"] #so it accepts english and portuguese date formats |
@@ -199,9 +205,9 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): | @@ -199,9 +205,9 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): | ||
199 | 205 | ||
200 | #For each student in the subject | 206 | #For each student in the subject |
201 | for student in students: | 207 | for student in students: |
202 | - data[student] = [] | 208 | + data[student.id] = [] |
203 | 209 | ||
204 | - data[student].append(student.social_name) | 210 | + data[student.id].append(student.social_name) |
205 | 211 | ||
206 | interactions = OrderedDict() | 212 | interactions = OrderedDict() |
207 | 213 | ||
@@ -289,7 +295,7 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): | @@ -289,7 +295,7 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): | ||
289 | interactions[_("Class")] = "" | 295 | interactions[_("Class")] = "" |
290 | interactions[_("Performance")] = "" | 296 | interactions[_("Performance")] = "" |
291 | for value in interactions.values(): | 297 | for value in interactions.values(): |
292 | - data[student].append(value) | 298 | + data[student.id].append(value) |
293 | 299 | ||
294 | 300 | ||
295 | for key in interactions.keys(): | 301 | for key in interactions.keys(): |
@@ -404,4 +410,12 @@ def download_report_csv(request): | @@ -404,4 +410,12 @@ def download_report_csv(request): | ||
404 | response = HttpResponse(report.csv_data,content_type='text/csv') | 410 | response = HttpResponse(report.csv_data,content_type='text/csv') |
405 | response['Content-Disposition'] = 'attachment; filename="report.csv"' | 411 | response['Content-Disposition'] = 'attachment; filename="report.csv"' |
406 | 412 | ||
413 | + return response | ||
414 | + | ||
415 | +def download_report_xls(request): | ||
416 | + report = ReportXLS.objects.get(user= request.user) | ||
417 | + | ||
418 | + response = HttpResponse(report.xls_data,content_type='application/ms-excel') | ||
419 | + response['Content-Disposition'] = 'attachment; filename="report.xls"' | ||
420 | + | ||
407 | return response | 421 | return response |
408 | \ No newline at end of file | 422 | \ No newline at end of file |