diff --git a/analytics/static/analytics/js/behavior.js b/analytics/static/analytics/js/behavior.js index 970f890..b4feb00 100644 --- a/analytics/static/analytics/js/behavior.js +++ b/analytics/static/analytics/js/behavior.js @@ -1,9 +1,22 @@ $(document).ready(function(){ selectors_options.init(); + + //for month selector + + $('#month_selector').change(function(){ + $.get('/analytics/amount_active_users_per_day', {month: $(this).val() }).done(function(data){ + console.log(data); + charts.month_heatmap(data); + + }); + }); + + }); + var selectors_options = { init: function(){ selectors = $("div.selector"); @@ -66,3 +79,5 @@ var selectors_options = { $(e).removeAttr("opened"); //remove attribute so it can call API again }, }; + + diff --git a/analytics/static/analytics/js/charts.js b/analytics/static/analytics/js/charts.js index d73d82b..740c5c3 100644 --- a/analytics/static/analytics/js/charts.js +++ b/analytics/static/analytics/js/charts.js @@ -448,6 +448,51 @@ var charts = { } }); + }, + month_heatmap: function(data){ + + if($('#month-chart').length != 0){ + $('#month-chart').fadeOut(); + $('#month-chart').remove(); + } + var svg = d3.select('#right-chart-body').append('svg') + .attr('width', 300) + .attr('height', 200) + .attr('id', 'month-chart'); + + //color range + var color = d3.scaleLinear().range(["#29c8b8", '#149e91']).domain([0, d3.max(data, function(d){ return d.count; })]); + + var rects = svg.selectAll("rect") + .data(data) + .enter() + .append("g"); + rect_width = 40; + rect_height = 40; + rects.append("rect") + .attr("width", rect_width) + .attr("height", rect_height) + .attr("class", "day_rect") + .attr("x", function(d){ + + return rect_width* (d.day % 7); + }).attr("y", function(d){ + return rect_height*(Math.floor(d.day / 7)); + }).attr("fill", function(d){ + return color(d.count); + }); + + rects.append("text") + .text( function(d){ + return d.day; + }).attr("fill", "white") + .attr("text-anchor", "middle") + .attr("x", function(d){ + return rect_width* (d.day % 7) + rect_width/2; + }).attr("y", function(d){ + return rect_height*(Math.floor(d.day / 7)) + rect_height/2; + }); + } } diff --git a/analytics/templates/analytics/general.html b/analytics/templates/analytics/general.html index 584750d..82df770 100644 --- a/analytics/templates/analytics/general.html +++ b/analytics/templates/analytics/general.html @@ -93,8 +93,18 @@
- - +
+

{% trans "amount of access in: " %}

+ +
+
+ +
diff --git a/analytics/urls.py b/analytics/urls.py index 24cadc0..83ecdba 100644 --- a/analytics/urls.py +++ b/analytics/urls.py @@ -11,4 +11,5 @@ urlpatterns = [ url(r'^most_accessed_categories/$', views.most_accessed_categories, name = "most_accessed_categories"), url(r'^most_accessed_resources/$', views.most_accessed_resource_kind, name= "most_accessed_resources"), url(r'^most_active_users/$', views.most_active_users, name= "most_active_users"), + url(r'^amount_active_users_per_day/$', views.most_active_users_in_a_month, name="most_active_users_in_a_month") ] \ No newline at end of file diff --git a/analytics/views.py b/analytics/views.py index 8e07503..432c92b 100644 --- a/analytics/views.py +++ b/analytics/views.py @@ -13,6 +13,9 @@ import operator from django.utils.translation import ugettext_lazy as _ from django.shortcuts import render, get_object_or_404, redirect +from datetime import date +import calendar + class GeneralView(generic.TemplateView): template_name = "analytics/general.html" @@ -26,6 +29,9 @@ class GeneralView(generic.TemplateView): def get_context_data(self, **kwargs): context = {} + + context['months'] = [_('January'), _('February'), _('March'), _('April'), _('May'), _('June'), _('July'), _('August'), + _('September'), _('October'), _('November'), _('December')] return context @@ -55,8 +61,23 @@ def most_used_tags(request): return JsonResponse(data, safe= False) -def heatmap(request): - return None +def most_active_users_in_a_month(request): + params = request.GET + days = get_days_of_the_month(params['month']) + print(days) + data = {} + mappings = {_('January'): 1, _('February'): 2, _('March'): 3, _('April'): 4, _('May'): 5, _('June'): 6, _('July'): 7 + , _('August'): 8, _('September'): 9, _('October'): 10, _('November'): 11, _('December'): 12} + + + for day in days: + built_date = date(date.today().year, mappings[params['month']], day) + print(built_date) + day_count = Log.objects.filter(datetime__date = built_date).count() + data[day] = day_count + + data = [{"day": day, "count": day_count} for day, day_count in data.items()] + return JsonResponse(data, safe=False) @@ -136,4 +157,25 @@ def most_active_users(request): user_object = User.objects.get(id=user['user_id']) user['image'] = user_object.image_url user['user'] = user_object.social_name - return JsonResponse(fifty_users, safe=False) \ No newline at end of file + return JsonResponse(fifty_users, safe=False) + + +def get_days_of_the_month(month): + + #get current year + year = date.today().year + print(year) + print(month) + mappings = {_('January'): 1, _('February'): 2, _('March'): 3, _('April'): 4, _('May'): 5, _('June'): 6, _('July'): 7 + , _('August'): 8, _('September'): 9, _('October'): 10, _('November'): 11, _('December'): 12} + + c = calendar.Calendar() + days = c.itermonthdays(year, mappings[month]) + days_set = set() + for day in days: + days_set.add(day) + + days_set.remove(0) #because 0 is not aan actual day from that month + return days_set + + -- libgit2 0.21.2