from itertools import chain from flask import request class Navigation: mapping = {} selected_class = "usa-current" def __init__(self): self.mapping = { navigation: { # if not specified, assume endpoints are all in the `main` blueprint. self.get_endpoint_with_blueprint(endpoint) for endpoint in endpoints } for navigation, endpoints in self.mapping.items() } @property def endpoints_with_navigation(self): return tuple(chain.from_iterable(( endpoints for navigation_item, endpoints in self.mapping.items() ))) def is_selected(self, navigation_item): if request.endpoint in self.mapping[navigation_item]: return self.selected_class return '' @staticmethod def get_endpoint_with_blueprint(endpoint): return endpoint if '.' in endpoint else 'main.{}'.format(endpoint) class HeaderNavigation(Navigation): mapping = { 'support': { 'bat_phone', 'feedback', 'support', 'support_public', 'thanks', 'triage', }, 'features': { 'features', 'features_email', 'features_sms', 'message_status', 'roadmap', 'security', 'terms', 'trial_mode_new', 'using_notify', }, 'pricing': { 'pricing', 'how_to_pay', 'billing_details', }, 'documentation': { 'documentation', 'integration_testing', }, 'user-profile': { 'user_profile', 'user_profile_confirm_delete_mobile_number', 'user_profile_email', 'user_profile_email_authenticate', 'user_profile_email_confirm', 'user_profile_mobile_number', 'user_profile_mobile_number_authenticate', 'user_profile_mobile_number_confirm', 'user_profile_mobile_number_delete', 'user_profile_name', 'user_profile_password', 'user_profile_disable_platform_admin_view', }, 'platform-admin': { 'archive_user', 'change_user_auth', 'clear_cache', 'create_email_branding', 'edit_sms_provider_ratio', 'email_branding', 'find_services_by_name', 'find_users_by_email', 'live_services', 'live_services_csv', 'notifications_sent_by_service', 'get_billing_report', 'get_daily_volumes', 'get_daily_sms_provider_volumes', 'get_volumes_by_service', 'organisations', 'platform_admin', 'platform_admin_list_complaints', 'platform_admin_reports', 'platform_admin_splash_page', 'suspend_service', 'trial_services', 'update_email_branding', 'user_information', 'view_provider', 'view_providers', }, 'sign-in': { 'revalidate_email_sent', 'sign_in', 'two_factor_sms', 'two_factor_email', 'two_factor_email_sent', 'two_factor_email_interstitial', 'two_factor_webauthn', 'verify', 'verify_email', }, } # header HTML now comes from GOVUK Frontend so requires a boolean, not an attribute def is_selected(self, navigation_item): return request.endpoint in self.mapping[navigation_item] class MainNavigation(Navigation): mapping = { 'dashboard': { 'conversation', 'inbox', 'monthly', 'service_dashboard', 'template_usage', 'view_notification', 'view_notifications', }, 'templates': { 'action_blocked', 'add_service_template', 'check_messages', 'check_notification', 'choose_template', 'choose_template_to_copy', 'confirm_redact_template', 'conversation_reply', 'copy_template', 'delete_service_template', 'edit_service_template', 'manage_template_folder', 'send_messages', 'send_one_off', 'send_one_off_step', 'send_one_off_to_myself', 'set_sender', 'set_template_sender', 'view_template', 'view_template_version', 'view_template_versions', }, 'uploads': { 'uploads', 'view_job', 'view_jobs', }, 'team-members': { 'confirm_edit_user_email', 'confirm_edit_user_mobile_number', 'edit_user_email', 'edit_user_mobile_number', 'edit_user_permissions', 'invite_user', 'manage_users', 'remove_user_from_service', }, 'usage': { 'usage', }, 'settings': { # 'add_organisation_from_gp_service', # 'add_organisation_from_nhs_local_service', 'email_branding_govuk', 'email_branding_govuk_and_org', 'email_branding_nhs', 'email_branding_organisation', 'email_branding_request', 'email_branding_something_else', 'estimate_usage', 'link_service_to_organisation', 'request_to_go_live', 'service_add_email_reply_to', 'service_add_sms_sender', 'service_confirm_delete_email_reply_to', 'service_confirm_delete_sms_sender', 'service_edit_email_reply_to', 'service_edit_sms_sender', 'service_email_reply_to', 'service_name_change', 'service_preview_email_branding', 'service_set_auth_type', 'service_set_channel', 'send_files_by_email_contact_details', 'service_set_email_branding', 'service_set_inbound_number', 'service_set_inbound_sms', 'service_set_international_sms', 'service_set_reply_to_email', 'service_set_sms_prefix', 'service_verify_reply_to_address', 'service_verify_reply_to_address_updates', 'service_settings', 'service_sms_senders', 'set_free_sms_allowance', 'set_message_limit', 'set_rate_limit', 'submit_request_to_go_live', }, 'api-integration': { 'api_callbacks', 'api_documentation', 'api_integration', 'api_keys', 'create_api_key', 'delivery_status_callback', 'received_text_messages_callback', 'revoke_api_key', 'guest_list', 'old_guest_list', }, } class CaseworkNavigation(Navigation): mapping = { 'send-one-off': { 'choose_template', 'send_one_off', 'send_one_off_step', 'send_one_off_to_myself', }, 'sent-messages': { 'view_notifications', 'view_notification', }, 'uploads': { 'view_jobs', 'view_job', 'uploads', }, } class OrgNavigation(Navigation): mapping = { 'dashboard': { 'organisation_dashboard', }, 'settings': { 'edit_organisation_billing_details', 'edit_organisation_domains', 'edit_organisation_email_branding', 'edit_organisation_domains', 'edit_organisation_go_live_notes', 'edit_organisation_name', 'edit_organisation_notes', 'edit_organisation_type', 'organisation_preview_email_branding', 'organisation_settings', }, 'team-members': { 'edit_organisation_user', 'invite_org_user', 'manage_org_users', 'remove_user_from_organisation', }, 'trial-services': { 'organisation_trial_mode_services', }, 'billing': { 'organisation_billing', } }