Commit 89aa5e15dd2c603a57e3d377a7068c1e7afeb226

Authored by Felipe Bormann
1 parent 59f8fd90

monthly chart is updating by category and filter by month as well inside category view

analytics/views.py
... ... @@ -64,15 +64,22 @@ def most_active_users_in_a_month(request):
64 64 for day in days:
65 65 built_date = date(int(year), mappings[_(month)], day)
66 66 days_list.append(built_date)
67   - data = activity_in_timestamp(days_list)
  67 + data = activity_in_timestamp(days_list, params = params)
68 68 data = [{"day": day.day, "count": day_count} for day, day_count in data.items()]
69 69 return JsonResponse(data, safe=False)
70 70  
71 71  
72   -def activity_in_timestamp(days):
  72 +def activity_in_timestamp(days, **kwargs):
73 73 data = {}
  74 + params = kwargs.get('params')
  75 + print(params)
74 76 for day in days:
75   - day_count = Log.objects.filter(datetime__date = day).count()
  77 + if params.get('category_id'):
  78 + category_id = params['category_id']
  79 + day_count = Log.objects.filter(datetime__date = day, context__contains = {"category_id" : int(category_id)}).count()
  80 +
  81 + else:
  82 + day_count = Log.objects.filter(datetime__date = day).count()
76 83 data[day] = day_count
77 84  
78 85 return data
... ... @@ -184,10 +191,12 @@ def most_active_users(request):
184 191  
185 192  
186 193 def get_days_of_the_week_log(request):
187   - date = request.GET['date']
  194 +
  195 + params = request.GET
  196 + date = params['date']
188 197 date = datetime.strptime( date, '%m/%d/%Y',)
189 198 days = get_days_of_the_week(date)
190   - data = activity_in_timestamp(days)
  199 + data = activity_in_timestamp(days, params = params)
