Commit bf11cf839a59b5b30feb3b5ca8f87377f3bf6d87
1 parent
74e082e1
Exists in
master
and in
2 other branches
finished date count as well as calendar heatmap, still has tooltip to go and sty…
…le select option above it
Showing
5 changed files
with
118 additions
and
5 deletions
Show diff stats
analytics/static/analytics/js/behavior.js
1 | 1 | ||
2 | $(document).ready(function(){ | 2 | $(document).ready(function(){ |
3 | selectors_options.init(); | 3 | selectors_options.init(); |
4 | + | ||
5 | + //for month selector | ||
6 | + | ||
7 | + $('#month_selector').change(function(){ | ||
8 | + $.get('/analytics/amount_active_users_per_day', {month: $(this).val() }).done(function(data){ | ||
9 | + console.log(data); | ||
10 | + charts.month_heatmap(data); | ||
11 | + | ||
12 | + }); | ||
13 | + }); | ||
14 | + | ||
15 | + | ||
4 | }); | 16 | }); |
5 | 17 | ||
6 | 18 | ||
19 | + | ||
7 | var selectors_options = { | 20 | var selectors_options = { |
8 | init: function(){ | 21 | init: function(){ |
9 | selectors = $("div.selector"); | 22 | selectors = $("div.selector"); |
@@ -66,3 +79,5 @@ var selectors_options = { | @@ -66,3 +79,5 @@ var selectors_options = { | ||
66 | $(e).removeAttr("opened"); //remove attribute so it can call API again | 79 | $(e).removeAttr("opened"); //remove attribute so it can call API again |
67 | }, | 80 | }, |
68 | }; | 81 | }; |
82 | + | ||
83 | + |
analytics/static/analytics/js/charts.js
@@ -448,6 +448,51 @@ var charts = { | @@ -448,6 +448,51 @@ var charts = { | ||
448 | } | 448 | } |
449 | 449 | ||
450 | }); | 450 | }); |
451 | + }, | ||
452 | + month_heatmap: function(data){ | ||
453 | + | ||
454 | + if($('#month-chart').length != 0){ | ||
455 | + $('#month-chart').fadeOut(); | ||
456 | + $('#month-chart').remove(); | ||
457 | + } | ||
458 | + var svg = d3.select('#right-chart-body').append('svg') | ||
459 | + .attr('width', 300) | ||
460 | + .attr('height', 200) | ||
461 | + .attr('id', 'month-chart'); | ||
462 | + | ||
463 | + //color range | ||
464 | + var color = d3.scaleLinear().range(["#29c8b8", '#149e91']).domain([0, d3.max(data, function(d){ return d.count; })]); | ||
465 | + | ||
466 | + var rects = svg.selectAll("rect") | ||
467 | + .data(data) | ||
468 | + .enter() | ||
469 | + .append("g"); | ||
470 | + rect_width = 40; | ||
471 | + rect_height = 40; | ||
472 | + rects.append("rect") | ||
473 | + .attr("width", rect_width) | ||
474 | + .attr("height", rect_height) | ||
475 | + .attr("class", "day_rect") | ||
476 | + .attr("x", function(d){ | ||
477 | + | ||
478 | + return rect_width* (d.day % 7); | ||
479 | + }).attr("y", function(d){ | ||
480 | + return rect_height*(Math.floor(d.day / 7)); | ||
481 | + }).attr("fill", function(d){ | ||
482 | + return color(d.count); | ||
483 | + }); | ||
484 | + | ||
485 | + rects.append("text") | ||
486 | + .text( function(d){ | ||
487 | + return d.day; | ||
488 | + }).attr("fill", "white") | ||
489 | + .attr("text-anchor", "middle") | ||
490 | + .attr("x", function(d){ | ||
491 | + return rect_width* (d.day % 7) + rect_width/2; | ||
492 | + }).attr("y", function(d){ | ||
493 | + return rect_height*(Math.floor(d.day / 7)) + rect_height/2; | ||
494 | + }); | ||
495 | + | ||
451 | } | 496 | } |
452 | } | 497 | } |
453 | 498 |
analytics/templates/analytics/general.html
@@ -93,8 +93,18 @@ | @@ -93,8 +93,18 @@ | ||
93 | 93 | ||
94 | </div> | 94 | </div> |
95 | <div class="chart right-chart"> | 95 | <div class="chart right-chart"> |
96 | - | ||
97 | - | 96 | + <div> |
97 | + <p>{% trans "amount of access in: " %}</p> | ||
98 | + <select id="month_selector"> | ||
99 | + {% for month in months %} | ||
100 | + <option>{{month}}</option> | ||
101 | + {% endfor %} | ||
102 | + | ||
103 | + </select> | ||
104 | + </div> | ||
105 | + <div id="right-chart-body"> | ||
106 | + | ||
107 | + </div> | ||
98 | </div> | 108 | </div> |
99 | </section> | 109 | </section> |
100 | 110 |
analytics/urls.py
@@ -11,4 +11,5 @@ urlpatterns = [ | @@ -11,4 +11,5 @@ urlpatterns = [ | ||
11 | url(r'^most_accessed_categories/$', views.most_accessed_categories, name = "most_accessed_categories"), | 11 | url(r'^most_accessed_categories/$', views.most_accessed_categories, name = "most_accessed_categories"), |
12 | url(r'^most_accessed_resources/$', views.most_accessed_resource_kind, name= "most_accessed_resources"), | 12 | url(r'^most_accessed_resources/$', views.most_accessed_resource_kind, name= "most_accessed_resources"), |
13 | url(r'^most_active_users/$', views.most_active_users, name= "most_active_users"), | 13 | url(r'^most_active_users/$', views.most_active_users, name= "most_active_users"), |
14 | + url(r'^amount_active_users_per_day/$', views.most_active_users_in_a_month, name="most_active_users_in_a_month") | ||
14 | ] | 15 | ] |
15 | \ No newline at end of file | 16 | \ No newline at end of file |
analytics/views.py
@@ -13,6 +13,9 @@ import operator | @@ -13,6 +13,9 @@ import operator | ||
13 | from django.utils.translation import ugettext_lazy as _ | 13 | from django.utils.translation import ugettext_lazy as _ |
14 | from django.shortcuts import render, get_object_or_404, redirect | 14 | from django.shortcuts import render, get_object_or_404, redirect |
15 | 15 | ||
16 | +from datetime import date | ||
17 | +import calendar | ||
18 | + | ||
16 | 19 | ||
17 | class GeneralView(generic.TemplateView): | 20 | class GeneralView(generic.TemplateView): |
18 | template_name = "analytics/general.html" | 21 | template_name = "analytics/general.html" |
@@ -26,6 +29,9 @@ class GeneralView(generic.TemplateView): | @@ -26,6 +29,9 @@ class GeneralView(generic.TemplateView): | ||
26 | 29 | ||
27 | def get_context_data(self, **kwargs): | 30 | def get_context_data(self, **kwargs): |
28 | context = {} | 31 | context = {} |
32 | + | ||
33 | + context['months'] = [_('January'), _('February'), _('March'), _('April'), _('May'), _('June'), _('July'), _('August'), | ||
34 | + _('September'), _('October'), _('November'), _('December')] | ||
29 | 35 | ||
30 | return context | 36 | return context |
31 | 37 | ||
@@ -55,8 +61,23 @@ def most_used_tags(request): | @@ -55,8 +61,23 @@ def most_used_tags(request): | ||
55 | return JsonResponse(data, safe= False) | 61 | return JsonResponse(data, safe= False) |
56 | 62 | ||
57 | 63 | ||
58 | -def heatmap(request): | ||
59 | - return None | 64 | +def most_active_users_in_a_month(request): |
65 | + params = request.GET | ||
66 | + days = get_days_of_the_month(params['month']) | ||
67 | + print(days) | ||
68 | + data = {} | ||
69 | + mappings = {_('January'): 1, _('February'): 2, _('March'): 3, _('April'): 4, _('May'): 5, _('June'): 6, _('July'): 7 | ||
70 | + , _('August'): 8, _('September'): 9, _('October'): 10, _('November'): 11, _('December'): 12} | ||
71 | + | ||
72 | + | ||
73 | + for day in days: | ||
74 | + built_date = date(date.today().year, mappings[params['month']], day) | ||
75 | + print(built_date) | ||
76 | + day_count = Log.objects.filter(datetime__date = built_date).count() | ||
77 | + data[day] = day_count | ||
78 | + | ||
79 | + data = [{"day": day, "count": day_count} for day, day_count in data.items()] | ||
80 | + return JsonResponse(data, safe=False) | ||
60 | 81 | ||
61 | 82 | ||
62 | 83 | ||
@@ -136,4 +157,25 @@ def most_active_users(request): | @@ -136,4 +157,25 @@ def most_active_users(request): | ||
136 | user_object = User.objects.get(id=user['user_id']) | 157 | user_object = User.objects.get(id=user['user_id']) |
137 | user['image'] = user_object.image_url | 158 | user['image'] = user_object.image_url |
138 | user['user'] = user_object.social_name | 159 | user['user'] = user_object.social_name |
139 | - return JsonResponse(fifty_users, safe=False) | ||
140 | \ No newline at end of file | 160 | \ No newline at end of file |
161 | + return JsonResponse(fifty_users, safe=False) | ||
162 | + | ||
163 | + | ||
164 | +def get_days_of_the_month(month): | ||
165 | + | ||
166 | + #get current year | ||
167 | + year = date.today().year | ||
168 | + print(year) | ||
169 | + print(month) | ||
170 | + mappings = {_('January'): 1, _('February'): 2, _('March'): 3, _('April'): 4, _('May'): 5, _('June'): 6, _('July'): 7 | ||
171 | + , _('August'): 8, _('September'): 9, _('October'): 10, _('November'): 11, _('December'): 12} | ||
172 | + | ||
173 | + c = calendar.Calendar() | ||
174 | + days = c.itermonthdays(year, mappings[month]) | ||
175 | + days_set = set() | ||
176 | + for day in days: | ||
177 | + days_set.add(day) | ||
178 | + | ||
179 | + days_set.remove(0) #because 0 is not aan actual day from that month | ||
180 | + return days_set | ||
181 | + | ||
182 | + |