backoffice: use select criterias when getting statistics (#5997)

This commit is contained in:
Frédéric Péters 2014-11-22 11:51:08 +01:00
parent 2f69166442
commit 830eab99a7
1 changed files with 35 additions and 41 deletions

View File

@ -33,6 +33,7 @@ from qommon import errors
from qommon import ods
from qommon.form import *
from qommon.admin.menu import is_accessible
from qommon.storage import NotEqual, LessOrEqual, GreaterOrEqual
from wcs.forms.common import FormStatusPage
@ -75,6 +76,33 @@ def format_time(t, units = 2):
return _('%d seconds') % seconds
def get_stats_criteria(request, parsed_values=None):
"""
Parses the request query string and returns a list of criterias suitable
for select() usage. The parsed_values parameter can be given a dictionary,
to be filled with the parsed values.
"""
format_string = misc.date_format()
criterias = [NotEqual('status', 'draft')]
try:
period_start = time.strptime(request.form.get('start'), format_string)
criterias.append(GreaterOrEqual('receipt_time', period_start))
if parsed_values is not None:
parsed_values['period_start'] = datetime.datetime.fromtimestamp(time.mktime(period_start))
except (ValueError, TypeError):
pass
try:
period_end = time.strptime(request.form.get('end'), format_string)
criterias.append(LessOrEqual('receipt_time', period_end))
if parsed_values is not None:
parsed_values['period_end'] = datetime.datetime.fromtimestamp(time.mktime(period_end))
except (ValueError, TypeError):
pass
return criterias
class FormDefPage(wcs.admin.forms.FormDefPage):
def html_top(self, title):
return html_top('forms', title)
@ -257,33 +285,16 @@ class RootDirectory(BackofficeRootDirectory):
get_response().breadcrumb.append(('statistics', _('Global statistics')))
get_response().filter['sidebar'] = self.get_stats_sidebar()
r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Global statistics')
format_string = misc.date_format()
try:
period_start = time.strptime(get_request().form.get('start'),
format_string)
except (ValueError, TypeError):
period_start = None
try:
period_end = time.strptime(get_request().form.get('end'),
format_string)
except (ValueError, TypeError):
period_end = None
formdefs = FormDef.select(lambda x: not x.is_disabled() or x.disabled_redirection,
order_by='name', ignore_errors=True)
counts = {}
parsed_values = {}
criterias = get_stats_criteria(get_request(), parsed_values)
for formdef in formdefs:
values = formdef.data_class().select(lambda x: x.status != 'draft')
if period_start:
values = [x for x in values if x.receipt_time >= period_start]
if period_end:
values = [x for x in values if x.receipt_time <= period_end]
values = formdef.data_class().select(criterias)
counts[formdef.id] = len(values)
do_graphs = False
@ -309,10 +320,8 @@ class RootDirectory(BackofficeRootDirectory):
r += htmltext('<div class="splitcontent-right">')
from wcs import sql
if period_start:
period_start = datetime.datetime.fromtimestamp(time.mktime(period_start))
if period_end:
period_end = datetime.datetime.fromtimestamp(time.mktime(period_end))
period_start = parsed_values.get('period_start')
period_end = parsed_values.get('period_end')
monthly_totals = sql.get_monthly_totals(period_start, period_end)[-12:]
yearly_totals = sql.get_yearly_totals(period_start, period_end)[-10:]
@ -968,24 +977,9 @@ class FormPage(Directory):
get_response().breadcrumb.append( ('stats', _('Statistics')) )
get_response().filter['sidebar'] = self.get_stats_sidebar()
r += htmltext('<h2>%s - %s</h2>') % (self.formdef.name, _('Statistics'))
values = self.formdef.data_class().select(lambda x: x.status != 'draft')
format_string = misc.date_format()
try:
period_start = time.strptime(get_request().form.get('start'),
format_string)
except (ValueError, TypeError):
pass
else:
values = [x for x in values if x.receipt_time >= period_start]
try:
period_end = time.strptime(get_request().form.get('end'),
format_string)
except (ValueError, TypeError):
pass
else:
values = [x for x in values if x.receipt_time <= period_end]
criterias = get_stats_criteria(get_request())
values = self.formdef.data_class().select(criterias)
no_forms = len(values)
r += htmltext('<p>%s %d</p>') % (_('Total number of records:'), no_forms)