0001-backoffice-use-a-customisable-template-to-render-use.patch
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<i>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 |
- |