Skip to content

Commit

Permalink
report errors as allerts
Browse files Browse the repository at this point in the history
  • Loading branch information
PetrDlouhy committed Jan 10, 2020
1 parent 37b06a1 commit f171a1c
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 62 deletions.
119 changes: 59 additions & 60 deletions admin_tools_stats/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
# The Initial Developer of the Original Code is
# Arezqui Belaid <info@star2billing.com>
#
import logging
from collections import OrderedDict
from datetime import timedelta

Expand All @@ -30,6 +31,7 @@

from qsstats.utils import get_bounds

logger = logging.getLogger(__name__)

operation = (
('DistinctCount', 'DistinctCount'),
Expand Down Expand Up @@ -279,66 +281,62 @@ def clean(self, *args, **kwargs):

def get_time_series(self, dynamic_criteria_field_name, dynamic_criteria, all_criteria, request, time_since, time_until, interval):
""" Get the stats time series """
try:
model_name = apps.get_model(self.model_app_name, self.model_name)
kwargs = {}
if request and not request.user.is_superuser and self.user_field_name:
kwargs[self.user_field_name] = request.user
for i in all_criteria:
# fixed mapping value passed info kwargs
if i.criteria_fix_mapping:
for key in i.criteria_fix_mapping:
# value => i.criteria_fix_mapping[key]
kwargs[key] = i.criteria_fix_mapping[key]

# dynamic mapping value passed info kwargs
dynamic_key = "select_box_dynamic_%i" % i.id
if dynamic_key in dynamic_criteria:
if dynamic_criteria[dynamic_key] != '':
criteria_value = i.get_dynamic_choices(i, self)[dynamic_criteria[dynamic_key]]
if isinstance(criteria_value, (list, tuple)):
criteria_value = criteria_value[0]
else:
criteria_value = dynamic_criteria[dynamic_key]
kwargs['id' if i.dynamic_criteria_field_name == '' else i.dynamic_criteria_field_name] = criteria_value

aggregate = None
if self.type_operation_field_name and self.operation_field_name:
operation = {
'DistinctCount': Count(self.operation_field_name, distinct=True),
'Count': Count(self.operation_field_name),
'Sum': Sum(self.operation_field_name),
'Avg': Avg(self.operation_field_name),
'StdDev': StdDev(self.operation_field_name),
'Max': Max(self.operation_field_name),
'Min': Min(self.operation_field_name),
'Variance': Variance(self.operation_field_name),
}
aggregate = operation[self.type_operation_field_name]
else:
aggregate = Count('id', distinct=True)

# TODO: maybe backport values_list support back to django-qsstats-magic and use it again for the query
time_range = {'%s__range' % self.date_field_name: (time_since, time_until)}
qs = model_name.objects
qs = qs.filter(**time_range)
qs = qs.filter(**kwargs)
if hasattr(time_since, 'tzinfo') and time_since.tzinfo:
tzinfo = {'tzinfo': time_since.tzinfo}
else:
tzinfo = {}
qs = qs.annotate(d=Trunc(self.date_field_name, interval, **tzinfo))
if dynamic_criteria_field_name:
qs = qs.values_list('d', dynamic_criteria_field_name)
qs = qs.order_by('d', dynamic_criteria_field_name)
else:
qs = qs.values_list('d')
qs = qs.order_by('d')
qs = qs.annotate(agg=aggregate)
return qs
except (LookupError, FieldError, TypeError) as e:
self.error_message = str(e)
messages.add_message(request, messages.ERROR, "%s dashboard: %s" % (self.graph_title, str(e)))
model_name = apps.get_model(self.model_app_name, self.model_name)
kwargs = {}
if request and not request.user.is_superuser and self.user_field_name:
kwargs[self.user_field_name] = request.user
for i in all_criteria:
# fixed mapping value passed info kwargs
if i.criteria_fix_mapping:
for key in i.criteria_fix_mapping:
# value => i.criteria_fix_mapping[key]
kwargs[key] = i.criteria_fix_mapping[key]

# dynamic mapping value passed info kwargs
dynamic_key = "select_box_dynamic_%i" % i.id
if dynamic_key in dynamic_criteria:
if dynamic_criteria[dynamic_key] != '':
criteria_value = i.get_dynamic_choices(i, self)[dynamic_criteria[dynamic_key]]
if isinstance(criteria_value, (list, tuple)):
criteria_value = criteria_value[0]
else:
criteria_value = dynamic_criteria[dynamic_key]
kwargs['id' if i.dynamic_criteria_field_name == '' else i.dynamic_criteria_field_name] = criteria_value

aggregate = None
if self.type_operation_field_name and self.operation_field_name:
operation = {
'DistinctCount': Count(self.operation_field_name, distinct=True),
'Count': Count(self.operation_field_name),
'Sum': Sum(self.operation_field_name),
'Avg': Avg(self.operation_field_name),
'StdDev': StdDev(self.operation_field_name),
'Max': Max(self.operation_field_name),
'Min': Min(self.operation_field_name),
'Variance': Variance(self.operation_field_name),
}
aggregate = operation[self.type_operation_field_name]
else:
aggregate = Count('id', distinct=True)

# TODO: maybe backport values_list support back to django-qsstats-magic and use it again for the query
time_range = {'%s__range' % self.date_field_name: (time_since, time_until)}
qs = model_name.objects
qs = qs.filter(**time_range)
qs = qs.filter(**kwargs)
if hasattr(time_since, 'tzinfo') and time_since.tzinfo:
tzinfo = {'tzinfo': time_since.tzinfo}
else:
tzinfo = {}
qs = qs.annotate(d=Trunc(self.date_field_name, interval, **tzinfo))
if dynamic_criteria_field_name:
qs = qs.values_list('d', dynamic_criteria_field_name)
qs = qs.order_by('d', dynamic_criteria_field_name)
else:
qs = qs.values_list('d')
qs = qs.order_by('d')
qs = qs.annotate(agg=aggregate)
return qs

def get_multi_series_criteria(self, request_get):
try:
Expand Down Expand Up @@ -410,6 +408,7 @@ def get_control_form(self):
dy_map = i.get_dynamic_choices(i, self)
if dy_map:
temp += i.criteria_name + ': <select class="chart-input dynamic_criteria_select_box" name="select_box_dynamic_%i" >' % i.id
temp += '<option value="">-------</option>'
for key, name in dy_map.items():
if isinstance(name, (list, tuple)):
name = name[1]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
{% load nvd3_tags %}
{% if values %}
{% if error %}
alert('{{ error|escapejs }}');
{% elif values %}
function loadChartScript(){
{% load_chart chart_type values chart_container extra %}
};
Expand Down
11 changes: 10 additions & 1 deletion admin_tools_stats/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import logging
import time
from collections import OrderedDict
from datetime import datetime
Expand All @@ -12,6 +13,9 @@
from .models import DashboardStats


logger = logging.getLogger(__name__)


class AdminChartsView(TemplateView):
template_name = 'admin_tools_stats/admin_charts.js'

Expand Down Expand Up @@ -57,7 +61,12 @@ def get_context_data(self, *args, interval=None, graph_key=None, **kwargs):
time_until = current_tz.localize(time_until)
time_until = time_until.replace(hour=23, minute=59)

series = dashboard_stats.get_multi_time_series(self.request.GET, time_since, time_until, interval, self.request)
try:
series = dashboard_stats.get_multi_time_series(self.request.GET, time_since, time_until, interval, self.request)
except Exception as e:
context['error'] = str(e)
logger.exception(e)
return context
criteria = dashboard_stats.get_multi_series_criteria(self.request.GET)
if criteria:
choices = criteria.get_dynamic_choices(criteria, dashboard_stats)
Expand Down

0 comments on commit f171a1c

Please sign in to comment.