diff --git a/app/__init__.py b/app/__init__.py index 7e0f9229b..f39d4eaae 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -40,66 +40,46 @@ from werkzeug.local import LocalProxy from app import proxy_fix from app.config import configs -from app.asset_fingerprinter import AssetFingerprinter -from app.notify_client.models import Service +from app.asset_fingerprinter import asset_fingerprinter +from app.models.service import Service +from app.models.user import AnonymousUser from app.navigation import ( CaseworkNavigation, HeaderNavigation, MainNavigation, OrgNavigation ) -from app.notify_client.service_api_client import ServiceAPIClient -from app.notify_client.api_key_api_client import ApiKeyApiClient -from app.notify_client.invite_api_client import InviteApiClient -from app.notify_client.job_api_client import JobApiClient -from app.notify_client.notification_api_client import NotificationApiClient -from app.notify_client.status_api_client import StatusApiClient -from app.notify_client.template_statistics_api_client import TemplateStatisticsApiClient -from app.notify_client.user_api_client import UserApiClient -from app.notify_client.events_api_client import EventsApiClient -from app.notify_client.provider_client import ProviderClient -from app.notify_client.email_branding_client import EmailBrandingClient -from app.notify_client.models import AnonymousUser -from app.notify_client.organisations_api_client import OrganisationsClient -from app.notify_client.org_invite_api_client import OrgInviteApiClient -from app.notify_client.letter_jobs_client import LetterJobsClient -from app.notify_client.inbound_number_client import InboundNumberClient -from app.notify_client.billing_api_client import BillingAPIClient -from app.notify_client.complaint_api_client import ComplaintApiClient -from app.notify_client.platform_stats_api_client import PlatformStatsAPIClient +from app.notify_client.service_api_client import service_api_client +from app.notify_client.api_key_api_client import api_key_api_client +from app.notify_client.invite_api_client import invite_api_client +from app.notify_client.job_api_client import job_api_client +from app.notify_client.notification_api_client import notification_api_client +from app.notify_client.status_api_client import status_api_client +from app.notify_client.template_statistics_api_client import template_statistics_client +from app.notify_client.user_api_client import user_api_client +from app.notify_client.events_api_client import events_api_client +from app.notify_client.provider_client import provider_client +from app.notify_client.email_branding_client import email_branding_client +from app.notify_client.organisations_api_client import organisations_client +from app.notify_client.org_invite_api_client import org_invite_api_client +from app.notify_client.letter_jobs_client import letter_jobs_client +from app.notify_client.inbound_number_client import inbound_number_client +from app.notify_client.billing_api_client import billing_api_client +from app.notify_client.complaint_api_client import complaint_api_client +from app.notify_client.platform_stats_api_client import platform_stats_api_client from app.commands import setup_commands from app.utils import get_cdn_domain, gmt_timezones, id_safe login_manager = LoginManager() csrf = CSRFProtect() - -service_api_client = ServiceAPIClient() -user_api_client = UserApiClient() -api_key_api_client = ApiKeyApiClient() -job_api_client = JobApiClient() -notification_api_client = NotificationApiClient() -status_api_client = StatusApiClient() -invite_api_client = InviteApiClient() -template_statistics_client = TemplateStatisticsApiClient() -events_api_client = EventsApiClient() -provider_client = ProviderClient() -email_branding_client = EmailBrandingClient() -organisations_client = OrganisationsClient() -org_invite_api_client = OrgInviteApiClient() -asset_fingerprinter = AssetFingerprinter() antivirus_client = AntivirusClient() statsd_client = StatsdClient() zendesk_client = ZendeskClient() -letter_jobs_client = LetterJobsClient() -inbound_number_client = InboundNumberClient() -billing_api_client = BillingAPIClient() -complaint_api_client = ComplaintApiClient() -platform_stats_api_client = PlatformStatsAPIClient() # The current service attached to the request stack. def _get_current_service(): - return Service(_lookup_req_object('service')) + return _lookup_req_object('service') current_service = LocalProxy(_get_current_service) @@ -465,7 +445,9 @@ def load_service_before_request(): if service_id: try: - _request_ctx_stack.top.service = service_api_client.get_service(service_id)['data'] + _request_ctx_stack.top.service = Service( + service_api_client.get_service(service_id)['data'] + ) except HTTPError as exc: # if service id isn't real, then 404 rather than 500ing later because we expect service to be set if exc.status_code == 404: diff --git a/app/asset_fingerprinter.py b/app/asset_fingerprinter.py index 8304069d5..e712a5ebe 100644 --- a/app/asset_fingerprinter.py +++ b/app/asset_fingerprinter.py @@ -44,3 +44,6 @@ class AssetFingerprinter(object): with codecs.open(asset_file_path, encoding='utf-8') as asset_file: contents = asset_file.read() return contents + + +asset_fingerprinter = AssetFingerprinter() diff --git a/app/main/forms.py b/app/main/forms.py index 91df7bc59..643fdcd31 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -43,7 +43,7 @@ from app.main.validators import ( ValidEmail, ValidGovEmail, ) -from app.notify_client.models import permissions, roles +from app.models.user import permissions, roles from app.utils import AgreementInfo, guess_name_from_email_address diff --git a/app/main/views/add_service.py b/app/main/views/add_service.py index e311a70e6..114f43437 100644 --- a/app/main/views/add_service.py +++ b/app/main/views/add_service.py @@ -12,7 +12,7 @@ from app import ( ) from app.main import main from app.main.forms import CreateServiceForm -from app.notify_client.models import InvitedUser +from app.models.user import InvitedUser from app.utils import AgreementInfo, email_safe, is_gov_user diff --git a/app/main/views/api_keys.py b/app/main/views/api_keys.py index 91b787961..95048eabf 100644 --- a/app/main/views/api_keys.py +++ b/app/main/views/api_keys.py @@ -151,12 +151,12 @@ def get_apis(): if current_service.service_callback_api: callback_api = service_api_client.get_service_callback_api( current_service.id, - current_service.get('service_callback_api')[0] + current_service.service_callback_api[0] ) if current_service.inbound_api: inbound_api = service_api_client.get_service_inbound_api( current_service.id, - current_service.get('inbound_api')[0] + current_service.inbound_api[0] ) return (callback_api, inbound_api) @@ -251,7 +251,7 @@ def get_received_text_messages_callback(): if current_service.inbound_api: return service_api_client.get_service_inbound_api( current_service.id, - current_service.get('inbound_api')[0] + current_service.inbound_api[0] ) diff --git a/app/main/views/conversation.py b/app/main/views/conversation.py index 2dac0478a..540945afb 100644 --- a/app/main/views/conversation.py +++ b/app/main/views/conversation.py @@ -4,7 +4,7 @@ from notifications_python_client.errors import HTTPError from notifications_utils.recipients import format_phone_number_human_readable from notifications_utils.template import SMSPreviewTemplate -from app import notification_api_client, service_api_client +from app import current_service, notification_api_client, service_api_client from app.main import main from app.main.forms import SearchTemplatesForm from app.utils import user_has_permissions @@ -44,13 +44,7 @@ def conversation_reply( service_id, notification_id, ): - - templates = [ - template - for template in service_api_client.get_service_templates(service_id)['data'] - if template['template_type'] == 'sms' - ] - + templates = current_service.templates_by_type('sms') return render_template( 'views/templates/choose-reply.html', templates=templates, diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 1aa5c1c37..f678babf6 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -72,7 +72,6 @@ def service_dashboard(service_id): return render_template( 'views/dashboard/dashboard.html', updates_url=url_for(".service_dashboard_updates", service_id=service_id), - templates=service_api_client.get_service_templates(service_id)['data'], partials=get_dashboard_partials(service_id) ) diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index 644e2d5bf..cf50029f1 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -324,7 +324,7 @@ def get_status_filters(service, message_type, statistics): option, url_for( '.view_notifications', - service_id=service['id'], + service_id=service.id, message_type=message_type, status=option ), diff --git a/app/main/views/manage_users.py b/app/main/views/manage_users.py index 90b98450e..4c0642ead 100644 --- a/app/main/views/manage_users.py +++ b/app/main/views/manage_users.py @@ -10,7 +10,7 @@ from app import ( ) from app.main import main from app.main.forms import InviteUserForm, PermissionsForm, SearchUsersForm -from app.notify_client.models import permissions +from app.models.user import permissions from app.utils import user_has_permissions diff --git a/app/main/views/send.py b/app/main/views/send.py index 58fbcee67..5992b4ac3 100644 --- a/app/main/views/send.py +++ b/app/main/views/send.py @@ -359,9 +359,9 @@ def send_test_step(service_id, template_id, step_index): email_reply_to = None sms_sender = None if db_template['template_type'] == 'email': - email_reply_to = get_email_reply_to_address_from_session(service_id) + email_reply_to = get_email_reply_to_address_from_session() elif db_template['template_type'] == 'sms': - sms_sender = get_sms_sender_from_session(service_id) + sms_sender = get_sms_sender_from_session() template = get_template( db_template, current_service, @@ -530,9 +530,9 @@ def _check_messages(service_id, template_id, upload_id, preview_row, letters_as_ email_reply_to = None sms_sender = None if db_template['template_type'] == 'email': - email_reply_to = get_email_reply_to_address_from_session(service_id) + email_reply_to = get_email_reply_to_address_from_session() elif db_template['template_type'] == 'sms': - sms_sender = get_sms_sender_from_session(service_id) + sms_sender = get_sms_sender_from_session() template = get_template( db_template, current_service, @@ -815,9 +815,9 @@ def _check_notification(service_id, template_id, exception=None): email_reply_to = None sms_sender = None if db_template['template_type'] == 'email': - email_reply_to = get_email_reply_to_address_from_session(service_id) + email_reply_to = get_email_reply_to_address_from_session() elif db_template['template_type'] == 'sms': - sms_sender = get_sms_sender_from_session(service_id) + sms_sender = get_sms_sender_from_session() template = get_template( db_template, current_service, @@ -903,17 +903,17 @@ def send_notification(service_id, template_id): )) -def get_email_reply_to_address_from_session(service_id): +def get_email_reply_to_address_from_session(): if session.get('sender_id'): - return service_api_client.get_reply_to_email_address( - service_id, session['sender_id'] + return current_service.get_email_reply_to_address( + session['sender_id'] )['email_address'] -def get_sms_sender_from_session(service_id): +def get_sms_sender_from_session(): if session.get('sender_id'): - return service_api_client.get_sms_sender( - service_id=service_id, sms_sender_id=session['sender_id'] + return current_service.get_sms_sender( + session['sender_id'] )['sms_sender'] diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index f1c111ad3..25e2f29c3 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -13,7 +13,6 @@ from flask import ( ) from flask_login import current_user, login_required from notifications_python_client.errors import HTTPError -from notifications_utils.field import Field from app import ( billing_api_client, @@ -56,7 +55,6 @@ from app.utils import ( AgreementInfo, email_safe, get_cdn_domain, - get_default_sms_sender, user_has_permissions, user_is_platform_admin, ) @@ -66,50 +64,7 @@ from app.utils import ( @login_required @user_has_permissions('manage_service', 'manage_api_keys') def service_settings(service_id): - letter_branding_organisations = email_branding_client.get_letter_email_branding() - organisation = organisations_client.get_service_organisation(service_id).get('name', None) - - if current_service.email_branding: - email_branding = email_branding_client.get_email_branding(current_service.email_branding)['email_branding'] - else: - email_branding = None - - inbound_number = inbound_number_client.get_inbound_sms_number_for_service(service_id) - disp_inbound_number = inbound_number['data'].get('number', '') - reply_to_email_addresses = service_api_client.get_reply_to_email_addresses(service_id) - reply_to_email_address_count = len(reply_to_email_addresses) - default_reply_to_email_address = next( - (x['email_address'] for x in reply_to_email_addresses if x['is_default']), "Not set" - ) - letter_contact_details = service_api_client.get_letter_contacts(service_id) - letter_contact_details_count = len(letter_contact_details) - default_letter_contact_block = next( - (Field(x['contact_block'], html='escape') for x in letter_contact_details if x['is_default']), "Not set" - ) - sms_senders = service_api_client.get_sms_senders(service_id) - - free_sms_fragment_limit = billing_api_client.get_free_sms_fragment_limit_for_year(service_id) - data_retention = service_api_client.get_service_data_retention(service_id) - - return render_template( - 'views/service-settings.html', - email_branding=email_branding, - letter_branding=letter_branding_organisations.get( - current_service.get('dvla_organisation', '001') - ), - can_receive_inbound=(current_service.has_permission('inbound_sms')), - inbound_number=disp_inbound_number, - default_reply_to_email_address=default_reply_to_email_address, - reply_to_email_address_count=reply_to_email_address_count, - default_letter_contact_block=default_letter_contact_block, - letter_contact_details_count=letter_contact_details_count, - default_sms_sender=get_default_sms_sender(sms_senders), - sms_sender_count=len(sms_senders), - free_sms_fragment_limit=free_sms_fragment_limit, - prefix_sms=current_service.prefix_sms, - organisation=organisation, - data_retention=data_retention, - ) + return render_template('views/service-settings.html') @main.route("/services//service-settings/name", methods=['GET', 'POST']) @@ -346,7 +301,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.get('contact_link'): + if current_service.has_permission('upload_document') or current_service.contact_link: switch_service_permissions(service_id, 'upload_document') return redirect(url_for('.service_settings', service_id=service_id)) @@ -415,7 +370,7 @@ def service_set_contact_link(service_id): form = ServiceContactDetailsForm() if request.method == 'GET': - contact_details = current_service.get('contact_link') + contact_details = current_service.contact_link contact_type = check_contact_details_type(contact_details) field_to_update = getattr(form, contact_type) @@ -454,10 +409,7 @@ def service_set_reply_to_email(service_id): @login_required @user_has_permissions('manage_service', 'manage_api_keys') def service_email_reply_to(service_id): - reply_to_email_addresses = service_api_client.get_reply_to_email_addresses(service_id) - return render_template( - 'views/service-settings/email_reply_to.html', - reply_to_email_addresses=reply_to_email_addresses) + return render_template('views/service-settings/email_reply_to.html') @main.route("/services//service-settings/email-reply-to/add", methods=['GET', 'POST']) @@ -465,8 +417,7 @@ def service_email_reply_to(service_id): @user_has_permissions('manage_service') def service_add_email_reply_to(service_id): form = ServiceReplyToEmailForm() - reply_to_email_address_count = len(service_api_client.get_reply_to_email_addresses(service_id)) - first_email_address = reply_to_email_address_count == 0 + first_email_address = current_service.count_email_reply_to_addresses == 0 if form.validate_on_submit(): service_api_client.add_reply_to_email_address( current_service.id, @@ -494,7 +445,7 @@ def service_add_email_reply_to(service_id): @user_has_permissions('manage_service') def service_edit_email_reply_to(service_id, reply_to_email_id): form = ServiceReplyToEmailForm() - reply_to_email_address = service_api_client.get_reply_to_email_address(service_id, reply_to_email_id) + reply_to_email_address = current_service.get_email_reply_to_address(reply_to_email_id) if request.method == 'GET': form.email_address.data = reply_to_email_address['email_address'] form.is_default.data = reply_to_email_address['is_default'] @@ -530,7 +481,6 @@ def service_delete_email_reply_to(service_id, reply_to_email_id): @user_has_permissions('manage_service') def service_set_inbound_number(service_id): available_inbound_numbers = inbound_number_client.get_available_inbound_sms_numbers() - service_has_inbound_number = inbound_number_client.get_inbound_sms_number_for_service(service_id)['data'] != {} inbound_numbers_value_and_label = [ (number['id'], number['number']) for number in available_inbound_numbers['data'] ] @@ -551,7 +501,6 @@ def service_set_inbound_number(service_id): 'views/service-settings/set-inbound-number.html', form=form, no_available_numbers=no_available_numbers, - service_has_inbound_number=service_has_inbound_number ) @@ -614,10 +563,8 @@ def service_set_international_sms(service_id): @login_required @user_has_permissions('manage_service') def service_set_inbound_sms(service_id): - number = inbound_number_client.get_inbound_sms_number_for_service(service_id)['data'].get('number', '') return render_template( 'views/service-settings/set-inbound-sms.html', - inbound_number=number, ) @@ -680,8 +627,7 @@ def service_letter_contact_details(service_id): @user_has_permissions('manage_service') def service_add_letter_contact(service_id): form = ServiceLetterContactBlockForm() - letter_contact_blocks_count = len(service_api_client.get_letter_contacts(service_id)) - first_contact_block = letter_contact_blocks_count == 0 + first_contact_block = current_service.count_letter_contact_details == 0 if form.validate_on_submit(): service_api_client.add_letter_contact( current_service.id, @@ -696,15 +642,18 @@ def service_add_letter_contact(service_id): return render_template( 'views/service-settings/letter-contact/add.html', form=form, - first_contact_block=first_contact_block) + first_contact_block=first_contact_block, + ) @main.route("/services//service-settings/letter-contact//edit", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_service') def service_edit_letter_contact(service_id, letter_contact_id): - letter_contact_block = service_api_client.get_letter_contact(service_id, letter_contact_id) - form = ServiceLetterContactBlockForm(letter_contact_block=letter_contact_block['contact_block']) + letter_contact_block = current_service.get_letter_contact_block(letter_contact_id) + form = ServiceLetterContactBlockForm( + letter_contact_block=letter_contact_block['contact_block'] + ) if request.method == 'GET': form.is_default.data = letter_contact_block['is_default'] if form.validate_on_submit(): @@ -725,24 +674,8 @@ def service_edit_letter_contact(service_id, letter_contact_id): @login_required @user_has_permissions('manage_service', 'manage_api_keys') def service_sms_senders(service_id): - - def attach_hint(sender): - hints = [] - if sender['is_default']: - hints += ["default"] - if sender['inbound_number_id']: - hints += ["receives replies"] - if hints: - sender['hint'] = "(" + " and ".join(hints) + ")" - - sms_senders = service_api_client.get_sms_senders(service_id) - - for sender in sms_senders: - attach_hint(sender) - return render_template( 'views/service-settings/sms-senders.html', - sms_senders=sms_senders ) @@ -751,8 +684,7 @@ def service_sms_senders(service_id): @user_has_permissions('manage_service') def service_add_sms_sender(service_id): form = ServiceSmsSenderForm() - sms_sender_count = len(service_api_client.get_sms_senders(service_id)) - first_sms_sender = sms_sender_count == 0 + first_sms_sender = current_service.count_sms_senders == 0 if form.validate_on_submit(): service_api_client.add_sms_sender( current_service.id, @@ -779,7 +711,7 @@ def service_add_sms_sender(service_id): @login_required @user_has_permissions('manage_service') def service_edit_sms_sender(service_id, sms_sender_id): - sms_sender = service_api_client.get_sms_sender(service_id, sms_sender_id) + sms_sender = current_service.get_sms_sender(sms_sender_id) is_inbound_number = sms_sender['inbound_number_id'] if is_inbound_number: form = ServiceEditInboundNumberForm(is_default=sms_sender['is_default']) @@ -850,7 +782,7 @@ def service_set_letter_contact_block(service_id): @user_is_platform_admin def set_organisation_type(service_id): - form = OrganisationTypeForm(organisation_type=current_service.get('organisation_type')) + form = OrganisationTypeForm(organisation_type=current_service.organisation_type) if form.validate_on_submit(): free_sms_fragment_limit = current_app.config['DEFAULT_FREE_SMS_FRAGMENT_LIMITS'].get( @@ -875,7 +807,7 @@ def set_organisation_type(service_id): @user_is_platform_admin def set_free_sms_allowance(service_id): - form = FreeSMSAllowance(free_sms_allowance=billing_api_client.get_free_sms_fragment_limit_for_year(service_id)) + form = FreeSMSAllowance(free_sms_allowance=current_service.free_sms_fragment_limit) if form.validate_on_submit(): billing_api_client.create_or_update_free_sms_fragment_limit(service_id, form.free_sms_allowance.data) @@ -896,7 +828,7 @@ def service_set_email_branding(service_id): form = ServiceSetBranding( all_email_brandings=get_branding_as_value_and_label(email_branding), - current_email_branding=current_service.email_branding, + current_email_branding=current_service.email_branding_id, ) if form.validate_on_submit(): @@ -953,7 +885,7 @@ def set_letter_branding(service_id): ) return redirect(url_for('.service_settings', service_id=service_id)) - form.dvla_org_id.data = current_service.get('dvla_organisation', '001') + form.dvla_org_id.data = current_service.dvla_organisation return render_template( 'views/service-settings/set-letter-branding.html', @@ -967,9 +899,6 @@ def set_letter_branding(service_id): def request_letter_branding(service_id): return render_template( 'views/service-settings/request-letter-branding.html', - letter_branding=email_branding_client.get_letter_email_branding()[ - current_service.get('dvla_organisation', '001') - ] ) @@ -1009,9 +938,7 @@ def branding_request(service_id): branding_type = 'govuk' if current_service.email_branding: - email_branding = email_branding_client.get_email_branding( - current_service.email_branding)['email_branding'] - branding_type = email_branding['brand_type'] + branding_type = current_service.email_branding['brand_type'] form = BrandingOptionsEmail( options=branding_type @@ -1054,9 +981,9 @@ def branding_request(service_id): @login_required @user_is_platform_admin def data_retention(service_id): - results = service_api_client.get_service_data_retention(service_id) - return render_template('views/service-settings/data-retention.html', - data_retention_settings=results) + return render_template( + 'views/service-settings/data-retention.html', + ) @main.route("/services//data-retention/add", methods=['GET', 'POST']) @@ -1079,7 +1006,7 @@ def add_data_retention(service_id): @login_required @user_is_platform_admin def edit_data_retention(service_id, data_retention_id): - data_retention_item = service_api_client.get_service_data_retention_by_id(service_id, data_retention_id) + data_retention_item = current_service.get_data_retention_item(data_retention_id) form = ServiceDataRetentionEditForm(days_of_retention=data_retention_item['days_of_retention']) if form.validate_on_submit(): service_api_client.update_service_data_retention(service_id, data_retention_id, form.days_of_retention.data) diff --git a/app/main/views/templates.py b/app/main/views/templates.py index 91e397b1e..849cb2e5e 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -25,6 +25,7 @@ from app.main.forms import ( SMSTemplateForm, ) from app.main.views.send import get_example_csv_rows, get_sender_details +from app.models.service import Service from app.template_previews import TemplatePreview, get_page_count_for_letter from app.utils import ( email_or_sms_not_enabled, @@ -101,24 +102,6 @@ def start_tour(service_id, template_id): @login_required @user_has_permissions() def choose_template(service_id, template_type='all'): - templates = service_api_client.get_service_templates(service_id)['data'] - - letters_available = current_service.has_permission('letter') - - available_template_types = list(filter(None, ( - 'email', - 'sms', - 'letter' if letters_available else None, - ))) - - templates = [ - template for template in templates - if template['template_type'] in available_template_types - ] - - has_multiple_template_types = len({ - template['template_type'] for template in templates - }) > 1 template_nav_items = [ (label, key, url_for('.choose_template', service_id=current_service.id, template_type=key), '') @@ -126,23 +109,18 @@ def choose_template(service_id, template_type='all'): ('All', 'all'), ('Text message', 'sms'), ('Email', 'email'), - ('Letter', 'letter') if letters_available else None, + ('Letter', 'letter') if current_service.has_permission('letter') else None, ]) ] - templates_on_page = [ - template for template in templates - if ( - template_type in ['all', template['template_type']] and - template['template_type'] in available_template_types - ) - ] - return render_template( 'views/templates/choose.html', - templates=templates_on_page, - show_search_box=(len(templates_on_page) > 7), - show_template_nav=has_multiple_template_types and (len(templates) > 2), + templates=current_service.templates_by_type(template_type), + show_search_box=(len(current_service.templates_by_type(template_type)) > 7), + show_template_nav=( + current_service.has_multiple_template_types + and (len(current_service.templates) > 2) + ), template_nav_items=template_nav_items, template_type=template_type, search_form=SearchTemplatesForm(), @@ -254,15 +232,10 @@ def add_template_by_type(service_id): def choose_template_to_copy(service_id): return render_template( 'views/templates/copy.html', - services=[{ - 'name': service['name'], - 'id': service['id'], - 'templates': [ - template for template in - service_api_client.get_service_templates(service['id'])['data'] - if template['template_type'] in current_service['permissions'] - ], - } for service in user_api_client.get_services_for_user(current_user)], + services=[ + Service(service) + for service in user_api_client.get_services_for_user(current_user) + ], ) diff --git a/app/models/service.py b/app/models/service.py new file mode 100644 index 000000000..c663962d3 --- /dev/null +++ b/app/models/service.py @@ -0,0 +1,254 @@ +from notifications_utils.field import Field +from werkzeug.utils import cached_property + +from app.notify_client.billing_api_client import billing_api_client +from app.notify_client.email_branding_client import email_branding_client +from app.notify_client.inbound_number_client import inbound_number_client +from app.notify_client.job_api_client import job_api_client +from app.notify_client.organisations_api_client import organisations_client +from app.notify_client.service_api_client import service_api_client +from app.notify_client.user_api_client import user_api_client +from app.utils import get_default_sms_sender + + +class Service(): + + ALLOWED_PROPERTIES = { + 'active', + 'contact_link', + 'dvla_organisation', + 'email_branding', + 'email_from', + 'id', + 'inbound_api', + 'letter_contact_block', + 'letter_logo_filename', + 'message_limit', + 'name', + 'organisation_type', + 'permissions', + 'postage', + 'prefix_sms', + 'research_mode', + 'service_callback_api', + } + + def __init__(self, _dict): + # in the case of a bad request current service may be `None` + self._dict = _dict or {} + if 'permissions' not in self._dict: + self.permissions = {'email', 'sms', 'letter'} + + def __bool__(self): + return self._dict != {} + + def __getattr__(self, attr): + if attr in self.ALLOWED_PROPERTIES: + return self._dict[attr] + raise AttributeError('`{}` is not a service attribute'.format(attr)) + + @property + def trial_mode(self): + return self._dict['restricted'] + + def has_permission(self, permission): + return permission in self.permissions + + @cached_property + def has_jobs(self): + return job_api_client.has_jobs(self.id) + + @cached_property + def has_team_members(self): + return user_api_client.get_count_of_users_with_permission( + self.id, 'manage_service' + ) > 1 + + @cached_property + def templates(self): + + templates = service_api_client.get_service_templates(self.id)['data'] + + return [ + template for template in templates + if template['template_type'] in self.available_template_types + ] + + def templates_by_type(self, template_type): + if isinstance(template_type, str): + template_type = [template_type] + return [ + template for template in self.templates + if set(template_type) & {'all', template['template_type']} + ] + + @property + def available_template_types(self): + return [ + channel for channel in ('email', 'sms', 'letter') + if self.has_permission(channel) + ] + + @property + def has_templates(self): + return len(self.templates) > 0 + + @property + def has_multiple_template_types(self): + return len({ + template['template_type'] for template in self.templates + }) > 1 + + @property + def has_email_templates(self): + return len(self.templates_by_type('email')) > 0 + + @property + def has_sms_templates(self): + return len(self.templates_by_type('sms')) > 0 + + @cached_property + def email_reply_to_addresses(self): + return service_api_client.get_reply_to_email_addresses(self.id) + + @property + def has_email_reply_to_address(self): + return bool(self.email_reply_to_addresses) + + @property + def count_email_reply_to_addresses(self): + return len(self.email_reply_to_addresses) + + @property + def default_email_reply_to_address(self): + return next( + ( + x['email_address'] + for x in self.email_reply_to_addresses if x['is_default'] + ), None + ) + + def get_email_reply_to_address(self, id): + return service_api_client.get_reply_to_email_address(self.id, id) + + @property + def needs_to_add_email_reply_to_address(self): + return self.has_email_templates and not self.has_email_reply_to_address + + @property + def shouldnt_use_govuk_as_sms_sender(self): + return self.organisation_type in {'local', 'nhs'} + + @cached_property + def sms_senders(self): + return service_api_client.get_sms_senders(self.id) + + @property + def sms_senders_with_hints(self): + + def attach_hint(sender): + hints = [] + if sender['is_default']: + hints += ["default"] + if sender['inbound_number_id']: + hints += ["receives replies"] + if hints: + sender['hint'] = "(" + " and ".join(hints) + ")" + return sender + + return [attach_hint(sender) for sender in self.sms_senders] + + @property + def default_sms_sender(self): + return get_default_sms_sender(self.sms_senders) + + @property + def count_sms_senders(self): + return len(self.sms_senders) + + @property + def sms_sender_is_govuk(self): + return self.default_sms_sender in {'GOVUK', 'None'} + + def get_sms_sender(self, id): + return service_api_client.get_sms_sender(self.id, id) + + @property + def needs_to_change_sms_sender(self): + return all(( + self.has_sms_templates, + self.shouldnt_use_govuk_as_sms_sender, + self.sms_sender_is_govuk, + )) + + @cached_property + def letter_contact_details(self): + return service_api_client.get_letter_contacts(self.id) + + @property + def count_letter_contact_details(self): + return len(self.letter_contact_details) + + @property + def default_letter_contact_block(self): + return next( + ( + Field(x['contact_block'], html='escape') + for x in self.letter_contact_details if x['is_default'] + ), None + ) + + def get_letter_contact_block(self, id): + return service_api_client.get_letter_contact(self.id, id) + + @property + def go_live_checklist_completed(self): + return all(( + self.has_team_members, + self.has_templates, + not self.needs_to_add_email_reply_to_address, + not self.needs_to_change_sms_sender, + )) + + @property + def go_live_checklist_completed_as_yes_no(self): + return 'Yes' if self.go_live_checklist_completed else 'No' + + @cached_property + def free_sms_fragment_limit(self): + return billing_api_client.get_free_sms_fragment_limit_for_year(self.id) or 0 + + @cached_property + def data_retention(self): + return service_api_client.get_service_data_retention(self.id) + + def get_data_retention_item(self, id): + return service_api_client.get_service_data_retention_by_id(self.id, id) + + @property + def email_branding_id(self): + return self._dict['email_branding'] + + @cached_property + def email_branding(self): + if self.email_branding_id: + return email_branding_client.get_email_branding(self.email_branding_id)['email_branding'] + return None + + @cached_property + def letter_branding(self): + return email_branding_client.get_letter_email_branding().get( + self.dvla_organisation, '001' + ) + + @cached_property + def organisation_name(self): + return organisations_client.get_service_organisation(self.id).get('name', None) + + @cached_property + def inbound_number(self): + return inbound_number_client.get_inbound_sms_number_for_service(self.id)['data'].get('number', '') + + @property + def has_inbound_number(self): + return bool(self.inbound_number) diff --git a/app/notify_client/models.py b/app/models/user.py similarity index 74% rename from app/notify_client/models.py rename to app/models/user.py index 0d94eba41..201743356 100644 --- a/app/notify_client/models.py +++ b/app/models/user.py @@ -3,8 +3,6 @@ from itertools import chain from flask import request, session from flask_login import AnonymousUserMixin, UserMixin -from app.utils import get_default_sms_sender - roles = { 'send_messages': ['send_texts', 'send_emails', 'send_letters'], 'manage_templates': ['manage_templates'], @@ -266,118 +264,3 @@ class AnonymousUser(AnonymousUserMixin): # set the anonymous user so that if a new browser hits us we don't error http://stackoverflow.com/a/19275188 def logged_in_elsewhere(self): return False - - -class Service(dict): - - ALLOWED_PROPERTIES = { - 'active', - 'dvla_organisation', - 'email_branding', - 'email_from', - 'id', - 'inbound_api', - 'letter_contact_block', - 'letter_logo_filename', - 'message_limit', - 'name', - 'organisation_type', - 'permissions', - 'postage', - 'prefix_sms', - 'research_mode', - 'service_callback_api', - } - - def __init__(self, _dict): - # in the case of a bad request current service may be `None` - super().__init__(_dict or {}) - - def __getattr__(self, attr): - if attr in self.ALLOWED_PROPERTIES: - return self[attr] - raise AttributeError('`{}` is not a service attribute'.format(attr)) - - @property - def trial_mode(self): - return self['restricted'] - - def has_permission(self, permission): - return permission in self.permissions - - @property - def has_jobs(self): - # Can’t import at top-level because app isn’t yet initialised - from app import job_api_client - return job_api_client.has_jobs(self.id) - - @property - def has_team_members(self): - from app import user_api_client - return user_api_client.get_count_of_users_with_permission( - self.id, 'manage_service' - ) > 1 - - @property - def has_templates(self): - from app import service_api_client - return service_api_client.count_service_templates( - self.id - ) > 0 - - @property - def has_email_templates(self): - from app import service_api_client - return service_api_client.count_service_templates( - self.id, template_type='email' - ) > 0 - - @property - def has_sms_templates(self): - from app import service_api_client - return service_api_client.count_service_templates( - self.id, template_type='sms' - ) > 0 - - @property - def has_email_reply_to_address(self): - from app import service_api_client - return bool(service_api_client.get_reply_to_email_addresses( - self.id - )) - - @property - def needs_to_add_email_reply_to_address(self): - return self.has_email_templates and not self.has_email_reply_to_address - - @property - def shouldnt_use_govuk_as_sms_sender(self): - return self.organisation_type in {'local', 'nhs'} - - @property - def sms_sender_is_govuk(self): - from app import service_api_client - return get_default_sms_sender( - service_api_client.get_sms_senders(self.id) - ) in {'GOVUK', 'None'} - - @property - def needs_to_change_sms_sender(self): - return all(( - self.has_sms_templates, - self.shouldnt_use_govuk_as_sms_sender, - self.sms_sender_is_govuk, - )) - - @property - def go_live_checklist_completed(self): - return all(( - self.has_team_members, - self.has_templates, - not self.needs_to_add_email_reply_to_address, - not self.needs_to_change_sms_sender, - )) - - @property - def go_live_checklist_completed_as_yes_no(self): - return 'Yes' if self.go_live_checklist_completed else 'No' diff --git a/app/notify_client/api_key_api_client.py b/app/notify_client/api_key_api_client.py index 404f7880d..bfcde52b6 100644 --- a/app/notify_client/api_key_api_client.py +++ b/app/notify_client/api_key_api_client.py @@ -30,3 +30,6 @@ class ApiKeyApiClient(NotifyAdminAPIClient): return self.post( url='/service/{0}/api-key/revoke/{1}'.format(service_id, key_id), data=data) + + +api_key_api_client = ApiKeyApiClient() diff --git a/app/notify_client/billing_api_client.py b/app/notify_client/billing_api_client.py index dace14ec4..ec6c69551 100644 --- a/app/notify_client/billing_api_client.py +++ b/app/notify_client/billing_api_client.py @@ -41,3 +41,6 @@ class BillingAPIClient(NotifyAdminAPIClient): url='/service/{0}/billing/free-sms-fragment-limit'.format(service_id), data=data ) + + +billing_api_client = BillingAPIClient() diff --git a/app/notify_client/complaint_api_client.py b/app/notify_client/complaint_api_client.py index 2d51f3ebc..556620444 100644 --- a/app/notify_client/complaint_api_client.py +++ b/app/notify_client/complaint_api_client.py @@ -13,3 +13,6 @@ class ComplaintApiClient(NotifyAdminAPIClient): def get_complaint_count(self, params_dict=None): return self.get('/complaint/count-by-date-range', params=params_dict) + + +complaint_api_client = ComplaintApiClient() diff --git a/app/notify_client/email_branding_client.py b/app/notify_client/email_branding_client.py index 4af1d6f0c..4daa279b6 100644 --- a/app/notify_client/email_branding_client.py +++ b/app/notify_client/email_branding_client.py @@ -50,3 +50,6 @@ class EmailBrandingClient(NotifyAdminAPIClient): "brand_type": brand_type } return self.post(url="/email-branding/{}".format(branding_id), data=data) + + +email_branding_client = EmailBrandingClient() diff --git a/app/notify_client/events_api_client.py b/app/notify_client/events_api_client.py index c12b8b721..36cd9729d 100644 --- a/app/notify_client/events_api_client.py +++ b/app/notify_client/events_api_client.py @@ -12,3 +12,6 @@ class EventsApiClient(NotifyAdminAPIClient): } resp = self.post(url='/events', data=data) return resp['data'] + + +events_api_client = EventsApiClient() diff --git a/app/notify_client/inbound_number_client.py b/app/notify_client/inbound_number_client.py index eeadc7aca..5a912f1a6 100644 --- a/app/notify_client/inbound_number_client.py +++ b/app/notify_client/inbound_number_client.py @@ -14,3 +14,6 @@ class InboundNumberClient(NotifyAdminAPIClient): def get_inbound_sms_number_for_service(self, service_id): return self.get('/inbound-number/service/{}'.format(service_id)) + + +inbound_number_client = InboundNumberClient() diff --git a/app/notify_client/invite_api_client.py b/app/notify_client/invite_api_client.py index ba7434134..9ea677157 100644 --- a/app/notify_client/invite_api_client.py +++ b/app/notify_client/invite_api_client.py @@ -1,8 +1,8 @@ -from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache -from app.notify_client.models import ( +from app.models.user import ( InvitedUser, translate_permissions_from_admin_roles_to_db, ) +from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache class InviteApiClient(NotifyAdminAPIClient): @@ -57,3 +57,6 @@ class InviteApiClient(NotifyAdminAPIClient): invited_user = InvitedUser(**invite) invited_users.append(invited_user) return invited_users + + +invite_api_client = InviteApiClient() diff --git a/app/notify_client/job_api_client.py b/app/notify_client/job_api_client.py index 75e5ddd7a..34dfdbe88 100644 --- a/app/notify_client/job_api_client.py +++ b/app/notify_client/job_api_client.py @@ -125,3 +125,6 @@ class JobApiClient(NotifyAdminAPIClient): job['data']['notifications_requested'] = stats['requested'] return job + + +job_api_client = JobApiClient() diff --git a/app/notify_client/letter_jobs_client.py b/app/notify_client/letter_jobs_client.py index 079d31e12..3dd2a39cd 100644 --- a/app/notify_client/letter_jobs_client.py +++ b/app/notify_client/letter_jobs_client.py @@ -20,3 +20,6 @@ class LetterJobsClient(NotifyAdminAPIClient): url='/letters/returned', data={'references': references} ) + + +letter_jobs_client = LetterJobsClient() diff --git a/app/notify_client/notification_api_client.py b/app/notify_client/notification_api_client.py index 187162e68..10f0d3e6f 100644 --- a/app/notify_client/notification_api_client.py +++ b/app/notify_client/notification_api_client.py @@ -92,3 +92,6 @@ class NotificationApiClient(NotifyAdminAPIClient): ) return self.get(url=get_url) + + +notification_api_client = NotificationApiClient() diff --git a/app/notify_client/org_invite_api_client.py b/app/notify_client/org_invite_api_client.py index 1f6767b40..f80b20ca3 100644 --- a/app/notify_client/org_invite_api_client.py +++ b/app/notify_client/org_invite_api_client.py @@ -1,5 +1,5 @@ +from app.models.user import InvitedOrgUser from app.notify_client import NotifyAdminAPIClient, _attach_current_user -from app.notify_client.models import InvitedOrgUser class OrgInviteApiClient(NotifyAdminAPIClient): @@ -49,3 +49,6 @@ class OrgInviteApiClient(NotifyAdminAPIClient): invited_user = InvitedOrgUser(**invite) invited_users.append(invited_user) return invited_users + + +org_invite_api_client = OrgInviteApiClient() diff --git a/app/notify_client/organisations_api_client.py b/app/notify_client/organisations_api_client.py index ce7d39a4b..f5b31a835 100644 --- a/app/notify_client/organisations_api_client.py +++ b/app/notify_client/organisations_api_client.py @@ -52,3 +52,6 @@ class OrganisationsClient(NotifyAdminAPIClient): url="/organisations/unique", params={"org_id": org_id, "name": name} )["result"] + + +organisations_client = OrganisationsClient() diff --git a/app/notify_client/platform_stats_api_client.py b/app/notify_client/platform_stats_api_client.py index 9ca9390de..d2cc15f30 100644 --- a/app/notify_client/platform_stats_api_client.py +++ b/app/notify_client/platform_stats_api_client.py @@ -9,3 +9,6 @@ class PlatformStatsAPIClient(NotifyAdminAPIClient): def get_aggregate_platform_stats(self, params_dict=None): return self.get("/platform-stats", params=params_dict) + + +platform_stats_api_client = PlatformStatsAPIClient() diff --git a/app/notify_client/provider_client.py b/app/notify_client/provider_client.py index 8c9975b85..8289eb5f0 100644 --- a/app/notify_client/provider_client.py +++ b/app/notify_client/provider_client.py @@ -27,3 +27,6 @@ class ProviderClient(NotifyAdminAPIClient): } data = _attach_current_user(data) return self.post(url='/provider-details/{}'.format(provider_id), data=data) + + +provider_client = ProviderClient() diff --git a/app/notify_client/service_api_client.py b/app/notify_client/service_api_client.py index 26a1fe79f..539fbbb73 100644 --- a/app/notify_client/service_api_client.py +++ b/app/notify_client/service_api_client.py @@ -506,3 +506,6 @@ class ServiceAPIClient(NotifyAdminAPIClient): def get_service_data_retention_by_id(self, service_id, data_retention_id): return self.get("service/{}/data-retention/{}".format(service_id, data_retention_id)) + + +service_api_client = ServiceAPIClient() diff --git a/app/notify_client/status_api_client.py b/app/notify_client/status_api_client.py index 1a69e7281..650741c67 100644 --- a/app/notify_client/status_api_client.py +++ b/app/notify_client/status_api_client.py @@ -8,3 +8,6 @@ class StatusApiClient(NotifyAdminAPIClient): def get_status(self, *params): return self.get(url='/_status', *params) + + +status_api_client = StatusApiClient() diff --git a/app/notify_client/template_statistics_api_client.py b/app/notify_client/template_statistics_api_client.py index 749fdf0d4..f9f3f3183 100644 --- a/app/notify_client/template_statistics_api_client.py +++ b/app/notify_client/template_statistics_api_client.py @@ -26,3 +26,6 @@ class TemplateStatisticsApiClient(NotifyAdminAPIClient): return self.get( url='/service/{}/template-statistics/{}'.format(service_id, template_id) )['data'] + + +template_statistics_client = TemplateStatisticsApiClient() diff --git a/app/notify_client/user_api_client.py b/app/notify_client/user_api_client.py index 3914999c0..78a694c88 100644 --- a/app/notify_client/user_api_client.py +++ b/app/notify_client/user_api_client.py @@ -2,12 +2,12 @@ from itertools import chain from notifications_python_client.errors import HTTPError -from app.notify_client import NotifyAdminAPIClient, cache -from app.notify_client.models import ( +from app.models.user import ( User, roles, translate_permissions_from_admin_roles_to_db, ) +from app.notify_client import NotifyAdminAPIClient, cache ALLOWED_ATTRIBUTES = { 'name', @@ -226,3 +226,6 @@ class UserApiClient(NotifyAdminAPIClient): def user_belongs_to_service(self, user, service_id): return service_id in self.get_service_ids_for_user(user) + + +user_api_client = UserApiClient() diff --git a/app/templates/partials/check/too-many-messages.html b/app/templates/partials/check/too-many-messages.html index b75dbb65f..073f906d7 100644 --- a/app/templates/partials/check/too-many-messages.html +++ b/app/templates/partials/check/too-many-messages.html @@ -7,7 +7,7 @@

