Projet

Général

Profil

0001-backoffice-display-applied-filters-in-PDF-output-891.patch

Frédéric Péters, 08 novembre 2015 17:01

Télécharger (8,88 ko)

Voir les différences:

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