Projet

Général

Profil

0001-backoffice-use-a-customisable-template-to-render-use.patch

Frédéric Péters, 15 mai 2020 10:24

Télécharger (9,39 ko)

Voir les différences:

Subject: [PATCH] backoffice: use a customisable template to render user info
 in sidebar (#40034)

 tests/test_admin_pages.py      | 37 ++++++++++++++++++++++------------
 tests/test_backoffice_pages.py | 26 ++++++++++++++++++++++++
 wcs/admin/settings.py          | 31 ++++++++++++++++++++++++----
 wcs/backoffice/management.py   | 12 ++++++++++-
 4 files changed, 88 insertions(+), 18 deletions(-)
tests/test_admin_pages.py
4654 4654
    resp = app.get('/backoffice/settings/users').follow().follow()
4655 4655

  
4656 4656
    # add a field
4657
    resp.forms[1]['label'] = 'foobar'
4658
    resp = resp.forms[1].submit()
4657
    resp.forms[2]['label'] = 'foobar'
4658
    resp = resp.forms[2].submit()
4659 4659
    assert resp.location == 'http://example.net/backoffice/settings/users/fields/'
4660 4660
    resp = resp.follow()
4661 4661
    assert b'foobar' in pub.cfg['users']['formdef']
4662 4662
    assert 'foobar' in resp.text
4663 4663

  
4664 4664
    # set field as email
4665
    resp.forms[0]['field_email'] = '1'
4666
    resp = resp.forms[0].submit()
4665
    resp.forms['mapping']['field_email'] = '1'
4666
    resp = resp.forms['mapping'].submit()
4667 4667
    assert resp.location == 'http://example.net/backoffice/settings/users/fields/'
4668 4668
    resp = resp.follow()
4669 4669
    assert pub.cfg['users']['field_email'] == '1'
4670 4670

  
4671 4671
    # and unset it
4672
    resp.forms[0]['field_email'] = ''
4673
    resp = resp.forms[0].submit()
4672
    resp.forms['mapping']['field_email'] = ''
4673
    resp = resp.forms['mapping'].submit()
4674 4674
    assert resp.location == 'http://example.net/backoffice/settings/users/fields/'
4675 4675
    resp = resp.follow()
4676 4676
    assert pub.cfg['users']['field_email'] == None
4677 4677

  
4678 4678
    # add a comment field
4679
    resp.forms[1]['label'] = 'barfoo'
4680
    resp.forms[1]['type'] = 'Comment'
4681
    resp = resp.forms[1].submit()
4679
    resp.forms[2]['label'] = 'barfoo'
4680
    resp.forms[2]['type'] = 'Comment'
4681
    resp = resp.forms[2].submit()
4682 4682
    assert resp.location == 'http://example.net/backoffice/settings/users/fields/'
4683 4683
    resp = resp.follow()
4684 4684
    assert b'barfoo' in pub.cfg['users']['formdef']
......
4687 4687
    # check fields are present in edit form
4688 4688
    resp = app.get('/backoffice/users/%s/edit' % user.id)
4689 4689
    assert 'barfoo' in resp.text
4690
    assert 'f1' in resp.forms[0].fields
4691
    assert 'email' in resp.forms[0].fields
4690
    assert 'f1' in resp.form.fields
4691
    assert 'email' in resp.form.fields
4692 4692

  
4693 4693
    # check the email field is not displayed if it's overridden by a custom
4694 4694
    # field.
4695 4695
    pub.cfg['users']['field_email'] = '1'
4696 4696
    pub.write_cfg()
4697 4697
    resp = app.get('/backoffice/users/%s/edit' % user.id)
4698
    assert 'f1' in resp.forms[0].fields
4699
    assert 'email' not in resp.forms[0].fields
4698
    assert 'f1' in resp.form.fields
4699
    assert 'email' not in resp.form.fields
4700

  
4701
    # set a sidebar template
4702
    app = login(get_app(pub))
4703
    resp = app.get('/backoffice/settings/users').follow().follow()
4704
    resp.forms['template']['sidebar_template'] = 'hello {{ form_user_display_name }}'
4705
    resp = resp.forms['template'].submit().follow()
4706
    assert pub.cfg['users']['sidebar_template'] == 'hello {{ form_user_display_name }}'
4707
    resp.forms['template']['sidebar_template'] = '{% if True %}'
4708
    resp = resp.forms['template'].submit().follow()
4709
    assert pub.cfg['users']['sidebar_template'] == 'hello {{ form_user_display_name }}'
4710
    assert 'syntax error in Django template' in resp
4700 4711

  
4701 4712
    # restore config
4702 4713
    pub.cfg['users']['field_email'] = None
tests/test_backoffice_pages.py
1868 1868
    assert 'by %s' % user.get_display_name() in resp.text
1869 1869

  
1870 1870

  
1871
def test_backoffice_sidebar_user_template(pub):
1872
    user = create_user(pub)
1873
    create_environment(pub)
1874
    form_class = FormDef.get_by_urlname('form-title').data_class()
1875
    number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0]
1876
    number31.user_id = user.id
1877
    number31.store()
1878
    app = login(get_app(pub))
1879
    resp = app.get('/backoffice/management/form-title/')
1880
    resp = resp.click(href='%s/' % number31.id)
