Commit 495dbd8aeb9a447e704092ffec62e98ecdbb0888

Authored by fbormann
1 parent 81da7085

added report app and removed query of reports from api app, modified css for rep…

…ort page and added link to subject cards
amadeus/settings.py
@@ -77,7 +77,7 @@ INSTALLED_APPS = [ @@ -77,7 +77,7 @@ INSTALLED_APPS = [
77 'security', 77 'security',
78 'themes', 78 'themes',
79 'api', 79 'api',
80 - 80 + 'reports',
81 ] 81 ]
82 82
83 MIDDLEWARE_CLASSES = [ 83 MIDDLEWARE_CLASSES = [
amadeus/static/css/base/amadeus.css
@@ -1196,4 +1196,13 @@ li.item .notify_badge { @@ -1196,4 +1196,13 @@ li.item .notify_badge {
1196 font-weight: 700; 1196 font-weight: 700;
1197 font-size: 20px; 1197 font-size: 20px;
1198 } 1198 }
1199 -/* End Goals */  
1200 \ No newline at end of file 1199 \ No newline at end of file
  1200 +/* End Goals */
  1201 +
  1202 +
  1203 +/* Reports */
  1204 +
  1205 +.report-menu-choice li{
  1206 + width: 15%;
  1207 + text-align: center;
  1208 +}
  1209 +/* End Reports */
1201 \ No newline at end of file 1210 \ No newline at end of file
reports/forms.py 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +from django import forms
  2 +from django.utils.translation import ugettext_lazy as _
  3 +import datetime
  4 +
  5 +class CreateInteractionReportForm(forms.Form):
  6 + topics = forms.ChoiceField(required=True)
  7 + init_date = forms.DateField(required=True)
  8 + end_date = forms.DateField(required=True)
  9 +
  10 + from_mural = forms.BooleanField()
  11 + from_messages = forms.BooleanField()
  12 +
reports/templates/reports/report.html
@@ -2,17 +2,49 @@ @@ -2,17 +2,49 @@
2 2
3 {% load static i18n pagination %} 3 {% load static i18n pagination %}
4 {% load django_bootstrap_breadcrumbs %} 4 {% load django_bootstrap_breadcrumbs %}
  5 +{% load widget_tweaks %}
5 6
6 {% block breadcrumbs %} 7 {% block breadcrumbs %}
7 {{ block.super }} 8 {{ block.super }}
8 9
9 - {% trans 'Mural: General' as general %}  
10 -  
11 - {% breadcrumb general 'mural:manage_general' %} 10 + {% breadcrumb 'analytics' '' %}
12 {% endblock %} 11 {% endblock %}
13 12
14 {% block content %} 13 {% block content %}
15 14
  15 + <div class="panel panel-info topic-panel">
  16 + <div class="panel-heading">
  17 + <div class="row">
  18 + <div class="col-md-12 category-header">
  19 + <h4 class="panel-title" style="margin-top: 10px; margin-bottom: 8px">
  20 + <span>{% trans "Analytics" %}</span>
  21 + </h4>
  22 + </div>
  23 + </div>
  24 + </div>
  25 + </div>
  26 +
  27 + <div id="core-subjects-options-div">
  28 + <ul class="core-subjects-options report-menu-choice">
  29 + <li class="active">
  30 + {% trans "Interaction Data" %}
  31 + </li>
  32 + <li>
  33 + {% trans "Report Card" %}
  34 + </li>
  35 + <li>
  36 + {% trans "Participation" %}
  37 + </li>
  38 + </ul>
  39 + </div>
  40 +
  41 +<form action="" method="post">{% csrf_token %}
  42 + {% for field in form %}
  43 + <label> {{field.label}} </label>
  44 + {% render_field field class='form-control' %}
  45 + {% endfor %}
  46 + <input type="submit" value="Send message" />
  47 +</form>
16 48
17 {% for user, datum in data.items %} 49 {% for user, datum in data.items %}
18 50
reports/urls.py
@@ -3,5 +3,5 @@ from . import views @@ -3,5 +3,5 @@ from . import views
3 3
4 4
5 urlpatterns = [ 5 urlpatterns = [
6 - url(r'^report/$', views.ReportView.as_view(), name='report'), 6 + url(r'^create/interactions/$', views.ReportView.as_view(), name='create_interaction'),
7 ] 7 ]
8 \ No newline at end of file 8 \ No newline at end of file
reports/views.py
@@ -8,109 +8,26 @@ from django.db.models import Q @@ -8,109 +8,26 @@ from django.db.models import Q
8 from django.contrib.auth.mixins import LoginRequiredMixin 8 from django.contrib.auth.mixins import LoginRequiredMixin
9 from datetime import datetime, date 9 from datetime import datetime, date
10 from subjects.models import Subject 10 from subjects.models import Subject
11 - 11 +from .forms import CreateInteractionReportForm
12 from log.models import Log 12 from log.models import Log
13 13
14 -class ReportView(LoginRequiredMixin, generic.TemplateView):  
15 - template_name = "api/report.html"  
16 -  
17 - def get_context_data(self, **kwargs):  
18 - context = {}  
19 - params = self.request.GET  
20 -  
21 - if params['subject_id'] and params['init_date'] and params['end_date']:  
22 - subject_id = params['subject_id']  
23 - subject = Subject.objects.get(id=subject_id)  
24 - data = {}  
25 - students = subject.students.all()  
26 - formats = ["%d/%m/%Y", "%m/%d/%Y"] #so it accepts english and portuguese date formats  
27 - for fmt in formats:  
28 - try:  
29 - init_date = datetime.strptime(params['init_date'], fmt)  
30 - end_date = datetime.strptime(params['end_date'], fmt)  
31 - except ValueError:  
32 - pass  
33 -  
34 - for student in students:  
35 - interactions = {}  
36 - #first columns  
37 - interactions['subject_name'] = subject.name  
38 - interactions['username'] = student.social_name  
39 - interactions['init_date'] = init_date  
40 - interactions['end_date'] = end_date  
41 -  
42 - help_posts_made_by_user = SubjectPost.objects.filter(action="help",space__id=subject.id, user=student,  
43 - create_date__range=(init_date, end_date))  
44 -  
45 - #number of help posts created by the student  
46 - interactions['doubts_count'] = help_posts_made_by_user.count()  
47 -  
48 - help_posts = SubjectPost.objects.filter(action="help", create_date__range=(init_date, end_date),  
49 - space__id=subject_id)  
50 -  
51 - #comments count on help posts created by the student  
52 - interactions['comments_count'] = Comment.objects.filter(post__in = help_posts.filter(user=student),  
53 - create_date__range=(init_date, end_date)).count()  
54 -  
55 -  
56 - #count the amount of comments made by the student on posts made by one of the professors  
57 - interactions['comments_professor_count'] = Comment.objects.filter(post__in = help_posts.filter(user__in= subject.professor.all()), create_date__range=(init_date, end_date),  
58 - user=student).count()  
59 14
60 - #comments made by the user on other users posts  
61 - interactions['comments_on_others_count'] = Comment.objects.filter(post__in = help_posts.exclude(user=student),  
62 - create_date__range=(init_date, end_date),  
63 - user= student).count()  
64 -  
65 -  
66 -  
67 - comments_by_teacher = Comment.objects.filter(user__in=subject.professor.all())  
68 - help_posts_ids = []  
69 - for comment in comments_by_teacher:  
70 - help_posts_ids.append(comment.post.id)  
71 - #number of help posts created by the user that the teacher commented on  
72 - interactions['help_posts_commented_by_teacher'] = help_posts.filter(user=student, id__in = help_posts_ids).count() 15 +class ReportView(LoginRequiredMixin, generic.FormView):
  16 + template_name = "reports/report.html"
  17 + form_class = CreateInteractionReportForm
  18 + success_url = "/teste"
  19 + def get_initial(self):
  20 + """
  21 + Returns the initial data to use for forms on this view.
  22 + """
73 23
74 -  
75 - comments_by_others = Comment.objects.filter(user__in=subject.students.exclude(id = student.id))  
76 - help_posts_ids = []  
77 - for comment in comments_by_teacher:  
78 - help_posts_ids.append(comment.post.id)  
79 - #number of help posts created by the user others students commented on  
80 - interactions['help_posts_commented_by_others'] = help_posts.filter(user=student, id__in = help_posts_ids).count()  
81 -  
82 - #Number of student visualizations on the mural of the subject  
83 - interactions['mural_visualizations_count'] = MuralVisualizations.objects.filter(post__in = SubjectPost.objects.filter(space__id=subject.id),  
84 - user = student).count()  
85 -  
86 -  
87 - #VAR20 - number of access to mural between 6 a.m to 12a.m.  
88 - interactions['access_subject_between_6_to_12_am'] = Log.objects.filter(action="access", resource="subject",  
89 - user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__hour__range = (5, 11)).count()  
90 -  
91 - #VAR21 - number of access to mural between 6 a.m to 12a.m.  
92 - interactions['access_subject_between_0_to_6_pm'] = Log.objects.filter(action="access", resource="subject",  
93 - user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__hour__range = (11, 17)).count()  
94 - #VAR22  
95 - interactions['access_subject_between_6_to_12_pm'] = Log.objects.filter(action="access", resource="subject",  
96 - user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__hour__range = (17, 23)).count()  
97 -  
98 - #VAR23  
99 - interactions['access_subject_between_0_to_6_am'] = Log.objects.filter(action="access", resource="subject",  
100 - user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__hour__range = (23, 5)).count()  
101 -  
102 - #VAR24 through 30  
103 - day_numbers = [0, 1, 2, 3, 4, 5, 6]  
104 - day_names = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]  
105 - for day_num in day_numbers:  
106 - interactions['access_subject_'+day_names[day_num]] = Log.objects.filter(action="access", resource="subject",  
107 - user_id= student.id, context__contains = {'subject_id' : subject.id}, datetime__week_day = day_num).count()  
108 -  
109 - data[student] = interactions  
110 -  
111 - context["data"] = data 24 + initial = super(ReportView, self).get_initial()
  25 + params = self.request.GET
  26 + subject = Subject.objects.get(id=params['subject_id'])
112 27
  28 + initial['topics'] = subject.topic_subject.all()
113 29
114 - return context 30 + return initial
  31 +
115 32
116 33
subjects/templates/subjects/subject_card.html
@@ -34,7 +34,7 @@ @@ -34,7 +34,7 @@
34 </ul> 34 </ul>
35 {% endif %} 35 {% endif %}
36 36
37 - <a href="" class="pull-right action_icon"><i class="fa fa-bar-chart" aria-hidden="true"></i></a> 37 + <a href="{% url 'subjects:reports:create_interaction' %}?subject_id={{subject.id}}" class="pull-right action_icon"><i class="fa fa-bar-chart" aria-hidden="true"></i></a>
38 <a href="{% url 'notifications:view' subject.slug %}" class="pull-right action_icon"> 38 <a href="{% url 'notifications:view' subject.slug %}" class="pull-right action_icon">
39 <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> 39 <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
40 {% notifies_number subject request.user %} 40 {% notifies_number subject request.user %}