backoffice: use select criterias when getting statistics (#5997)
This commit is contained in:
parent
2f69166442
commit
830eab99a7
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue