Commit 8d82a1f92eb096559f1932c248ad4501b57c6607

Authored by fbormann
1 parent 5456f053

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
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/static/reports/js/report.js 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +
  2 +//Function to get all resources of all topics related to that subjct
  3 +$(function (){
  4 +
  5 +});
0 6 \ 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">&times;</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">&times;</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 +
... ...