From 720feaa9de35b3ca29366c8663cc4d1cad8a5fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 8 Nov 2015 17:00:05 +0100 Subject: [PATCH] backoffice: display applied filters in PDF output (#8916) --- data/print-html-as-pdf.js | 4 ++++ tests/test_backoffice_pages.py | 15 +++++++++++++++ wcs/backoffice/management.py | 23 +++++++++++++++++++++++ wcs/qommon/static/css/dc2/admin.css | 4 ++++ wcs/qommon/storage.py | 4 ++-- wcs/sql.py | 4 ++-- 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/data/print-html-as-pdf.js b/data/print-html-as-pdf.js index 71b3491..7f7e95e 100644 --- a/data/print-html-as-pdf.js +++ b/data/print-html-as-pdf.js @@ -16,6 +16,10 @@ page.open(system.args[1], function() { $('html').css('background', 'white').css('font-size', '8pt'); $('div#main').css('width', '95%'); $('div#main-content').css('width', '95%').css('border', 'none'); + $('#statistics .criterias').css('display', 'block'); + $('div#main-content > h2').css({ + 'border-bottom': '1px solid #666', + 'font-weight': 'bold'}); }); page.render(system.args[1] + '.pdf'); phantom.exit(); diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index 9f111bf..f0768aa 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -322,10 +322,13 @@ def test_backoffice_statistics(pub): assert 'Resolution time' in resp.body assert 'To Status "New"' in resp.body assert 'To Status "Finished"' in resp.body + assert not '

Filters

' in resp.body resp.forms[0]['filter-end-value'] = '2013-01-01' resp = resp.forms[0].submit() assert 'Total number of records: 0' in resp.body + assert '

Filters

' in resp.body + assert 'End: 2013-01-01' in resp.body def test_backoffice_statistics_status_filter(pub): create_superuser(pub) @@ -334,24 +337,32 @@ def test_backoffice_statistics_status_filter(pub): resp = app.get('/backoffice/management/form-title/') resp = resp.click('Statistics') assert 'filter' not in resp.forms[0].fields # status is not displayed by default + assert not '

Filters

' in resp.body # add 'status' as a filter resp.forms[0]['filter-status'].checked = True resp = resp.forms[0].submit() assert 'filter' in resp.forms[0].fields + assert not '

Filters

' in resp.body assert resp.forms[0]['filter'].value == 'all' resp.forms[0]['filter'].value = 'pending' resp = resp.forms[0].submit() assert 'Total number of records: 17' in resp.body + assert '

Filters

' in resp.body + assert 'Status: Pending' in resp.body resp.forms[0]['filter'].value = 'done' resp = resp.forms[0].submit() assert 'Total number of records: 33' in resp.body + assert '

Filters

' in resp.body + assert 'Status: Done' in resp.body resp.forms[0]['filter'].value = 'rejected' resp = resp.forms[0].submit() assert 'Total number of records: 0' in resp.body + assert '

Filters

' in resp.body + assert 'Status: Rejected' in resp.body resp.forms[0]['filter'].value = 'all' resp = resp.forms[0].submit() @@ -378,6 +389,8 @@ def test_backoffice_statistics_status_select(pub): resp.forms[0]['filter-2-value'].value = 'foo' resp = resp.forms[0].submit() assert 'Total number of records: 13' in resp.body + assert '

Filters

' in resp.body + assert '2nd field: foo' in resp.body # check it's also possible to get back to the complete list resp.forms[0]['filter-2-value'].value = '' @@ -392,6 +405,8 @@ def test_backoffice_statistics_status_select(pub): resp.forms[0]['filter-3-value'].value = 'A' resp = resp.forms[0].submit() assert 'Total number of records: 13' in resp.body + assert '

Filters

' in resp.body + assert '3rd field: aa' in resp.body # set field to be displayed by default in filters formdef = FormDef.get_by_urlname('form-title') diff --git a/wcs/backoffice/management.py b/wcs/backoffice/management.py index 84bfbbc..c8e919a 100644 --- a/wcs/backoffice/management.py +++ b/wcs/backoffice/management.py @@ -682,11 +682,20 @@ class FormPage(Directory): if filter_field.id == 'start': period_start = time.strptime(filter_field_value, format_string) criterias.append(GreaterOrEqual('receipt_time', period_start)) + criterias[-1]._label = '%s: %s' % (_('Start'), filter_field_value) elif filter_field.id == 'end': period_end = time.strptime(filter_field_value, format_string) criterias.append(LessOrEqual('receipt_time', period_end)) + criterias[-1]._label = '%s: %s' % (_('End'), filter_field_value) elif filter_field.type == 'item' and filter_field_value not in (None, 'None'): criterias.append(Equal('f%s' % filter_field.id, filter_field_value)) + field_options = filter_field.get_options() + if field_options and type(field_options[0]) in (list, tuple): + for option in field_options: + if option[0] == filter_field_value or option[-1] == filter_field_value: + filter_field_value = option[1] + break + criterias[-1]._label = '%s: %s' % (filter_field.label, filter_field_value) return criterias @@ -1072,12 +1081,17 @@ class FormPage(Directory): if selected_filter == 'pending': applied_filters = ['wf-%s' % x.id for x in self.formdef.workflow.get_not_endpoint_status()] + criteria_label = _('Status: %s') % _('Pending') elif selected_filter == 'done': applied_filters = ['wf-%s' % x.id for x in self.formdef.workflow.get_endpoint_status()] + criteria_label = _('Status: %s') % _('Done') else: + criteria_label = _('Status: %s') % self.formdef.workflow.get_status( + selected_filter).name applied_filters = ['wf-%s' % selected_filter] criterias.append(Or([Equal('status', x) for x in applied_filters])) + criterias[-1]._label = criteria_label values = self.formdef.data_class().select(criterias) if get_publisher().is_using_postgresql(): @@ -1086,6 +1100,15 @@ class FormPage(Directory): self.formdef.data_class().load_all_evolutions(values) r += htmltext('
') + if criterias: + r += htmltext('
') + r += htmltext('

%s

') % _('Filters') + r += htmltext('
    ') + for criteria in criterias: + criteria_label = getattr(criteria, '_label', None) + if criteria_label: + r += htmltext('
  • %s
  • ') % criteria_label + r += htmltext('
') if do_graphs: r += htmltext('
') diff --git a/wcs/qommon/static/css/dc2/admin.css b/wcs/qommon/static/css/dc2/admin.css index c2712e8..ec3272f 100644 --- a/wcs/qommon/static/css/dc2/admin.css +++ b/wcs/qommon/static/css/dc2/admin.css @@ -1133,3 +1133,7 @@ div.user-pending-forms span.datetime, div.user-pending-forms span.status { font-size: 80%; } + +#statistics .criterias { + display: none; +} diff --git a/wcs/qommon/storage.py b/wcs/qommon/storage.py index 878d1f1..244dc6b 100644 --- a/wcs/qommon/storage.py +++ b/wcs/qommon/storage.py @@ -127,7 +127,7 @@ class Intersects(Criteria): return lambda x: value.intersection(set(getattr(x, self.attribute, []) or [])) class Or(Criteria): - def __init__(self, criterias): + def __init__(self, criterias, **kwargs): self.criterias = criterias def build_lambda(self): @@ -139,7 +139,7 @@ class Or(Criteria): return func class And(Criteria): - def __init__(self, criterias): + def __init__(self, criterias, **kwargs): self.criterias = criterias def build_lambda(self): diff --git a/wcs/sql.py b/wcs/sql.py index 9556126..8d30e0d 100644 --- a/wcs/sql.py +++ b/wcs/sql.py @@ -111,7 +111,7 @@ class NotNull(Criteria): return {} class Or(Criteria): - def __init__(self, criterias): + def __init__(self, criterias, **kwargs): self.criterias = [] for element in criterias: sql_class = globals().get(element.__class__.__name__) @@ -128,7 +128,7 @@ class Or(Criteria): return d class And(Criteria): - def __init__(self, criterias): + def __init__(self, criterias, **kwargs): self.criterias = [] for element in criterias: sql_class = globals().get(element.__class__.__name__) -- 2.6.2