"""New applications and roles models. One day, all of this can be moved to a database or a service. """ from account.constants import constants ANALYTICS_APP_GROUP = 'ANALYTICS_APP_GROUP' ACCOUNTING_APP_GROUP = 'ACCOUNTING_APP_GROUP' CONTENT_APP_GROUP = 'CONTENT_APP_GROUP' SETTINGS_APP_GROUP = 'SETTINGS_APP_GROUP' MARKETING_APP_GROUP = 'MARKETING_APP_GROUP' APPLICATION_GROUPS = [ ANALYTICS_APP_GROUP, ACCOUNTING_APP_GROUP, CONTENT_APP_GROUP, SETTINGS_APP_GROUP, MARKETING_APP_GROUP, ] BANKING_TAX_APP = 'BANKING_TAX_APP' COLLABORATORS_APP = 'COLLABORATORS_APP' CUSTOMER_ACCOUNTING_APP = 'CUSTOMER_ACCOUNTING_APP' FANSIFTER_APP = 'FANSIFTER_APP' INSIGHTS_APP = 'INSIGHTS_APP' SETTINGS_APP = 'SETTINGS_APP' SONGWHIP_APP = 'SONGWHIP_APP' WORKSTATION_ACCOUNTING_APP = 'WORKSTATION_ACCOUNTING_APP' WORKSTATION_ANALYTICS_APP = 'WORKSTATION_ANALYTICS_APP' WORKSTATION_CATALOG_APP = 'WORKSTATION_CATALOG_APP' WORKSTATION_MARKETING_APP = 'WORKSTATION_MARKETING_APP' APPLICATION_IDS = [ BANKING_TAX_APP, COLLABORATORS_APP, CUSTOMER_ACCOUNTING_APP, FANSIFTER_APP, INSIGHTS_APP, SETTINGS_APP, SONGWHIP_APP, WORKSTATION_ACCOUNTING_APP, WORKSTATION_ANALYTICS_APP, WORKSTATION_CATALOG_APP, WORKSTATION_MARKETING_APP, ] APPLICATIONS = [ { 'group_id': ACCOUNTING_APP_GROUP, 'application_id': BANKING_TAX_APP, 'page': None, 'subdomain': 'documents', 'url': None, }, { 'group_id': ACCOUNTING_APP_GROUP, 'application_id': CUSTOMER_ACCOUNTING_APP, 'page': None, 'subdomain': 'accounting', 'url': None, }, { 'group_id': ACCOUNTING_APP_GROUP, 'application_id': COLLABORATORS_APP, 'page': None, 'subdomain': 'collaborators', 'url': None, }, { 'group_id': ACCOUNTING_APP_GROUP, 'application_id': WORKSTATION_ACCOUNTING_APP, 'page': '/accounting', 'subdomain': 'workstation', 'url': None, }, { 'group_id': ANALYTICS_APP_GROUP, 'application_id': INSIGHTS_APP, 'page': None, 'subdomain': 'insights', 'url': None, }, { 'group_id': ANALYTICS_APP_GROUP, 'application_id': WORKSTATION_ANALYTICS_APP, 'page': '/analytics', 'subdomain': 'workstation', 'url': None, }, { 'group_id': CONTENT_APP_GROUP, 'application_id': WORKSTATION_CATALOG_APP, 'page': '/catalog', 'subdomain': 'workstation', 'url': None, }, { 'group_id': MARKETING_APP_GROUP, 'application_id': WORKSTATION_MARKETING_APP, 'page': '/marketing2', 'subdomain': 'workstation', 'url': None, }, { 'group_id': MARKETING_APP_GROUP, 'application_id': FANSIFTER_APP, 'page': None, 'subdomain': 'fansifter', 'url': None, }, { 'group_id': MARKETING_APP_GROUP, 'application_id': SONGWHIP_APP, 'page': None, 'subdomain': None, 'url': 'https://songwhip.com', }, { 'group_id': SETTINGS_APP_GROUP, 'application_id': SETTINGS_APP, 'page': None, 'subdomain': 'settings', 'url': None, }, ] APPLICATIONS_DICT = {app['application_id']: app for app in APPLICATIONS} BANKING_TAX_BASE_ROLE = 'BANKING_TAX_BASE_ROLE' COLLABORATORS_BASE_ROLE = 'COLLABORATORS_BASE_ROLE' CUSTOMER_ACCOUNTING_BASE_ROLE = 'CUSTOMER_ACCOUNTING_BASE_ROLE' INSIGHTS_BASE_ROLE = 'INSIGHTS_BASE_ROLE' INSIGHTS_YT_REVENUE_ROLE = 'INSIGHTS_YT_REVENUE_ROLE' SETTINGS_BASE_ROLE = 'SETTINGS_BASE_ROLE' SONGWHIP_BASE_ROLE = 'songwhip' SONGWHIP_READ_ROLE = 'songwhip_read' # A dummy role like the above, but matches PP role name WORKSTATION_ADMIN_ROLE = 'WORKSTATION_ADMIN_ROLE' WORKSTATION_CATALOG_ROLE = 'WORKSTATION_CATALOG_ROLE' WORKSTATION_ANALYTICS_BASE_ROLE = 'WORKSTATION_ANALYTICS_BASE_ROLE' WORKSTATION_MARKETING_ROLE = 'WORKSTATION_MARKETING_ROLE' WORKSTATION_ADVERTISING_ROLE = 'WORKSTATION_ADVERTISING_ROLE' WORKSTATION_ACCOUNTING_BASE_ROLE = 'WORKSTATION_ACCOUNTING_BASE_ROLE' FANSIFTER_CAN_VIEW_FAN_DATA = 'fansifter_can_view_fan_data' FANSIFTER_CAN_CREATE_AD_REPORTS = 'fansifter_can_create_ad_reports' FANSIFTER_CAN_SHARE_AD_CAMPAIGN_AUDIENCES = 'fansifter_can_share_ad_campaign_audiences' FANSIFTER_CAN_CONNECT_AD_ACCOUNTS = 'fansifter_can_connect_ad_accounts' FANSIFTER_CAN_VIEW_EMAIL_CAMPAIGNS = 'fansifter_can_view_email_campaigns' FANSIFTER_CAN_CREATE_EMAIL_CAMPAIGNS = 'fansifter_can_create_email_campaigns' FANSIFTER_CAN_VIEW_SMS_CAMPAIGNS = 'fansifter_can_view_sms_campaigns' FANSIFTER_CAN_CREATE_SMS_CAMPAIGNS = 'fansifter_can_create_sms_campaigns' ROLES = [ {'application_id': BANKING_TAX_APP, 'role_id': BANKING_TAX_BASE_ROLE}, {'application_id': COLLABORATORS_APP, 'role_id': COLLABORATORS_BASE_ROLE}, { 'application_id': CUSTOMER_ACCOUNTING_APP, 'role_id': CUSTOMER_ACCOUNTING_BASE_ROLE, }, {'application_id': INSIGHTS_APP, 'role_id': INSIGHTS_BASE_ROLE}, {'application_id': INSIGHTS_APP, 'role_id': INSIGHTS_YT_REVENUE_ROLE}, {'application_id': SETTINGS_APP, 'role_id': SETTINGS_BASE_ROLE}, {'application_id': SONGWHIP_APP, 'role_id': SONGWHIP_BASE_ROLE}, {'application_id': SONGWHIP_APP, 'role_id': SONGWHIP_READ_ROLE}, {'application_id': SETTINGS_APP, 'role_id': WORKSTATION_ADMIN_ROLE}, {'application_id': WORKSTATION_CATALOG_APP, 'role_id': WORKSTATION_CATALOG_ROLE}, { 'application_id': WORKSTATION_ANALYTICS_APP, 'role_id': WORKSTATION_ANALYTICS_BASE_ROLE, }, { 'application_id': WORKSTATION_MARKETING_APP, 'role_id': WORKSTATION_MARKETING_ROLE, }, { 'application_id': WORKSTATION_MARKETING_APP, 'role_id': WORKSTATION_ADVERTISING_ROLE, }, { 'application_id': WORKSTATION_ACCOUNTING_APP, 'role_id': WORKSTATION_ACCOUNTING_BASE_ROLE, }, {'application_id': FANSIFTER_APP, 'role_id': FANSIFTER_CAN_VIEW_FAN_DATA}, {'application_id': FANSIFTER_APP, 'role_id': FANSIFTER_CAN_CREATE_AD_REPORTS}, {'application_id': FANSIFTER_APP, 'role_id': FANSIFTER_CAN_SHARE_AD_CAMPAIGN_AUDIENCES}, {'application_id': FANSIFTER_APP, 'role_id': FANSIFTER_CAN_CONNECT_AD_ACCOUNTS}, {'application_id': FANSIFTER_APP, 'role_id': FANSIFTER_CAN_VIEW_EMAIL_CAMPAIGNS}, {'application_id': FANSIFTER_APP, 'role_id': FANSIFTER_CAN_CREATE_EMAIL_CAMPAIGNS}, {'application_id': FANSIFTER_APP, 'role_id': FANSIFTER_CAN_VIEW_SMS_CAMPAIGNS}, {'application_id': FANSIFTER_APP, 'role_id': FANSIFTER_CAN_CREATE_SMS_CAMPAIGNS}, ] # This mapping if for UI display purposes. # It is used to show an application and its default role as a singular entity. # Future use cases: # * introducing new applications without a default role # * evolving an application and removing its default role # * applications with multiple default roles (potential migration or dual write purposes) APPLICATION_DEFAULT_ROLE_MAPPING = { INSIGHTS_APP: [INSIGHTS_BASE_ROLE], BANKING_TAX_APP: [BANKING_TAX_BASE_ROLE], COLLABORATORS_APP: [COLLABORATORS_BASE_ROLE], CUSTOMER_ACCOUNTING_APP: [CUSTOMER_ACCOUNTING_BASE_ROLE], SETTINGS_APP: [SETTINGS_BASE_ROLE], SONGWHIP_APP: [SONGWHIP_READ_ROLE], WORKSTATION_CATALOG_APP: [WORKSTATION_CATALOG_ROLE], WORKSTATION_ANALYTICS_APP: [WORKSTATION_ANALYTICS_BASE_ROLE], WORKSTATION_MARKETING_APP: [WORKSTATION_MARKETING_ROLE], WORKSTATION_ACCOUNTING_APP: [WORKSTATION_ACCOUNTING_BASE_ROLE], FANSIFTER_APP: [FANSIFTER_CAN_VIEW_FAN_DATA], } ROLES_DICT = { role['role_id']: { 'is_default': role['role_id'] in APPLICATION_DEFAULT_ROLE_MAPPING.get(role['application_id'], []), 'role_id': role['role_id'], 'application_id': role['application_id'], } for role in ROLES } def _get_application_domain(application_id: str, company_brand_name: str) -> str: brand_name = constants.COMPANY_BRAND_APPLICATION_DOMAIN_OVERRIDES.get( company_brand_name, {} ).get(application_id, company_brand_name) return constants.COMPANY_BRAND_TO_DOMAIN_MAPPING.get(brand_name) def get_application_url(application_id: str, company_brand_name: str) -> str: """ Get application url based on application id, company brand name and environment. Args: application_id (str): Application id. company_brand_name (str): Company brand name. Return: str: Application url. """ app = APPLICATIONS_DICT.get(application_id) if not app: raise ValueError(f'Application {application_id} not found.') if company_brand_name not in constants.COMPANY_BRAND_TO_DOMAIN_MAPPING: raise ValueError(f'Invalid Company brand {company_brand_name}.') subdomain = app.get('subdomain') page = app.get('page') url = app.get('url') domain = _get_application_domain(application_id, company_brand_name) if url: return url if not subdomain: raise ValueError(f'Subdomain not specified for application {application_id}.') base_url = f'https://{subdomain}.{domain}' if page: return f'{base_url}{page}' else: return base_url