misc: allow duplicated role names (#8373)

This doesn't let the user create such roles as the result will always be
confusing lists but at least it won't crash if an external process creates
such roles.
This commit is contained in:
Frédéric Péters 2015-09-25 14:44:33 +02:00
parent e38e9be0ac
commit 31510a0f65
10 changed files with 32 additions and 25 deletions

View File

@ -443,7 +443,7 @@ def test_form_workflow_remapping(pub):
def test_form_workflow_role(pub):
create_superuser(pub)
create_role()
role = create_role()
FormDef.wipe()
formdef = FormDef()
@ -458,10 +458,16 @@ def test_form_workflow_role(pub):
resp = app.get('/backoffice/forms/1/')
resp = resp.click(href='role/_receiver')
resp.forms[0]['role_id'] = 'foobar'
resp.forms[0]['role_id'] = role.id
resp = resp.forms[0].submit('submit')
assert FormDef.get(1).workflow_roles == {'_receiver': '1'}
# check it doesn't fail if a second role with the same name exists
role = Role(name='foobar')
role.store()
resp = app.get('/backoffice/forms/1/')
resp = resp.click(href='role/_receiver')
def test_form_workflow_options(pub):
create_superuser(pub)
create_role()
@ -542,7 +548,7 @@ def test_form_roles(pub):
resp = app.get('/backoffice/forms/1/')
resp = resp.click('User Roles')
resp.forms[0]['roles$element0'].value = role.name
resp.forms[0]['roles$element0'].value = role.id
resp = resp.forms[0].submit('submit')
assert FormDef.get(1).roles == [role.id]
@ -915,12 +921,12 @@ def test_form_legacy_int_id(pub):
resp = app.get('/backoffice/forms/1/')
resp = resp.click('User Roles')
assert resp.forms[0]['roles$element0'].value == 'Logged Users'
assert resp.forms[0]['roles$element1'].value == 'ZAB'
assert resp.forms[0]['roles$element0'].value == 'logged-users'
assert resp.forms[0]['roles$element1'].value == role.id
resp = app.get('/backoffice/forms/1/')
resp = resp.click('Recipient')
assert resp.forms[0]['role_id'].value == 'ZAB'
assert resp.forms[0]['role_id'].value == role.id
def test_form_anonymise(pub):
create_superuser(pub)

View File

@ -568,9 +568,10 @@ class FormDefPage(Directory):
def _roles_selection(self, title, attribute, description=None,
include_logged_users_role=True):
form = Form(enctype='multipart/form-data')
options = [(None, '---')]
options = [(None, '---', None)]
if include_logged_users_role:
options.append((logged_users_role().id, logged_users_role().name))
options.append((logged_users_role().id,
logged_users_role().name, logged_users_role().id))
options += get_user_roles()
form.add(WidgetList, 'roles', element_type=SingleSelectWidget,
value=getattr(self.formdef, attribute),

View File

@ -87,6 +87,6 @@ def logged_users_role():
def get_user_roles():
t = sorted([(qommon.misc.simplify(x.name), x.id, x.name) for x in Role.select()])
t = sorted([(qommon.misc.simplify(x.name), x.id, x.name, x.id) for x in Role.select()])
return [x[1:] for x in t]

View File

@ -43,7 +43,7 @@ class AggregationEmailWorkflowStatusItem(WorkflowStatusItem):
value = self.to,
add_element_label = _('Add Role'),
element_kwargs = {'render_br': False,
'options': [(None, '---')] +
'options': [(None, '---', None)] +
self.get_list_of_roles(include_logged_in_users=False)})
def get_parameters(self):

View File

@ -115,7 +115,7 @@ class AddAttachmentWorkflowStatusItem(WorkflowStatusItem):
value = self.by,
add_element_label = _('Add Role'),
element_kwargs={'render_br': False,
'options': [(None, '---')] + self.get_list_of_roles()})
'options': [(None, '---', None)] + self.get_list_of_roles()})
if 'required' in parameters:
form.add(CheckboxWidget, '%srequired' % prefix, title = _('Required'), value = self.required)
if 'title' in parameters:

View File

@ -46,7 +46,7 @@ class DispatchWorkflowStatusItem(WorkflowStatusItem):
if 'role_id' in parameters:
form.add(SingleSelectWidget, '%srole_id' % prefix,
title=_('Value for role'), value=str(self.role_id),
options=[(None, '----')] + get_user_roles())
options=[(None, '----', None)] + get_user_roles())
def perform(self, formdata):
if not (self.role_id and self.role_key):

View File