You can only send {{ current_service.message_limit }} messages per day - {%- if current_service.restricted %} + {%- if current_service.trial_mode %} in trial mode {%- endif -%} . diff --git a/app/templates/views/dashboard/dashboard.html b/app/templates/views/dashboard/dashboard.html index fd2f25a2f..3ddcc0f39 100644 --- a/app/templates/views/dashboard/dashboard.html +++ b/app/templates/views/dashboard/dashboard.html @@ -15,7 +15,7 @@

Dashboard

- {% if current_user.has_permissions('manage_templates') and not templates %} + {% if current_user.has_permissions('manage_templates') and not current_service.templates %} {% include 'views/dashboard/write-first-messages.html' %} {% endif %} diff --git a/app/templates/views/organisations/organisation/index.html b/app/templates/views/organisations/organisation/index.html index 6e7fb3b25..72ed84eee 100644 --- a/app/templates/views/organisations/organisation/index.html +++ b/app/templates/views/organisations/organisation/index.html @@ -17,7 +17,7 @@ {% for service in organisation_services %}
  • {% if service.has_permission_to_view %} - {{ service['name'] }} + {{ service['name'] }} {% else %} {{ service['name'] }} {% endif %} diff --git a/app/templates/views/service-settings.html b/app/templates/views/service-settings.html index e4b8e16cd..e57fbf2fa 100644 --- a/app/templates/views/service-settings.html +++ b/app/templates/views/service-settings.html @@ -81,17 +81,16 @@ {% call settings_row(if_has_permission='email') %} {{ text_field('Email reply-to addresses') }} - {% call field(status='default' if default_reply_to_email_address == "Not set" else '') %} - - {{ default_reply_to_email_address }} - {% if reply_to_email_address_count > 1 %} + {% call field(status='default' if default_reply_to_email_address == None else '') %} + {{ current_service.default_email_reply_to_address or 'Not set' }} + {% if current_service.count_email_reply_to_addresses > 1 %}
    - {{ '…and %d more' | format(reply_to_email_address_count - 1) }} + {{ '…and %d more' | format(current_service.count_email_reply_to_addresses - 1) }}
    {% endif %} {% endcall %} {{ edit_field( - 'Manage' if reply_to_email_address_count else 'Change', + 'Manage' if current_service.count_email_reply_to_addresses else 'Change', url_for('.service_email_reply_to', service_id=current_service.id), permissions=['manage_service','manage_api_keys'] @@ -101,7 +100,7 @@ {% call settings_row(if_has_permission='email') %} {{ text_field('Email branding') }} - {{ text_field('Your branding' if email_branding else 'GOV.UK') }} + {{ text_field('Your branding' if current_service.email_branding else 'GOV.UK') }} {{ edit_field( 'Change', url_for('.branding_request', service_id=current_service.id), @@ -132,16 +131,16 @@ {% call settings_row(if_has_permission='sms') %} {{ text_field('Text message sender') }} - {% call field(status='default' if default_sms_sender == "None" else '') %} - {{ default_sms_sender | string | nl2br | safe if default_sms_sender else 'None'}} - {% if sms_sender_count > 1 %} + {% call field(status='default' if current_service.default_sms_sender == "None" else '') %} + {{ current_service.default_sms_sender | string | nl2br | safe if current_service.default_sms_sender else 'None'}} + {% if current_service.count_sms_senders > 1 %}
    - {{ '…and %d more' | format(sms_sender_count - 1) }} + {{ '…and %d more' | format(current_service.count_sms_senders - 1) }}
    {% endif %} {% endcall %} {{ edit_field( - 'Manage' if sms_sender_count else 'Change', + 'Manage' if current_service.count_sms_senders > 1 else 'Change', url_for('.service_sms_senders', service_id=current_service.id), permissions=['manage_service','manage_api_keys'] @@ -151,7 +150,7 @@ {% call settings_row(if_has_permission='sms') %} {{ text_field('Text messages start with service name') }} - {{ boolean_field(prefix_sms) }} + {{ boolean_field(current_service.prefix_sms) }} {{ edit_field( 'Change', url_for('.service_set_sms_prefix', @@ -208,16 +207,16 @@ {% call settings_row(if_has_permission='letter') %} {{ text_field('Sender addresses') }} - {% call field(status='default' if default_letter_contact_block == "Not set" else '') %} - {{ default_letter_contact_block | string | nl2br | safe if default_letter_contact_block else 'Not set'}} - {% if letter_contact_details_count > 1 %} + {% call field(status='default' if current_service.default_letter_contact_block == None else '') %} + {{ current_service.default_letter_contact_block | string | nl2br | safe if current_service.default_letter_contact_block else 'Not set'}} + {% if current_service.count_letter_contact_details > 1 %}
    - {{ '…and %d more' | format(letter_contact_details_count - 1) }} + {{ '…and %d more' | format(current_service.count_letter_contact_details - 1) }}
    {% endif %} {% endcall %} {{ edit_field( - 'Manage' if letter_contact_details_count else 'Change', + 'Manage' if current_service.count_letter_contact_details else 'Change', url_for('.service_letter_contact_details', service_id=current_service.id), permissions=['manage_service','manage_api_keys'] @@ -227,7 +226,7 @@ {% call settings_row(if_has_permission='letter') %} {{ text_field('Letter branding') }} - {{ text_field(letter_branding) }} + {{ text_field(current_service.letter_branding) }} {{ edit_field( 'Change', url_for('.request_letter_branding', service_id=current_service.id), @@ -253,7 +252,7 @@ {% endcall %}
  • - {% if current_service.restricted %} + {% if current_service.trial_mode %}

    Your service is in trial mode

      @@ -297,7 +296,7 @@ ) %} {% call row() %} {{ text_field('Organisation')}} - {{ optional_text_field(organisation or None) }} + {{ optional_text_field(current_service.organisation_name) }} {{ edit_field('Change', url_for('.link_service_to_organisation', service_id=current_service.id)) }} {% endcall %} {% call row() %} @@ -309,23 +308,23 @@ {% endcall %} {% call row() %} {{ text_field('Free text message allowance')}} - {{ text_field('{:,}'.format(free_sms_fragment_limit or 0)) }} + {{ text_field('{:,}'.format(current_service.free_sms_fragment_limit)) }} {{ edit_field('Change', url_for('.set_free_sms_allowance', service_id=current_service.id)) }} {% endcall %} {% call row() %} {{ text_field('Email branding' )}} - {{ text_field(email_branding.name or 'GOV.UK') }} + {{ text_field(current_service.email_branding.name or 'GOV.UK') }} {{ edit_field('Change', url_for('.service_set_email_branding', service_id=current_service.id)) }} {% endcall %} {% call row() %} {{ text_field('Letter branding')}} - {{ text_field(letter_branding) }} + {{ text_field(current_service.letter_branding) }} {{ edit_field('Change', url_for('.set_letter_branding', service_id=current_service.id)) }} {% endcall %} {% call row() %} {{ text_field('Data retention')}} {% call field() %} - {{ data_retention | join(', ', attribute='notification_type') }} + {{ current_service.data_retention | join(', ', attribute='notification_type') }} {% endcall %} {{ edit_field('Change', url_for('.data_retention', service_id=current_service.id)) }} {% endcall %} @@ -334,7 +333,7 @@
      • - {{ 'Make service live' if current_service.restricted else 'Revert service to trial mode' }} + {{ 'Make service live' if current_service.trial_mode else 'Revert service to trial mode' }}
      • @@ -354,7 +353,7 @@
      • {% if 'sms' in current_service.permissions %}
      • - {% if not can_receive_inbound %} + {% if not current_service.has_permission('inbound_sms') %} Allow inbound sms diff --git a/app/templates/views/service-settings/data-retention.html b/app/templates/views/service-settings/data-retention.html index 5856dff0a..6bf0811c3 100644 --- a/app/templates/views/service-settings/data-retention.html +++ b/app/templates/views/service-settings/data-retention.html @@ -25,7 +25,7 @@
        - {% if not data_retention_settings %} + {% if not current_service.data_retention %}
        You haven’t added any data retention
        @@ -36,7 +36,7 @@ field_headings_visible=False, caption_visible=False ) %} - {% for item in data_retention_settings %} + {% for item in current_service.data_retention %} {% call row() %} {{ text_field(item.notification_type | format_notification_type)}} {{ text_field(item.days_of_retention) }} diff --git a/app/templates/views/service-settings/email_reply_to.html b/app/templates/views/service-settings/email_reply_to.html index 526bbac35..12d3fceb6 100644 --- a/app/templates/views/service-settings/email_reply_to.html +++ b/app/templates/views/service-settings/email_reply_to.html @@ -22,12 +22,12 @@ {% endif %}
        - {% if not reply_to_email_addresses %} + {% if not current_service.email_reply_to_addresses %}
        You haven’t added any email reply-to addresses yet
        {% endif %} - {% for item in reply_to_email_addresses %} + {% for item in current_service.email_reply_to_addresses %}

        {{ item.email_address }} @@ -39,7 +39,7 @@ {% if current_user.has_permissions('manage_service') %} Change {% endif %} - {% if reply_to_email_addresses|length > 1 %} + {% if current_service.count_email_reply_to_addresses > 1 %} {{ api_key(item.id, thing="ID") }} {% endif %}

        @@ -58,7 +58,7 @@

        Set up separate email addresses to receive replies from your users. - {% if current_service.restricted and not reply_to_email_addresses %} + {% if current_service.trial_mode and not current_service.has_email_reply_to_address %} Your service can’t go live until you’ve added at least one reply-to address. {% endif %} diff --git a/app/templates/views/service-settings/request-letter-branding.html b/app/templates/views/service-settings/request-letter-branding.html index d1aea867c..6a390bd3f 100644 --- a/app/templates/views/service-settings/request-letter-branding.html +++ b/app/templates/views/service-settings/request-letter-branding.html @@ -12,7 +12,7 @@

        - Your letters have the {{ letter_branding }} logo. + Your letters have the {{ current_service.letter_branding }} logo.

        Contact support diff --git a/app/templates/views/service-settings/set-inbound-number.html b/app/templates/views/service-settings/set-inbound-number.html index 021734617..86b2a6f1e 100644 --- a/app/templates/views/service-settings/set-inbound-number.html +++ b/app/templates/views/service-settings/set-inbound-number.html @@ -10,7 +10,7 @@ {% block maincolumn_content %}

        Set Inbound Number

        - {% if service_has_inbound_number %} + {% if current_service.has_inbound_number %}

        This service already has an inbound number

        {{ page_footer( back_link=url_for('.service_settings', service_id=current_service.id), diff --git a/app/templates/views/service-settings/set-inbound-sms.html b/app/templates/views/service-settings/set-inbound-sms.html index aeea73625..7494c8efb 100644 --- a/app/templates/views/service-settings/set-inbound-sms.html +++ b/app/templates/views/service-settings/set-inbound-sms.html @@ -13,7 +13,7 @@

        Receive text messages

        {% if 'inbound_sms' in current_service.permissions %}

        - Your service can receive text messages sent to {{ inbound_number }}. + Your service can receive text messages sent to {{ current_service.inbound_number }}.

        If you want to turn this feature off, diff --git a/app/templates/views/service-settings/set-reply-to-email.html b/app/templates/views/service-settings/set-reply-to-email.html index 9d65d1a17..e947fbb53 100644 --- a/app/templates/views/service-settings/set-reply-to-email.html +++ b/app/templates/views/service-settings/set-reply-to-email.html @@ -22,7 +22,7 @@ Set up a separate email address to receive replies from your users, then enter it here.

        - {% if current_service.restricted %} + {% if current_service.trial_mode %}

        Your service can’t go live until you’ve done this.

        diff --git a/app/templates/views/service-settings/sms-senders.html b/app/templates/views/service-settings/sms-senders.html index 297148220..b9d198683 100644 --- a/app/templates/views/service-settings/sms-senders.html +++ b/app/templates/views/service-settings/sms-senders.html @@ -21,12 +21,12 @@ {% endif %}
        - {% if not sms_senders %} + {% if not current_service.sms_senders %}
        You haven’t added any text message senders yet
        {% endif %} - {% for item in sms_senders %} + {% for item in current_service.sms_senders_with_hints %}

        {{ item.sms_sender }} @@ -40,7 +40,7 @@ {% if current_user.has_permissions('manage_service') %} Change {% endif %} - {% if sms_senders|length > 1 %} + {% if current_service.count_sms_senders > 1 %} {{ api_key(item.id, thing="ID") }} {% endif %}

        diff --git a/app/templates/views/templates/copy.html b/app/templates/views/templates/copy.html index 8690b4b2c..94d765f05 100644 --- a/app/templates/views/templates/copy.html +++ b/app/templates/views/templates/copy.html @@ -13,13 +13,14 @@