notify-api-412 use black to enforce python coding style

This commit is contained in:
Kenneth Kehl
2023-08-25 09:12:23 -07:00
parent c6eb007386
commit 8c9721d8e2
201 changed files with 31660 additions and 28105 deletions

View File

@@ -19,52 +19,51 @@ from app.utils import get_default_sms_sender
class Service(JSONModel, SortByNameMixin):
ALLOWED_PROPERTIES = {
'active',
'billing_contact_email_addresses',
'billing_contact_names',
'billing_reference',
'consent_to_research',
'contact_link',
'count_as_live',
'email_from',
'go_live_at',
'go_live_user',
'id',
'inbound_api',
'message_limit',
'rate_limit',
'name',
'notes',
'prefix_sms',
'purchase_order_number',
'research_mode',
'service_callback_api',
'volume_email',
'volume_sms',
"active",
"billing_contact_email_addresses",
"billing_contact_names",
"billing_reference",
"consent_to_research",
"contact_link",
"count_as_live",
"email_from",
"go_live_at",
"go_live_user",
"id",
"inbound_api",
"message_limit",
"rate_limit",
"name",
"notes",
"prefix_sms",
"purchase_order_number",
"research_mode",
"service_callback_api",
"volume_email",
"volume_sms",
}
TEMPLATE_TYPES = (
'email',
'sms',
"email",
"sms",
)
ALL_PERMISSIONS = TEMPLATE_TYPES + (
'edit_folder_permissions',
'email_auth',
'inbound_sms',
'international_sms',
'upload_document',
"edit_folder_permissions",
"email_auth",
"inbound_sms",
"international_sms",
"upload_document",
)
@classmethod
def from_id(cls, service_id):
return cls(service_api_client.get_service(service_id)['data'])
return cls(service_api_client.get_service(service_id)["data"])
@property
def permissions(self):
return self._dict.get('permissions', self.TEMPLATE_TYPES)
return self._dict.get("permissions", self.TEMPLATE_TYPES)
@property
def billing_details(self):
@@ -72,7 +71,7 @@ class Service(JSONModel, SortByNameMixin):
self.billing_contact_email_addresses,
self.billing_contact_names,
self.billing_reference,
self.purchase_order_number
self.purchase_order_number,
]
if any(billing_details):
return billing_details
@@ -83,7 +82,9 @@ class Service(JSONModel, SortByNameMixin):
return service_api_client.update_service(self.id, **kwargs)
def update_count_as_live(self, count_as_live):
return service_api_client.update_count_as_live(self.id, count_as_live=count_as_live)
return service_api_client.update_count_as_live(
self.id, count_as_live=count_as_live
)
def update_status(self, live):
return service_api_client.update_status(self.id, live=live)
@@ -95,7 +96,6 @@ class Service(JSONModel, SortByNameMixin):
)
def force_permission(self, permission, on=False):
permissions, permission = set(self.permissions), {permission}
return self.update_permissions(
@@ -110,7 +110,7 @@ class Service(JSONModel, SortByNameMixin):
@property
def trial_mode(self):
return self._dict['restricted']
return self._dict["restricted"]
@property
def live(self):
@@ -118,7 +118,7 @@ class Service(JSONModel, SortByNameMixin):
def has_permission(self, permission):
if permission not in self.ALL_PERMISSIONS:
raise KeyError(f'{permission} is not a service permission')
raise KeyError(f"{permission} is not a service permission")
return permission in self.permissions
def get_page_of_jobs(self, page):
@@ -146,7 +146,7 @@ class Service(JSONModel, SortByNameMixin):
@cached_property
def scheduled_job_stats(self):
if not self.has_jobs:
return {'count': 0}
return {"count": 0}
return job_api_client.get_scheduled_job_stats(self.id)
@cached_property
@@ -155,8 +155,7 @@ class Service(JSONModel, SortByNameMixin):
def invite_pending_for(self, email_address):
return email_address.lower() in (
invited_user.email_address.lower()
for invited_user in self.invited_users
invited_user.email_address.lower() for invited_user in self.invited_users
)
@cached_property
@@ -172,10 +171,16 @@ class Service(JSONModel, SortByNameMixin):
@cached_property
def has_team_members(self):
return len([
user for user in self.team_members
if user.has_permission_for_service(self.id, 'manage_service')
]) > 1
return (
len(
[
user
for user in self.team_members
if user.has_permission_for_service(self.id, "manage_service")
]
)
> 1
)
def cancel_invite(self, invited_user_id):
if str(invited_user_id) not in {user.id for user in self.invited_users}:
@@ -187,7 +192,6 @@ class Service(JSONModel, SortByNameMixin):
)
def get_team_member(self, user_id):
if str(user_id) not in {user.id for user in self.active_users}:
abort(404)
@@ -195,20 +199,22 @@ class Service(JSONModel, SortByNameMixin):
@cached_property
def all_templates(self):
templates = service_api_client.get_service_templates(self.id)['data']
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
template
for template in templates
if template["template_type"] in self.available_template_types
]
@cached_property
def all_template_ids(self):
return {template['id'] for template in self.all_templates}
return {template["id"] for template in self.all_templates}
def get_template(self, template_id, version=None):
return service_api_client.get_service_template(self.id, template_id, version)['data']
return service_api_client.get_service_template(self.id, template_id, version)[
"data"
]
def get_template_folder_with_user_permission_or_403(self, folder_id, user):
template_folder = self.get_template_folder(folder_id)
@@ -221,7 +227,7 @@ class Service(JSONModel, SortByNameMixin):
def get_template_with_user_permission_or_403(self, template_id, user):
template = self.get_template(template_id)
self.get_template_folder_with_user_permission_or_403(template['folder'], user)
self.get_template_folder_with_user_permission_or_403(template["folder"], user)
return template
@@ -238,32 +244,31 @@ class Service(JSONModel, SortByNameMixin):
@property
def has_multiple_template_types(self):
return len({
template['template_type'] for template in self.all_templates
}) > 1
return len({template["template_type"] for template in self.all_templates}) > 1
@property
def has_estimated_usage(self):
return (
self.consent_to_research is not None and any((
return self.consent_to_research is not None and any(
(
self.volume_email,
self.volume_sms,
))
)
)
def has_templates_of_type(self, template_type):
return any(
template for template in self.all_templates
if template['template_type'] == template_type
template
for template in self.all_templates
if template["template_type"] == template_type
)
@property
def has_email_templates(self):
return self.has_templates_of_type('email')
return self.has_templates_of_type("email")
@property
def has_sms_templates(self):
return self.has_templates_of_type('sms')
return self.has_templates_of_type("sms")
@property
def intending_to_send_email(self):
@@ -293,9 +298,11 @@ class Service(JSONModel, SortByNameMixin):
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
x["email_address"]
for x in self.email_reply_to_addresses
if x["is_default"]
),
None,
)
def get_email_reply_to_address(self, id):
@@ -315,15 +322,14 @@ class Service(JSONModel, SortByNameMixin):
@property
def sms_senders_with_hints(self):
def attach_hint(sender):
hints = []
if sender['is_default']:
if sender["is_default"]:
hints += ["default"]
if sender['inbound_number_id']:
if sender["inbound_number_id"]:
hints += ["receives replies"]
if hints:
sender['hint'] = "(" + " and ".join(hints) + ")"
sender["hint"] = "(" + " and ".join(hints) + ")"
return sender
return [attach_hint(sender) for sender in self.sms_senders]
@@ -338,39 +344,48 @@ class Service(JSONModel, SortByNameMixin):
@property
def sms_sender_is_govuk(self):
return self.default_sms_sender in {'GOVUK', 'None'}
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.intending_to_send_sms,
self.shouldnt_use_govuk_as_sms_sender,
self.sms_sender_is_govuk,
))
return all(
(
self.intending_to_send_sms,
self.shouldnt_use_govuk_as_sms_sender,
self.sms_sender_is_govuk,
)
)
@property
def volumes(self):
return sum(filter(None, (
self.volume_email,
self.volume_sms,
)))
return sum(
filter(
None,
(
self.volume_email,
self.volume_sms,
),
)
)
@property
def go_live_checklist_completed(self):
return all((
bool(self.volumes),
self.has_team_members,
self.has_templates,
not self.needs_to_add_email_reply_to_address,
not self.needs_to_change_sms_sender,
))
return all(
(
bool(self.volumes),
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'
return "Yes" if self.go_live_checklist_completed else "No"
@cached_property
def free_sms_fragment_limit(self):
@@ -381,36 +396,42 @@ class Service(JSONModel, SortByNameMixin):
return service_api_client.get_service_data_retention(self.id)
def get_data_retention_item(self, id):
return next(
(dr for dr in self.data_retention if dr['id'] == id),
None
)
return next((dr for dr in self.data_retention if dr["id"] == id), None)
def get_days_of_retention(self, notification_type):
return next(
(dr for dr in self.data_retention if dr['notification_type'] == notification_type),
{}
).get('days_of_retention', current_app.config['ACTIVITY_STATS_LIMIT_DAYS'])
(
dr
for dr in self.data_retention
if dr["notification_type"] == notification_type
),
{},
).get("days_of_retention", current_app.config["ACTIVITY_STATS_LIMIT_DAYS"])
@property
def email_branding_id(self):
return self._dict['email_branding']
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 email_branding_client.get_email_branding(self.email_branding_id)[
"email_branding"
]
return None
@cached_property
def email_branding_name(self):
if self.email_branding is None:
return 'GOV.UK'
return self.email_branding['name']
return "GOV.UK"
return self.email_branding["name"]
@property
def needs_to_change_email_branding(self):
return self.email_branding_id is None and self.organization_type != Organization.TYPE_CENTRAL
return (
self.email_branding_id is None
and self.organization_type != Organization.TYPE_CENTRAL
)
@cached_property
def organization(self):
@@ -418,11 +439,11 @@ class Service(JSONModel, SortByNameMixin):
@property
def organization_id(self):
return self._dict['organization']
return self._dict["organization"]
@property
def organization_type(self):
return self.organization.organization_type or self._dict['organization_type']
return self.organization.organization_type or self._dict["organization_type"]
@property
def organization_name(self):
@@ -436,7 +457,9 @@ class Service(JSONModel, SortByNameMixin):
@cached_property
def inbound_number(self):
return inbound_number_client.get_inbound_sms_number_for_service(self.id)['data'].get('number', '')
return inbound_number_client.get_inbound_sms_number_for_service(self.id)[
"data"
].get("number", "")
@property
def has_inbound_number(self):
@@ -444,7 +467,7 @@ class Service(JSONModel, SortByNameMixin):
@cached_property
def inbound_sms_summary(self):
if not self.has_permission('inbound_sms'):
if not self.has_permission("inbound_sms"):
return None
return service_api_client.get_inbound_sms_summary(self.id)
@@ -452,35 +475,34 @@ class Service(JSONModel, SortByNameMixin):
def all_template_folders(self):
return sorted(
template_folder_api_client.get_template_folders(self.id),
key=lambda folder: folder['name'].lower(),
key=lambda folder: folder["name"].lower(),
)
@cached_property
def all_template_folder_ids(self):
return {folder['id'] for folder in self.all_template_folders}
return {folder["id"] for folder in self.all_template_folders}
def get_template_folder(self, folder_id):
if folder_id is None:
return {
'id': None,
'name': 'Templates',
'parent_id': None,
"id": None,
"name": "Templates",
"parent_id": None,
}
return self._get_by_id(self.all_template_folders, folder_id)
def get_template_folder_path(self, template_folder_id):
folder = self.get_template_folder(template_folder_id)
if folder['id'] is None:
if folder["id"] is None:
return [folder]
return self.get_template_folder_path(folder['parent_id']) + [
self.get_template_folder(folder['id'])
return self.get_template_folder_path(folder["parent_id"]) + [
self.get_template_folder(folder["id"])
]
def get_template_path(self, template):
return self.get_template_folder_path(template['folder']) + [
return self.get_template_folder_path(template["folder"]) + [
template,
]
@@ -489,7 +511,6 @@ class Service(JSONModel, SortByNameMixin):
return len(self.all_templates + self.all_template_folders)
def move_to_folder(self, ids_to_move, move_to):
ids_to_move = set(ids_to_move)
template_folder_api_client.move_to_folder(
@@ -502,8 +523,8 @@ class Service(JSONModel, SortByNameMixin):
@cached_property
def api_keys(self):
return sorted(
api_key_api_client.get_api_keys(self.id)['apiKeys'],
key=lambda key: key['name'].lower(),
api_key_api_client.get_api_keys(self.id)["apiKeys"],
key=lambda key: key["name"].lower(),
)
def get_api_key(self, id):