@ -80,7 +80,7 @@ class FormWorkflowStatusItem(WorkflowStatusItem):
value = self.by,
add_element_label = _('Add Role'),
element_kwargs = {'render_br': False,
'options': [(None, '---')] +
'options': [(None, '---', None)] +
self.get_list_of_roles(include_logged_in_users=False)})
if 'varname' in parameters:
form.add(VarnameWidget, '%svarname' % prefix, required=True,

View File

@ -157,7 +157,7 @@ class JumpWorkflowStatusItem(WorkflowStatusJumpItem):
value=self.by,
add_element_label=_('Add Role'),
element_kwargs={'render_br': False,
'options': [(None, '---')] +
'options': [(None, '---', None)] +
self.get_list_of_roles(include_logged_in_users=False)})
if 'timeout' in parameters:
_hint = htmltext(_("ex.: 7 days 1 minute<br/> Usable units of time: %(variables)s. " \

View File

@ -32,7 +32,7 @@ class AddRoleWorkflowStatusItem(WorkflowStatusItem):
if 'role_id' in parameters:
form.add(SingleSelectWidget, '%srole_id' % prefix,
title=_('Role to Add'), value=str(self.role_id),
options=[(None, '----')] + get_user_roles())
options=[(None, '----', None)] + get_user_roles())
def role_id_export_to_xml(self, item, charset, include_id=False):
self._role_export_to_xml('role_id', item, charset,
@ -76,7 +76,7 @@ class RemoveRoleWorkflowStatusItem(WorkflowStatusItem):
if 'role_id' in parameters:
form.add(SingleSelectWidget, '%srole_id' % prefix,
title=_('Role to Remove'), value=self.role_id,
options=[(None, '----')] + get_user_roles())
options=[(None, '----', None)] + get_user_roles())
def perform(self, formdata):
if not self.role_id:

View File

@ -393,13 +393,13 @@ class Workflow(StorableObject):
def get_list_of_roles(self, include_logged_in_users=True):
t = []
t.append(('_submitter', C_('role|User')))
t.append(('_submitter', C_('role|User'), '_submitter'))
for workflow_role in self.roles.items():
t.append(workflow_role)
t.append(list(workflow_role) + [workflow_role[0]])
if include_logged_in_users:
t.append((logged_users_role().id, logged_users_role().name))
t.append((logged_users_role().id, logged_users_role().name, logged_users_role().id))
if get_user_roles():
t.append((None, '----'))
t.append((None, '----', None))
t.extend(get_user_roles())
return t
@ -1174,7 +1174,7 @@ class CommentableWorkflowStatusItem(WorkflowStatusItem):
value=self.by,
add_element_label=_('Add Role'),
element_kwargs={'render_br': False,
'options': [(None, '---')] + self.get_list_of_roles()})
'options': [(None, '---', None)] + self.get_list_of_roles()})
if 'varname' in parameters:
form.add(VarnameWidget, '%svarname' % prefix,
title=_('Variable Name'), value=self.varname,
@ -1255,7 +1255,7 @@ class ChoiceWorkflowStatusItem(WorkflowStatusJumpItem):
value = self.by,
add_element_label = _('Add Role'),
element_kwargs={'render_br': False,
'options': [(None, '---')] + self.get_list_of_roles()})
'options': [(None, '---', None)] + self.get_list_of_roles()})
if 'backoffice_info_text' in parameters:
form.add(WysiwygTextWidget, '%sbackoffice_info_text' % prefix,
title=_('Information Text for Backoffice'),
@ -1321,7 +1321,7 @@ class SendmailWorkflowStatusItem(WorkflowStatusItem):
value=self.to,
add_element_label=_('Add Role'),
element_kwargs={'render_br': False,
'options': [(None, '---')] +
'options': [(None, '---', None)] +
self.get_list_of_roles(include_logged_in_users=False)})
if 'subject' in parameters:
form.add(StringWidget, '%ssubject' % prefix, title=_('Subject'),
@ -1595,7 +1595,7 @@ class EditableWorkflowStatusItem(WorkflowStatusItem):
value = self.by,
add_element_label = _('Add Role'),
element_kwargs={'render_br': False,
'options': [(None, '---')] + self.get_list_of_roles()})
'options': [(None, '---', None)] + self.get_list_of_roles()})
if 'status' in parameters:
# XXX: look into this one, as None is a perfectly valid value, and
# it would put this question in the 'workflow options' part.
@ -1716,7 +1716,7 @@ class ExportToModel(WorkflowStatusItem):
value = self.by,
add_element_label = _('Add Role'),
element_kwargs={'render_br': False,
'options': [(None, '---')] + self.get_list_of_roles()})
'options': [(None, '---', None)] + self.get_list_of_roles()})
if 'attach_to_history' in parameters:
form.add(CheckboxWidget, '%sattach_to_history' % prefix,
title=_('Attach generated file to the form history'),