Refactor permissions handling to use sets

We didn’t like the nested conditional way of doing this. So this commit
refactors the way that permissions are set by:

- splitting it up into multiple, clearly named methods
- treating the list of permissions as `set`s, which they naturally are,
  because you can’t have duplicate permissions (this removes a lot of
  the complexity around having to test for membership before removing
  a permission, for example)
This commit is contained in:
Chris Hill-Scott
2017-09-27 11:58:37 +01:00
parent 9581a3bb77
commit 2f6cf3df38

View File

@@ -224,26 +224,36 @@ def service_switch_research_mode(service_id):
return redirect(url_for('.service_settings', service_id=service_id))
def switch_service_permissions(service_id, permission, sms_sender=None, force=None):
def switch_service_permissions(service_id, permission, sms_sender=None):
permissions = current_service['permissions'].copy()
force_service_permission(
service_id,
permission,
on=permission not in current_service['permissions'],
sms_sender=sms_sender
)
if force is None:
if permission in permissions:
permissions.remove(permission)
else:
permissions.append(permission)
else:
if force is True:
permissions.append(permission)
elif force is False and permission in permissions:
permissions.remove(permission)
current_service['permissions'] = list(set(permissions))
def force_service_permission(service_id, permission, on=False, sms_sender=None):
permissions, permission = set(current_service['permissions']), {permission}
update_service_permissions(
service_id,
permissions | permission if on else permissions - permission,
sms_sender=sms_sender
)
def update_service_permissions(service_id, permissions, sms_sender=None):
current_service['permissions'] = list(permissions)
data = {'permissions': current_service['permissions']}
data = {'permissions': permissions}
if sms_sender:
data['sms_sender'] = sms_sender
service_api_client.update_service_with_properties(service_id, data)
@@ -442,10 +452,10 @@ def service_set_international_sms(service_id):
enabled='on' if 'international_sms' in current_service['permissions'] else 'off'
)
if form.validate_on_submit():
switch_service_permissions(
force_service_permission(
service_id,
'international_sms',
force=False if form.enabled.data == 'off' else True,
on=(form.enabled.data == 'on'),
)
return redirect(
url_for(".service_settings", service_id=service_id)