0001-backoffice-display-applied-filters-in-PDF-output-891.patch
data/print-html-as-pdf.js | ||
---|---|---|
16 | 16 |
$('html').css('background', 'white').css('font-size', '8pt'); |
17 | 17 |
$('div#main').css('width', '95%'); |
18 | 18 |
$('div#main-content').css('width', '95%').css('border', 'none'); |
19 |
$('#statistics .criterias').css('display', 'block'); |
|
20 |
$('div#main-content > h2').css({ |
|
21 |
'border-bottom': '1px solid #666', |
|
22 |
'font-weight': 'bold'}); |
|
19 | 23 |
}); |
20 | 24 |
page.render(system.args[1] + '.pdf'); |
21 | 25 |
phantom.exit(); |
tests/test_backoffice_pages.py | ||
---|---|---|
322 | 322 |
assert 'Resolution time' in resp.body |
323 | 323 |
assert 'To Status "New"' in resp.body |
324 | 324 |
assert 'To Status "Finished"' in resp.body |
325 |
assert not '<h2>Filters</h2>' in resp.body |
|
325 | 326 | |
326 | 327 |
resp.forms[0]['filter-end-value'] = '2013-01-01' |
327 | 328 |
resp = resp.forms[0].submit() |
328 | 329 |
assert 'Total number of records: 0' in resp.body |
330 |
assert '<h2>Filters</h2>' in resp.body |
|
331 |
assert 'End: 2013-01-01' in resp.body |
|
329 | 332 | |
330 | 333 |
def test_backoffice_statistics_status_filter(pub): |
331 | 334 |
create_superuser(pub) |
... | ... | |
334 | 337 |
resp = app.get('/backoffice/management/form-title/') |
335 | 338 |
resp = resp.click('Statistics') |
336 | 339 |
assert 'filter' not in resp.forms[0].fields # status is not displayed by default |
340 |
assert not '<h2>Filters</h2>' in resp.body |
|
337 | 341 | |
338 | 342 |
# add 'status' as a filter |
339 | 343 |
resp.forms[0]['filter-status'].checked = True |
340 | 344 |
resp = resp.forms[0].submit() |
341 | 345 |
assert 'filter' in resp.forms[0].fields |
346 |
assert not '<h2>Filters</h2>' in resp.body |
|
342 | 347 | |
343 | 348 |
assert resp.forms[0]['filter'].value == 'all' |
344 | 349 |
resp.forms[0]['filter'].value = 'pending' |
345 | 350 |
resp = resp.forms[0].submit() |
346 | 351 |
assert 'Total number of records: 17' in resp.body |
352 |
assert '<h2>Filters</h2>' in resp.body |
|
353 |
assert 'Status: Pending' in resp.body |
|
347 | 354 | |
348 | 355 |
resp.forms[0]['filter'].value = 'done' |
349 | 356 |
resp = resp.forms[0].submit() |
350 | 357 |
assert 'Total number of records: 33' in resp.body |
358 |
assert '<h2>Filters</h2>' in resp.body |
|
359 |
assert 'Status: Done' in resp.body |
|
351 | 360 | |
352 | 361 |
resp.forms[0]['filter'].value = 'rejected' |
353 | 362 |
resp = resp.forms[0].submit() |
354 | 363 |
assert 'Total number of records: 0' in resp.body |
364 |
assert '<h2>Filters</h2>' in resp.body |
|
365 |
assert 'Status: Rejected' in resp.body |
|
355 | 366 | |
356 | 367 |
resp.forms[0]['filter'].value = 'all' |
357 | 368 |
resp = resp.forms[0].submit() |
... | ... | |
378 | 389 |
resp.forms[0]['filter-2-value'].value = 'foo' |
379 | 390 |
resp = resp.forms[0].submit() |
380 | 391 |
assert 'Total number of records: 13' in resp.body |
392 |
assert '<h2>Filters</h2>' in resp.body |
|
393 |
assert '2nd field: foo' in resp.body |
|
381 | 394 | |
382 | 395 |
# check it's also possible to get back to the complete list |
383 | 396 |
resp.forms[0]['filter-2-value'].value = '' |
... | ... | |
392 | 405 |
resp.forms[0]['filter-3-value'].value = 'A' |
393 | 406 |
resp = resp.forms[0].submit() |
394 | 407 |
assert 'Total number of records: 13' in resp.body |
408 |
assert '<h2>Filters</h2>' in resp.body |
|
409 |
assert '3rd field: aa' in resp.body |
|
395 | 410 | |
396 | 411 |
# set field to be displayed by default in filters |
397 | 412 |
formdef = FormDef.get_by_urlname('form-title') |
wcs/backoffice/management.py | ||
---|---|---|
682 | 682 |
if filter_field.id == 'start': |
683 | 683 |
period_start = time.strptime(filter_field_value, format_string) |
684 | 684 |
criterias.append(GreaterOrEqual('receipt_time', period_start)) |
685 |
criterias[-1]._label = '%s: %s' % (_('Start'), filter_field_value) |
|
685 | 686 |
elif filter_field.id == 'end': |
686 | 687 |
period_end = time.strptime(filter_field_value, format_string) |
687 | 688 |
criterias.append(LessOrEqual('receipt_time', period_end)) |
689 |
criterias[-1]._label = '%s: %s' % (_('End'), filter_field_value) |
|
688 | 690 |
elif filter_field.type == 'item' and filter_field_value not in (None, 'None'): |
689 | 691 |
criterias.append(Equal('f%s' % filter_field.id, filter_field_value)) |
692 |
field_options = filter_field.get_options() |
|
693 |
if field_options and type(field_options[0]) in (list, tuple): |
|
694 |
for option in field_options: |
|
695 |
if option[0] == filter_field_value or option[-1] == filter_field_value: |
|
696 |
filter_field_value = option[1] |
|
697 |
break |
|
698 |
criterias[-1]._label = '%s: %s' % (filter_field.label, filter_field_value) |
|
690 | 699 | |
691 | 700 |
return criterias |
692 | 701 | |
... | ... | |
1072 | 1081 |
if selected_filter == 'pending': |
1073 | 1082 |
applied_filters = ['wf-%s' % x.id for x in |
1074 | 1083 |
self.formdef.workflow.get_not_endpoint_status()] |
1084 |
criteria_label = _('Status: %s') % _('Pending') |
|
1075 | 1085 |
elif selected_filter == 'done': |
1076 | 1086 |
applied_filters = ['wf-%s' % x.id for x in |
1077 | 1087 |
self.formdef.workflow.get_endpoint_status()] |
1088 |
criteria_label = _('Status: %s') % _('Done') |
|
1078 | 1089 |
else: |
1090 |
criteria_label = _('Status: %s') % self.formdef.workflow.get_status( |
|
1091 |
selected_filter).name |
|
1079 | 1092 |
applied_filters = ['wf-%s' % selected_filter] |
1080 | 1093 |
criterias.append(Or([Equal('status', x) for x in applied_filters])) |
1094 |
criterias[-1]._label = criteria_label |
|
1081 | 1095 | |
1082 | 1096 |
values = self.formdef.data_class().select(criterias) |
1083 | 1097 |
if get_publisher().is_using_postgresql(): |
... | ... | |
1086 | 1100 |
self.formdef.data_class().load_all_evolutions(values) |
1087 | 1101 | |
1088 | 1102 |
r += htmltext('<div id="statistics">') |
1103 |
if criterias: |
|
1104 |
r += htmltext('<div class="criterias bo-block">') |
|
1105 |
r += htmltext('<h2>%s</h2>') % _('Filters') |
|
1106 |
r += htmltext('<ul>') |
|
1107 |
for criteria in criterias: |
|
1108 |
criteria_label = getattr(criteria, '_label', None) |
|
1109 |
if criteria_label: |
|
1110 |
r += htmltext('<li>%s</li>') % criteria_label |
|
1111 |
r += htmltext('</ul></div>') |
|
1089 | 1112 |
if do_graphs: |
1090 | 1113 |
r += htmltext('<div class="splitcontent-left">') |
1091 | 1114 |
wcs/qommon/static/css/dc2/admin.css | ||
---|---|---|
1133 | 1133 |
div.user-pending-forms span.status { |
1134 | 1134 |
font-size: 80%; |
1135 | 1135 |
} |
1136 | ||
1137 |
#statistics .criterias { |
|
1138 |
display: none; |
|
1139 |
} |
wcs/qommon/storage.py | ||
---|---|---|
127 | 127 |
return lambda x: value.intersection(set(getattr(x, self.attribute, []) or [])) |
128 | 128 | |
129 | 129 |
class Or(Criteria): |
130 |
def __init__(self, criterias): |
|
130 |
def __init__(self, criterias, **kwargs):
|
|
131 | 131 |
self.criterias = criterias |
132 | 132 | |
133 | 133 |
def build_lambda(self): |
... | ... | |
139 | 139 |
return func |
140 | 140 | |
141 | 141 |
class And(Criteria): |
142 |
def __init__(self, criterias): |
|
142 |
def __init__(self, criterias, **kwargs):
|
|
143 | 143 |
self.criterias = criterias |
144 | 144 | |
145 | 145 |
def build_lambda(self): |
wcs/sql.py | ||
---|---|---|
111 | 111 |
return {} |
112 | 112 | |
113 | 113 |
class Or(Criteria): |
114 |
def __init__(self, criterias): |
|
114 |
def __init__(self, criterias, **kwargs):
|
|
115 | 115 |
self.criterias = [] |
116 | 116 |
for element in criterias: |
117 | 117 |
sql_class = globals().get(element.__class__.__name__) |
... | ... | |
128 | 128 |
return d |
129 | 129 | |
130 | 130 |
class And(Criteria): |
131 |
def __init__(self, criterias): |
|
131 |
def __init__(self, criterias, **kwargs):
|
|
132 | 132 |
self.criterias = [] |
133 | 133 |
for element in criterias: |
134 | 134 |
sql_class = globals().get(element.__class__.__name__) |
135 |
- |