From 57cdf8896f854de7ba573cfe8d5040155df1e656 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 20 Oct 2014 20:40:42 +0200 Subject: Dashboard: many improvments on graph (refs #2075) * by default graph is set by month * data are reapeated in a table * ability to save the graph in a file * detail by department with a line by department + total * add a legend * ability to zoom on the graph --- ishtar_common/models.py | 45 ++++++++--- ishtar_common/static/media/style.css | 15 +++- .../ishtar/dashboards/dashboard_main.html | 3 + .../ishtar/dashboards/dashboard_main_detail.html | 88 +++++++++++++++++----- ishtar_common/templatetags/date_formating.py | 19 +++++ ishtar_common/views.py | 11 ++- 6 files changed, 145 insertions(+), 36 deletions(-) create mode 100644 ishtar_common/templatetags/date_formating.py (limited to 'ishtar_common') diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 98f4addb7..c59f38674 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -561,10 +561,12 @@ class UserDashboard: .order_by('person__person_types') class Dashboard: - def __init__(self, model, slice='year', date_source=None, fltr={}): + def __init__(self, model, slice='year', date_source=None, show_detail=None, + fltr={}): # don't provide date_source if it is not relevant self.model = model self.total_number = model.get_total_number(fltr) + self.show_detail = show_detail history_model = self.model.history.model # last edited - created self.recents, self.lasts = [], [] @@ -597,21 +599,40 @@ class Dashboard: self.periods.sort() if not self.total_number or not self.periods: return + kwargs_num = base_kwargs.copy() + self.serie_labels = [_(u"Total")] # numbers if slice == 'year': - self.values = [('year', _(u"Year"), reversed(self.periods))] - self.numbers = [model.get_by_year(year, **base_kwargs).count() + self.values = [('year', "", + list(reversed(self.periods)))] + self.numbers = [model.get_by_year(year, **kwargs_num).count() for year in self.periods] - self.values += [('number', _(u"Number"), reversed(self.numbers))] + self.values += [('number', _(u"Number"), + list(reversed(self.numbers)))] if slice == 'month': - self.numbers = [model.get_by_month(*period, **base_kwargs).count() - for period in self.periods] - periods = reversed(self.periods) - self.periods = ["%d-%s-01" % (period[0], ('0'+str(period[1])) - if len(str(period[1])) == 1 else period[1]) - for period in periods] - self.values = [('month', _(u"Month"), self.periods)] - self.values += [('number', _(u"Number"), reversed(self.numbers))] + periods = list(reversed(self.periods)) + self.periods = ["%d-%s-01" % (p[0], ('0'+str(p[1])) + if len(str(p[1])) == 1 else p[1]) + for p in periods] + self.values = [('month', "", self.periods)] + if show_detail: + for dpt in settings.ISHTAR_DPTS: + self.serie_labels.append(unicode(dpt)) + idx = 'number_' + unicode(dpt) + kwargs_num['fltr'] = {"towns__numero_insee__startswith":\ + unicode(dpt)} + numbers = [model.get_by_month(*p.split('-')[:2], + **kwargs_num).count() + for p in self.periods] + self.values += [(idx, dpt, list(numbers))] + # put "Total" at the end + self.serie_labels.append(self.serie_labels.pop(0)) + kwargs_num['fltr'] = {} + self.numbers = [model.get_by_month(*p.split('-')[:2], + **kwargs_num).count() + for p in self.periods] + self.values += [('number', _(u"Total"), + list(self.numbers))] # calculate self.average = self.get_average() self.variance = self.get_variance() diff --git a/ishtar_common/static/media/style.css b/ishtar_common/static/media/style.css index 341308926..54a97ca77 100644 --- a/ishtar_common/static/media/style.css +++ b/ishtar_common/static/media/style.css @@ -669,6 +669,13 @@ table.confirm tr.spacer td:last-child{ padding:0.5em 1em; } +.chart-img{ + display:none; +} + +.chart-img-form{ + margin-top:1em; +} #window table th, .dashboard table.resume th{ background-color:#922; @@ -783,8 +790,7 @@ table.confirm tr.spacer td:last-child{ margin:0.3em; } -p.alert{ - color:#D14; +p.info-box, p.alert{ display:block; font-style:italic; width:670px; @@ -794,6 +800,11 @@ p.alert{ -moz-border-radius:8px; -webkit-border-radius:8px; border-radius:8px; + font-size: 0.9em; +} + +p.alert{ + color:#D14; background-image:url(images/red_flag.png); background-repeat:no-repeat; background-position:left center; diff --git a/ishtar_common/templates/ishtar/dashboards/dashboard_main.html b/ishtar_common/templates/ishtar/dashboards/dashboard_main.html index 8822875b5..868f8a5c3 100644 --- a/ishtar_common/templates/ishtar/dashboards/dashboard_main.html +++ b/ishtar_common/templates/ishtar/dashboards/dashboard_main.html @@ -6,9 +6,12 @@ + + + {% endblock %} {% block content %} diff --git a/ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html b/ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html index 610457ae3..820c50136 100644 --- a/ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html +++ b/ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html @@ -1,11 +1,8 @@ -{% load i18n %} +{% load i18n date_formating %} {% load url from future %}

{% trans "Numbers" %}

-

{% trans "Total:" %} {{dashboard.total_number}}

-
-
{% if form %}
@@ -16,15 +13,27 @@
{% endif %} - {% comment %} - +

{% trans "Total:" %} {{dashboard.total_number}}

+
+
+

{% trans 'Draw rectangle on the graph to zoom. Double-click to reinitialize.' %}

+
+ +
+
+

{% trans 'Right-click on this image to save it.' %}

+
+
+
+
+
{% for idx, lbl, values in dashboard.values %} - {% for value in values %}{% endfor%} + {% for value in values reversed %}{% if forloop.parentloop.counter0 %}{%endif%}{% endfor%} {% endfor%} -
{{lbl}}{{value}}{% else %}{%endif%}{{value|date_formating }}{% if forloop.parentloop.counter0 %}{% else %}
{% endcomment %} +
{% if dashboard.periods %}

{% trans "By years" %}

@@ -71,23 +80,41 @@