1881
    assert 'Associated User' in resp.text
1882
    assert '<p>admin</p>' in resp.text
1883
    pub.cfg['users'] = {'sidebar_template': 'XXX{{ form_user_display_name }}YYY'}
1884
    pub.write_cfg()
1885
    resp = app.get(resp.request.url)
1886
    assert '<p>XXXadminYYY</p>' in resp.text
1887
    pub.cfg['users'] = {'sidebar_template': 'XXX<b>{{ form_user_display_name }}</b>YYY'}
1888
    pub.write_cfg()
1889
    resp = app.get(resp.request.url)
1890
    assert '<p>XXX<b>admin</b>YYY</p>' in resp.text
1891
    user.name = 'adm<i>n'
1892
    user.store()
1893
    resp = app.get(resp.request.url)
1894
    assert '<p>XXX<b>adm&lt;i&gt;n</b>YYY</p>' in resp.text
1895

  
1896

  
1871 1897
def test_backoffice_geolocation_info(pub):
1872 1898
    user = create_user(pub)
1873 1899
    create_environment(pub)
wcs/admin/settings.py
118 118

  
119 119

  
120 120
class UserFieldsDirectory(FieldsDirectory):
121
    _q_exports = ['', 'update_order', 'new', 'mapping']
121
    _q_exports = ['', 'update_order', 'new', 'mapping', 'template']
122 122

  
123 123
    section = 'settings'
124 124
    field_def_page_class = UserFieldDefPage
......
128 128

  
129 129
    def index_bottom(self):
130 130
        r = TemplateIO(html=True)
131
        r += get_session().display_message()
131 132
        r += htmltext('<div class="bo-block">')
132 133
        r += htmltext('<h2>%s</h2>') % _('Fields Mapping')
133 134
        r += htmltext('<p>%s</p>') % _('These settings make it possible to assign custom user fields to standard user fields.')
134
        form = self.mapping_form()
135
        r += form.render()
135
        r += self.mapping_form().render()
136
        r += htmltext('</div>')
137
        r += htmltext('<div class="bo-block">')
138
        r += htmltext('<h2>%s</h2>') % _('Sidebar Template')
139
        r += self.sidebar_template_form().render()
136 140
        r += htmltext('</div>')
137 141
        return r.getvalue()
138 142

  
......
141 145
        options = [(None, _('None'), '')] + [
142 146
                (x.id, x.label, x.id) for x in self.objectdef.fields]
143 147

  
144
        form = Form(action = 'mapping', enctype='multipart/form-data')
148
        form = Form(action='mapping', id='mapping')
145 149
        field_name_value = users_cfg.get('field_name')
146 150
        if type(field_name_value) is str:
147 151
            field_name_value = [field_name_value]
......
161 165
        cfg_submit(form, 'users', ['field_name', 'field_email'])
162 166
        return redirect('.')
163 167

  
168
    def sidebar_template_form(self):
169
        users_cfg = get_cfg('users', {})
170
        form = Form(action='template', id='template')
171
        form.add(TextWidget, 'sidebar_template',
172
                value=users_cfg.get('sidebar_template') or '{{ form_user_display_name }}',
173
                required=False,
174
                validation_function=ComputedExpressionWidget.validate_template,
175
                rows=4)
176
        form.add_submit('submit', _('Submit'))
177
        return form
178

  
179
    def template(self):
180
        form = self.sidebar_template_form()
181
        if form.has_errors():
182
            get_session().message = ('error', form.get_widget('sidebar_template').get_error())
183
            return redirect('.')
184
        cfg_submit(form, 'users', ['sidebar_template'])
185
        return redirect('.')
186

  
164 187

  
165 188
class UserFieldsFormDef(FormDef):
166 189
    '''Class to handle custom user fields, it loads and saves from/to
wcs/backoffice/management.py
53 53
from ..qommon.form import *
54 54
from ..qommon.storage import (Equal, NotEqual, LessOrEqual, GreaterOrEqual, Or,
55 55
        Intersects, ILike, FtsMatch, Contains, Null, NotNull)
56
from ..qommon.template import Template
56 57

  
57 58
from wcs.api_utils import get_user_from_api_query_string
58 59
from wcs.carddef import CardDef
......
2625 2626
        if formdata.user_id and formdata.get_user():
2626 2627
            r += htmltext('<div class="extra-context">')
2627 2628
            r += htmltext('<h3>%s</h3>') % _('Associated User')
2628
            r += htmltext('<p>%s</p>') % formdata.get_user().display_name
2629
            users_cfg = get_cfg('users', {})
2630
            sidebar_user_template = users_cfg.get('sidebar_template')
2631
            if sidebar_user_template:
2632
                variables = get_publisher().substitutions.get_context_variables(mode='lazy')
2633
                sidebar_user = Template(sidebar_user_template).render(variables)
2634
                if not sidebar_user.startswith('<'):
2635
                    sidebar_user = htmltext('<p>%s</p>' % sidebar_user)
2636
                r += sidebar_user
2637
            else:
2638
                r += htmltext('<p>%s</p>') % formdata.get_user().display_name
2629 2639
            r += htmltext('</div>')
2630 2640

  
2631 2641
        if formdata.formdef.geolocations and formdata.geolocations:
2632
-