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 |
|
-
|