Commit 8d82a1f92eb096559f1932c248ad4501b57c6607
1 parent
5456f053
Exists in
master
and in
3 other branches
made progress on template using formsets, still has to send data through URL to …
…the other view and find a good way to select resources dynamically
Showing
6 changed files
with
132 additions
and
49 deletions
Show diff stats
reports/forms.py
| ... | ... | @@ -2,6 +2,13 @@ from django import forms |
| 2 | 2 | from django.utils.translation import ugettext_lazy as _ |
| 3 | 3 | import datetime |
| 4 | 4 | |
| 5 | +from django.forms.formsets import BaseFormSet | |
| 6 | + | |
| 7 | +class ResourceAndTagForm(forms.Form): | |
| 8 | + | |
| 9 | + resource = forms.ChoiceField(label=_("Resources"), required=True) | |
| 10 | + tag = forms.ChoiceField(label=_('Tag')) | |
| 11 | + | |
| 5 | 12 | |
| 6 | 13 | |
| 7 | 14 | class CreateInteractionReportForm(forms.Form): |
| ... | ... | @@ -17,13 +24,14 @@ class CreateInteractionReportForm(forms.Form): |
| 17 | 24 | |
| 18 | 25 | def __init__(self, *args, **kwargs): |
| 19 | 26 | super(CreateInteractionReportForm, self).__init__(*args, **kwargs) |
| 20 | - | |
| 21 | 27 | initial = kwargs['initial'] |
| 22 | 28 | topics = list(initial['topic']) |
| 23 | 29 | self.subject = initial['subject'] #so we can check date cleaned data |
| 24 | 30 | self.fields['topic'].choices = [(topic.id, topic.name) for topic in topics] |
| 25 | 31 | self.fields['topic'].choices.append((_("All"), _("All"))) |
| 26 | 32 | |
| 33 | + | |
| 34 | + | |
| 27 | 35 | def clean_init_date(self): |
| 28 | 36 | init_date = self.cleaned_data.get('init_date') |
| 29 | 37 | if init_date < self.subject.init_date: |
| ... | ... | @@ -32,6 +40,6 @@ class CreateInteractionReportForm(forms.Form): |
| 32 | 40 | |
| 33 | 41 | def clean_end_date(self): |
| 34 | 42 | end_date = self.cleaned_data.get('init_date') |
| 35 | - if end_date > self.subject.init_date: | |
| 36 | - self._errors['end_date'] = [_('This date should be right or before ' + str(self.subject.init_date) + ', which is when the subject finishes. ')] | |
| 43 | + if end_date > self.subject.end_date: | |
| 44 | + self._errors['end_date'] = [_('This date should be right or before ' + str(self.subject.end_date) + ', which is when the subject finishes. ')] | |
| 37 | 45 | return end_date |
| 38 | 46 | \ No newline at end of file | ... | ... |
reports/templates/reports/_form.html
| 1 | 1 | {% load widget_tweaks static i18n %} |
| 2 | 2 | |
| 3 | 3 | <form action="" method="post">{% csrf_token %} |
| 4 | + <p>{% trans "General Parameters" %}</p><hr> | |
| 4 | 5 | {% for field in form %} |
| 5 | - {% if field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date' %} | |
| 6 | - <label> {{field.label}} </label> | |
| 7 | - {% render_field field class='form-control date-picker' %} | |
| 8 | - | |
| 9 | - {% else %} | |
| 10 | - <label> {{field.label}} </label> | |
| 11 | - {% render_field field class='form-control' %} | |
| 12 | - {% endif %} | |
| 13 | - | |
| 14 | - {% if field.errors %} | |
| 15 | - <div class="row"> | |
| 16 | - </br> | |
| 17 | - <div class="alert alert-danger alert-dismissible" role="alert"> | |
| 18 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
| 19 | - <span aria-hidden="true">×</span> | |
| 20 | - </button> | |
| 21 | - <ul> | |
| 22 | - {% for error in field.errors %} | |
| 23 | - <li>{{ error }}</li> | |
| 24 | - {% endfor %} | |
| 25 | - </ul> | |
| 26 | - </div> | |
| 27 | - </div> | |
| 6 | + {% if field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date' %} | |
| 7 | + <label> {{field.label}} </label> | |
| 8 | + {% render_field field class='form-control date-picker' %} | |
| 9 | + | |
| 10 | + | |
| 11 | + {% elif field.auto_id == 'id_from_mural' %} | |
| 12 | + <p>{% trans "Data Source" %}</p><hr> | |
| 13 | + <label> {{field.label}} </label> | |
| 14 | + {% render_field field class='form-control' %} | |
| 15 | + {% else %} | |
| 16 | + <label> {{field.label}} </label> | |
| 17 | + {% render_field field class='form-control' %} | |
| 28 | 18 | {% endif %} |
| 19 | + | |
| 20 | + {% if field.errors %} | |
| 21 | + <div class="row"> | |
| 22 | + </br> | |
| 23 | + <div class="alert alert-danger alert-dismissible" role="alert"> | |
| 24 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
| 25 | + <span aria-hidden="true">×</span> | |
| 26 | + </button> | |
| 27 | + <ul> | |
| 28 | + {% for error in field.errors %} | |
| 29 | + <li>{{ error }}</li> | |
| 30 | + {% endfor %} | |
| 31 | + </ul> | |
| 32 | + </div> | |
| 33 | + </div> | |
| 34 | + {% endif %} | |
| 29 | 35 | {% endfor %} |
| 36 | + | |
| 37 | + <!---Adding the selector --> | |
| 38 | + <div class="panel-group" id="resources_accordion" role="tablist" aria-multiselectable="true"> | |
| 39 | + <div class="panel panel-info"> | |
| 40 | + <div class="panel-heading"> | |
| 41 | + <div class="row"> | |
| 42 | + <div class="col-md-12"> | |
| 43 | + <a data-parent="#resources_accordion" data-toggle="collapse" href="#resources"> | |
| 44 | + <h4 class="panel-title"> | |
| 45 | + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button><label for="resources">{% trans "Interaction with resources" %}</label> | |
| 46 | + </h4> | |
| 47 | + </a> | |
| 48 | + </div> | |
| 49 | + </div> | |
| 50 | + </div> | |
| 51 | + | |
| 52 | + <div id="resources" class="panel-collapse collapse"> | |
| 53 | + {{ resource_tag_formset.management_form }} | |
| 54 | + | |
| 55 | + {% for resource_tag_form in resource_tag_formset %} | |
| 56 | + <div class="resource-tag-formset"> | |
| 57 | + {% for field in resource_tag_form %} | |
| 58 | + <label>{{field.label}}</label> | |
| 59 | + {% render_field field class="form-control" %} | |
| 60 | + {% endfor %} | |
| 61 | + </div> | |
| 62 | + {% endfor %} | |
| 63 | + </div> | |
| 64 | + </div> | |
| 65 | + </div> | |
| 66 | + | |
| 30 | 67 | <div class="row text-center"> |
| 31 | 68 | <input type="submit" value="Search" class="btn btn-success btn-raised" /> |
| 32 | 69 | </div> |
| 33 | 70 | </form> |
| 71 | + | |
| 72 | + | ... | ... |
reports/templates/reports/create.html
| ... | ... | @@ -11,6 +11,12 @@ |
| 11 | 11 | {% breadcrumb 'analytics' '' %} |
| 12 | 12 | {% endblock %} |
| 13 | 13 | |
| 14 | +{% block javascript %} | |
| 15 | + {{block.super}} | |
| 16 | + <script type="text/javascript" src="{% static "js/jquery.formset.js" %} "></script> | |
| 17 | + | |
| 18 | +{% endblock javascript %} | |
| 19 | + | |
| 14 | 20 | {% block content %} |
| 15 | 21 | |
| 16 | 22 | <div class="panel panel-info topic-panel"> |
| ... | ... | @@ -41,5 +47,11 @@ |
| 41 | 47 | |
| 42 | 48 | {% include "reports/_form.html" %} |
| 43 | 49 | |
| 44 | - | |
| 50 | + <script type="text/javascript" src="{% static "reports/js/report.js" %}"></script> | |
| 51 | + <script> | |
| 52 | + $('.resource-tag-formset').formset({ | |
| 53 | + addText: 'add data source', | |
| 54 | + deleteText: 'remove data source' | |
| 55 | + }); | |
| 56 | + </script> | |
| 45 | 57 | {% endblock content %} |
| 46 | 58 | \ No newline at end of file | ... | ... |
reports/templates/reports/view.html
| ... | ... | @@ -6,9 +6,9 @@ |
| 6 | 6 | |
| 7 | 7 | {% block breadcrumbs %} |
| 8 | 8 | {{ block.super }} |
| 9 | - {% breadcrumb view.subject.category 'subjects:cat_view' view.subject.category.slug %} | |
| 10 | - {% breadcrumb view.subject 'subjects:view' view.subject.slug %} | |
| 11 | - {% breadcrumb 'analytics' '' %} | |
| 9 | + {% breadcrumb subject.category 'subjects:cat_view' subject.category.slug %} | |
| 10 | + {% breadcrumb subject 'subjects:view' subject.slug %} | |
| 11 | + {% breadcrumb 'Analytics' '' %} | |
| 12 | 12 | {% endblock %} |
| 13 | 13 | |
| 14 | 14 | {% block content %} |
| ... | ... | @@ -65,10 +65,6 @@ |
| 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 "Variable Descriptions" %} | |
| 69 | - | |
| 70 | - </li> | |
| 71 | - <li> | |
| 72 | 68 | <i class="fa fa-download" aria-hidden="true"></i> {% trans "Interactions Data" %} |
| 73 | 69 | </li> |
| 74 | 70 | </ul> | ... | ... |
reports/views.py
| ... | ... | @@ -13,9 +13,11 @@ from django.db.models import Q |
| 13 | 13 | from django.contrib.auth.mixins import LoginRequiredMixin |
| 14 | 14 | from datetime import datetime, date |
| 15 | 15 | from subjects.models import Subject |
| 16 | -from .forms import CreateInteractionReportForm | |
| 16 | +from .forms import CreateInteractionReportForm, ResourceAndTagForm | |
| 17 | 17 | from log.models import Log |
| 18 | +from topics.models import Resource | |
| 18 | 19 | |
| 20 | +from django.forms import formset_factory | |
| 19 | 21 | |
| 20 | 22 | class ReportView(LoginRequiredMixin, generic.FormView): |
| 21 | 23 | template_name = "reports/create.html" |
| ... | ... | @@ -40,7 +42,24 @@ class ReportView(LoginRequiredMixin, generic.FormView): |
| 40 | 42 | subject = Subject.objects.get(id=self.request.GET['subject_id']) |
| 41 | 43 | |
| 42 | 44 | context['subject'] = subject |
| 45 | + | |
| 46 | + topics = subject.topic_subject.all() | |
| 47 | + #get all resources associated with topics | |
| 48 | + resources = [] | |
| 49 | + tags = [] | |
| 50 | + for topic in topics: | |
| 51 | + resources_set = topic.resource_topic.all() | |
| 52 | + for resource in resources_set: | |
| 53 | + for tag in resource.tags.all(): | |
| 54 | + tags.append(tag) | |
| 55 | + resources.append(resource) | |
| 56 | + context['resources'] = resources | |
| 57 | + context['tags'] = tags | |
| 43 | 58 | |
| 59 | + | |
| 60 | + #set formset | |
| 61 | + resourceTagFormSet = formset_factory(ResourceAndTagForm, extra= 1) | |
| 62 | + context['resource_tag_formset'] = resourceTagFormSet | |
| 44 | 63 | return context |
| 45 | 64 | |
| 46 | 65 | def get_success_url(self): |
| ... | ... | @@ -65,8 +84,9 @@ class ReportView(LoginRequiredMixin, generic.FormView): |
| 65 | 84 | POST variables and then checked for validity. |
| 66 | 85 | """ |
| 67 | 86 | form = self.get_form() |
| 87 | + print(form) | |
| 68 | 88 | if form.is_valid(): |
| 69 | - | |
| 89 | + print(form) | |
| 70 | 90 | self.form_data = form.cleaned_data |
| 71 | 91 | return self.form_valid(form) |
| 72 | 92 | else: |
| ... | ... | @@ -86,6 +106,8 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): |
| 86 | 106 | context['init_date'] = params_data['init_date'] |
| 87 | 107 | context['end_date'] = params_data['end_date'] |
| 88 | 108 | context['subject'] = subject |
| 109 | + | |
| 110 | + | |
| 89 | 111 | if params_data['from_mural']: |
| 90 | 112 | context['data'], context['header'] = self.get_mural_data(subject, params_data['init_date'], params_data['end_date']) |
| 91 | 113 | return context |
| ... | ... | @@ -115,22 +137,22 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): |
| 115 | 137 | create_date__range=(init_date, end_date)) |
| 116 | 138 | |
| 117 | 139 | #number of help posts created by the student |
| 118 | - interactions['v01'] = help_posts_made_by_user.count() | |
| 140 | + interactions['number of help posts created by the user'] = help_posts_made_by_user.count() | |
| 119 | 141 | |
| 120 | 142 | help_posts = SubjectPost.objects.filter(action="help", create_date__range=(init_date, end_date), |
| 121 | 143 | space__id=subject.id) |
| 122 | 144 | |
| 123 | 145 | #comments count on help posts created by the student |
| 124 | - interactions['v02'] = Comment.objects.filter(post__in = help_posts.filter(user=student), | |
| 146 | + interactions['amount of comments on help posts created by the student'] = Comment.objects.filter(post__in = help_posts.filter(user=student), | |
| 125 | 147 | create_date__range=(init_date, end_date)).count() |
| 126 | 148 | |
| 127 | 149 | |
| 128 | 150 | #count the amount of comments made by the student on posts made by one of the professors |
| 129 | - interactions['v03'] = Comment.objects.filter(post__in = help_posts.filter(user__in= subject.professor.all()), create_date__range=(init_date, end_date), | |
| 151 | + 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), | |
| 130 | 152 | user=student).count() |
| 131 | 153 | |
| 132 | 154 | #comments made by the user on other users posts |
| 133 | - interactions['v04'] = Comment.objects.filter(post__in = help_posts.exclude(user=student), | |
| 155 | + interactions['amount of comments made by the student on other students help posts'] = Comment.objects.filter(post__in = help_posts.exclude(user=student), | |
| 134 | 156 | create_date__range=(init_date, end_date), |
| 135 | 157 | user= student).count() |
| 136 | 158 | |
| ... | ... | @@ -141,7 +163,7 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): |
| 141 | 163 | for comment in comments_by_teacher: |
| 142 | 164 | help_posts_ids.append(comment.post.id) |
| 143 | 165 | #number of help posts created by the user that the teacher commented on |
| 144 | - interactions['v05'] = help_posts.filter(user=student, id__in = help_posts_ids).count() | |
| 166 | + 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() | |
| 145 | 167 | |
| 146 | 168 | |
| 147 | 169 | comments_by_others = Comment.objects.filter(user__in=subject.students.exclude(id = student.id)) |
| ... | ... | @@ -149,33 +171,33 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): |
| 149 | 171 | for comment in comments_by_teacher: |
| 150 | 172 | help_posts_ids.append(comment.post.id) |
| 151 | 173 | #number of help posts created by the user others students commented on |
| 152 | - interactions['v06'] = help_posts.filter(user=student, id__in = help_posts_ids).count() | |
| 174 | + interactions['number of help posts created by the user others students commented on'] = help_posts.filter(user=student, id__in = help_posts_ids).count() | |
| 153 | 175 | |
| 154 | 176 | #Number of student visualizations on the mural of the subject |
| 155 | - interactions['v07'] = MuralVisualizations.objects.filter(post__in = SubjectPost.objects.filter(space__id=subject.id), | |
| 177 | + interactions['Number of student visualizations on the mural of the subject'] = MuralVisualizations.objects.filter(post__in = SubjectPost.objects.filter(space__id=subject.id), | |
| 156 | 178 | user = student).count() |
| 157 | 179 | |
| 158 | 180 | |
| 159 | 181 | #VAR20 - number of access to mural between 6 a.m to 12a.m. |
| 160 | - interactions['v20'] = Log.objects.filter(action="access", resource="subject", | |
| 182 | + interactions[' number of access to mural between 6 a.m to 12a.m.'] = Log.objects.filter(action="access", resource="subject", | |
| 161 | 183 | user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__hour__range = (5, 11)).count() |
| 162 | 184 | |
| 163 | - #VAR21 - number of access to mural between 6 a.m to 12a.m. | |
| 164 | - interactions['v21'] = Log.objects.filter(action="access", resource="subject", | |
| 185 | + #VAR21 - number of access to mural between 0 p.m to 6p.m. | |
| 186 | + interactions['number of access to mural between 0 p.m to 6p.m.'] = Log.objects.filter(action="access", resource="subject", | |
| 165 | 187 | user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__hour__range = (11, 17)).count() |
| 166 | 188 | #VAR22 |
| 167 | - interactions['v22'] = Log.objects.filter(action="access", resource="subject", | |
| 189 | + interactions[' number of access to mural between 6 p.m to 12p.m.'] = Log.objects.filter(action="access", resource="subject", | |
| 168 | 190 | user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__hour__range = (17, 23)).count() |
| 169 | 191 | |
| 170 | 192 | #VAR23 |
| 171 | - interactions['v23'] = Log.objects.filter(action="access", resource="subject", | |
| 193 | + interactions[' number of access to mural between 0 a.m to 6a.m.'] = Log.objects.filter(action="access", resource="subject", | |
| 172 | 194 | user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__hour__range = (23, 5)).count() |
| 173 | 195 | |
| 174 | 196 | #VAR24 through 30 |
| 175 | 197 | day_numbers = [0, 1, 2, 3, 4, 5, 6] |
| 176 | 198 | day_names = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"] |
| 177 | 199 | for day_num in day_numbers: |
| 178 | - interactions['v'+ str(24+day_num)] = Log.objects.filter(action="access", resource="subject", | |
| 200 | + interactions['number of access to the subject on '+ day_names[day_num]] = Log.objects.filter(action="access", resource="subject", | |
| 179 | 201 | user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__week_day = day_num).count() |
| 180 | 202 | |
| 181 | 203 | for value in interactions.values(): |
| ... | ... | @@ -185,3 +207,4 @@ class ViewReportView(LoginRequiredMixin, generic.TemplateView): |
| 185 | 207 | header.append(key) |
| 186 | 208 | return data, header |
| 187 | 209 | |
| 210 | + | ... | ... |