backoffice: use a single request to get formdef counts on stats page (#54237)

This commit is contained in:
Frédéric Péters 2021-05-24 11:04:26 +02:00
parent 0a237eaafa
commit ceb49bd925
2 changed files with 32 additions and 5 deletions

View File

@ -756,9 +756,18 @@ class ManagementDirectory(Directory):
counts = {}
parsed_values = {}
criterias = get_global_criteria(get_request(), parsed_values)
for formdef in formdefs:
values = formdef.data_class().select(criterias)
counts[formdef.id] = len(values)
period_start = parsed_values.get('period_start')
period_end = parsed_values.get('period_end')
if get_publisher().is_using_postgresql():
from wcs import sql
formdef_totals = sql.get_formdef_totals(period_start, period_end, criterias)
counts = {str(x): y for x, y in formdef_totals}
else:
for formdef in formdefs:
values = formdef.data_class().select(criterias)
counts[formdef.id] = len(values)
do_graphs = False
if (
@ -782,8 +791,6 @@ class ManagementDirectory(Directory):
if do_graphs:
r += htmltext('</div>')
r += htmltext('<div class="splitcontent-right">')
period_start = parsed_values.get('period_start')
period_end = parsed_values.get('period_end')
r += do_graphs_section(period_start, period_end, criterias=[NotEqual('status', 'draft')])
r += htmltext('</div>')

View File

@ -3243,6 +3243,26 @@ def get_weekday_totals(period_start=None, period_end=None, criterias=None):
return result
@guard_postgres
def get_formdef_totals(period_start=None, period_end=None, criterias=None):
conn, cur = get_connection_and_cursor()
statement = '''SELECT formdef_id, COUNT(*)'''
parameters = {}
statement += get_period_query(
period_start=period_start, period_end=period_end, criterias=criterias, parameters=parameters
)
statement += ' GROUP BY formdef_id'
cur.execute(statement, parameters)
result = cur.fetchall()
result = [(int(x), y) for x, y in result]
conn.commit()
cur.close()
return result
@guard_postgres
def get_hour_totals(period_start=None, period_end=None, criterias=None):
conn, cur = get_connection_and_cursor()