Commit 78f2432575e2496e5ca3b046de4d1dca31452108
1 parent
98e35be1
Exists in
master
and in
3 other branches
created model for retrieving simple csv report files and now it's possibl to download csv files
Showing
7 changed files
with
144 additions
and
72 deletions
Show diff stats
reports/locale/pt_BR/LC_MESSAGES/django.po
... | ... | @@ -8,7 +8,7 @@ msgid "" |
8 | 8 | msgstr "" |
9 | 9 | "Project-Id-Version: PACKAGE VERSION\n" |
10 | 10 | "Report-Msgid-Bugs-To: \n" |
11 | -"POT-Creation-Date: 2017-03-17 00:26-0300\n" | |
11 | +"POT-Creation-Date: 2017-03-20 18:40-0300\n" | |
12 | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
13 | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
14 | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" |
... | ... | @@ -66,20 +66,20 @@ msgstr "Esta data deve ser igual ou após" |
66 | 66 | msgid "This date should be right or before " |
67 | 67 | msgstr "Esta data deve ser igual ou anterior à" |
68 | 68 | |
69 | -#: templates/reports/_form.html:4 | |
69 | +#: templates/reports/_form.html:19 | |
70 | 70 | msgid "General Parameters" |
71 | 71 | msgstr "Escolha o Tópico e o Período" |
72 | 72 | |
73 | -#: templates/reports/_form.html:28 | |
73 | +#: templates/reports/_form.html:37 | |
74 | 74 | msgid "Choose the Data Source (is possible to pick more than one)" |
75 | 75 | msgstr "Escolha a fonte de dados (é possível escolher mais de uma)" |
76 | 76 | |
77 | -#: templates/reports/_form.html:65 | |
77 | +#: templates/reports/_form.html:62 | |
78 | 78 | msgid "Interaction with resources" |
79 | 79 | msgstr "Interação com recursos" |
80 | 80 | |
81 | -#: templates/reports/_form.html:100 | |
82 | -msgid "Search" | |
81 | +#: templates/reports/_form.html:97 | |
82 | +msgid "Search Report" | |
83 | 83 | msgstr "Buscar" |
84 | 84 | |
85 | 85 | #: templates/reports/create.html:27 templates/reports/view.html:33 |
... | ... | @@ -134,84 +134,83 @@ msgstr "Dados de interação" |
134 | 134 | msgid "Report created successfully" |
135 | 135 | msgstr "Relatório criado com sucesso!" |
136 | 136 | |
137 | -#: views.py:168 | |
137 | +#: views.py:169 | |
138 | 138 | msgid "Number of help posts created by the user." |
139 | 139 | msgstr "Número de postagens de dúvidas criadas no mural da disciplina." |
140 | 140 | |
141 | -#: views.py:174 | |
141 | +#: views.py:175 | |
142 | 142 | msgid "Amount of comments on help posts created by the student." |
143 | 143 | msgstr "" |
144 | 144 | "Número de comentários criados para as próprias postagens de dúvidas no mural " |
145 | 145 | "da disciplina." |
146 | 146 | |
147 | -#: views.py:179 | |
147 | +#: views.py:180 | |
148 | 148 | msgid "Amount of comments made by the student on teachers help posts." |
149 | 149 | msgstr "" |
150 | 150 | "Número de comentários às postagens de dúvidas no mural da disciplina criadas " |
151 | 151 | "pelo professor." |
152 | 152 | |
153 | -#: views.py:183 | |
153 | +#: views.py:184 | |
154 | 154 | msgid "Amount of comments made by the student on other students help posts." |
155 | 155 | msgstr "" |
156 | 156 | "Número de comentários às postagens de dúvidas no mural da disciplina criadas " |
157 | 157 | "por outros estudantes." |
158 | 158 | |
159 | -#: views.py:194 | |
159 | +#: views.py:195 | |
160 | 160 | msgid "Number of help posts created by the user that the teacher commented on." |
161 | 161 | msgstr "" |
162 | 162 | "Número de comentários às postagens de dúvidas no mural da disciplina criadas " |
163 | 163 | "por outros estudantes" |
164 | 164 | |
165 | -#: views.py:202 | |
165 | +#: views.py:203 | |
166 | 166 | msgid "Number of help posts created by the user others students commented on." |
167 | 167 | msgstr "" |
168 | 168 | " Número de postagens de dúvidas criadas no mural da disciplina que foram " |
169 | 169 | "comentadas por outros estudantes." |
170 | 170 | |
171 | -#: views.py:205 | |
171 | +#: views.py:206 | |
172 | 172 | msgid "Number of student visualizations on the mural of the subject." |
173 | 173 | msgstr "Número de visualizações do mural da disciplina." |
174 | 174 | |
175 | -#: views.py:217 | |
175 | +#: views.py:218 | |
176 | 176 | msgid "Number of access to mural between 6 a.m to 12a.m. ." |
177 | 177 | msgstr "" |
178 | 178 | "Número de acessos ao ambiente virtual da disciplina no horário de 06h às 12h." |
179 | 179 | |
180 | -#: views.py:221 | |
180 | +#: views.py:222 | |
181 | 181 | msgid "Number of access to mural between 0 p.m to 6p.m. ." |
182 | 182 | msgstr "" |
183 | 183 | "Número de acessos ao ambiente virtual da disciplina no horário de 12h às 18h." |
184 | 184 | |
185 | -#: views.py:224 | |
185 | +#: views.py:225 | |
186 | 186 | msgid "Number of access to mural between 6 p.m to 12p.m. ." |
187 | 187 | msgstr "" |
188 | 188 | "Número de acessos ao ambiente virtual da disciplina no horário de 18h às 24h." |
189 | 189 | |
190 | -#: views.py:228 | |
190 | +#: views.py:229 | |
191 | 191 | msgid "Number of access to mural between 0 a.m to 6a.m. ." |
192 | 192 | msgstr "" |
193 | 193 | "Número de acessos ao ambiente virtual da disciplina no horário de 24h às 06h." |
194 | 194 | |
195 | -#: views.py:233 | |
196 | -msgid "sunday" | |
197 | -msgstr "domingo" | |
198 | - | |
199 | -#: views.py:236 views.py:239 | |
195 | +#: views.py:237 views.py:240 | |
200 | 196 | msgid "Number of access to the subject on " |
201 | 197 | msgstr "Número de acessos ao assunto na(o) " |
202 | 198 | |
203 | -#: views.py:242 | |
199 | +#: views.py:243 | |
204 | 200 | msgid "Number of distinct days the user access the subject. " |
205 | 201 | msgstr "Número de dias distintos que acessou o ambiente virtual da disciplina." |
206 | 202 | |
207 | -#: views.py:243 | |
203 | +#: views.py:244 | |
208 | 204 | msgid "Class" |
209 | 205 | msgstr "Classe" |
210 | 206 | |
211 | -#: views.py:244 | |
207 | +#: views.py:245 | |
212 | 208 | msgid "Performance" |
213 | 209 | msgstr "Desempenho" |
214 | 210 | |
211 | +#~ msgid "sunday" | |
212 | +#~ msgstr "domingo" | |
213 | + | |
215 | 214 | #~ msgid "Topics to select data from" |
216 | 215 | #~ msgstr "Tópico do qual os dados serão retirados" |
217 | 216 | ... | ... |
... | ... | @@ -0,0 +1,31 @@ |
1 | +# -*- coding: utf-8 -*- | |
2 | +# Generated by Django 1.10.4 on 2017-03-21 00:06 | |
3 | +from __future__ import unicode_literals | |
4 | + | |
5 | +from django.conf import settings | |
6 | +from django.db import migrations, models | |
7 | +import django.db.models.deletion | |
8 | + | |
9 | + | |
10 | +class Migration(migrations.Migration): | |
11 | + | |
12 | + initial = True | |
13 | + | |
14 | + dependencies = [ | |
15 | + migrations.swappable_dependency(settings.AUTH_USER_MODEL), | |
16 | + ] | |
17 | + | |
18 | + operations = [ | |
19 | + migrations.CreateModel( | |
20 | + name='ReportCSV', | |
21 | + fields=[ | |
22 | + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | |
23 | + ('csv_data', models.TextField()), | |
24 | + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), | |
25 | + ], | |
26 | + options={ | |
27 | + 'verbose_name_plural': 'ReportCSVs', | |
28 | + 'verbose_name': 'ReportCSV', | |
29 | + }, | |
30 | + ), | |
31 | + ] | ... | ... |
reports/models.py
1 | 1 | from django.db import models |
2 | - | |
2 | +from users.models import User | |
3 | 3 | # Create your models here. |
4 | +class ReportCSV(models.Model): | |
5 | + | |
6 | + user = models.ForeignKey(User) | |
7 | + csv_data = models.TextField() | |
8 | + | |
9 | + class Meta: | |
10 | + verbose_name = "ReportCSV" | |
11 | + verbose_name_plural = "ReportCSVs" | |
12 | + | |
13 | + def __str__(self): | |
14 | + pass | |
15 | + | |
4 | 16 | \ No newline at end of file | ... | ... |
reports/templates/reports/_form.html
... | ... | @@ -94,7 +94,7 @@ |
94 | 94 | </div> |
95 | 95 | |
96 | 96 | <div class="row text-center"> |
97 | - <input type="submit" value="{% trans 'Search' %}" class="btn btn-success btn-raised" /> | |
97 | + <input type="submit" value="{% trans 'Search Report' %}" class="btn btn-success btn-raised" /> | |
98 | 98 | </div> |
99 | 99 | </form> |
100 | 100 | ... | ... |
reports/templates/reports/view.html
... | ... | @@ -65,7 +65,9 @@ |
65 | 65 | <ul id="report-info"> |
66 | 66 | <li> {{data.values|length}} {% trans "register(s)" %} </li> |
67 | 67 | <li> |
68 | - <i class="fa fa-download" aria-hidden="true"></i> {% trans "Interactions Data" %} | |
68 | + <a href="{% url 'subjects:reports:download_report' %}?{{csv_data}}"><i class="fa fa-download" aria-hidden="true"></i> {% trans "Interactions Data" %}</a> | |
69 | + | |
70 | + | |
69 | 71 | </li> |
70 | 72 | </ul> |
71 | 73 | ... | ... |
reports/urls.py
... | ... | @@ -7,4 +7,5 @@ urlpatterns = [ |
7 | 7 | url(r'^view/interactions/$', views.ViewReportView.as_view(), name='view_report'), |
8 | 8 | url(r'^get/resources/$', views.get_resources, name='get_resource_and_tags'), |
9 | 9 | url(r'^get/tags/$', views.get_tags, name='get_tags'), |
10 | + url(r'^post/download_report/$', views.download_report, name="download_report"), | |
10 | 11 | ] |
11 | 12 | \ No newline at end of file | ... | ... |
reports/views.py
... | ... | @@ -18,6 +18,8 @@ from log.models import Log |
18 | 18 | from topics.models import Resource, Topic |
19 | 19 | from collections import OrderedDict |
20 | 20 | from django.forms import formset_factory |
21 | +from .models import ReportCSV | |
22 | +import pandas as pd | |
21 | 23 | |
22 | 24 | class ReportView(LoginRequiredMixin, generic.FormView): |
23 | 25 | template_name = "reports/create.html" |
... | ... | @@ -133,10 +135,25 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): |
133 | 135 | |
134 | 136 | resources = params_data.getlist('resource') |
135 | 137 | tags = params_data.getlist('tag') |
136 | - if params_data['from_mural']: | |
137 | - #I used getlist method so it can get more than one tag and one resource class_name | |
138 | - context['data'], context['header'] = self.get_mural_data(subject, params_data['init_date'], params_data['end_date'], | |
139 | - resources, tags ) | |
138 | + self.from_mural = params_data['from_mural'] | |
139 | + #I used getlist method so it can get more than one tag and one resource class_name | |
140 | + context['data'], context['header'] = self.get_mural_data(subject, params_data['init_date'], params_data['end_date'], | |
141 | + resources, tags ) | |
142 | + | |
143 | + | |
144 | + #this is to save the csv for further download | |
145 | + df = pd.DataFrame.from_dict(context['data'], orient='index') | |
146 | + | |
147 | + df.columns = context['header'] | |
148 | + #so it does not exist more than one report CSV available for that user to download | |
149 | + if ReportCSV.objects.filter(user= self.request.user).count() > 0: | |
150 | + report = ReportCSV.objects.get(user=self.request.user) | |
151 | + report.delete() | |
152 | + | |
153 | + | |
154 | + report = ReportCSV(user= self.request.user, csv_data = df.to_csv()) | |
155 | + report.save() | |
156 | + | |
140 | 157 | return context |
141 | 158 | |
142 | 159 | def get_mural_data(self, subject, init_date, end_date, resources_id, tags_id): |
... | ... | @@ -158,52 +175,53 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): |
158 | 175 | |
159 | 176 | data[student].append(student.social_name) |
160 | 177 | |
161 | - interactions = OrderedDict() | |
178 | + interactions = OrderedDict() | |
179 | + | |
162 | 180 | #interactions['username'] = student.social_name |
163 | - | |
164 | - help_posts_made_by_user = SubjectPost.objects.filter(action="help",space__id=subject.id, user=student, | |
165 | - create_date__range=(init_date, end_date)) | |
181 | + if self.from_mural == "True": | |
182 | + help_posts_made_by_user = SubjectPost.objects.filter(action="help",space__id=subject.id, user=student, | |
183 | + create_date__range=(init_date, end_date)) | |
166 | 184 | |
167 | - #number of help posts created by the student | |
168 | - interactions[_('Number of help posts created by the user.')] = help_posts_made_by_user.count() | |
185 | + #number of help posts created by the student | |
186 | + interactions[_('Number of help posts created by the user.')] = help_posts_made_by_user.count() | |
169 | 187 | |
170 | - help_posts = SubjectPost.objects.filter(action="help", create_date__range=(init_date, end_date), | |
171 | - space__id=subject.id) | |
188 | + help_posts = SubjectPost.objects.filter(action="help", create_date__range=(init_date, end_date), | |
189 | + space__id=subject.id) | |
172 | 190 | |
173 | - #comments count on help posts created by the student | |
174 | - interactions[_('Amount of comments on help posts created by the student.')] = Comment.objects.filter(post__in = help_posts.filter(user=student), | |
175 | - create_date__range=(init_date, end_date)).count() | |
176 | - | |
191 | + #comments count on help posts created by the student | |
192 | + interactions[_('Amount of comments on help posts created by the student.')] = Comment.objects.filter(post__in = help_posts.filter(user=student), | |
193 | + create_date__range=(init_date, end_date)).count() | |
194 | + | |
177 | 195 | |
178 | - #count the amount of comments made by the student on posts made by one of the professors | |
179 | - interactions[_('Amount of comments made by the student on teachers help posts.')] = Comment.objects.filter(post__in = help_posts.filter(user__in= subject.professor.all()), create_date__range=(init_date, end_date), | |
180 | - user=student).count() | |
196 | + #count the amount of comments made by the student on posts made by one of the professors | |
197 | + interactions[_('Amount of comments made by the student on teachers help posts.')] = Comment.objects.filter(post__in = help_posts.filter(user__in= subject.professor.all()), create_date__range=(init_date, end_date), | |
198 | + user=student).count() | |
181 | 199 | |
182 | - #comments made by the user on other users posts | |
183 | - interactions[_('Amount of comments made by the student on other students help posts.')] = Comment.objects.filter(post__in = help_posts.exclude(user=student), | |
184 | - create_date__range=(init_date, end_date), | |
185 | - user= student).count() | |
186 | - | |
187 | - | |
188 | - | |
189 | - comments_by_teacher = Comment.objects.filter(user__in=subject.professor.all()) | |
190 | - help_posts_ids = [] | |
191 | - for comment in comments_by_teacher: | |
192 | - help_posts_ids.append(comment.post.id) | |
193 | - #number of help posts created by the user that the teacher commented on | |
194 | - interactions[_('Number of help posts created by the user that the teacher commented on.')] = help_posts.filter(user=student, id__in = help_posts_ids).count() | |
195 | - | |
196 | - | |
197 | - comments_by_others = Comment.objects.filter(user__in=subject.students.exclude(id = student.id)) | |
198 | - help_posts_ids = [] | |
199 | - for comment in comments_by_teacher: | |
200 | - help_posts_ids.append(comment.post.id) | |
201 | - #number of help posts created by the user others students commented on | |
202 | - interactions[_('Number of help posts created by the user others students commented on.')] = help_posts.filter(user=student, id__in = help_posts_ids).count() | |
203 | - | |
204 | - #Number of student visualizations on the mural of the subject | |
205 | - interactions[_('Number of student visualizations on the mural of the subject.')] = MuralVisualizations.objects.filter(post__in = SubjectPost.objects.filter(space__id=subject.id), | |
206 | - user = student).count() | |
200 | + #comments made by the user on other users posts | |
201 | + interactions[_('Amount of comments made by the student on other students help posts.')] = Comment.objects.filter(post__in = help_posts.exclude(user=student), | |
202 | + create_date__range=(init_date, end_date), | |
203 | + user= student).count() | |
204 | + | |
205 | + | |
206 | + | |
207 | + comments_by_teacher = Comment.objects.filter(user__in=subject.professor.all()) | |
208 | + help_posts_ids = [] | |
209 | + for comment in comments_by_teacher: | |
210 | + help_posts_ids.append(comment.post.id) | |
211 | + #number of help posts created by the user that the teacher commented on | |
212 | + interactions[_('Number of help posts created by the user that the teacher commented on.')] = help_posts.filter(user=student, id__in = help_posts_ids).count() | |
213 | + | |
214 | + | |
215 | + comments_by_others = Comment.objects.filter(user__in=subject.students.exclude(id = student.id)) | |
216 | + help_posts_ids = [] | |
217 | + for comment in comments_by_teacher: | |
218 | + help_posts_ids.append(comment.post.id) | |
219 | + #number of help posts created by the user others students commented on | |
220 | + interactions[_('Number of help posts created by the user others students commented on.')] = help_posts.filter(user=student, id__in = help_posts_ids).count() | |
221 | + | |
222 | + #Number of student visualizations on the mural of the subject | |
223 | + interactions[_('Number of student visualizations on the mural of the subject.')] = MuralVisualizations.objects.filter(post__in = SubjectPost.objects.filter(space__id=subject.id), | |
224 | + user = student).count() | |
207 | 225 | |
208 | 226 | |
209 | 227 | #VAR08 through VAR_019 of documenttation: |
... | ... | @@ -317,3 +335,12 @@ def get_tags(request): |
317 | 335 | |
318 | 336 | data['tags'] = [ {'id':tag.id, 'name':tag.name} for tag in tags] |
319 | 337 | return JsonResponse(data) |
338 | + | |
339 | + | |
340 | +def download_report(request): | |
341 | + report = ReportCSV.objects.get(user=request.user) | |
342 | + | |
343 | + response = HttpResponse(report.csv_data,content_type='text/csv') | |
344 | + response['Content-Disposition'] = 'attachment; filename="report.csv"' | |
345 | + | |
346 | + return response | |
320 | 347 | \ No newline at end of file | ... | ... |