0001-backoffice-list-almost-all-formdata-in-360-user-view.patch
tests/test_backoffice_pages.py | ||
---|---|---|
1434 | 1434 |
resp = app.get('/backoffice/management/users/%s/' % user.id) |
1435 | 1435 |
for item in to_match: |
1436 | 1436 |
assert item in resp.body |
1437 |
count_li = resp.body.count('<li') |
|
1438 | ||
1439 |
# check list items are displayed, without links, if we cannot view them. |
|
1440 |
formdef = FormDef.get_by_urlname('form-title') |
|
1441 |
formdef.workflow_roles['_receiver'] = 'XXX' |
|
1442 |
formdef.store() |
|
1443 |
formdef.data_class().rebuild_security() |
|
1444 | ||
1445 |
resp = app.get('/backoffice/management/users/%s/' % user.id) |
|
1446 |
for item in to_match: |
|
1447 |
assert not item in resp.body # not linked |
|
1448 |
assert resp.body.count('<li') == count_li |
|
1449 | ||
1450 |
# mark formdef so it's not listed in 360 view |
|
1451 |
formdef.skip_from_360_view = True |
|
1452 |
formdef.store() |
|
1453 | ||
1454 |
# check formdatas are no longer part of the page |
|
1455 |
resp = app.get('/backoffice/management/users/%s/' % user.id) |
|
1456 |
assert resp.body.count('<li') == (count_li - 2) |
|
1437 | 1457 | |
1438 | 1458 |
def test_360_user_view_tracking_code(pub): |
1439 | 1459 |
if not pub.is_using_postgresql(): |
wcs/admin/forms.py | ||
---|---|---|
134 | 134 |
class OptionsDirectory(Directory): |
135 | 135 |
_q_exports = ['confirmation', 'private_status', 'only_allow_one', |
136 | 136 |
'always_advertise', 'tracking_code', 'online_status', 'captcha', |
137 |
'description', 'keywords', 'category'] |
|
137 |
'description', 'keywords', 'category', ('360_view', 'p_360_view')]
|
|
138 | 138 | |
139 | 139 |
def __init__(self, formdef): |
140 | 140 |
self.formdef = formdef |
... | ... | |
181 | 181 |
value=self.formdef.has_captcha) |
182 | 182 |
return self.handle(form, _('CAPTCHA')) |
183 | 183 | |
184 |
def p_360_view(self): |
|
185 |
form = Form(enctype='multipart/form-data') |
|
186 |
form.add(CheckboxWidget, 'skip_from_360_view', |
|
187 |
title=_('Skip from 360 view'), |
|
188 |
value=self.formdef.skip_from_360_view) |
|
189 |
return self.handle(form, _('Skip from 360 view')) |
|
190 | ||
184 | 191 |
def online_status(self): |
185 | 192 |
form = Form(enctype='multipart/form-data') |
186 | 193 |
form.add(CheckboxWidget, 'disabled', |
... | ... | |
232 | 239 |
'enable_tracking_codes', 'private_status_and_history', |
233 | 240 |
'always_advertise', 'disabled_redirection', |
234 | 241 |
'publication_date', 'expiration_date', 'has_captcha', |
235 |
'description', 'keywords', 'category_id'] |
|
242 |
'description', 'keywords', 'category_id', |
|
243 |
'skip_from_360_view'] |
|
236 | 244 |
for f in attrs: |
237 | 245 |
widget = form.get_widget(f) |
238 | 246 |
if widget: |
... | ... | |
440 | 448 |
self.formdef.always_advertise and |
441 | 449 |
C_('display to unlogged|Enabled') or C_('display to unlogged|Disabled')) |
442 | 450 | |
451 |
r += add_option_line('options/360_view', |
|
452 |
_('Skip from 360 view'), |
|
453 |
self.formdef.skip_from_360_view and |
|
454 |
C_('skip from 360 view|Enabled') or C_('skip from 360 view|Disabled')) |
|
455 | ||
443 | 456 |
r += add_option_line('options/tracking_code', |
444 | 457 |
_('Tracking Code'), |
445 | 458 |
self.formdef.enable_tracking_codes and |
wcs/backoffice/management.py | ||
---|---|---|
42 | 42 |
from qommon.form import * |
43 | 43 |
from qommon.sms import SMS |
44 | 44 |
from qommon.storage import (Equal, NotEqual, LessOrEqual, GreaterOrEqual, Or, |
45 |
Intersects, ILike, FtsMatch) |
|
45 |
Intersects, ILike, FtsMatch, Contains)
|
|
46 | 46 | |
47 | 47 |
from wcs.forms.backoffice import FormDefUI |
48 | 48 |
from wcs.forms.common import FormStatusPage |
... | ... | |
158 | 158 |
get_response().breadcrumb.append(('%s/' % self.user.id, self.user.display_name)) |
159 | 159 |
html_top('management', _('Management')) |
160 | 160 |
# display list of open formdata for the user |
161 |
user_roles = [logged_users_role().id] + (get_request().user.roles or []) |
|
161 |
formdefs = [x for x in FormDef.select() if not x.skip_from_360_view] |
|
162 |
user_roles = set([logged_users_role().id] + (get_request().user.roles or [])) |
|
162 | 163 |
criterias = [Equal('is_at_endpoint', False), |
163 | 164 |
Equal('user_id', str(self.user.id)), |
164 |
Intersects('concerned_roles_array', user_roles),
|
|
165 |
Contains('formdef_id', [x.id for x in formdefs]),
|
|
165 | 166 |
] |
166 | 167 |
from wcs import sql |
167 | 168 |
formdatas = sql.AnyFormData.select(criterias, order_by='receipt_time') |
168 | 169 | |
170 |
criterias = [Equal('is_at_endpoint', False), |
|
171 |
Equal('user_id', str(self.user.id)), |
|
172 |
Intersects('concerned_roles_array', user_roles), |
|
173 |
] |
|
174 |
viewable_formdatas = sql.AnyFormData.select(criterias) |
|
175 |
viewable_formdatas_ids = {} |
|
176 |
for viewable_formdata in viewable_formdatas: |
|
177 |
viewable_formdatas_ids[(viewable_formdata.formdef.id, viewable_formdata.id)] = True |
|
178 | ||
169 | 179 |
r = TemplateIO(html=True) |
170 | 180 |
r += get_session().display_message() |
171 | 181 | |
... | ... | |
209 | 219 |
cat_formdatas = formdata_by_category[cat.id] |
210 | 220 |
else: |
211 | 221 |
cat_formdatas = formdatas |
212 |
r += htmltext('<ul class="biglist">') |
|
222 |
r += htmltext('<ul class="biglist c-360-user-view">')
|
|
213 | 223 |
for formdata in cat_formdatas: |
214 | 224 |
status = formdata.get_status() |
215 | 225 |
if status: |
... | ... | |
218 | 228 |
status_label = _('Unknown') |
219 | 229 |
submit_date = misc.strftime.strftime( |
220 | 230 |
misc.date_format(), formdata.receipt_time) |
221 |
r += htmltext('<li><a href="%s">%s, ' |
|
222 |
'<span class="datetime">%s</span> ' |
|
223 |
'<span class="status">(%s)</span></a>' % ( |
|
224 |
formdata.get_url(backoffice=True), |
|
225 |
formdata.formdef.name, |
|
226 |
submit_date, status_label)) |
|
231 |
formdata_key_id = (formdata.formdef.id, formdata.id) |
|
232 |
if formdata_key_id in viewable_formdatas_ids: |
|
233 |
r += htmltext('<li><a href="%s">%s, ' |
|
234 |
'<span class="datetime">%s</span> ' |
|
235 |
'<span class="status">(%s)</span></a>' % ( |
|
236 |
formdata.get_url(backoffice=True), |
|
237 |
formdata.formdef.name, |
|
238 |
submit_date, status_label)) |
|
239 |
else: |
|
240 |
r += htmltext('<li><span>%s, ' |
|
241 |
'<span class="datetime">%s</span> ' |
|
242 |
'<span class="status">(%s)</span></span>' % ( |
|
243 |
formdata.formdef.name, |
|
244 |
submit_date, status_label)) |
|
227 | 245 |
if formdata.formdef.enable_tracking_codes: |
228 | 246 |
r += htmltext('<p class="commands">') |
229 | 247 |
r += command_icon('sendcode/%s/%s' % |
wcs/formdef.py | ||
---|---|---|
85 | 85 |
publication_date = None |
86 | 86 |
expiration_date = None |
87 | 87 |
has_captcha = False |
88 | ||
88 |
skip_from_360_view = False |
|
89 | 89 |
private_status_and_history = False |
90 | 90 | |
91 | 91 |
last_modification_time = None |
... | ... | |
100 | 100 |
BOOLEAN_ATTRIBUTES = ['discussion', 'detailed_emails', 'disabled', |
101 | 101 |
'only_allow_one', 'enable_tracking_codes', |
102 | 102 |
'always_advertise', 'private_status_and_history', |
103 |
'has_captcha'] |
|
103 |
'has_captcha', 'skip_from_360_view']
|
|
104 | 104 | |
105 | 105 |
def migrate(self): |
106 | 106 |
changed = False |
wcs/qommon/static/css/dc2/admin.css | ||
---|---|---|
1166 | 1166 |
ul.apps { |
1167 | 1167 |
margin-left: 1em; |
1168 | 1168 |
} |
1169 | ||
1170 |
.c-360-user-view li > span { |
|
1171 |
padding-left: 1ex; |
|
1172 |
} |
|
1169 |
- |