Move service permission handle inside the model

These helper functions for modifying a service permission were just
floating around loose in the view code.

A much better home for them is on the model. This will also make it
easy to reuse them in other views if we ever need to.
This commit is contained in:
Chris Hill-Scott
2018-11-05 16:53:03 +00:00
parent a69551b2cb
commit 318f846630
3 changed files with 40 additions and 45 deletions

View File

@@ -227,42 +227,11 @@ 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_service_permission(
service_id,
permission,
on=permission not in current_service.permissions,
sms_sender=sms_sender
)
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):
data = {'permissions': list(permissions)}
if sms_sender:
data['sms_sender'] = sms_sender
current_service.update_with_properties(data)
@main.route("/services/<service_id>/service-settings/can-send-email")
@login_required
@user_is_platform_admin
def service_switch_can_send_email(service_id):
switch_service_permissions(service_id, 'email')
current_service.switch_permission('email')
return redirect(url_for('.service_settings', service_id=service_id))
@@ -270,7 +239,7 @@ def service_switch_can_send_email(service_id):
@login_required
@user_is_platform_admin
def service_switch_can_send_sms(service_id):
switch_service_permissions(service_id, 'sms')
current_service.switch_permission('sms')
return redirect(url_for('.service_settings', service_id=service_id))
@@ -278,7 +247,7 @@ def service_switch_can_send_sms(service_id):
@login_required
@user_is_platform_admin
def service_switch_email_auth(service_id):
switch_service_permissions(service_id, 'email_auth')
current_service.switch_permission('email_auth')
return redirect(url_for('.service_settings', service_id=service_id))
@@ -286,7 +255,7 @@ def service_switch_email_auth(service_id):
@login_required
@user_is_platform_admin
def service_switch_can_send_precompiled_letter(service_id):
switch_service_permissions(service_id, 'precompiled_letter')
current_service.switch_permission('precompiled_letter')
return redirect(url_for('.service_settings', service_id=service_id))
@@ -299,7 +268,7 @@ def service_switch_can_upload_document(service_id):
# If turning the permission off, or turning it on and the service already has a contact_link,
# don't show the form to add the link
if current_service.has_permission('upload_document') or current_service.contact_link:
switch_service_permissions(service_id, 'upload_document')
current_service.switch_permission('upload_document')
return redirect(url_for('.service_settings', service_id=service_id))
if form.validate_on_submit():
@@ -308,7 +277,7 @@ def service_switch_can_upload_document(service_id):
current_service.update(
contact_link=form.data[contact_type]
)
switch_service_permissions(service_id, 'upload_document')
current_service.switch_permission('upload_document')
return redirect(url_for('.service_settings', service_id=service_id))
return render_template('views/service-settings/contact_link.html', form=form)
@@ -318,7 +287,7 @@ def service_switch_can_upload_document(service_id):
@login_required
@user_is_platform_admin
def service_switch_can_edit_folders(service_id):
switch_service_permissions(service_id, 'edit_folders')
current_service.switch_permission('edit_folders')
return redirect(url_for('.service_settings', service_id=service_id))
@@ -490,7 +459,7 @@ def service_set_inbound_number(service_id):
is_default=True,
inbound_number_id=form.inbound_number.data
)
switch_service_permissions(current_service.id, 'inbound_sms')
current_service.force_permission('inbound_sms', on=True)
return redirect(url_for('.service_settings', service_id=service_id))
return render_template(
'views/service-settings/set-inbound-number.html',
@@ -539,8 +508,7 @@ def service_set_international_sms(service_id):
enabled='on' if current_service.has_permission('international_sms') else 'off'
)
if form.validate_on_submit():
force_service_permission(
service_id,
current_service.force_permission(
'international_sms',
on=(form.enabled.data == 'on'),
)
@@ -570,8 +538,7 @@ def service_set_letters(service_id):
enabled='on' if current_service.has_permission('letter') else 'off'
)
if form.validate_on_submit():
force_service_permission(
service_id,
current_service.force_permission(
'letter',
on=(form.enabled.data == 'on'),
)

View File

@@ -53,6 +53,31 @@ class Service():
def update_with_properties(self, properties):
return service_api_client.update_service_with_properties(self.id, properties)
def switch_permission(self, permission, sms_sender=None):
return self.force_permission(
permission,
on=not self.has_permission(permission),
sms_sender=sms_sender
)
def force_permission(self, permission, on=False, sms_sender=None):
permissions, permission = set(self.permissions), {permission}
return self.update_permissions(
permissions | permission if on else permissions - permission,
sms_sender=sms_sender
)
def update_permissions(self, permissions, sms_sender=None):
data = {'permissions': list(permissions)}
if sms_sender:
data['sms_sender'] = sms_sender
self.update_with_properties(data)
@property
def trial_mode(self):
return self._dict['restricted']

View File

@@ -1170,7 +1170,10 @@ def test_enabling_and_disabling_email_and_sms(
mock_get_inbound_number_for_service
):
service_one['permissions'] = permissions_before_switch
mocked_fn = mocker.patch('app.service_api_client.update_service_with_properties', return_value=service_one)
mocked_fn = mocker.patch(
'app.notify_client.service_api_client.service_api_client.update_service',
return_value=service_one,
)
response = logged_in_platform_admin_client.get(
url_for('main.service_switch_can_send_{}'.format(notification_type), service_id=service_one['id'])
@@ -1178,7 +1181,7 @@ def test_enabling_and_disabling_email_and_sms(
assert response.status_code == 302
assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True)
assert mocked_fn.call_args == call(service_one['id'], {'permissions': permissions_after_switch})
assert mocked_fn.call_args == call(service_one['id'], permissions=permissions_after_switch)
def test_and_more_hint_appears_on_settings_with_more_than_just_a_single_sender(