191 200 #mapping of number to days
192 201 mapping = {0: _("Mon"), 1: _("Tue"), 2: _("Wed"), 3: _("Thu"), 4: _("Fri"), 5: _("Sat"), 6: _("Sun")}
193 202 data = [{"day": mapping[day.weekday()], "count": day_count} for day, day_count in data.items()]
... ...
dashboards/static/dashboards/js/behavior.js
... ... @@ -7,28 +7,6 @@ $(document).ready(function(){
7 7 charts.most_used_tags('/analytics/most_used_tags');
8 8 charts.build_bubble_user('/analytics/most_active_users/');
9 9  
10   -
11   - $('#month_selector').change(function(){
12   -
13   - var date = $(this).val().split("/");
14   - $.get('/analytics/amount_active_users_per_day', {month: date[0], year: date[1] }).done(function(data){
15   - charts.month_heatmap(data, '#right-chart-body', 'month-chart');
16   -
17   - });
18   - });
19   - //week date selector at the right-chart field
20   - $('input.datepicker').datetimepicker({
21   - format: 'L',
22   - defaultDate: new Date(),
23   - }).on('dp.change', function(ev){
24   - new_date = new Date(ev.date);
25   - var date = (new_date.getMonth() + 1) + '/' + new_date.getDate() + '/' + new_date.getFullYear();
26   - $.get('/analytics/get_days_of_the_week_log', {date: date}).done(function(data){
27   - charts.month_heatmap(data, '#bottom-right-chart-body', 'weekly-chart');
28   - });
29   -
30   - });
31   -
32 10  
33 11 //first call to month selector
34 12 var month = new Array();
... ... @@ -56,6 +34,28 @@ $(document).ready(function(){
56 34 });
57 35  
58 36  
  37 + //update month heatmap when the month selector is changed
  38 + $('#month_selector').change(function(){
  39 +
  40 + var date = $(this).val().split("/");
  41 + $.get('/analytics/amount_active_users_per_day', {month: date[0], year: date[1] }).done(function(data){
  42 + charts.month_heatmap(data, '#right-chart-body', 'month-chart');
  43 +
  44 + });
  45 + });
  46 +
  47 + //week date selector at the right-chart field
  48 + $('input.datepicker').datetimepicker({
  49 + format: 'L',
  50 + defaultDate: new Date(),
  51 + }).on('dp.change', function(ev){
  52 + new_date = new Date(ev.date);
  53 + var date = (new_date.getMonth() + 1) + '/' + new_date.getDate() + '/' + new_date.getFullYear();
  54 + $.get('/analytics/get_days_of_the_week_log', {date: date}).done(function(data){
  55 + charts.month_heatmap(data, '#bottom-right-chart-body', 'weekly-chart');
  56 + });
  57 +
  58 + });
59 59  
60 60 });
61 61  
... ...
dashboards/static/dashboards/js/behavior_categories.js
... ... @@ -3,8 +3,58 @@ $(document).ready(function(){
3 3  
4 4 $("#category-selector").on("change", function(e){
5 5 //when it changes, the tag chart is replaced and all others are.
6   - category_id = $(e.target).val();
  6 + var category_id = $(e.target).val();
7 7 charts.most_used_tags('/analytics/get_category_tags/?category_id='+category_id);
  8 +
  9 +
  10 + //first call to month selector
  11 + var month = new Array();
  12 + month[0] = "January";
  13 + month[1] = "February";
  14 + month[2] = "March";
  15 + month[3] = "April";
  16 + month[4] = "May";
  17 + month[5] = "June";
  18 + month[6] = "July";
  19 + month[7] = "August";
  20 + month[8] = "September";
  21 + month[9] = "October";
  22 + month[10] = "November";
  23 + month[11] = "December";
  24 +
  25 +
  26 + $.get('/analytics/amount_active_users_per_day', { month: month[(new Date()).getMonth()], category_id: category_id }).done(function(data){
  27 + charts.month_heatmap(data, '#right-side-heatmaps', 'month-chart');
  28 + });
  29 +
8 30 });
9   -});
10 31  
  32 +
  33 +
  34 +
  35 +
  36 + $('#month_selector').change(function(){
  37 +
  38 + var date = $(this).val().split("/");
  39 + $.get('/analytics/amount_active_users_per_day', {month: date[0], year: date[1], category_id: $("#category-selector").val() }).done(function(data){
  40 + charts.month_heatmap(data, '#right-side-heatmaps', 'month-chart');
  41 +
  42 + });
  43 + });
  44 +
  45 + //week date selector at the right-chart field
  46 + $('input.datepicker').datetimepicker({
  47 + format: 'L',
  48 + defaultDate: new Date(),
  49 + }).on('dp.change', function(ev){
  50 + new_date = new Date(ev.date);
  51 + var date = (new_date.getMonth() + 1) + '/' + new_date.getDate() + '/' + new_date.getFullYear();
  52 + $.get('/analytics/get_days_of_the_week_log', {date: date}).done(function(data){
  53 + charts.month_heatmap(data, '#bottom-right-chart-body', 'weekly-chart');
  54 + });
  55 +
  56 + });
  57 +
  58 +
  59 +
  60 +});
... ...
dashboards/static/dashboards/js/logbehavior.js
... ... @@ -70,7 +70,9 @@ var log = {
70 70 "limit": 20, //maximum number of elements per page
71 71 });*/
72 72  
73   - $('#log-table').DataTable();
  73 + $('#log-table').DataTable({
  74 + "pageLength": 100
  75 + });
74 76  
75 77 },
76 78 }
... ...
dashboards/templates/dashboards/category.html
... ... @@ -3,13 +3,16 @@
3 3 {% load static i18n pagination %}
4 4 {% load django_bootstrap_breadcrumbs %}
5 5 {% block style %}
6   - <link rel="stylesheet" type="text/css" href="{% static 'dashboards/css/general.css' %}">
7   - <link rel="stylesheet" type="text/css" href="{% static 'dashboards/css/dashboards_category.css' %}">
  6 + {% for file in style_files %}
  7 + <link rel="stylesheet" type="text/css" href="{% static file %}">
  8 + {% endfor %}
8 9 {% endblock style %}
9 10  
10 11 {% block javascript %}
11   - <script type="text/javascript" src="{% static "analytics/js/charts.js" %}"></script>
12   - <script type="text/javascript" src="{% static "dashboards/js/behavior_categories.js" %}"></script>
  12 +
  13 + {% for file in javascript_files %}
  14 + <script type="text/javascript" src="{% static file %}"></script>
  15 + {% endfor %}
