Projet

Général

Profil

0001-wip.patch

Valentin Deniaud, 25 janvier 2022 18:19

Télécharger (8,04 ko)

Voir les différences:

Subject: [PATCH] wip

 wcs/backoffice/management.py |   2 +-
 wcs/statistics/views.py      | 126 ++++++++++++++++++++++++++++++++++-
 2 files changed, 124 insertions(+), 4 deletions(-)
wcs/backoffice/management.py
925 925
            return ('start', 'end')
926 926
        return ()
927 927

  
928
    def get_item_filter_options(self, filter_field, selected_filter, criterias):
928
    def get_item_filter_options(self, filter_field, selected_filter, criterias=None):
929 929
        criterias = (criterias or [])[:]
930 930
        # remove potential filter on self (Equal for item, Intersects for items)
931 931
        criterias = [
wcs/statistics/views.py
17 17
from django.http import HttpResponseBadRequest, HttpResponseForbidden, JsonResponse
18 18
from django.urls import reverse
19 19
from django.views.generic import View
20
from quixote import get_publisher
20
from quixote import get_publisher, get_request
21 21

  
22 22
from wcs.api_utils import is_url_signed
23
from wcs.backoffice.management import FormPage
23 24
from wcs.categories import Category
25
from wcs.formdef import FormDef
24 26
from wcs.qommon import _, misc
25 27
from wcs.qommon.misc import C_
26
from wcs.qommon.storage import Equal
28
from wcs.qommon.storage import Equal, NotEqual, Or
27 29

  
28 30

  
29 31
class RestrictedView(View):
......
42 44
        category_options = [{'id': '_all', 'label': C_('categories|All')}] + [
43 45
            {'id': x.id, 'label': x.name} for x in categories
44 46
        ]
47
        forms = FormDef.select()
48
        forms.sort(key=lambda x: misc.simplify(x.name))
49
        form_options = [{'id': '_all', 'label': C_('forms|All')}] + [
50
            {'id': x.url_name, 'label': x.name} for x in forms
51
        ]
45 52
        return JsonResponse(
46 53
            {
47 54
                'data': [
......
81 88
                                'required': True,
82 89
                                'default': '_all',
83 90
                            },
91
                            {
92
                                'id': 'form',
93
                                'label': _('Form'),
94
                                'options': form_options,
95
                                'required': True,
96
                                'default': '_all',
97
                            },
84 98
                        ],
85 99
                    }
86 100
                ]
......
99 113
            'criterias': [],
100 114
        }
101 115
        category_id = request.GET.get('category', '_all')
102
        if category_id != '_all':
116
        formdef_slug = request.GET.get('form', '_all')
117
        subfilters = []
118
        if formdef_slug != '_all':
119
            try:
120
                formdef = FormDef.get_by_urlname(formdef_slug, ignore_migration=True)
121
            except KeyError:
122
                return HttpResponseBadRequest('invalid form')
123
            form_page = FormPage(formdef=formdef, update_breadcrumbs=False)
124
            totals_kwargs['criterias'].append(Equal('formdef_id', formdef.id))
125
            totals_kwargs['criterias'].extend(self.get_filters_criterias(formdef, form_page))
126
            subfilters = self.get_subfilters(form_page)
127
        elif category_id != '_all':
103 128
            totals_kwargs['criterias'].append(Equal('category_id', category_id))
129

  
104 130
        time_interval_methods = {
105 131
            'month': sql.get_monthly_totals,
106 132
            'year': sql.get_yearly_totals,
......
122 148
                            'data': [x[1] for x in totals],
123 149
                        }
124 150
                    ],
151
                    'subfilters': subfilters,
125 152
                },
126 153
                'err': 0,
127 154
            }
128 155
        )
156

  
157
    def get_filters_criterias(self, formdef, form_page):
158
        criterias = form_page.get_criterias_from_query()
159

  
160
        selected_status = self.request.GET['filter-status']
161
        applied_filters = None
162
        if selected_status and selected_status != 'all':
163
            if selected_status == 'pending':
164
                applied_filters = ['wf-%s' % x.id for x in formdef.workflow.get_not_endpoint_status()]
165
            elif selected_status == 'done':
166
                applied_filters = ['wf-%s' % x.id for x in formdef.workflow.get_endpoint_status()]
167
            else:
168
                try:
169
                    formdef.workflow.get_status(selected_status)
170
                    applied_filters = ['wf-%s' % selected_status]
171
                except KeyError:
172
                    pass
173

  
174
        if applied_filters:
175
            criterias.append(Or([Equal('status', x) for x in applied_filters]))
176
        else:
177
            criterias = [NotEqual('status', 'draft')] + criterias
178

  
179
        return criterias
180

  
181
    @staticmethod
182
    def get_subfilters(form_page):
183
        waitpoint_status = form_page.formdef.workflow.get_waitpoint_status()
184

  
185
        filter_fields = []
186
        for field in form_page.get_formdef_fields():
187
            if field.type not in form_page.get_filterable_field_types() + ['status']:
188
                continue
189
            if field.type == 'status' and not waitpoint_status:
190
                continue
191
            filter_fields.append(field)
192

  
193
            # add contextual_id/contextual_varname attributes
194
            # they are id/varname for normal fields
195
            # but in case of blocks they are concatenation of block id/varname + field id/varname
196
            is_in_block_field = getattr(field, 'block_field', None)
197
            field.contextual_id = field.id
198
            field.contextual_varname = None
199
            if is_in_block_field:
200
                field.contextual_id = '%s-%s' % (field.block_field.id, field.id)
201
                field.label = '%s / %s' % (field.block_field.label, field.label)
202
                if field.varname and field.block_field.varname:
203
                    field.contextual_varname = '%s_%s' % (field.block_field.varname, field.varname)
204
            else:
205
                field.contextual_varname = field.varname
206

  
207
        subfilters = []
208
        for filter_field in filter_fields:
209
            if not filter_field.contextual_varname:
210
                continue
211

  
212
            filter_field_key = 'filter-%s' % filter_field.contextual_varname
213
            filter_field.required = False
214
            filter_field.default_filter_value = ''
215

  
216
            if filter_field.type == 'status':
217
                filter_field.required = True
218
                filter_field.default_filter_value = 'all'
219
                options = [
220
                    ('waiting', _('Waiting for an action')),
221
                    ('all', _('All')),
222
                    ('pending', C_('formdata|Open')),
223
                    ('done', _('Done')),
224
                ]
225
                for status in waitpoint_status:
226
                    options.append((status.id, status.name))
227
            elif filter_field.type in ('item', 'items'):
228
                if get_publisher().is_using_postgresql():
229
                    options = form_page.get_item_filter_options(filter_field, selected_filter='all')
230
                else:
231
                    continue
232
            elif filter_field.type == 'bool':
233
                options = [('true', _('Yes')), ('false', _('No'))]
234
            else:
235
                continue
236

  
237
            filter_description = {
238
                'id': filter_field_key,
239
                'label': filter_field.label,
240
                'options': [{'id': x[0], 'label': x[1]} for x in options],
241
                'required': filter_field.required,
242
            }
243
            if filter_field.default_filter_value:
244
                filter_description['default'] = filter_field.default_filter_value
245

  
246
            subfilters.append(filter_description)
247

  
248
        return subfilters
129
-