194 |
194 |
category_slug = request.GET.get('category', '_all')
|
195 |
195 |
formdef_slug = request.GET.get('form', '_all' if self.has_global_count_support else '_nothing')
|
196 |
196 |
group_by = request.GET.get('group-by')
|
|
197 |
group_labels = {}
|
197 |
198 |
subfilters = []
|
198 |
199 |
if formdef_slug != '_all' and not formdef_slug.startswith('category:'):
|
199 |
200 |
try:
|
... | ... | |
207 |
208 |
totals_kwargs['criterias'].append(Equal('formdef_klass', self.formdef_class))
|
208 |
209 |
totals_kwargs['criterias'].append(Equal('formdef_id', formdef.id))
|
209 |
210 |
totals_kwargs['criterias'].extend(self.get_filters_criterias(formdef, form_page))
|
210 |
|
if group_by:
|
211 |
|
group_by_field = self.get_group_by_field(form_page, group_by)
|
212 |
|
if group_by_field and group_by_field.type == 'status':
|
213 |
|
totals_kwargs['group_by'] = 'status'
|
214 |
|
elif group_by_field:
|
215 |
|
totals_kwargs['group_by'] = sql.get_field_id(group_by_field)
|
|
211 |
self.set_group_by_parameters(group_by, formdef, form_page, totals_kwargs, group_labels)
|
216 |
212 |
subfilters = self.get_subfilters(form_page)
|
217 |
213 |
else:
|
218 |
214 |
totals_kwargs['criterias'].append(StrictNotEqual('status', 'draft'))
|
... | ... | |
245 |
241 |
x_labels = [x[0] for x in totals]
|
246 |
242 |
series = [{'label': self.label, 'data': [x[1] for x in totals]}]
|
247 |
243 |
else:
|
248 |
|
x_labels, series = self.get_grouped_data(totals, group_by_field, formdef, form_page)
|
|
244 |
x_labels, series = self.get_grouped_data(totals, group_labels)
|
249 |
245 |
|
250 |
246 |
return JsonResponse(
|
251 |
247 |
{'data': {'x_labels': x_labels, 'series': series, 'subfilters': subfilters}, 'err': 0}
|
... | ... | |
342 |
338 |
if not hasattr(fields[0], 'block_field'): # block fields are not supported
|
343 |
339 |
return fields[0]
|
344 |
340 |
|
345 |
|
def get_grouped_data(self, totals, group_by_field, formdef, form_page):
|
|
341 |
def get_group_labels(self, group_by_field, formdef, form_page):
|
|
342 |
group_labels = {}
|
|
343 |
if group_by_field.type == 'status':
|
|
344 |
group_labels = {'wf-%s' % status.id: status.name for status in formdef.workflow.possible_status}
|
|
345 |
elif group_by_field.type == 'bool':
|
|
346 |
group_labels = {True: _('Yes'), False: _('No')}
|
|
347 |
elif group_by_field.type in ('item', 'items'):
|
|
348 |
options = form_page.get_item_filter_options(
|
|
349 |
group_by_field, selected_filter='all', anonymised=True
|
|
350 |
)
|
|
351 |
group_labels = {option[0]: option[1] for option in options}
|
|
352 |
|
|
353 |
group_labels[None] = _('None')
|
|
354 |
return group_labels
|
|
355 |
|
|
356 |
def set_group_by_parameters(self, group_by, formdef, form_page, totals_kwargs, group_labels):
|
|
357 |
if not group_by:
|
|
358 |
return
|
|
359 |
|
|
360 |
group_by_field = self.get_group_by_field(form_page, group_by)
|
|
361 |
if not group_by_field:
|
|
362 |
return
|
|
363 |
|
|
364 |
if group_by_field.type == 'status':
|
|
365 |
totals_kwargs['group_by'] = 'status'
|
|
366 |
else:
|
|
367 |
totals_kwargs['group_by'] = sql.get_field_id(group_by_field)
|
|
368 |
|
|
369 |
group_labels.update(self.get_group_labels(group_by_field, formdef, form_page))
|
|
370 |
|
|
371 |
def get_grouped_data(self, totals, group_labels):
|
346 |
372 |
totals_by_time = collections.OrderedDict(
|
347 |
373 |
# time1: {group1: total_11, group2: total_12},
|
348 |
374 |
# time2: {group1: total_21}
|
... | ... | |
369 |
395 |
for group in seen_group_values:
|
370 |
396 |
totals_by_group[group] = [totals.get(group) for totals in totals_by_time.values()]
|
371 |
397 |
|
372 |
|
group_labels = {}
|
373 |
|
if group_by_field.type == 'status':
|
374 |
|
group_labels = {'wf-%s' % status.id: status.name for status in formdef.workflow.possible_status}
|
375 |
|
elif group_by_field.type == 'bool':
|
376 |
|
group_labels = {True: _('Yes'), False: _('No')}
|
377 |
|
elif group_by_field.type in ('item', 'items'):
|
378 |
|
options = form_page.get_item_filter_options(
|
379 |
|
group_by_field, selected_filter='all', anonymised=True
|
380 |
|
)
|
381 |
|
group_labels = {option[0]: option[1] for option in options}
|
382 |
|
group_labels[None] = _('None')
|
383 |
|
|
384 |
398 |
x_labels = list(totals_by_time)
|
385 |
399 |
series = [
|
386 |
400 |
{'label': group_labels.get(group, group), 'data': data} for group, data in totals_by_group.items()
|
387 |
|
-
|