13 16 {% endblock javascript %}
14 17  
15 18 {% block breadcrumbs %}
... ... @@ -27,14 +30,18 @@
27 30 <nav>
28 31 <ul class="core-subjects-options report-menu-choice">
29 32 {% if user.is_staff %}
30   - <a href="{% url 'dashboards:view_general' %}"><li>
31   - {% trans "Platform Report" %}
32   - </li></a>
  33 + <a href="{% url 'dashboards:view_general' %}">
  34 + <li>
  35 + {% trans "Platform Report" %}
  36 + </li>
  37 + </a>
33 38 {% endif %}
34 39  
35   - <a href="{% url 'dashboards:view_categories' %}"><li class="active">
36   - {% trans "Category Report" %}
37   - </li></a>
  40 + <a href="{% url 'dashboards:view_categories' %}">
  41 + <li class="active">
  42 + {% trans "Category Report" %}
  43 + </li>
  44 + </a>
38 45 <li>
39 46 {% trans "Subject Report" %}
40 47 </li>
... ... @@ -52,18 +59,38 @@
52 59 {% endfor %}
53 60 </select>
54 61 <ul id="report-header-options">
55   - <li class="selected">
  62 + <li class="tab-option selected">
56 63 {% trans "Focus" %}
57 64 </li>
58   - <li>
  65 + <a href="{% url 'dashboards:view_general_log' %}"><li class="tab-option">
59 66 {% trans "Log" %}
60   - </li>
  67 + </li></a>
61 68 </ul>
62 69 </header>
63 70  
64 71 <article class="report-body">
65 72  
66 73 {% include "dashboards/tags_body.html" %}
  74 +
  75 + <div id="bottom-part">
  76 + <div id="left-chart">
  77 +
  78 + </div>
  79 + <div id="month_selector_div">
  80 + <h4>{% trans "Amount of access in: " %}
  81 + <select id="month_selector">
  82 + {% for month in months %}
  83 + <option>{{month}}</option>
  84 + {% endfor %}
  85 +
  86 + </select>
  87 + </h4>
  88 + </div>
  89 +
  90 + <div id="right-side-heatmaps">
  91 +
  92 + </div>
  93 + </div>
67 94 </article>
68 95 </section>
69 96 {% endblock content %}
70 97 \ No newline at end of file
... ...
dashboards/views.py
... ... @@ -90,11 +90,32 @@ class CategoryView(LogMixin, generic.TemplateView):
90 90 context = {}
91 91 self.createLog(actor = self.request.user)
92 92  
  93 + context['months'] = self.get_last_twelve_months()
  94 +
93 95 context['categories'] = self.categories_associated_with_user(self.request.user)
94   - context['javascript_files'] = ["analytics/js/charts.js", "dashboards/js/behavior.js"]
95   - context['style_files'] = ['dashboards/css/general.css']
  96 + context['javascript_files'] = ["analytics/js/charts.js", "dashboards/js/behavior_categories.js"]
  97 + context['style_files'] = ['dashboards/css/general.css', 'dashboards/css/dashboards_category.css']
96 98 return context
97 99  
  100 +
  101 + def get_last_twelve_months(self):
  102 + today = date.today()
  103 + months = []
  104 + month_mappings = { 1: _('January'), 2: _('February'), 3: _('March'), 4: _('April'), 5: _('May'), 6: _('June'), 7: _('July')
  105 + , 8: _('August'), 9: _('September'), 10: _('October'), 11: _('November'), 12: _('December')}
  106 + date_used = today #the date used for solving the inital month problem
  107 + offset = 0 #offset is the amount of weeks I had to shift so I could change the month if 4 weeks weren't enough
  108 + for i in range(12):
  109 +
  110 + operation_date = today - timedelta(weeks= (4*i + offset))
  111 + while date_used.month == operation_date.month:
  112 + offset += 2
  113 + operation_date = today - timedelta(weeks= (4*i + offset))
  114 +
  115 + months.append(month_mappings[date_used.month] + '/' + str(date_used.year))
  116 + date_used = operation_date
  117 + return months
  118 +
98 119 def categories_associated_with_user(self, user):
99 120 if user.is_staff:
100 121 categories = Category.objects.all()
... ...