Projet

Général

Profil

0001-statistics-compute-group-labels-sooner-63377.patch

Valentin Deniaud, 24 août 2022 11:31

Télécharger (4,96 ko)

Voir les différences:

Subject: [PATCH 1/2] statistics: compute group labels sooner (#63377)

 wcs/statistics/views.py | 54 ++++++++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 20 deletions(-)
wcs/statistics/views.py
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
-