From a91fde2fda5cb8d92678780e58fe8f4736edacfb Mon Sep 17 00:00:00 2001 From: Ben Thorner Date: Wed, 10 Mar 2021 13:55:06 +0000 Subject: [PATCH] Run auto-correct on app/ and tests/ --- app/__init__.py | 112 +++++++++----- app/accept_invite/rest.py | 18 +-- app/authentication/auth.py | 16 +- app/aws/s3.py | 5 +- app/billing/billing_schemas.py | 1 - app/billing/rest.py | 13 +- .../broadcast_message_schema.py | 2 +- app/broadcast_message/rest.py | 31 ++-- app/celery/broadcast_message_tasks.py | 22 ++- app/celery/celery.py | 5 +- app/celery/letters_pdf_tasks.py | 22 ++- app/celery/nightly_tasks.py | 25 ++-- app/celery/process_ses_receipts_tasks.py | 9 +- .../process_sms_client_response_tasks.py | 9 +- app/celery/provider_tasks.py | 2 +- app/celery/reporting_tasks.py | 11 +- app/celery/research_mode_tasks.py | 9 +- app/celery/scheduled_tasks.py | 52 ++++--- app/celery/service_callback_tasks.py | 6 +- app/celery/tasks.py | 46 +++--- app/clients/document_download.py | 1 - app/clients/email/__init__.py | 2 +- app/clients/email/aws_ses.py | 9 +- app/clients/email/aws_ses_stub.py | 4 +- .../performance_platform_client.py | 3 +- app/clients/sms/__init__.py | 2 +- app/clients/sms/firetext.py | 6 +- app/clients/sms/mmg.py | 6 +- app/cloudfoundry_config.py | 2 +- app/commands.py | 71 ++++++--- app/complaint/complaint_rest.py | 5 +- app/config.py | 4 +- app/cronitor.py | 3 +- app/dao/__init__.py | 1 + app/dao/annual_billing_dao.py | 2 +- app/dao/api_key_dao.py | 10 +- app/dao/broadcast_message_dao.py | 4 +- app/dao/broadcast_service_dao.py | 6 +- app/dao/date_util.py | 4 +- app/dao/fact_billing_dao.py | 25 ++-- app/dao/fact_notification_status_dao.py | 16 +- app/dao/inbound_sms_dao.py | 12 +- app/dao/invited_org_user_dao.py | 2 +- app/dao/invited_user_dao.py | 2 +- app/dao/jobs_dao.py | 27 ++-- app/dao/notifications_dao.py | 48 +++--- app/dao/organisation_dao.py | 4 +- app/dao/permissions_dao.py | 14 +- app/dao/provider_details_dao.py | 12 +- app/dao/provider_rates_dao.py | 2 +- app/dao/returned_letters_dao.py | 2 +- app/dao/service_callback_api_dao.py | 10 +- app/dao/service_inbound_api_dao.py | 2 +- app/dao/services_dao.py | 40 +++-- app/dao/templates_dao.py | 12 +- app/dao/uploads_dao.py | 13 +- app/dao/users_dao.py | 8 +- app/delivery/send_to_providers.py | 34 +++-- app/email_branding/rest.py | 12 +- app/errors.py | 10 +- app/events/rest.py | 11 +- app/hashing.py | 2 +- app/history_meta.py | 8 +- app/inbound_number/rest.py | 6 +- app/inbound_sms/rest.py | 20 ++- app/invite/rest.py | 19 ++- app/job/rest.py | 47 +++--- app/letter_branding/letter_branding_rest.py | 12 +- app/letters/rest.py | 3 +- app/letters/utils.py | 13 +- app/models.py | 53 +++---- .../notifications_letter_callback.py | 17 +-- .../notifications_ses_callback.py | 21 +-- .../notifications_sms_callback.py | 9 +- app/notifications/process_notifications.py | 29 ++-- app/notifications/receive_notifications.py | 6 +- app/notifications/rest.py | 36 ++--- app/notifications/utils.py | 2 +- app/notifications/validators.py | 54 ++++--- app/organisation/invite_rest.py | 19 ++- app/organisation/rest.py | 29 ++-- app/performance_dashboard/rest.py | 14 +- app/performance_platform/processing_time.py | 6 +- .../total_sent_notifications.py | 4 +- app/platform_stats/rest.py | 13 +- app/provider_details/rest.py | 13 +- app/schema_validation/__init__.py | 12 +- app/schemas.py | 38 +++-- app/serialised_models.py | 1 - app/service/callback_rest.py | 39 ++--- app/service/rest.py | 139 +++++++++--------- app/service/send_notification.py | 45 +++--- app/service/sender.py | 10 +- app/service/service_callback_api_schema.py | 2 +- app/service/statistics.py | 2 +- app/service/utils.py | 13 +- app/status/healthcheck.py | 8 +- app/template/rest.py | 42 +++--- app/template/template_schemas.py | 5 +- app/template_folder/rest.py | 24 +-- app/template_statistics/rest.py | 7 +- app/upload/rest.py | 21 +-- app/user/rest.py | 83 ++++++----- app/utils.py | 18 ++- app/v2/broadcast/__init__.py | 1 + app/v2/broadcast/post_broadcast.py | 6 +- app/v2/errors.py | 2 +- app/v2/inbound_sms/__init__.py | 1 + app/v2/inbound_sms/get_inbound_sms.py | 2 +- app/v2/inbound_sms/inbound_sms_schemas.py | 1 - app/v2/notifications/__init__.py | 1 + app/v2/notifications/get_notifications.py | 17 ++- app/v2/notifications/notification_schemas.py | 5 +- app/v2/notifications/post_notifications.py | 40 ++--- app/v2/template/post_template.py | 2 +- app/v2/template/template_schemas.py | 3 +- app/v2/templates/templates_schemas.py | 5 +- app/v2/utils.py | 2 +- app/xml_schemas/__init__.py | 3 +- tests/__init__.py | 2 +- .../accept_invite/test_accept_invite_rest.py | 3 +- .../app/authentication/test_authentication.py | 34 +++-- tests/app/aws/test_s3.py | 6 +- tests/app/billing/test_billing.py | 20 +-- tests/app/broadcast_message/test_rest.py | 22 ++- .../celery/test_broadcast_message_tasks.py | 30 ++-- tests/app/celery/test_ftp_update_tasks.py | 39 ++--- tests/app/celery/test_letters_pdf_tasks.py | 25 ++-- tests/app/celery/test_nightly_tasks.py | 26 ++-- .../celery/test_process_ses_receipts_tasks.py | 14 +- tests/app/celery/test_provider_tasks.py | 9 +- tests/app/celery/test_reporting_tasks.py | 24 +-- tests/app/celery/test_research_mode_tasks.py | 21 ++- tests/app/celery/test_scheduled_tasks.py | 24 ++- .../app/celery/test_service_callback_tasks.py | 9 +- tests/app/celery/test_tasks.py | 64 ++++---- tests/app/clients/test_aws_ses.py | 9 +- tests/app/clients/test_cbc_proxy.py | 12 +- tests/app/clients/test_document_download.py | 7 +- tests/app/clients/test_firetext.py | 10 +- tests/app/clients/test_mmg.py | 3 +- .../app/clients/test_performance_platform.py | 6 +- .../test_performance_platform_commands.py | 5 +- tests/app/complaint/test_complaint_rest.py | 9 +- tests/app/conftest.py | 51 ++++--- .../notification_dao/test_notification_dao.py | 40 ++--- ...t_notification_dao_delete_notifications.py | 16 +- ...t_notification_dao_performance_platform.py | 5 +- .../test_notification_dao_template_usage.py | 3 +- tests/app/dao/test_annual_billing_dao.py | 3 +- tests/app/dao/test_api_key_dao.py | 8 +- tests/app/dao/test_broadcast_message_dao.py | 12 +- tests/app/dao/test_complaint_dao.py | 8 +- tests/app/dao/test_date_utils.py | 6 +- tests/app/dao/test_email_branding_dao.py | 3 +- tests/app/dao/test_events_dao.py | 1 - .../dao/test_fact_notification_status_dao.py | 33 +++-- .../app/dao/test_fact_processing_time_dao.py | 4 +- tests/app/dao/test_ft_billing_dao.py | 38 ++--- tests/app/dao/test_inbound_numbers_dao.py | 12 +- tests/app/dao/test_inbound_sms_dao.py | 14 +- tests/app/dao/test_invited_user_dao.py | 12 +- tests/app/dao/test_jobs_dao.py | 16 +- tests/app/dao/test_letter_branding_dao.py | 4 +- tests/app/dao/test_organisation_dao.py | 11 +- tests/app/dao/test_provider_details_dao.py | 24 ++- tests/app/dao/test_provider_rates_dao.py | 3 +- tests/app/dao/test_returned_letters_dao.py | 8 +- .../app/dao/test_service_callback_api_dao.py | 7 +- .../dao/test_service_data_retention_dao.py | 4 +- .../dao/test_service_email_reply_to_dao.py | 3 +- tests/app/dao/test_service_guest_list_dao.py | 10 +- tests/app/dao/test_service_inbound_api_dao.py | 7 +- .../dao/test_service_letter_contact_dao.py | 5 +- tests/app/dao/test_service_permissions_dao.py | 16 +- tests/app/dao/test_service_sms_sender_dao.py | 8 +- tests/app/dao/test_services_dao.py | 122 +++++++++------ tests/app/dao/test_template_folder_dao.py | 5 +- tests/app/dao/test_templates_dao.py | 14 +- tests/app/dao/test_uploads_dao.py | 16 +- tests/app/dao/test_users_dao.py | 37 +++-- tests/app/db.py | 77 +++++----- tests/app/delivery/test_send_to_providers.py | 28 ++-- tests/app/email_branding/test_rest.py | 2 +- tests/app/events/test_rest.py | 1 + tests/app/inbound_number/test_rest.py | 3 +- tests/app/inbound_sms/test_rest.py | 5 +- tests/app/invite/test_invite_rest.py | 3 +- tests/app/job/test_rest.py | 9 +- tests/app/letters/test_letter_utils.py | 17 ++- .../rest/test_send_notification.py | 30 ++-- .../test_notifications_ses_callback.py | 8 +- .../test_process_client_response.py | 8 +- .../test_process_letter_notifications.py | 8 +- .../test_process_notification.py | 19 ++- .../test_receive_notification.py | 15 +- tests/app/notifications/test_rest.py | 11 +- tests/app/notifications/test_validators.py | 47 +++--- tests/app/organisation/test_invite_rest.py | 3 +- tests/app/organisation/test_rest.py | 14 +- tests/app/performance_dashboard/test_rest.py | 7 +- .../test_processing_time.py | 6 +- .../test_total_sent_notifications.py | 7 +- tests/app/platform_stats/test_rest.py | 13 +- tests/app/provider_details/test_rest.py | 1 - tests/app/public_contracts/__init__.py | 2 +- .../public_contracts/test_GET_notification.py | 10 +- .../test_POST_notification.py | 3 +- tests/app/service/test_api_key_endpoints.py | 2 +- tests/app/service/test_archived_service.py | 7 +- tests/app/service/test_callback_rest.py | 8 +- tests/app/service/test_rest.py | 69 ++++----- tests/app/service/test_schema.py | 3 +- .../service/test_send_one_off_notification.py | 17 ++- .../test_send_pdf_letter_notification.py | 2 +- tests/app/service/test_sender.py | 4 +- .../service/test_service_contact_list_rest.py | 6 +- tests/app/service/test_service_guest_list.py | 12 +- tests/app/service/test_statistics.py | 4 +- tests/app/service/test_statistics_rest.py | 15 +- .../service/test_suspend_resume_service.py | 4 +- tests/app/service/test_utils.py | 3 +- tests/app/template/test_rest.py | 20 ++- tests/app/template/test_rest_history.py | 4 +- .../test_template_folder_rest.py | 8 +- tests/app/test_cloudfoundry_config.py | 7 +- tests/app/test_config.py | 2 +- tests/app/test_cronitor.py | 3 +- tests/app/test_model.py | 24 ++- tests/app/test_schemas.py | 5 +- tests/app/test_utils.py | 7 +- tests/app/upload/test_rest.py | 11 +- tests/app/user/test_rest.py | 30 ++-- tests/app/user/test_rest_verify.py | 22 +-- tests/app/v2/broadcast/test_post_broadcast.py | 14 +- .../v2/inbound_sms/test_get_inbound_sms.py | 6 +- .../inbound_sms/test_inbound_sms_schemas.py | 5 +- .../notifications/test_get_notifications.py | 6 +- .../test_notification_schemas.py | 11 +- .../test_post_letter_notifications.py | 14 +- .../notifications/test_post_notifications.py | 19 +-- tests/app/v2/template/test_get_template.py | 5 +- tests/app/v2/template/test_post_template.py | 1 - .../app/v2/template/test_template_schemas.py | 17 +-- tests/app/v2/templates/test_get_templates.py | 8 +- .../v2/templates/test_templates_schemas.py | 13 +- tests/app/v2/test_errors.py | 3 +- tests/conftest.py | 8 +- 248 files changed, 2026 insertions(+), 1716 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 0aabb5e6d..54f92a655 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,22 +1,30 @@ -import time import os import random import string +import time import uuid +from time import monotonic from celery import current_task -from flask import _request_ctx_stack, request, g, jsonify, make_response, current_app, has_request_context -from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy +from flask import ( + _request_ctx_stack, + current_app, + g, + has_request_context, + jsonify, + make_response, + request, +) from flask_marshmallow import Marshmallow from flask_migrate import Migrate +from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy from gds_metrics import GDSMetrics from gds_metrics.metrics import Gauge, Histogram -from time import monotonic -from notifications_utils.clients.zendesk.zendesk_client import ZendeskClient -from notifications_utils.clients.statsd.statsd_client import StatsdClient -from notifications_utils.clients.redis.redis_client import RedisClient -from notifications_utils.clients.encryption.encryption_client import Encryption from notifications_utils import logging, request_helper +from notifications_utils.clients.encryption.encryption_client import Encryption +from notifications_utils.clients.redis.redis_client import RedisClient +from notifications_utils.clients.statsd.statsd_client import StatsdClient +from notifications_utils.clients.zendesk.zendesk_client import ZendeskClient from sqlalchemy import event from werkzeug.exceptions import HTTPException as WerkzeugHTTPException from werkzeug.local import LocalProxy @@ -27,9 +35,11 @@ from app.clients.cbc_proxy import CBCProxyClient from app.clients.document_download import DocumentDownloadClient from app.clients.email.aws_ses import AwsSesClient from app.clients.email.aws_ses_stub import AwsSesStubClient +from app.clients.performance_platform.performance_platform_client import ( + PerformancePlatformClient, +) from app.clients.sms.firetext import FiretextClient from app.clients.sms.mmg import MMGClient -from app.clients.performance_platform.performance_platform_client import PerformancePlatformClient class SQLAlchemy(_SQLAlchemy): @@ -126,36 +136,52 @@ def create_app(application): def register_blueprint(application): - from app.service.rest import service_blueprint - from app.service.callback_rest import service_callback_blueprint - from app.user.rest import user_blueprint - from app.template.rest import template_blueprint - from app.status.healthcheck import status as status_blueprint - from app.job.rest import job_blueprint - from app.notifications.rest import notifications as notifications_blueprint - from app.invite.rest import invite as invite_blueprint from app.accept_invite.rest import accept_invite - from app.template_statistics.rest import template_statistics as template_statistics_blueprint - from app.events.rest import events as events_blueprint - from app.provider_details.rest import provider_details as provider_details_blueprint + from app.authentication.auth import ( + requires_admin_auth, + requires_auth, + requires_no_auth, + ) + from app.billing.rest import billing_blueprint + from app.broadcast_message.rest import broadcast_message_blueprint + from app.complaint.complaint_rest import complaint_blueprint from app.email_branding.rest import email_branding_blueprint + from app.events.rest import events as events_blueprint from app.inbound_number.rest import inbound_number_blueprint from app.inbound_sms.rest import inbound_sms as inbound_sms_blueprint - from app.notifications.receive_notifications import receive_notifications_blueprint - from app.notifications.notifications_sms_callback import sms_callback_blueprint - from app.notifications.notifications_letter_callback import letter_callback_blueprint - from app.authentication.auth import requires_admin_auth, requires_auth, requires_no_auth + from app.invite.rest import invite as invite_blueprint + from app.job.rest import job_blueprint + from app.letter_branding.letter_branding_rest import ( + letter_branding_blueprint, + ) from app.letters.rest import letter_job - from app.billing.rest import billing_blueprint - from app.organisation.rest import organisation_blueprint + from app.notifications.notifications_letter_callback import ( + letter_callback_blueprint, + ) + from app.notifications.notifications_sms_callback import ( + sms_callback_blueprint, + ) + from app.notifications.receive_notifications import ( + receive_notifications_blueprint, + ) + from app.notifications.rest import notifications as notifications_blueprint from app.organisation.invite_rest import organisation_invite_blueprint - from app.complaint.complaint_rest import complaint_blueprint + from app.organisation.rest import organisation_blueprint from app.performance_dashboard.rest import performance_dashboard_blueprint from app.platform_stats.rest import platform_stats_blueprint + from app.provider_details.rest import ( + provider_details as provider_details_blueprint, + ) + from app.service.callback_rest import service_callback_blueprint + from app.service.rest import service_blueprint + from app.status.healthcheck import status as status_blueprint + from app.template.rest import template_blueprint from app.template_folder.rest import template_folder_blueprint - from app.letter_branding.letter_branding_rest import letter_branding_blueprint + from app.template_statistics.rest import ( + template_statistics as template_statistics_blueprint, + ) from app.upload.rest import upload_blueprint - from app.broadcast_message.rest import broadcast_message_blueprint + from app.user.rest import user_blueprint service_blueprint.before_request(requires_admin_auth) application.register_blueprint(service_blueprint, url_prefix='/service') @@ -249,14 +275,28 @@ def register_blueprint(application): def register_v2_blueprints(application): - from app.v2.inbound_sms.get_inbound_sms import v2_inbound_sms_blueprint as get_inbound_sms - from app.v2.notifications.post_notifications import v2_notification_blueprint as post_notifications - from app.v2.notifications.get_notifications import v2_notification_blueprint as get_notifications - from app.v2.template.get_template import v2_template_blueprint as get_template - from app.v2.templates.get_templates import v2_templates_blueprint as get_templates - from app.v2.template.post_template import v2_template_blueprint as post_template - from app.v2.broadcast.post_broadcast import v2_broadcast_blueprint as post_broadcast from app.authentication.auth import requires_auth + from app.v2.broadcast.post_broadcast import ( + v2_broadcast_blueprint as post_broadcast, + ) + from app.v2.inbound_sms.get_inbound_sms import ( + v2_inbound_sms_blueprint as get_inbound_sms, + ) + from app.v2.notifications.get_notifications import ( + v2_notification_blueprint as get_notifications, + ) + from app.v2.notifications.post_notifications import ( + v2_notification_blueprint as post_notifications, + ) + from app.v2.template.get_template import ( + v2_template_blueprint as get_template, + ) + from app.v2.template.post_template import ( + v2_template_blueprint as post_template, + ) + from app.v2.templates.get_templates import ( + v2_templates_blueprint as get_templates, + ) post_notifications.before_request(requires_auth) application.register_blueprint(post_notifications) diff --git a/app/accept_invite/rest.py b/app/accept_invite/rest.py index 0485fc58a..5bb34c3fe 100644 --- a/app/accept_invite/rest.py +++ b/app/accept_invite/rest.py @@ -1,24 +1,12 @@ -from flask import ( - Blueprint, - jsonify, - current_app -) - -from itsdangerous import SignatureExpired, BadData - +from flask import Blueprint, current_app, jsonify +from itsdangerous import BadData, SignatureExpired from notifications_utils.url_safe_token import check_token from app.dao.invited_user_dao import get_invited_user_by_id from app.dao.organisation_dao import dao_get_invited_organisation_user - -from app.errors import ( - register_errors, - InvalidRequest -) - +from app.errors import InvalidRequest, register_errors from app.schemas import invited_user_schema - accept_invite = Blueprint('accept_invite', __name__) register_errors(accept_invite) diff --git a/app/authentication/auth.py b/app/authentication/auth.py index e26edee48..c9efab976 100644 --- a/app/authentication/auth.py +++ b/app/authentication/auth.py @@ -1,16 +1,22 @@ -from flask import request, _request_ctx_stack, current_app, g -from notifications_python_client.authentication import decode_jwt_token, get_token_issuer +from flask import _request_ctx_stack, current_app, g, request +from gds_metrics import Histogram +from notifications_python_client.authentication import ( + decode_jwt_token, + get_token_issuer, +) from notifications_python_client.errors import ( - TokenDecodeError, TokenExpiredError, TokenIssuerError, TokenAlgorithmError, TokenError + TokenAlgorithmError, + TokenDecodeError, + TokenError, + TokenExpiredError, + TokenIssuerError, ) from notifications_utils import request_helper from sqlalchemy.exc import DataError from sqlalchemy.orm.exc import NoResultFound -from gds_metrics import Histogram from app.serialised_models import SerialisedService - GENERAL_TOKEN_ERROR_MESSAGE = 'Invalid token: make sure your API token matches the example at https://docs.notifications.service.gov.uk/rest-api.html#authorisation-header' # noqa AUTH_DB_CONNECTION_DURATION_SECONDS = Histogram( diff --git a/app/aws/s3.py b/app/aws/s3.py index 3b896e4ac..5957ff870 100644 --- a/app/aws/s3.py +++ b/app/aws/s3.py @@ -1,7 +1,6 @@ -from flask import current_app - -from boto3 import client, resource import botocore +from boto3 import client, resource +from flask import current_app FILE_LOCATION_STRUCTURE = 'service-{}-notify/{}.csv' diff --git a/app/billing/billing_schemas.py b/app/billing/billing_schemas.py index 87f03eda2..9ab8cedbf 100644 --- a/app/billing/billing_schemas.py +++ b/app/billing/billing_schemas.py @@ -1,6 +1,5 @@ from datetime import datetime - create_or_update_free_sms_fragment_limit_schema = { "$schema": "http://json-schema.org/draft-04/schema#", "description": "POST annual billing schema", diff --git a/app/billing/rest.py b/app/billing/rest.py index 13f34bf37..3f5f6e08c 100644 --- a/app/billing/rest.py +++ b/app/billing/rest.py @@ -6,18 +6,17 @@ from app.billing.billing_schemas import ( serialize_ft_billing_yearly_totals, ) from app.dao.annual_billing_dao import ( - dao_get_free_sms_fragment_limit_for_year, - dao_get_all_free_sms_fragment_limit, dao_create_or_update_annual_billing_for_year, - dao_update_annual_billing_for_future_years + dao_get_all_free_sms_fragment_limit, + dao_get_free_sms_fragment_limit_for_year, + dao_update_annual_billing_for_future_years, ) from app.dao.date_util import get_current_financial_year_start_year from app.dao.fact_billing_dao import ( - fetch_monthly_billing_for_year, fetch_billing_totals_for_year, + fetch_billing_totals_for_year, + fetch_monthly_billing_for_year, ) - -from app.errors import InvalidRequest -from app.errors import register_errors +from app.errors import InvalidRequest, register_errors from app.schema_validation import validate billing_blueprint = Blueprint( diff --git a/app/broadcast_message/broadcast_message_schema.py b/app/broadcast_message/broadcast_message_schema.py index 4fe75b9be..09eff203b 100644 --- a/app/broadcast_message/broadcast_message_schema.py +++ b/app/broadcast_message/broadcast_message_schema.py @@ -1,5 +1,5 @@ -from app.schema_validation.definitions import uuid from app.models import BroadcastStatusType +from app.schema_validation.definitions import uuid create_broadcast_message_schema = { '$schema': 'http://json-schema.org/draft-04/schema#', diff --git a/app/broadcast_message/rest.py b/app/broadcast_message/rest.py index 5c61f66d4..9d8dffaa5 100644 --- a/app/broadcast_message/rest.py +++ b/app/broadcast_message/rest.py @@ -1,25 +1,30 @@ from datetime import datetime import iso8601 +from flask import Blueprint, current_app, jsonify, request -from flask import Blueprint, jsonify, request, current_app -from app.config import QueueNames -from app.dao.dao_utils import dao_save_object -from app.dao.templates_dao import dao_get_template_by_id_and_service_id -from app.dao.users_dao import get_user_by_id -from app.dao.broadcast_message_dao import ( - dao_get_broadcast_message_by_id_and_service_id, - dao_get_broadcast_messages_for_service, -) -from app.dao.services_dao import dao_fetch_service_by_id -from app.errors import register_errors, InvalidRequest -from app.models import BroadcastMessage, BroadcastStatusType, BroadcastEvent, BroadcastEventMessageType -from app.celery.broadcast_message_tasks import send_broadcast_event from app.broadcast_message.broadcast_message_schema import ( create_broadcast_message_schema, update_broadcast_message_schema, update_broadcast_message_status_schema, ) +from app.celery.broadcast_message_tasks import send_broadcast_event +from app.config import QueueNames +from app.dao.broadcast_message_dao import ( + dao_get_broadcast_message_by_id_and_service_id, + dao_get_broadcast_messages_for_service, +) +from app.dao.dao_utils import dao_save_object +from app.dao.services_dao import dao_fetch_service_by_id +from app.dao.templates_dao import dao_get_template_by_id_and_service_id +from app.dao.users_dao import get_user_by_id +from app.errors import InvalidRequest, register_errors +from app.models import ( + BroadcastEvent, + BroadcastEventMessageType, + BroadcastMessage, + BroadcastStatusType, +) from app.schema_validation import validate broadcast_message_blueprint = Blueprint( diff --git a/app/celery/broadcast_message_tasks.py b/app/celery/broadcast_message_tasks.py index adce949d3..fe0e66c37 100644 --- a/app/celery/broadcast_message_tasks.py +++ b/app/celery/broadcast_message_tasks.py @@ -6,15 +6,21 @@ from notifications_utils.statsd_decorators import statsd from sqlalchemy.schema import Sequence from app import cbc_proxy_client, db, notify_celery -from app.clients.cbc_proxy import CBCProxyFatalException, CBCProxyRetryableException -from app.config import QueueNames -from app.models import BroadcastEventMessageType, BroadcastProvider, BroadcastProviderMessageStatus -from app.dao.broadcast_message_dao import ( - dao_get_broadcast_event_by_id, - create_broadcast_provider_message, - update_broadcast_provider_message_status +from app.clients.cbc_proxy import ( + CBCProxyFatalException, + CBCProxyRetryableException, +) +from app.config import QueueNames +from app.dao.broadcast_message_dao import ( + create_broadcast_provider_message, + dao_get_broadcast_event_by_id, + update_broadcast_provider_message_status, +) +from app.models import ( + BroadcastEventMessageType, + BroadcastProvider, + BroadcastProviderMessageStatus, ) - from app.utils import format_sequential_number diff --git a/app/celery/celery.py b/app/celery/celery.py index 37c240307..6018319c8 100644 --- a/app/celery/celery.py +++ b/app/celery/celery.py @@ -1,9 +1,10 @@ import time -from gds_metrics.metrics import Histogram + from celery import Celery, Task from celery.signals import worker_process_shutdown from flask import g, request -from flask.ctx import has_request_context, has_app_context +from flask.ctx import has_app_context, has_request_context +from gds_metrics.metrics import Histogram @worker_process_shutdown.connect diff --git a/app/celery/letters_pdf_tasks.py b/app/celery/letters_pdf_tasks.py index e7b453364..ff4d236ed 100644 --- a/app/celery/letters_pdf_tasks.py +++ b/app/celery/letters_pdf_tasks.py @@ -1,18 +1,18 @@ +from base64 import urlsafe_b64encode from datetime import datetime, timedelta from hashlib import sha512 -from base64 import urlsafe_b64encode from botocore.exceptions import ClientError as BotoClientError from flask import current_app -from notifications_utils.postal_address import PostalAddress - -from notifications_utils.statsd_decorators import statsd from notifications_utils.letter_timings import LETTER_PROCESSING_DEADLINE +from notifications_utils.postal_address import PostalAddress +from notifications_utils.statsd_decorators import statsd from notifications_utils.timezones import convert_utc_to_bst from app import encryption, notify_celery from app.aws import s3 from app.config import QueueNames, TaskNames +from app.cronitor import cronitor from app.dao.notifications_dao import ( dao_get_letters_and_sheets_volume_by_postage, dao_get_letters_to_be_printed, @@ -23,18 +23,18 @@ from app.dao.notifications_dao import ( update_notification_status_by_id, ) from app.dao.templates_dao import dao_get_template_by_id -from app.letters.utils import get_letter_pdf_filename from app.errors import VirusScanError from app.exceptions import NotificationTechnicalFailureException from app.letters.utils import ( - get_billable_units_for_letter_page_count, - get_reference_from_filename, ScanErrorType, + get_billable_units_for_letter_page_count, + get_file_names_from_error_bucket, + get_letter_pdf_filename, + get_reference_from_filename, + move_error_pdf_to_scan_bucket, move_failed_pdf, move_sanitised_letter_to_test_or_live_pdf_bucket, move_scan_to_invalid_pdf_bucket, - move_error_pdf_to_scan_bucket, - get_file_names_from_error_bucket, ) from app.models import ( INTERNATIONAL_LETTERS, @@ -52,8 +52,6 @@ from app.models import ( Service, ) -from app.cronitor import cronitor - @notify_celery.task(bind=True, name="get-pdf-for-templated-letter", max_retries=15, default_retry_delay=300) @statsd(namespace="tasks") @@ -214,7 +212,7 @@ def send_letters_volume_email_to_dvla(letters_volumes, date): # avoid circular imports: from app.notifications.process_notifications import ( persist_notification, - send_notification_to_queue + send_notification_to_queue, ) for recipient in recipients: saved_notification = persist_notification( diff --git a/app/celery/nightly_tasks.py b/app/celery/nightly_tasks.py index 77ca1debb..e7e167ba0 100644 --- a/app/celery/nightly_tasks.py +++ b/app/celery/nightly_tasks.py @@ -1,7 +1,4 @@ -from datetime import ( - datetime, - timedelta -) +from datetime import datetime, timedelta import pytz from flask import current_app @@ -12,31 +9,33 @@ from sqlalchemy.exc import SQLAlchemyError from app import notify_celery, performance_platform_client, zendesk_client from app.aws import s3 from app.celery.service_callback_tasks import ( - send_delivery_status_to_service, create_delivery_status_callback_data, + send_delivery_status_to_service, ) from app.config import QueueNames +from app.cronitor import cronitor from app.dao.inbound_sms_dao import delete_inbound_sms_older_than_retention from app.dao.jobs_dao import ( + dao_archive_job, dao_get_jobs_older_than_data_retention, - dao_archive_job ) from app.dao.notifications_dao import ( dao_timeout_notifications, delete_notifications_older_than_retention_by_type, ) -from app.dao.service_callback_api_dao import get_service_delivery_status_callback_api_for_service +from app.dao.service_callback_api_dao import ( + get_service_delivery_status_callback_api_for_service, +) from app.exceptions import NotificationTechnicalFailureException from app.models import ( - Notification, - NOTIFICATION_SENDING, EMAIL_TYPE, - SMS_TYPE, + KEY_TYPE_NORMAL, LETTER_TYPE, - KEY_TYPE_NORMAL + NOTIFICATION_SENDING, + SMS_TYPE, + Notification, ) -from app.performance_platform import total_sent_notifications, processing_time -from app.cronitor import cronitor +from app.performance_platform import processing_time, total_sent_notifications from app.utils import get_london_midnight_in_utc diff --git a/app/celery/process_ses_receipts_tasks.py b/app/celery/process_ses_receipts_tasks.py index 153835287..f74581304 100644 --- a/app/celery/process_ses_receipts_tasks.py +++ b/app/celery/process_ses_receipts_tasks.py @@ -7,16 +7,15 @@ from notifications_utils.statsd_decorators import statsd from sqlalchemy.orm.exc import NoResultFound from app import notify_celery, statsd_client -from app.config import QueueNames from app.clients.email.aws_ses import get_aws_responses +from app.config import QueueNames from app.dao import notifications_dao -from app.models import NOTIFICATION_SENDING, NOTIFICATION_PENDING - +from app.models import NOTIFICATION_PENDING, NOTIFICATION_SENDING from app.notifications.notifications_ses_callback import ( + _check_and_queue_callback_task, + _check_and_queue_complaint_callback_task, determine_notification_bounce_type, handle_complaint, - _check_and_queue_complaint_callback_task, - _check_and_queue_callback_task, ) diff --git a/app/celery/process_sms_client_response_tasks.py b/app/celery/process_sms_client_response_tasks.py index d4ce57637..1aef5c699 100644 --- a/app/celery/process_sms_client_response_tasks.py +++ b/app/celery/process_sms_client_response_tasks.py @@ -6,13 +6,18 @@ from notifications_utils.statsd_decorators import statsd from notifications_utils.template import SMSMessageTemplate from app import notify_celery, statsd_client +from app.celery.service_callback_tasks import ( + create_delivery_status_callback_data, + send_delivery_status_to_service, +) from app.clients import ClientException from app.clients.sms.firetext import get_firetext_responses from app.clients.sms.mmg import get_mmg_responses -from app.celery.service_callback_tasks import send_delivery_status_to_service, create_delivery_status_callback_data from app.config import QueueNames from app.dao import notifications_dao -from app.dao.service_callback_api_dao import get_service_delivery_status_callback_api_for_service +from app.dao.service_callback_api_dao import ( + get_service_delivery_status_callback_api_for_service, +) from app.dao.templates_dao import dao_get_template_by_id from app.models import NOTIFICATION_PENDING diff --git a/app/celery/provider_tasks.py b/app/celery/provider_tasks.py index 60c01d201..841b9b63e 100644 --- a/app/celery/provider_tasks.py +++ b/app/celery/provider_tasks.py @@ -3,10 +3,10 @@ from notifications_utils.statsd_decorators import statsd from sqlalchemy.orm.exc import NoResultFound from app import notify_celery -from app.config import QueueNames from app.clients.email import EmailClientNonRetryableException from app.clients.email.aws_ses import AwsSesClientThrottlingSendRateException from app.clients.sms import SmsClientResponseException +from app.config import QueueNames from app.dao import notifications_dao from app.dao.notifications_dao import update_notification_status_by_id from app.delivery import send_to_providers diff --git a/app/celery/reporting_tasks.py b/app/celery/reporting_tasks.py index 9077747a1..38f25f805 100644 --- a/app/celery/reporting_tasks.py +++ b/app/celery/reporting_tasks.py @@ -9,14 +9,13 @@ from app.config import QueueNames from app.cronitor import cronitor from app.dao.fact_billing_dao import ( fetch_billing_data_for_day, - update_fact_billing + update_fact_billing, ) -from app.dao.fact_notification_status_dao import fetch_notification_status_for_day, update_fact_notification_status -from app.models import ( - SMS_TYPE, - EMAIL_TYPE, - LETTER_TYPE, +from app.dao.fact_notification_status_dao import ( + fetch_notification_status_for_day, + update_fact_notification_status, ) +from app.models import EMAIL_TYPE, LETTER_TYPE, SMS_TYPE @notify_celery.task(name="create-nightly-billing") diff --git a/app/celery/research_mode_tasks.py b/app/celery/research_mode_tasks.py index 8cfc243c8..db68a2fe4 100644 --- a/app/celery/research_mode_tasks.py +++ b/app/celery/research_mode_tasks.py @@ -1,17 +1,16 @@ +import json import random from datetime import datetime, timedelta -import json from flask import current_app -from requests import request, HTTPError - from notifications_utils.s3 import s3upload +from requests import HTTPError, request from app import notify_celery from app.aws.s3 import file_exists -from app.models import SMS_TYPE -from app.config import QueueNames from app.celery.process_ses_receipts_tasks import process_ses_results +from app.config import QueueNames +from app.models import SMS_TYPE temp_fail = "7700900003" perm_fail = "7700900002" diff --git a/app/celery/scheduled_tasks.py b/app/celery/scheduled_tasks.py index fff549317..93ba9e8a5 100644 --- a/app/celery/scheduled_tasks.py +++ b/app/celery/scheduled_tasks.py @@ -1,9 +1,5 @@ import uuid - -from datetime import ( - datetime, - timedelta -) +from datetime import datetime, timedelta from flask import current_app from notifications_utils.statsd_decorators import statsd @@ -11,41 +7,49 @@ from sqlalchemy import and_ from sqlalchemy.exc import SQLAlchemyError from app import cbc_proxy_client, notify_celery, zendesk_client -from app.celery.tasks import ( - process_job, - get_recipient_csv_and_template_and_sender_id, - process_row, - process_incomplete_jobs) -from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter from app.celery.broadcast_message_tasks import trigger_link_test +from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter +from app.celery.tasks import ( + get_recipient_csv_and_template_and_sender_id, + process_incomplete_jobs, + process_job, + process_row, +) from app.config import QueueNames -from app.dao.invited_org_user_dao import delete_org_invitations_created_more_than_two_days_ago -from app.dao.invited_user_dao import delete_invitations_created_more_than_two_days_ago +from app.dao.invited_org_user_dao import ( + delete_org_invitations_created_more_than_two_days_ago, +) +from app.dao.invited_user_dao import ( + delete_invitations_created_more_than_two_days_ago, +) from app.dao.jobs_dao import ( dao_set_scheduled_jobs_to_pending, + dao_update_job, find_jobs_with_missing_rows, - find_missing_row_for_job + find_missing_row_for_job, ) -from app.dao.jobs_dao import dao_update_job from app.dao.notifications_dao import ( - notifications_not_yet_sent, - dao_precompiled_letters_still_pending_virus_check, dao_old_letters_with_created_status, - letters_missing_from_sending_bucket, + dao_precompiled_letters_still_pending_virus_check, is_delivery_slow_for_providers, + letters_missing_from_sending_bucket, + notifications_not_yet_sent, ) from app.dao.provider_details_dao import ( + dao_adjust_provider_priority_back_to_resting_points, dao_reduce_sms_provider_priority, - dao_adjust_provider_priority_back_to_resting_points +) +from app.dao.services_dao import ( + dao_find_services_sending_to_tv_numbers, + dao_find_services_with_high_failure_rates, ) from app.dao.users_dao import delete_codes_older_created_more_than_a_day_ago -from app.dao.services_dao import dao_find_services_sending_to_tv_numbers, dao_find_services_with_high_failure_rates from app.models import ( - Job, - JOB_STATUS_IN_PROGRESS, - JOB_STATUS_ERROR, - SMS_TYPE, EMAIL_TYPE, + JOB_STATUS_ERROR, + JOB_STATUS_IN_PROGRESS, + SMS_TYPE, + Job, ) from app.notifications.process_notifications import send_notification_to_queue diff --git a/app/celery/service_callback_tasks.py b/app/celery/service_callback_tasks.py index ef7b0609c..e648a8dfa 100644 --- a/app/celery/service_callback_tasks.py +++ b/app/celery/service_callback_tasks.py @@ -2,11 +2,7 @@ import json from flask import current_app from notifications_utils.statsd_decorators import statsd -from requests import ( - HTTPError, - request, - RequestException -) +from requests import HTTPError, RequestException, request from app import encryption, notify_celery from app.config import QueueNames diff --git a/app/celery/tasks.py b/app/celery/tasks.py index 1145f8e0e..9650eb487 100644 --- a/app/celery/tasks.py +++ b/app/celery/tasks.py @@ -1,6 +1,6 @@ import json +from collections import defaultdict, namedtuple from datetime import datetime -from collections import namedtuple, defaultdict from flask import current_app from notifications_utils.columns import Columns @@ -8,36 +8,28 @@ from notifications_utils.postal_address import PostalAddress from notifications_utils.recipients import RecipientCSV from notifications_utils.statsd_decorators import statsd from notifications_utils.timezones import convert_utc_to_bst -from requests import ( - HTTPError, - request, - RequestException -) -from sqlalchemy.exc import SQLAlchemyError, IntegrityError +from requests import HTTPError, RequestException, request +from sqlalchemy.exc import IntegrityError, SQLAlchemyError -from app import ( - create_uuid, - create_random_identifier, - encryption, - notify_celery, -) +from app import create_random_identifier, create_uuid, encryption, notify_celery from app.aws import s3 -from app.celery import provider_tasks, letters_pdf_tasks, research_mode_tasks +from app.celery import letters_pdf_tasks, provider_tasks, research_mode_tasks from app.config import QueueNames -from app.dao.daily_sorted_letter_dao import dao_create_or_update_daily_sorted_letter +from app.dao.daily_sorted_letter_dao import ( + dao_create_or_update_daily_sorted_letter, +) from app.dao.inbound_sms_dao import dao_get_inbound_sms_by_id -from app.dao.jobs_dao import ( - dao_update_job, - dao_get_job_by_id, -) +from app.dao.jobs_dao import dao_get_job_by_id, dao_update_job from app.dao.notifications_dao import ( - get_notification_by_id, - dao_update_notifications_by_reference, dao_get_last_notification_added_for_job_id, - update_notification_status_by_reference, dao_get_notification_or_history_by_reference, + dao_update_notifications_by_reference, + get_notification_by_id, + update_notification_status_by_reference, +) +from app.dao.provider_details_dao import ( + get_provider_details_by_notification_type, ) -from app.dao.provider_details_dao import get_provider_details_by_notification_type from app.dao.returned_letters_dao import insert_or_update_returned_letters from app.dao.service_email_reply_to_dao import dao_get_reply_to_by_id from app.dao.service_inbound_api_dao import get_service_inbound_api_for_service @@ -56,16 +48,16 @@ from app.models import ( LETTER_TYPE, NOTIFICATION_CREATED, NOTIFICATION_DELIVERED, - NOTIFICATION_SENDING, - NOTIFICATION_TEMPORARY_FAILURE, - NOTIFICATION_TECHNICAL_FAILURE, NOTIFICATION_RETURNED_LETTER, + NOTIFICATION_SENDING, + NOTIFICATION_TECHNICAL_FAILURE, + NOTIFICATION_TEMPORARY_FAILURE, SMS_TYPE, DailySortedLetter, ) from app.notifications.process_notifications import persist_notification -from app.service.utils import service_allowed_to_send_to from app.serialised_models import SerialisedService, SerialisedTemplate +from app.service.utils import service_allowed_to_send_to from app.utils import DATETIME_FORMAT diff --git a/app/clients/document_download.py b/app/clients/document_download.py index c6ee1d9eb..744a59854 100644 --- a/app/clients/document_download.py +++ b/app/clients/document_download.py @@ -1,5 +1,4 @@ import requests - from flask import current_app diff --git a/app/clients/email/__init__.py b/app/clients/email/__init__.py index 6db70a8af..e680be23d 100644 --- a/app/clients/email/__init__.py +++ b/app/clients/email/__init__.py @@ -1,4 +1,4 @@ -from app.clients import ClientException, Client +from app.clients import Client, ClientException class EmailClientException(ClientException): diff --git a/app/clients/email/aws_ses.py b/app/clients/email/aws_ses.py index 479a1fe7b..4e7a6346b 100644 --- a/app/clients/email/aws_ses.py +++ b/app/clients/email/aws_ses.py @@ -1,10 +1,15 @@ +from time import monotonic + import boto3 import botocore from flask import current_app -from time import monotonic from app.clients import STATISTICS_DELIVERED, STATISTICS_FAILURE -from app.clients.email import EmailClient, EmailClientException, EmailClientNonRetryableException +from app.clients.email import ( + EmailClient, + EmailClientException, + EmailClientNonRetryableException, +) ses_response_map = { 'Permanent': { diff --git a/app/clients/email/aws_ses_stub.py b/app/clients/email/aws_ses_stub.py index 0414b50b4..4d78e22b5 100644 --- a/app/clients/email/aws_ses_stub.py +++ b/app/clients/email/aws_ses_stub.py @@ -1,10 +1,10 @@ import json +from time import monotonic from flask import current_app from requests import request -from time import monotonic -from app.clients.email import (EmailClientException, EmailClient) +from app.clients.email import EmailClient, EmailClientException class AwsSesStubClientException(EmailClientException): diff --git a/app/clients/performance_platform/performance_platform_client.py b/app/clients/performance_platform/performance_platform_client.py index 6654c8d30..e6a2b08c6 100644 --- a/app/clients/performance_platform/performance_platform_client.py +++ b/app/clients/performance_platform/performance_platform_client.py @@ -1,9 +1,8 @@ import base64 import json -from flask import current_app import requests - +from flask import current_app from notifications_utils.timezones import convert_utc_to_bst diff --git a/app/clients/sms/__init__.py b/app/clients/sms/__init__.py index 9a3cb2baf..e9f90f06a 100644 --- a/app/clients/sms/__init__.py +++ b/app/clients/sms/__init__.py @@ -1,4 +1,4 @@ -from app.clients import (Client, ClientException) +from app.clients import Client, ClientException class SmsClientResponseException(ClientException): diff --git a/app/clients/sms/firetext.py b/app/clients/sms/firetext.py index eb7287c0e..a93c9d6c5 100644 --- a/app/clients/sms/firetext.py +++ b/app/clients/sms/firetext.py @@ -1,10 +1,10 @@ import json import logging - from time import monotonic -from requests import request, RequestException -from app.clients.sms import (SmsClient, SmsClientResponseException) +from requests import RequestException, request + +from app.clients.sms import SmsClient, SmsClientResponseException logger = logging.getLogger(__name__) diff --git a/app/clients/sms/mmg.py b/app/clients/sms/mmg.py index 57c43a037..e8390f260 100644 --- a/app/clients/sms/mmg.py +++ b/app/clients/sms/mmg.py @@ -1,7 +1,9 @@ import json from time import monotonic -from requests import (request, RequestException) -from app.clients.sms import (SmsClient, SmsClientResponseException) + +from requests import RequestException, request + +from app.clients.sms import SmsClient, SmsClientResponseException mmg_response_map = { '2': {'status': 'permanent-failure', 'substatus': { diff --git a/app/cloudfoundry_config.py b/app/cloudfoundry_config.py index 5cb7c437f..9ddc1059d 100644 --- a/app/cloudfoundry_config.py +++ b/app/cloudfoundry_config.py @@ -3,8 +3,8 @@ Extracts cloudfoundry config from its json and populates the environment variabl on local/aws boxes """ -import os import json +import os def extract_cloudfoundry_config(): diff --git a/app/commands.py b/app/commands.py index 922314d83..b8e680083 100644 --- a/app/commands.py +++ b/app/commands.py @@ -1,29 +1,35 @@ import csv import functools +import itertools import uuid from datetime import datetime, timedelta from decimal import Decimal import click import flask -import itertools from click_datetime import Datetime as click_dt from flask import current_app, json from notifications_utils.recipients import RecipientCSV +from notifications_utils.statsd_decorators import statsd from notifications_utils.template import SMSMessageTemplate from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound -from notifications_utils.statsd_decorators import statsd from app import db, encryption from app.aws import s3 -from app.celery.tasks import record_daily_sorted_counts, process_row -from app.celery.nightly_tasks import send_total_sent_notifications_to_performance_platform -from app.celery.service_callback_tasks import send_delivery_status_to_service from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter -from app.celery.reporting_tasks import create_nightly_notification_status_for_day +from app.celery.nightly_tasks import ( + send_total_sent_notifications_to_performance_platform, +) +from app.celery.reporting_tasks import ( + create_nightly_notification_status_for_day, +) +from app.celery.service_callback_tasks import send_delivery_status_to_service +from app.celery.tasks import process_row, record_daily_sorted_counts from app.config import QueueNames -from app.dao.annual_billing_dao import dao_create_or_update_annual_billing_for_year +from app.dao.annual_billing_dao import ( + dao_create_or_update_annual_billing_for_year, +) from app.dao.fact_billing_dao import ( delete_billing_data_for_service_for_day, fetch_billing_data_for_day, @@ -32,36 +38,53 @@ from app.dao.fact_billing_dao import ( ) from app.dao.fact_processing_time_dao import insert_update_processing_time from app.dao.jobs_dao import dao_get_job_by_id -from app.dao.organisation_dao import dao_get_organisation_by_email_address, dao_add_service_to_organisation - -from app.dao.provider_rates_dao import create_provider_rates as dao_create_provider_rates -from app.dao.service_callback_api_dao import get_service_delivery_status_callback_api_for_service +from app.dao.organisation_dao import ( + dao_add_service_to_organisation, + dao_get_organisation_by_email_address, +) +from app.dao.provider_rates_dao import ( + create_provider_rates as dao_create_provider_rates, +) +from app.dao.service_callback_api_dao import ( + get_service_delivery_status_callback_api_for_service, +) from app.dao.services_dao import ( - delete_service_and_all_associated_db_objects, dao_fetch_all_services_by_user, dao_fetch_all_services_created_by_user, dao_fetch_service_by_id, - dao_update_service + dao_update_service, + delete_service_and_all_associated_db_objects, ) from app.dao.templates_dao import dao_get_template_by_id -from app.dao.users_dao import delete_model_user, delete_user_verify_codes, get_user_by_email +from app.dao.users_dao import ( + delete_model_user, + delete_user_verify_codes, + get_user_by_email, +) from app.models import ( - PROVIDERS, - NOTIFICATION_CREATED, - KEY_TYPE_TEST, - SMS_TYPE, EMAIL_TYPE, + KEY_TYPE_TEST, LETTER_TYPE, - User, + NOTIFICATION_CREATED, + PROVIDERS, + SMS_TYPE, + Domain, + EmailBranding, + FactProcessingTime, + LetterBranding, Notification, Organisation, - Domain, Service, - EmailBranding, - LetterBranding, FactProcessingTime, + User, +) +from app.performance_platform.processing_time import ( + send_processing_time_for_start_and_end, +) +from app.utils import ( + DATETIME_FORMAT, + get_london_midnight_in_utc, + get_midnight_for_day_before, ) -from app.performance_platform.processing_time import send_processing_time_for_start_and_end -from app.utils import DATETIME_FORMAT, get_london_midnight_in_utc, get_midnight_for_day_before @click.group(name='command', help='Additional commands') diff --git a/app/complaint/complaint_rest.py b/app/complaint/complaint_rest.py index 91743e27e..b8e1455b5 100644 --- a/app/complaint/complaint_rest.py +++ b/app/complaint/complaint_rest.py @@ -3,7 +3,10 @@ from datetime import datetime from flask import Blueprint, jsonify, request from app.complaint.complaint_schema import complaint_count_request -from app.dao.complaint_dao import fetch_count_of_complaints, fetch_paginated_complaints +from app.dao.complaint_dao import ( + fetch_count_of_complaints, + fetch_paginated_complaints, +) from app.errors import register_errors from app.schema_validation import validate from app.utils import pagination_links diff --git a/app/config.py b/app/config.py index 00e3c84c0..92a7f9a74 100644 --- a/app/config.py +++ b/app/config.py @@ -1,6 +1,6 @@ -from datetime import timedelta -import os import json +import os +from datetime import timedelta from celery.schedules import crontab from kombu import Exchange, Queue diff --git a/app/cronitor.py b/app/cronitor.py index 0dc6804b1..e0580fec4 100644 --- a/app/cronitor.py +++ b/app/cronitor.py @@ -1,5 +1,6 @@ -import requests from functools import wraps + +import requests from flask import current_app diff --git a/app/dao/__init__.py b/app/dao/__init__.py index 483e45fd1..31afdb1e7 100644 --- a/app/dao/__init__.py +++ b/app/dao/__init__.py @@ -1,4 +1,5 @@ from sqlalchemy.exc import SQLAlchemyError + from app import db diff --git a/app/dao/annual_billing_dao.py b/app/dao/annual_billing_dao.py index b91604d20..955c9ead3 100644 --- a/app/dao/annual_billing_dao.py +++ b/app/dao/annual_billing_dao.py @@ -1,7 +1,7 @@ from app import db from app.dao.dao_utils import transactional -from app.models import AnnualBilling from app.dao.date_util import get_current_financial_year_start_year +from app.models import AnnualBilling @transactional diff --git a/app/dao/api_key_dao.py b/app/dao/api_key_dao.py index d550c9dc0..9f82e2555 100644 --- a/app/dao/api_key_dao.py +++ b/app/dao/api_key_dao.py @@ -1,16 +1,12 @@ import uuid from datetime import datetime, timedelta +from sqlalchemy import func, or_ + from app import db +from app.dao.dao_utils import transactional, version_class from app.models import ApiKey -from app.dao.dao_utils import ( - transactional, - version_class -) - -from sqlalchemy import or_, func - @transactional @version_class(ApiKey) diff --git a/app/dao/broadcast_message_dao.py b/app/dao/broadcast_message_dao.py index 12af8e246..9715c93d5 100644 --- a/app/dao/broadcast_message_dao.py +++ b/app/dao/broadcast_message_dao.py @@ -3,12 +3,12 @@ import uuid from app import db from app.dao.dao_utils import transactional from app.models import ( - BroadcastMessage, BroadcastEvent, + BroadcastMessage, BroadcastProvider, BroadcastProviderMessage, BroadcastProviderMessageNumber, - BroadcastProviderMessageStatus + BroadcastProviderMessageStatus, ) diff --git a/app/dao/broadcast_service_dao.py b/app/dao/broadcast_service_dao.py index 22af1c9e9..27ac31273 100644 --- a/app/dao/broadcast_service_dao.py +++ b/app/dao/broadcast_service_dao.py @@ -5,12 +5,12 @@ from flask import current_app from app import db from app.dao.dao_utils import transactional, version_class from app.models import ( + BROADCAST_TYPE, + EMAIL_AUTH_TYPE, + Organisation, Service, ServiceBroadcastSettings, ServicePermission, - Organisation, - BROADCAST_TYPE, - EMAIL_AUTH_TYPE ) diff --git a/app/dao/date_util.py b/app/dao/date_util.py index 8d3b20b9b..64c18e4e2 100644 --- a/app/dao/date_util.py +++ b/app/dao/date_util.py @@ -1,7 +1,7 @@ -from datetime import datetime, timedelta, date, time +from datetime import date, datetime, time, timedelta -from notifications_utils.timezones import convert_bst_to_utc import pytz +from notifications_utils.timezones import convert_bst_to_utc def get_months_for_financial_year(year): diff --git a/app/dao/fact_billing_dao.py b/app/dao/fact_billing_dao.py index db8a0da81..152c7397d 100644 --- a/app/dao/fact_billing_dao.py +++ b/app/dao/fact_billing_dao.py @@ -1,34 +1,33 @@ -from datetime import datetime, timedelta, time, date +from datetime import date, datetime, time, timedelta from flask import current_app from notifications_utils.timezones import convert_bst_to_utc, convert_utc_to_bst +from sqlalchemy import Date, Integer, and_, desc, func from sqlalchemy.dialects.postgresql import insert -from sqlalchemy import func, desc, Date, Integer, and_ from sqlalchemy.sql.expression import case, literal from app import db from app.dao.date_util import ( get_financial_year, - get_financial_year_for_datetime + get_financial_year_for_datetime, ) from app.dao.organisation_dao import dao_get_organisation_live_services - from app.models import ( - FactBilling, - Service, + EMAIL_TYPE, + INTERNATIONAL_POSTAGE_TYPES, KEY_TYPE_TEST, LETTER_TYPE, - SMS_TYPE, - Rate, - LetterRate, - NotificationHistory, - EMAIL_TYPE, + NOTIFICATION_STATUS_TYPES_BILLABLE_FOR_LETTERS, NOTIFICATION_STATUS_TYPES_BILLABLE_SMS, NOTIFICATION_STATUS_TYPES_SENT_EMAILS, - NOTIFICATION_STATUS_TYPES_BILLABLE_FOR_LETTERS, + SMS_TYPE, AnnualBilling, + FactBilling, + LetterRate, + NotificationHistory, Organisation, - INTERNATIONAL_POSTAGE_TYPES, + Rate, + Service, ) from app.utils import get_london_midnight_in_utc, get_notification_table_to_use diff --git a/app/dao/fact_notification_status_dao.py b/app/dao/fact_notification_status_dao.py index 9da58130a..463d5a403 100644 --- a/app/dao/fact_notification_status_dao.py +++ b/app/dao/fact_notification_status_dao.py @@ -1,36 +1,36 @@ -from datetime import datetime, timedelta, time +from datetime import datetime, time, timedelta from flask import current_app from notifications_utils.timezones import convert_bst_to_utc -from sqlalchemy import case, func, Date +from sqlalchemy import Date, case, func from sqlalchemy.dialects.postgresql import insert -from sqlalchemy.sql.expression import literal, extract +from sqlalchemy.sql.expression import extract, literal from sqlalchemy.types import DateTime, Integer from app import db +from app.dao.dao_utils import transactional from app.models import ( - FactNotificationStatus, KEY_TYPE_TEST, - Notification, NOTIFICATION_CANCELLED, NOTIFICATION_CREATED, NOTIFICATION_DELIVERED, NOTIFICATION_FAILED, NOTIFICATION_PENDING, + NOTIFICATION_PERMANENT_FAILURE, NOTIFICATION_SENDING, NOTIFICATION_SENT, NOTIFICATION_TECHNICAL_FAILURE, NOTIFICATION_TEMPORARY_FAILURE, - NOTIFICATION_PERMANENT_FAILURE, + FactNotificationStatus, + Notification, Service, Template, ) -from app.dao.dao_utils import transactional from app.utils import ( get_london_midnight_in_utc, - midnight_n_days_ago, get_london_month_from_utc_column, get_notification_table_to_use, + midnight_n_days_ago, ) diff --git a/app/dao/inbound_sms_dao.py b/app/dao/inbound_sms_dao.py index 04c7c6dae..0add36249 100644 --- a/app/dao/inbound_sms_dao.py +++ b/app/dao/inbound_sms_dao.py @@ -1,11 +1,17 @@ from flask import current_app -from sqlalchemy import desc, and_ -from sqlalchemy.orm import aliased +from sqlalchemy import and_, desc from sqlalchemy.dialects.postgresql import insert +from sqlalchemy.orm import aliased from app import db from app.dao.dao_utils import transactional -from app.models import InboundSms, InboundSmsHistory, Service, ServiceDataRetention, SMS_TYPE +from app.models import ( + SMS_TYPE, + InboundSms, + InboundSmsHistory, + Service, + ServiceDataRetention, +) from app.utils import midnight_n_days_ago diff --git a/app/dao/invited_org_user_dao.py b/app/dao/invited_org_user_dao.py index c4061f0a0..b09b945e3 100644 --- a/app/dao/invited_org_user_dao.py +++ b/app/dao/invited_org_user_dao.py @@ -1,6 +1,6 @@ from datetime import datetime, timedelta -from app import db +from app import db from app.models import InvitedOrganisationUser diff --git a/app/dao/invited_user_dao.py b/app/dao/invited_user_dao.py index 1e9ccd22d..d44cd3343 100644 --- a/app/dao/invited_user_dao.py +++ b/app/dao/invited_user_dao.py @@ -1,6 +1,6 @@ from datetime import datetime, timedelta -from app import db +from app import db from app.models import InvitedUser diff --git a/app/dao/jobs_dao.py b/app/dao/jobs_dao.py index 9c95541e0..ca549d21b 100644 --- a/app/dao/jobs_dao.py +++ b/app/dao/jobs_dao.py @@ -2,33 +2,30 @@ import uuid from datetime import datetime, timedelta from flask import current_app -from notifications_utils.letter_timings import letter_can_be_cancelled, CANCELLABLE_JOB_LETTER_STATUSES -from sqlalchemy import ( - asc, - desc, - func, - and_ +from notifications_utils.letter_timings import ( + CANCELLABLE_JOB_LETTER_STATUSES, + letter_can_be_cancelled, ) +from sqlalchemy import and_, asc, desc, func from app import db from app.dao.dao_utils import transactional from app.dao.templates_dao import dao_get_template_by_id -from app.utils import midnight_n_days_ago - from app.models import ( - Job, + JOB_STATUS_CANCELLED, JOB_STATUS_FINISHED, JOB_STATUS_PENDING, JOB_STATUS_SCHEDULED, LETTER_TYPE, - Notification, - Template, - ServiceDataRetention, - NOTIFICATION_CREATED, NOTIFICATION_CANCELLED, - JOB_STATUS_CANCELLED, - FactNotificationStatus + NOTIFICATION_CREATED, + FactNotificationStatus, + Job, + Notification, + ServiceDataRetention, + Template, ) +from app.utils import midnight_n_days_ago def dao_get_notification_outcomes_for_job(service_id, job_id): diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index a21fa757f..176583d30 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -1,57 +1,61 @@ import functools +from datetime import datetime, timedelta from itertools import groupby from operator import attrgetter -from datetime import ( - datetime, - timedelta, -) from botocore.exceptions import ClientError from flask import current_app -from notifications_utils.international_billing_rates import INTERNATIONAL_BILLING_RATES +from notifications_utils.international_billing_rates import ( + INTERNATIONAL_BILLING_RATES, +) from notifications_utils.recipients import ( - validate_and_format_email_address, InvalidEmailError, - try_validate_and_format_phone_number + try_validate_and_format_phone_number, + validate_and_format_email_address, ) from notifications_utils.timezones import convert_bst_to_utc, convert_utc_to_bst -from sqlalchemy import (desc, func, asc, and_, or_) +from sqlalchemy import and_, asc, desc, func, or_ from sqlalchemy.orm import joinedload from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.sql import functions from sqlalchemy.sql.expression import case from werkzeug.datastructures import MultiDict -from app import db, create_uuid -from app.aws.s3 import remove_s3_object, get_s3_bucket_objects +from app import create_uuid, db +from app.aws.s3 import get_s3_bucket_objects, remove_s3_object +from app.clients.sms.firetext import ( + get_message_status_and_reason_from_firetext_code, +) from app.dao.dao_utils import transactional from app.letters.utils import get_letter_pdf_filename from app.models import ( - FactNotificationStatus, - Notification, - NotificationHistory, - ProviderDetails, + EMAIL_TYPE, KEY_TYPE_NORMAL, KEY_TYPE_TEST, LETTER_TYPE, NOTIFICATION_CREATED, NOTIFICATION_DELIVERED, - NOTIFICATION_SENDING, NOTIFICATION_PENDING, NOTIFICATION_PENDING_VIRUS_CHECK, - NOTIFICATION_TECHNICAL_FAILURE, - NOTIFICATION_TEMPORARY_FAILURE, NOTIFICATION_PERMANENT_FAILURE, + NOTIFICATION_SENDING, NOTIFICATION_SENT, NOTIFICATION_STATUS_TYPES_COMPLETED, + NOTIFICATION_TECHNICAL_FAILURE, + NOTIFICATION_TEMPORARY_FAILURE, SMS_TYPE, - EMAIL_TYPE, - ServiceDataRetention, + FactNotificationStatus, + Notification, + NotificationHistory, + ProviderDetails, Service, + ServiceDataRetention, +) +from app.utils import ( + escape_special_characters, + get_london_midnight_in_utc, + midnight_n_days_ago, ) -from app.utils import get_london_midnight_in_utc -from app.utils import midnight_n_days_ago, escape_special_characters -from app.clients.sms.firetext import get_message_status_and_reason_from_firetext_code def dao_get_last_date_template_was_used(template_id, service_id): diff --git a/app/dao/organisation_dao.py b/app/dao/organisation_dao.py index 4f422d501..f97ee779a 100644 --- a/app/dao/organisation_dao.py +++ b/app/dao/organisation_dao.py @@ -3,11 +3,11 @@ from sqlalchemy.sql.expression import func from app import db from app.dao.dao_utils import VersionOptions, transactional, version_class from app.models import ( - Organisation, Domain, InvitedOrganisationUser, + Organisation, Service, - User + User, ) diff --git a/app/dao/permissions_dao.py b/app/dao/permissions_dao.py index 236cb624a..16daaa3c4 100644 --- a/app/dao/permissions_dao.py +++ b/app/dao/permissions_dao.py @@ -1,16 +1,16 @@ from app import db from app.dao import DAOClass from app.models import ( - Permission, - MANAGE_USERS, - MANAGE_TEMPLATES, + MANAGE_API_KEYS, MANAGE_SETTINGS, - SEND_TEXTS, + MANAGE_TEMPLATES, + MANAGE_USERS, SEND_EMAILS, SEND_LETTERS, - MANAGE_API_KEYS, - VIEW_ACTIVITY) - + SEND_TEXTS, + VIEW_ACTIVITY, + Permission, +) # Default permissions for a service default_service_permissions = [ diff --git a/app/dao/provider_details_dao.py b/app/dao/provider_details_dao.py index 64f5ae6b4..697dfbd58 100644 --- a/app/dao/provider_details_dao.py +++ b/app/dao/provider_details_dao.py @@ -1,12 +1,18 @@ from datetime import datetime, timedelta +from flask import current_app from notifications_utils.timezones import convert_utc_to_bst from sqlalchemy import asc, desc, func -from flask import current_app -from app.dao.dao_utils import transactional -from app.models import FactBilling, ProviderDetails, ProviderDetailsHistory, SMS_TYPE, User from app import db +from app.dao.dao_utils import transactional +from app.models import ( + SMS_TYPE, + FactBilling, + ProviderDetails, + ProviderDetailsHistory, + User, +) def get_provider_details_by_id(provider_details_id): diff --git a/app/dao/provider_rates_dao.py b/app/dao/provider_rates_dao.py index 145bd431e..d75b0e15b 100644 --- a/app/dao/provider_rates_dao.py +++ b/app/dao/provider_rates_dao.py @@ -1,6 +1,6 @@ -from app.models import ProviderRates, ProviderDetails from app import db from app.dao.dao_utils import transactional +from app.models import ProviderDetails, ProviderRates @transactional diff --git a/app/dao/returned_letters_dao.py b/app/dao/returned_letters_dao.py index 270435af9..a0353d0eb 100644 --- a/app/dao/returned_letters_dao.py +++ b/app/dao/returned_letters_dao.py @@ -1,6 +1,6 @@ from datetime import datetime -from sqlalchemy import func, desc +from sqlalchemy import desc, func from sqlalchemy.dialects.postgresql import insert from app import db diff --git a/app/dao/service_callback_api_dao.py b/app/dao/service_callback_api_dao.py index ea23d6306..d07934190 100644 --- a/app/dao/service_callback_api_dao.py +++ b/app/dao/service_callback_api_dao.py @@ -1,10 +1,12 @@ from datetime import datetime -from app import db, create_uuid +from app import create_uuid, db from app.dao.dao_utils import transactional, version_class -from app.models import ServiceCallbackApi - -from app.models import DELIVERY_STATUS_CALLBACK_TYPE, COMPLAINT_CALLBACK_TYPE +from app.models import ( + COMPLAINT_CALLBACK_TYPE, + DELIVERY_STATUS_CALLBACK_TYPE, + ServiceCallbackApi, +) @transactional diff --git a/app/dao/service_inbound_api_dao.py b/app/dao/service_inbound_api_dao.py index 6b8cc973c..611eb214b 100644 --- a/app/dao/service_inbound_api_dao.py +++ b/app/dao/service_inbound_api_dao.py @@ -1,6 +1,6 @@ from datetime import datetime -from app import db, create_uuid +from app import create_uuid, db from app.dao.dao_utils import transactional, version_class from app.models import ServiceInboundApi diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index 96c629e4e..c68092c64 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -1,18 +1,14 @@ import uuid from datetime import date, datetime, timedelta -from sqlalchemy.sql.expression import asc, case, and_, func -from sqlalchemy.orm import joinedload -from sqlalchemy import cast, Float from flask import current_app +from sqlalchemy import Float, cast +from sqlalchemy.orm import joinedload +from sqlalchemy.sql.expression import and_, asc, case, func from app import db +from app.dao.dao_utils import VersionOptions, transactional, version_class from app.dao.date_util import get_current_financial_year -from app.dao.dao_utils import ( - transactional, - version_class, - VersionOptions, -) from app.dao.email_branding_dao import dao_get_email_branding_by_name from app.dao.letter_branding_dao import dao_get_letter_branding_by_name from app.dao.organisation_dao import dao_get_organisation_by_email_address @@ -20,6 +16,17 @@ from app.dao.service_sms_sender_dao import insert_service_sms_sender from app.dao.service_user_dao import dao_get_service_user from app.dao.template_folder_dao import dao_get_valid_template_folders_by_id from app.models import ( + CROWN_ORGANISATION_TYPES, + EMAIL_TYPE, + INTERNATIONAL_LETTERS, + INTERNATIONAL_SMS_TYPE, + KEY_TYPE_TEST, + LETTER_TYPE, + NHS_ORGANISATION_TYPES, + NON_CROWN_ORGANISATION_TYPES, + NOTIFICATION_PERMANENT_FAILURE, + SMS_TYPE, + UPLOAD_LETTERS, AnnualBilling, ApiKey, FactBilling, @@ -31,27 +38,16 @@ from app.models import ( Organisation, Permission, Service, + ServiceContactList, + ServiceEmailReplyTo, + ServiceLetterContact, ServicePermission, ServiceSmsSender, - ServiceEmailReplyTo, - ServiceContactList, - ServiceLetterContact, Template, TemplateHistory, TemplateRedacted, User, VerifyCode, - CROWN_ORGANISATION_TYPES, - EMAIL_TYPE, - INTERNATIONAL_SMS_TYPE, - KEY_TYPE_TEST, - NHS_ORGANISATION_TYPES, - NON_CROWN_ORGANISATION_TYPES, - NOTIFICATION_PERMANENT_FAILURE, - SMS_TYPE, - LETTER_TYPE, - UPLOAD_LETTERS, - INTERNATIONAL_LETTERS ) from app.utils import ( email_address_is_nhs, diff --git a/app/dao/templates_dao.py b/app/dao/templates_dao.py index 0c46e4cdb..45c030a1a 100644 --- a/app/dao/templates_dao.py +++ b/app/dao/templates_dao.py @@ -1,23 +1,19 @@ -from datetime import datetime import uuid +from datetime import datetime from flask import current_app from sqlalchemy import asc, desc from app import db +from app.dao.dao_utils import VersionOptions, transactional, version_class +from app.dao.users_dao import get_user_by_id from app.models import ( LETTER_TYPE, SECOND_CLASS, Template, TemplateHistory, - TemplateRedacted + TemplateRedacted, ) -from app.dao.dao_utils import ( - transactional, - version_class, - VersionOptions, -) -from app.dao.users_dao import get_user_by_id @transactional diff --git a/app/dao/uploads_dao.py b/app/dao/uploads_dao.py index f3175ffc4..cb04617a9 100644 --- a/app/dao/uploads_dao.py +++ b/app/dao/uploads_dao.py @@ -1,11 +1,18 @@ from datetime import datetime + from flask import current_app -from sqlalchemy import and_, desc, func, literal, text, String +from sqlalchemy import String, and_, desc, func, literal, text from app import db from app.models import ( - Job, Notification, Template, LETTER_TYPE, JOB_STATUS_CANCELLED, JOB_STATUS_SCHEDULED, - NOTIFICATION_CANCELLED, ServiceDataRetention + JOB_STATUS_CANCELLED, + JOB_STATUS_SCHEDULED, + LETTER_TYPE, + NOTIFICATION_CANCELLED, + Job, + Notification, + ServiceDataRetention, + Template, ) from app.utils import midnight_n_days_ago diff --git a/app/dao/users_dao.py b/app/dao/users_dao.py index 1cf53c2cf..9734337b2 100644 --- a/app/dao/users_dao.py +++ b/app/dao/users_dao.py @@ -1,16 +1,16 @@ -from random import (SystemRandom) -from datetime import (datetime, timedelta) import uuid +from datetime import datetime, timedelta +from random import SystemRandom from sqlalchemy import func from sqlalchemy.orm import joinedload from app import db +from app.dao.dao_utils import transactional from app.dao.permissions_dao import permission_dao from app.dao.service_user_dao import dao_get_service_users_by_user_id -from app.dao.dao_utils import transactional from app.errors import InvalidRequest -from app.models import (EMAIL_AUTH_TYPE, User, VerifyCode) +from app.models import EMAIL_AUTH_TYPE, User, VerifyCode from app.utils import escape_special_characters, get_archived_db_column_value diff --git a/app/delivery/send_to_providers.py b/app/delivery/send_to_providers.py index 1900fc250..1cb9896fc 100644 --- a/app/delivery/send_to_providers.py +++ b/app/delivery/send_to_providers.py @@ -1,33 +1,39 @@ import random -from urllib import parse from datetime import datetime, timedelta +from urllib import parse + from cachetools import TTLCache, cached from flask import current_app -from notifications_utils.template import HTMLEmailTemplate, PlainTextEmailTemplate, SMSMessageTemplate +from notifications_utils.template import ( + HTMLEmailTemplate, + PlainTextEmailTemplate, + SMSMessageTemplate, +) -from app import notification_provider_clients, statsd_client, create_uuid +from app import create_uuid, notification_provider_clients, statsd_client +from app.celery.research_mode_tasks import ( + send_email_response, + send_sms_response, +) from app.dao.email_branding_dao import dao_get_email_branding_by_id -from app.dao.notifications_dao import ( - dao_update_notification -) +from app.dao.notifications_dao import dao_update_notification from app.dao.provider_details_dao import ( + dao_reduce_sms_provider_priority, get_provider_details_by_notification_type, - dao_reduce_sms_provider_priority ) -from app.celery.research_mode_tasks import send_sms_response, send_email_response from app.exceptions import NotificationTechnicalFailureException from app.models import ( - SMS_TYPE, - KEY_TYPE_TEST, BRANDING_BOTH, BRANDING_ORG_BANNER, EMAIL_TYPE, - NOTIFICATION_TECHNICAL_FAILURE, - NOTIFICATION_SENT, + KEY_TYPE_TEST, NOTIFICATION_SENDING, - NOTIFICATION_STATUS_TYPES_COMPLETED + NOTIFICATION_SENT, + NOTIFICATION_STATUS_TYPES_COMPLETED, + NOTIFICATION_TECHNICAL_FAILURE, + SMS_TYPE, ) -from app.serialised_models import SerialisedTemplate, SerialisedService +from app.serialised_models import SerialisedService, SerialisedTemplate def send_sms_to_provider(notification): diff --git a/app/email_branding/rest.py b/app/email_branding/rest.py index 0991c9d0b..4ffb45d67 100644 --- a/app/email_branding/rest.py +++ b/app/email_branding/rest.py @@ -2,16 +2,16 @@ from flask import Blueprint, jsonify, request from app.dao.email_branding_dao import ( dao_create_email_branding, - dao_get_email_branding_options, dao_get_email_branding_by_id, - dao_update_email_branding + dao_get_email_branding_options, + dao_update_email_branding, +) +from app.email_branding.email_branding_schema import ( + post_create_email_branding_schema, + post_update_email_branding_schema, ) from app.errors import register_errors from app.models import EmailBranding -from app.email_branding.email_branding_schema import ( - post_create_email_branding_schema, - post_update_email_branding_schema -) from app.schema_validation import validate email_branding_blueprint = Blueprint('email_branding', __name__) diff --git a/app/errors.py b/app/errors.py index a699dffc8..f05e108dc 100644 --- a/app/errors.py +++ b/app/errors.py @@ -1,12 +1,10 @@ -from flask import ( - jsonify, - current_app, - json) +from flask import current_app, json, jsonify +from jsonschema import ValidationError as JsonSchemaValidationError +from marshmallow import ValidationError from notifications_utils.recipients import InvalidEmailError from sqlalchemy.exc import DataError from sqlalchemy.orm.exc import NoResultFound -from marshmallow import ValidationError -from jsonschema import ValidationError as JsonSchemaValidationError + from app.authentication.auth import AuthError from app.exceptions import ArchiveValidationError diff --git a/app/events/rest.py b/app/events/rest.py index 6bd189617..adabfce7a 100644 --- a/app/events/rest.py +++ b/app/events/rest.py @@ -1,13 +1,8 @@ -from flask import ( - Blueprint, - jsonify, - request -) +from flask import Blueprint, jsonify, request -from app.errors import register_errors - -from app.schemas import event_schema from app.dao.events_dao import dao_create_event +from app.errors import register_errors +from app.schemas import event_schema events = Blueprint('events', __name__, url_prefix='/events') register_errors(events) diff --git a/app/hashing.py b/app/hashing.py index b8721964d..9a42b2d44 100644 --- a/app/hashing.py +++ b/app/hashing.py @@ -1,4 +1,4 @@ -from flask_bcrypt import generate_password_hash, check_password_hash +from flask_bcrypt import check_password_hash, generate_password_hash def hashpw(password): diff --git a/app/history_meta.py b/app/history_meta.py index 623f86ba3..43cd6c610 100644 --- a/app/history_meta.py +++ b/app/history_meta.py @@ -15,11 +15,11 @@ session events. """ import datetime + +from sqlalchemy import Column, ForeignKeyConstraint, Integer, Table, util from sqlalchemy.ext.declarative import declared_attr -from sqlalchemy.orm import mapper, attributes, object_mapper -from sqlalchemy.orm.properties import RelationshipProperty, ColumnProperty -from sqlalchemy import Table, Column, ForeignKeyConstraint, Integer -from sqlalchemy import util +from sqlalchemy.orm import attributes, mapper, object_mapper +from sqlalchemy.orm.properties import ColumnProperty, RelationshipProperty def col_references_table(col, table): diff --git a/app/inbound_number/rest.py b/app/inbound_number/rest.py index e05413a7b..21241fabd 100644 --- a/app/inbound_number/rest.py +++ b/app/inbound_number/rest.py @@ -1,10 +1,10 @@ from flask import Blueprint, jsonify from app.dao.inbound_numbers_dao import ( - dao_get_inbound_numbers, - dao_get_inbound_number_for_service, dao_get_available_inbound_numbers, - dao_set_inbound_number_active_flag + dao_get_inbound_number_for_service, + dao_get_inbound_numbers, + dao_set_inbound_number_active_flag, ) from app.errors import register_errors diff --git a/app/inbound_sms/rest.py b/app/inbound_sms/rest.py index 35b1a2b8d..bf34fc553 100644 --- a/app/inbound_sms/rest.py +++ b/app/inbound_sms/rest.py @@ -1,23 +1,21 @@ -from flask import ( - Blueprint, - jsonify, - request -) - +from flask import Blueprint, jsonify, request from notifications_utils.recipients import try_validate_and_format_phone_number from app.dao.inbound_sms_dao import ( - dao_get_inbound_sms_for_service, dao_count_inbound_sms_for_service, dao_get_inbound_sms_by_id, - dao_get_paginated_most_recent_inbound_sms_by_user_number_for_service + dao_get_inbound_sms_for_service, + dao_get_paginated_most_recent_inbound_sms_by_user_number_for_service, +) +from app.dao.service_data_retention_dao import ( + fetch_service_data_retention_by_notification_type, ) -from app.dao.service_data_retention_dao import fetch_service_data_retention_by_notification_type from app.errors import register_errors +from app.inbound_sms.inbound_sms_schemas import ( + get_inbound_sms_for_service_schema, +) from app.schema_validation import validate -from app.inbound_sms.inbound_sms_schemas import get_inbound_sms_for_service_schema - inbound_sms = Blueprint( 'inbound_sms', __name__, diff --git a/app/invite/rest.py b/app/invite/rest.py index 408da97be..a5af73fe0 100644 --- a/app/invite/rest.py +++ b/app/invite/rest.py @@ -1,20 +1,19 @@ -from flask import ( - Blueprint, - request, - jsonify, - current_app) +from flask import Blueprint, current_app, jsonify, request from app.config import QueueNames from app.dao.invited_user_dao import ( - save_invited_user, get_invited_user, - get_invited_users_for_service + get_invited_users_for_service, + save_invited_user, ) from app.dao.templates_dao import dao_get_template_by_id -from app.models import BROADCAST_TYPE, EMAIL_TYPE, KEY_TYPE_NORMAL, Service -from app.notifications.process_notifications import persist_notification, send_notification_to_queue -from app.schemas import invited_user_schema from app.errors import register_errors +from app.models import BROADCAST_TYPE, EMAIL_TYPE, KEY_TYPE_NORMAL, Service +from app.notifications.process_notifications import ( + persist_notification, + send_notification_to_queue, +) +from app.schemas import invited_user_schema invite = Blueprint('invite', __name__, url_prefix='/service//invite') diff --git a/app/job/rest.py b/app/job/rest.py index 11cc6fc5a..0685254e0 100644 --- a/app/job/rest.py +++ b/app/job/rest.py @@ -1,43 +1,44 @@ import dateutil import pytz -from flask import ( - Blueprint, - jsonify, - request, - current_app -) +from flask import Blueprint, current_app, jsonify, request from app.aws.s3 import get_job_metadata_from_s3 +from app.celery.tasks import process_job +from app.config import QueueNames +from app.dao.fact_notification_status_dao import ( + fetch_notification_statuses_for_job, +) from app.dao.jobs_dao import ( + can_letter_job_be_cancelled, + dao_cancel_letter_job, dao_create_job, - dao_update_job, + dao_get_future_scheduled_job_by_id_and_service_id, dao_get_job_by_service_id_and_job_id, dao_get_jobs_by_service_id, - dao_get_future_scheduled_job_by_id_and_service_id, dao_get_notification_outcomes_for_job, dao_get_scheduled_job_stats, - dao_cancel_letter_job, - can_letter_job_be_cancelled + dao_update_job, +) +from app.dao.notifications_dao import ( + dao_get_notification_count_for_job_id, + get_notifications_for_job, ) -from app.dao.fact_notification_status_dao import fetch_notification_statuses_for_job from app.dao.services_dao import dao_fetch_service_by_id from app.dao.templates_dao import dao_get_template_by_id -from app.dao.notifications_dao import dao_get_notification_count_for_job_id, get_notifications_for_job +from app.errors import InvalidRequest, register_errors +from app.models import ( + JOB_STATUS_CANCELLED, + JOB_STATUS_PENDING, + JOB_STATUS_SCHEDULED, + LETTER_TYPE, +) from app.schemas import ( job_schema, - unarchived_template_schema, + notification_with_template_schema, notifications_filter_schema, - notification_with_template_schema + unarchived_template_schema, ) -from app.celery.tasks import process_job -from app.models import JOB_STATUS_SCHEDULED, JOB_STATUS_PENDING, JOB_STATUS_CANCELLED, LETTER_TYPE -from app.utils import pagination_links, midnight_n_days_ago -from app.config import QueueNames -from app.errors import ( - register_errors, - InvalidRequest -) - +from app.utils import midnight_n_days_ago, pagination_links job_blueprint = Blueprint('job', __name__, url_prefix='/service//job') diff --git a/app/letter_branding/letter_branding_rest.py b/app/letter_branding/letter_branding_rest.py index c07987b3b..d1f6fb0bb 100644 --- a/app/letter_branding/letter_branding_rest.py +++ b/app/letter_branding/letter_branding_rest.py @@ -1,15 +1,17 @@ from celery import current_app +from flask import Blueprint, jsonify, request from sqlalchemy.exc import IntegrityError -from flask import Blueprint, jsonify, request - from app.dao.letter_branding_dao import ( - dao_get_all_letter_branding, dao_create_letter_branding, + dao_create_letter_branding, + dao_get_all_letter_branding, + dao_get_letter_branding_by_id, dao_update_letter_branding, - dao_get_letter_branding_by_id ) from app.errors import register_errors -from app.letter_branding.letter_branding_schema import post_letter_branding_schema +from app.letter_branding.letter_branding_schema import ( + post_letter_branding_schema, +) from app.models import LetterBranding from app.schema_validation import validate diff --git a/app/letters/rest.py b/app/letters/rest.py index c36ee91bf..e8e724b06 100644 --- a/app/letters/rest.py +++ b/app/letters/rest.py @@ -1,5 +1,4 @@ -from flask import Blueprint, jsonify -from flask import request +from flask import Blueprint, jsonify, request from app.celery.tasks import process_returned_letters_list from app.config import QueueNames diff --git a/app/letters/utils.py b/app/letters/utils.py index ed9a7b4f9..5487c8252 100644 --- a/app/letters/utils.py +++ b/app/letters/utils.py @@ -1,20 +1,23 @@ -import boto3 import io import json import math - -from app.models import KEY_TYPE_TEST, SECOND_CLASS, RESOLVE_POSTAGE_FOR_FILE_NAME, NOTIFICATION_VALIDATION_FAILED - from datetime import datetime, timedelta from enum import Enum +import boto3 from flask import current_app - from notifications_utils.letter_timings import LETTER_PROCESSING_DEADLINE from notifications_utils.pdf import pdf_page_count from notifications_utils.s3 import s3upload from notifications_utils.timezones import convert_utc_to_bst +from app.models import ( + KEY_TYPE_TEST, + NOTIFICATION_VALIDATION_FAILED, + RESOLVE_POSTAGE_FOR_FILE_NAME, + SECOND_CLASS, +) + class ScanErrorType(Enum): ERROR = 1 diff --git a/app/models.py b/app/models.py index a2a9fbbc3..9d0db0563 100644 --- a/app/models.py +++ b/app/models.py @@ -1,41 +1,42 @@ +import datetime import itertools import uuid -import datetime -from flask import url_for, current_app -from sqlalchemy.ext.declarative import declared_attr -from sqlalchemy.ext.associationproxy import association_proxy -from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.schema import Sequence -from sqlalchemy.dialects.postgresql import ( - UUID, - JSON, - JSONB, -) -from sqlalchemy.orm.collections import attribute_mapped_collection -from sqlalchemy import UniqueConstraint, CheckConstraint, Index, String, and_, func +from flask import current_app, url_for from notifications_utils.columns import Columns +from notifications_utils.letter_timings import get_letter_timings from notifications_utils.recipients import ( + InvalidEmailError, + InvalidPhoneError, + try_validate_and_format_phone_number, validate_email_address, validate_phone_number, - try_validate_and_format_phone_number, - InvalidPhoneError, - InvalidEmailError ) -from notifications_utils.letter_timings import get_letter_timings from notifications_utils.template import ( + BroadcastMessageTemplate, + LetterPrintTemplate, PlainTextEmailTemplate, SMSMessageTemplate, - LetterPrintTemplate, - BroadcastMessageTemplate, ) from notifications_utils.timezones import convert_utc_to_bst - -from app.hashing import ( - hashpw, - check_hash +from sqlalchemy import ( + CheckConstraint, + Index, + String, + UniqueConstraint, + and_, + func, ) +from sqlalchemy.dialects.postgresql import JSON, JSONB, UUID +from sqlalchemy.ext.associationproxy import association_proxy +from sqlalchemy.ext.declarative import declared_attr +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm.collections import attribute_mapped_collection +from sqlalchemy.schema import Sequence + from app import db, encryption +from app.hashing import check_hash, hashpw +from app.history_meta import Versioned from app.utils import ( DATETIME_FORMAT, DATETIME_FORMAT_NO_TIMEZONE, @@ -43,8 +44,6 @@ from app.utils import ( get_uuid_string_or_none, ) -from app.history_meta import Versioned - SMS_TYPE = 'sms' EMAIL_TYPE = 'email' LETTER_TYPE = 'letter' @@ -2437,7 +2436,9 @@ class BroadcastEvent(db.Model): Return the full provider_message object rather than just an identifier, since the different providers expect reference to contain different things - let the cbc_proxy work out what information is relevant. """ - from app.dao.broadcast_message_dao import get_earlier_events_for_broadcast_event + from app.dao.broadcast_message_dao import ( + get_earlier_events_for_broadcast_event, + ) earlier_events = [ event for event in get_earlier_events_for_broadcast_event(self.id) ] diff --git a/app/notifications/notifications_letter_callback.py b/app/notifications/notifications_letter_callback.py index d2b9634e5..1bdf038fb 100644 --- a/app/notifications/notifications_letter_callback.py +++ b/app/notifications/notifications_letter_callback.py @@ -1,19 +1,16 @@ import json - from functools import wraps -from flask import ( - Blueprint, - jsonify, - request, - current_app -) +from flask import Blueprint, current_app, jsonify, request -from app.celery.tasks import update_letter_notifications_statuses, record_daily_sorted_counts -from app.v2.errors import register_errors +from app.celery.tasks import ( + record_daily_sorted_counts, + update_letter_notifications_statuses, +) +from app.config import QueueNames from app.notifications.utils import autoconfirm_subscription from app.schema_validation import validate -from app.config import QueueNames +from app.v2.errors import register_errors letter_callback_blueprint = Blueprint('notifications_letter_callback', __name__) register_errors(letter_callback_blueprint) diff --git a/app/notifications/notifications_ses_callback.py b/app/notifications/notifications_ses_callback.py index a124e691f..484d78f30 100644 --- a/app/notifications/notifications_ses_callback.py +++ b/app/notifications/notifications_ses_callback.py @@ -1,18 +1,21 @@ from flask import current_app -from app.dao.complaint_dao import save_complaint -from app.dao.notifications_dao import dao_get_notification_or_history_by_reference -from app.dao.service_callback_api_dao import ( - get_service_delivery_status_callback_api_for_service, get_service_complaint_callback_api_for_service -) -from app.models import Complaint from app.celery.service_callback_tasks import ( - send_delivery_status_to_service, - send_complaint_to_service, + create_complaint_callback_data, create_delivery_status_callback_data, - create_complaint_callback_data + send_complaint_to_service, + send_delivery_status_to_service, ) from app.config import QueueNames +from app.dao.complaint_dao import save_complaint +from app.dao.notifications_dao import ( + dao_get_notification_or_history_by_reference, +) +from app.dao.service_callback_api_dao import ( + get_service_complaint_callback_api_for_service, + get_service_delivery_status_callback_api_for_service, +) +from app.models import Complaint def determine_notification_bounce_type(notification_type, ses_message): diff --git a/app/notifications/notifications_sms_callback.py b/app/notifications/notifications_sms_callback.py index 7789f592a..e0111ea5a 100644 --- a/app/notifications/notifications_sms_callback.py +++ b/app/notifications/notifications_sms_callback.py @@ -1,9 +1,8 @@ -from flask import Blueprint -from flask import current_app -from flask import json -from flask import request, jsonify +from flask import Blueprint, current_app, json, jsonify, request -from app.celery.process_sms_client_response_tasks import process_sms_client_response +from app.celery.process_sms_client_response_tasks import ( + process_sms_client_response, +) from app.config import QueueNames from app.errors import InvalidRequest, register_errors diff --git a/app/notifications/process_notifications.py b/app/notifications/process_notifications.py index 2b649997a..ed4334d29 100644 --- a/app/notifications/process_notifications.py +++ b/app/notifications/process_notifications.py @@ -2,43 +2,38 @@ import uuid from datetime import datetime from flask import current_app - +from gds_metrics import Histogram from notifications_utils.clients import redis from notifications_utils.recipients import ( + format_email_address, get_international_phone_info, validate_and_format_phone_number, - format_email_address ) from notifications_utils.template import ( + LetterPrintTemplate, PlainTextEmailTemplate, SMSMessageTemplate, - LetterPrintTemplate, ) from app import redis_store from app.celery import provider_tasks from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter from app.config import QueueNames - -from app.models import ( - EMAIL_TYPE, - KEY_TYPE_TEST, - SMS_TYPE, - LETTER_TYPE, - NOTIFICATION_CREATED, - Notification, - INTERNATIONAL_POSTAGE_TYPES) from app.dao.notifications_dao import ( dao_create_notification, dao_delete_notifications_by_id, ) - +from app.models import ( + EMAIL_TYPE, + INTERNATIONAL_POSTAGE_TYPES, + KEY_TYPE_TEST, + LETTER_TYPE, + NOTIFICATION_CREATED, + SMS_TYPE, + Notification, +) from app.v2.errors import BadRequestError - -from gds_metrics import Histogram - - REDIS_GET_AND_INCR_DAILY_LIMIT_DURATION_SECONDS = Histogram( 'redis_get_and_incr_daily_limit_duration_seconds', 'Time taken to get and possibly incremement the daily limit cache key', diff --git a/app/notifications/receive_notifications.py b/app/notifications/receive_notifications.py index e2482db39..f48f48d48 100644 --- a/app/notifications/receive_notifications.py +++ b/app/notifications/receive_notifications.py @@ -2,16 +2,16 @@ from datetime import datetime from urllib.parse import unquote import iso8601 -from flask import jsonify, Blueprint, current_app, request, abort +from flask import Blueprint, abort, current_app, jsonify, request from gds_metrics.metrics import Counter from notifications_utils.recipients import try_validate_and_format_phone_number from app.celery import tasks from app.config import QueueNames -from app.dao.services_dao import dao_fetch_service_by_inbound_number from app.dao.inbound_sms_dao import dao_create_inbound_sms -from app.models import InboundSms, INBOUND_SMS_TYPE, SMS_TYPE +from app.dao.services_dao import dao_fetch_service_by_inbound_number from app.errors import register_errors +from app.models import INBOUND_SMS_TYPE, SMS_TYPE, InboundSms receive_notifications_blueprint = Blueprint('receive_notifications', __name__) register_errors(receive_notifications_blueprint) diff --git a/app/notifications/rest.py b/app/notifications/rest.py index e6425b794..66ca9973d 100644 --- a/app/notifications/rest.py +++ b/app/notifications/rest.py @@ -1,27 +1,21 @@ -from flask import ( - Blueprint, - jsonify, - request, - current_app -) +from flask import Blueprint, current_app, jsonify, request +from notifications_utils import SMS_CHAR_COUNT_LIMIT from app import api_user, authenticated_service from app.config import QueueNames -from app.dao import ( - notifications_dao -) -from app.errors import ( - register_errors, - InvalidRequest -) +from app.dao import notifications_dao +from app.errors import InvalidRequest, register_errors from app.models import ( - EMAIL_TYPE, SMS_TYPE, - KEY_TYPE_TEAM, PRIORITY, - LETTER_TYPE) + EMAIL_TYPE, + KEY_TYPE_TEAM, + LETTER_TYPE, + PRIORITY, + SMS_TYPE, +) from app.notifications.process_notifications import ( persist_notification, send_notification_to_queue, - simulated_recipient + simulated_recipient, ) from app.notifications.validators import ( check_if_service_can_send_to_number, @@ -31,14 +25,12 @@ from app.notifications.validators import ( ) from app.schemas import ( email_notification_schema, - sms_template_notification_schema, notification_with_personalisation_schema, - notifications_filter_schema + notifications_filter_schema, + sms_template_notification_schema, ) from app.service.utils import service_allowed_to_send_to -from app.utils import pagination_links, get_public_notify_type_text - -from notifications_utils import SMS_CHAR_COUNT_LIMIT +from app.utils import get_public_notify_type_text, pagination_links notifications = Blueprint('notifications', __name__) diff --git a/app/notifications/utils.py b/app/notifications/utils.py index bca551749..2198fa42e 100644 --- a/app/notifications/utils.py +++ b/app/notifications/utils.py @@ -1,5 +1,5 @@ -from flask import current_app import requests +from flask import current_app def confirm_subscription(confirmation_request): diff --git a/app/notifications/validators.py b/app/notifications/validators.py index f3199414f..bcdf15534 100644 --- a/app/notifications/validators.py +++ b/app/notifications/validators.py @@ -1,31 +1,45 @@ -from notifications_utils.postal_address import PostalAddress -from sqlalchemy.orm.exc import NoResultFound from flask import current_app +from gds_metrics.metrics import Histogram from notifications_utils import SMS_CHAR_COUNT_LIMIT -from notifications_utils.recipients import ( - validate_and_format_phone_number, - validate_and_format_email_address, - get_international_phone_info +from notifications_utils.clients.redis import ( + daily_limit_cache_key, + rate_limit_cache_key, ) -from notifications_utils.clients.redis import rate_limit_cache_key, daily_limit_cache_key +from notifications_utils.postal_address import PostalAddress +from notifications_utils.recipients import ( + get_international_phone_info, + validate_and_format_email_address, + validate_and_format_phone_number, +) +from sqlalchemy.orm.exc import NoResultFound -from app.dao import services_dao -from app.dao.service_sms_sender_dao import dao_get_service_sms_senders_by_id -from app.models import ( - INTERNATIONAL_SMS_TYPE, SMS_TYPE, EMAIL_TYPE, LETTER_TYPE, - KEY_TYPE_TEST, KEY_TYPE_TEAM, - ServicePermission, - INTERNATIONAL_LETTERS) -from app.service.utils import service_allowed_to_send_to -from app.v2.errors import TooManyRequestsError, BadRequestError, RateLimitError, ValidationError from app import redis_store -from app.notifications.process_notifications import create_content_for_notification -from app.utils import get_public_notify_type_text +from app.dao import services_dao from app.dao.service_email_reply_to_dao import dao_get_reply_to_by_id from app.dao.service_letter_contact_dao import dao_get_letter_contact_by_id +from app.dao.service_sms_sender_dao import dao_get_service_sms_senders_by_id +from app.models import ( + EMAIL_TYPE, + INTERNATIONAL_LETTERS, + INTERNATIONAL_SMS_TYPE, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, + LETTER_TYPE, + SMS_TYPE, + ServicePermission, +) +from app.notifications.process_notifications import ( + create_content_for_notification, +) from app.serialised_models import SerialisedTemplate - -from gds_metrics.metrics import Histogram +from app.service.utils import service_allowed_to_send_to +from app.utils import get_public_notify_type_text +from app.v2.errors import ( + BadRequestError, + RateLimitError, + TooManyRequestsError, + ValidationError, +) REDIS_EXCEEDED_RATE_LIMIT_DURATION_SECONDS = Histogram( 'redis_exceeded_rate_limit_duration_seconds', diff --git a/app/organisation/invite_rest.py b/app/organisation/invite_rest.py index e2a70c28c..d6454643d 100644 --- a/app/organisation/invite_rest.py +++ b/app/organisation/invite_rest.py @@ -1,25 +1,24 @@ -from flask import ( - Blueprint, - request, - jsonify, - current_app) +from flask import Blueprint, current_app, jsonify, request from notifications_utils.url_safe_token import generate_token from app.config import QueueNames from app.dao.invited_org_user_dao import ( - save_invited_org_user, get_invited_org_user, - get_invited_org_users_for_organisation + get_invited_org_users_for_organisation, + save_invited_org_user, ) from app.dao.templates_dao import dao_get_template_by_id from app.errors import register_errors from app.models import EMAIL_TYPE, KEY_TYPE_NORMAL, InvitedOrganisationUser -from app.notifications.process_notifications import persist_notification, send_notification_to_queue -from app.schema_validation import validate +from app.notifications.process_notifications import ( + persist_notification, + send_notification_to_queue, +) from app.organisation.organisation_schema import ( post_create_invited_org_user_status_schema, - post_update_invited_org_user_status_schema + post_update_invited_org_user_status_schema, ) +from app.schema_validation import validate organisation_invite_blueprint = Blueprint( 'organisation_invite', __name__, diff --git a/app/organisation/rest.py b/app/organisation/rest.py index 9c7c9f4a5..77761fcf6 100644 --- a/app/organisation/rest.py +++ b/app/organisation/rest.py @@ -1,29 +1,32 @@ -from flask import abort, Blueprint, jsonify, request, current_app +from flask import Blueprint, abort, current_app, jsonify, request from sqlalchemy.exc import IntegrityError from app.config import QueueNames from app.dao.fact_billing_dao import fetch_usage_year_for_organisation from app.dao.organisation_dao import ( - dao_create_organisation, - dao_get_organisations, - dao_get_organisation_by_id, - dao_get_organisation_by_email_address, - dao_get_organisation_services, - dao_update_organisation, dao_add_service_to_organisation, + dao_add_user_to_organisation, + dao_create_organisation, + dao_get_organisation_by_email_address, + dao_get_organisation_by_id, + dao_get_organisation_services, + dao_get_organisations, dao_get_users_for_organisation, - dao_add_user_to_organisation + dao_update_organisation, ) -from app.dao.templates_dao import dao_get_template_by_id from app.dao.services_dao import dao_fetch_service_by_id -from app.errors import register_errors, InvalidRequest -from app.models import Organisation, KEY_TYPE_NORMAL -from app.notifications.process_notifications import persist_notification, send_notification_to_queue +from app.dao.templates_dao import dao_get_template_by_id +from app.errors import InvalidRequest, register_errors +from app.models import KEY_TYPE_NORMAL, Organisation +from app.notifications.process_notifications import ( + persist_notification, + send_notification_to_queue, +) from app.organisation.organisation_schema import ( post_create_organisation_schema, - post_update_organisation_schema, post_link_service_to_organisation_schema, + post_update_organisation_schema, ) from app.schema_validation import validate diff --git a/app/performance_dashboard/rest.py b/app/performance_dashboard/rest.py index 31192f06a..beda46ac6 100644 --- a/app/performance_dashboard/rest.py +++ b/app/performance_dashboard/rest.py @@ -1,12 +1,18 @@ from datetime import datetime -from flask import Blueprint, request, jsonify +from flask import Blueprint, jsonify, request -from app.dao.fact_notification_status_dao import get_total_notifications_for_date_range -from app.dao.fact_processing_time_dao import get_processing_time_percentage_for_date_range +from app.dao.fact_notification_status_dao import ( + get_total_notifications_for_date_range, +) +from app.dao.fact_processing_time_dao import ( + get_processing_time_percentage_for_date_range, +) from app.dao.services_dao import get_live_services_with_organisation from app.errors import register_errors -from app.performance_dashboard.performance_dashboard_schema import performance_dashboard_request +from app.performance_dashboard.performance_dashboard_schema import ( + performance_dashboard_request, +) from app.schema_validation import validate performance_dashboard_blueprint = Blueprint('performance_dashboard', __name__, url_prefix='/performance-dashboard') diff --git a/app/performance_platform/processing_time.py b/app/performance_platform/processing_time.py index d93764a48..4b0eb3570 100644 --- a/app/performance_platform/processing_time.py +++ b/app/performance_platform/processing_time.py @@ -2,11 +2,13 @@ from datetime import timedelta from flask import current_app +from app import performance_platform_client from app.dao.fact_processing_time_dao import insert_update_processing_time +from app.dao.notifications_dao import ( + dao_get_total_notifications_sent_per_day_for_performance_platform, +) from app.models import FactProcessingTime from app.utils import get_london_midnight_in_utc -from app.dao.notifications_dao import dao_get_total_notifications_sent_per_day_for_performance_platform -from app import performance_platform_client def send_processing_time_to_performance_platform(bst_date): diff --git a/app/performance_platform/total_sent_notifications.py b/app/performance_platform/total_sent_notifications.py index aa37a9ccf..62b38e390 100644 --- a/app/performance_platform/total_sent_notifications.py +++ b/app/performance_platform/total_sent_notifications.py @@ -1,5 +1,7 @@ from app import performance_platform_client -from app.dao.fact_notification_status_dao import get_total_sent_notifications_for_day_and_type +from app.dao.fact_notification_status_dao import ( + get_total_sent_notifications_for_day_and_type, +) def send_total_notifications_sent_for_day_stats(start_time, notification_type, count): diff --git a/app/platform_stats/rest.py b/app/platform_stats/rest.py index c0aa23196..76132400a 100644 --- a/app/platform_stats/rest.py +++ b/app/platform_stats/rest.py @@ -4,15 +4,18 @@ from flask import Blueprint, jsonify, request from app.dao.date_util import get_financial_year_for_datetime from app.dao.fact_billing_dao import ( - fetch_sms_billing_for_all_services, fetch_letter_costs_for_all_services, - fetch_letter_line_items_for_all_services + fetch_letter_costs_for_all_services, + fetch_letter_line_items_for_all_services, + fetch_sms_billing_for_all_services, ) -from app.dao.fact_notification_status_dao import fetch_notification_status_totals_for_all_services -from app.errors import register_errors, InvalidRequest +from app.dao.fact_notification_status_dao import ( + fetch_notification_status_totals_for_all_services, +) +from app.errors import InvalidRequest, register_errors from app.models import UK_POSTAGE_TYPES from app.platform_stats.platform_stats_schema import platform_stats_request -from app.service.statistics import format_admin_stats from app.schema_validation import validate +from app.service.statistics import format_admin_stats from app.utils import get_london_midnight_in_utc platform_stats_blueprint = Blueprint('platform_stats', __name__) diff --git a/app/provider_details/rest.py b/app/provider_details/rest.py index c5a58127b..dea1c2f9b 100644 --- a/app/provider_details/rest.py +++ b/app/provider_details/rest.py @@ -1,17 +1,14 @@ from flask import Blueprint, jsonify, request -from app.schemas import provider_details_schema, provider_details_history_schema from app.dao.provider_details_dao import ( - get_provider_details_by_id, - dao_update_provider_details, dao_get_provider_stats, - dao_get_provider_versions + dao_get_provider_versions, + dao_update_provider_details, + get_provider_details_by_id, ) from app.dao.users_dao import get_user_by_id -from app.errors import ( - register_errors, - InvalidRequest -) +from app.errors import InvalidRequest, register_errors +from app.schemas import provider_details_history_schema, provider_details_schema provider_details = Blueprint('provider_details', __name__) register_errors(provider_details) diff --git a/app/schema_validation/__init__.py b/app/schema_validation/__init__.py index 87bd88972..13dd5de87 100644 --- a/app/schema_validation/__init__.py +++ b/app/schema_validation/__init__.py @@ -2,10 +2,14 @@ import json from datetime import datetime, timedelta from uuid import UUID -from iso8601 import iso8601, ParseError -from jsonschema import (Draft7Validator, ValidationError, FormatChecker) -from notifications_utils.recipients import (validate_phone_number, validate_email_address, InvalidPhoneError, - InvalidEmailError) +from iso8601 import ParseError, iso8601 +from jsonschema import Draft7Validator, FormatChecker, ValidationError +from notifications_utils.recipients import ( + InvalidEmailError, + InvalidPhoneError, + validate_email_address, + validate_phone_number, +) format_checker = FormatChecker() diff --git a/app/schemas.py b/app/schemas.py index 41d487608..47bfe2087 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -1,32 +1,28 @@ -from datetime import ( - datetime, - date, - timedelta) -from flask_marshmallow.fields import fields -from marshmallow import ( - post_load, - ValidationError, - validates, - validates_schema, - pre_load, - pre_dump, - post_dump -) -from marshmallow_sqlalchemy import field_for +from datetime import date, datetime, timedelta from uuid import UUID +from flask_marshmallow.fields import fields +from marshmallow import ( + ValidationError, + post_dump, + post_load, + pre_dump, + pre_load, + validates, + validates_schema, +) +from marshmallow_sqlalchemy import field_for from notifications_utils.recipients import ( - validate_email_address, InvalidEmailError, - validate_phone_number, InvalidPhoneError, - validate_and_format_phone_number + validate_and_format_phone_number, + validate_email_address, + validate_phone_number, ) -from app import ma -from app import models -from app.models import ServicePermission +from app import ma, models from app.dao.permissions_dao import permission_dao +from app.models import ServicePermission from app.utils import DATETIME_FORMAT_NO_TIMEZONE, get_template_instance diff --git a/app/serialised_models.py b/app/serialised_models.py index 8f9c93d69..45437dd4c 100644 --- a/app/serialised_models.py +++ b/app/serialised_models.py @@ -11,7 +11,6 @@ from notifications_utils.serialised_model import ( from werkzeug.utils import cached_property from app import db, redis_store - from app.dao.api_key_dao import get_model_api_keys from app.dao.services_dao import dao_fetch_service_by_id diff --git a/app/service/callback_rest.py b/app/service/callback_rest.py index 7565d9d8a..33ba2d1ab 100644 --- a/app/service/callback_rest.py +++ b/app/service/callback_rest.py @@ -1,35 +1,28 @@ -from flask import ( - Blueprint, - jsonify, - request, -) +from flask import Blueprint, jsonify, request from sqlalchemy.exc import SQLAlchemyError -from app.errors import ( - register_errors, - InvalidRequest +from app.dao.service_callback_api_dao import ( + delete_service_callback_api, + get_service_callback_api, + reset_service_callback_api, + save_service_callback_api, ) +from app.dao.service_inbound_api_dao import ( + delete_service_inbound_api, + get_service_inbound_api, + reset_service_inbound_api, + save_service_inbound_api, +) +from app.errors import InvalidRequest, register_errors from app.models import ( - ServiceInboundApi, - ServiceCallbackApi, DELIVERY_STATUS_CALLBACK_TYPE, + ServiceCallbackApi, + ServiceInboundApi, ) from app.schema_validation import validate from app.service.service_callback_api_schema import ( create_service_callback_api_schema, - update_service_callback_api_schema -) -from app.dao.service_inbound_api_dao import ( - save_service_inbound_api, - get_service_inbound_api, - reset_service_inbound_api, - delete_service_inbound_api, -) -from app.dao.service_callback_api_dao import ( - save_service_callback_api, - get_service_callback_api, - reset_service_callback_api, - delete_service_callback_api, + update_service_callback_api_schema, ) service_callback_blueprint = Blueprint('service_callback', __name__, url_prefix='/service/') diff --git a/app/service/rest.py b/app/service/rest.py index d0c6af347..09ef7f27e 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -1,12 +1,7 @@ import itertools from datetime import datetime -from flask import ( - jsonify, - request, - current_app, - Blueprint -) +from flask import Blueprint, current_app, jsonify, request from notifications_utils.letter_timings import letter_can_be_cancelled from notifications_utils.timezones import convert_utc_to_bst from sqlalchemy.exc import IntegrityError @@ -15,23 +10,24 @@ from sqlalchemy.orm.exc import NoResultFound from app.aws import s3 from app.config import QueueNames from app.dao import fact_notification_status_dao, notifications_dao -from app.dao.dao_utils import dao_rollback -from app.dao.date_util import get_financial_year from app.dao.api_key_dao import ( - save_model_api_key, + expire_api_key, get_model_api_keys, get_unsigned_secret, - expire_api_key) + save_model_api_key, +) +from app.dao.broadcast_service_dao import set_broadcast_service_type +from app.dao.dao_utils import dao_rollback +from app.dao.date_util import get_financial_year from app.dao.fact_notification_status_dao import ( + fetch_monthly_template_usage_for_service, fetch_notification_status_for_service_by_month, fetch_notification_status_for_service_for_day, fetch_notification_status_for_service_for_today_and_7_previous_days, - fetch_stats_for_all_services_by_date_range, fetch_monthly_template_usage_for_service + fetch_stats_for_all_services_by_date_range, ) from app.dao.inbound_numbers_dao import dao_allocate_number_for_service -from app.dao.organisation_dao import ( - dao_get_organisation_by_service_id, -) +from app.dao.organisation_dao import dao_get_organisation_by_service_id from app.dao.returned_letters_dao import ( fetch_most_recent_returned_letter, fetch_recent_returned_letter_count, @@ -40,11 +36,10 @@ from app.dao.returned_letters_dao import ( ) from app.dao.service_contact_list_dao import ( dao_archive_contact_list, - dao_get_contact_lists, dao_get_contact_list_by_id, + dao_get_contact_lists, save_service_contact_list, ) -from app.dao.broadcast_service_dao import set_broadcast_service_type from app.dao.service_data_retention_dao import ( fetch_service_data_retention, fetch_service_data_retention_by_id, @@ -52,13 +47,32 @@ from app.dao.service_data_retention_dao import ( insert_service_data_retention, update_service_data_retention, ) +from app.dao.service_email_reply_to_dao import ( + add_reply_to_email_address_for_service, + archive_reply_to_email_address, + dao_get_reply_to_by_id, + dao_get_reply_to_by_service_id, + update_reply_to_email_address, +) +from app.dao.service_guest_list_dao import ( + dao_add_and_commit_guest_list_contacts, + dao_fetch_service_guest_list, + dao_remove_service_guest_list, +) +from app.dao.service_letter_contact_dao import ( + add_letter_contact_for_service, + archive_letter_contact, + dao_get_letter_contact_by_id, + dao_get_letter_contacts_by_service_id, + update_letter_contact, +) from app.dao.service_sms_sender_dao import ( archive_sms_sender, dao_add_sms_sender_for_service, - dao_update_service_sms_sender, dao_get_service_sms_senders_by_id, dao_get_sms_senders_by_service_id, - update_existing_sms_sender_with_inbound_number + dao_update_service_sms_sender, + update_existing_sms_sender_with_inbound_number, ) from app.dao.services_dao import ( dao_add_user_to_service, @@ -68,78 +82,71 @@ from app.dao.services_dao import ( dao_fetch_all_services_by_user, dao_fetch_live_services_data, dao_fetch_service_by_id, - dao_fetch_todays_stats_for_service, dao_fetch_todays_stats_for_all_services, - dao_resume_service, + dao_fetch_todays_stats_for_service, dao_remove_user_from_service, + dao_resume_service, dao_suspend_service, dao_update_service, get_services_by_partial_name, ) -from app.dao.service_guest_list_dao import ( - dao_fetch_service_guest_list, - dao_add_and_commit_guest_list_contacts, - dao_remove_service_guest_list -) -from app.dao.service_email_reply_to_dao import ( - add_reply_to_email_address_for_service, - archive_reply_to_email_address, - dao_get_reply_to_by_id, - dao_get_reply_to_by_service_id, - update_reply_to_email_address -) -from app.dao.service_letter_contact_dao import ( - archive_letter_contact, - dao_get_letter_contacts_by_service_id, - dao_get_letter_contact_by_id, - add_letter_contact_for_service, - update_letter_contact -) from app.dao.templates_dao import dao_get_template_by_id from app.dao.users_dao import get_user_by_id -from app.errors import ( - InvalidRequest, - register_errors -) +from app.errors import InvalidRequest, register_errors from app.letters.utils import letter_print_day from app.models import ( KEY_TYPE_NORMAL, LETTER_TYPE, NOTIFICATION_CANCELLED, - Permission, - Service, EmailBranding, LetterBranding, - ServiceContactList + Permission, + Service, + ServiceContactList, +) +from app.notifications.process_notifications import ( + persist_notification, + send_notification_to_queue, ) -from app.notifications.process_notifications import persist_notification, send_notification_to_queue from app.schema_validation import validate +from app.schemas import ( + api_key_schema, + detailed_service_schema, + email_data_request_schema, + notification_with_template_schema, + notifications_filter_schema, + service_schema, +) from app.service import statistics +from app.service.send_notification import ( + send_one_off_notification, + send_pdf_letter_notification, +) from app.service.send_pdf_letter_schema import send_pdf_letter_request -from app.service.service_contact_list_schema import create_service_contact_list_schema +from app.service.sender import send_notification_to_service_users +from app.service.service_broadcast_settings_schema import ( + service_broadcast_settings_schema, +) +from app.service.service_contact_list_schema import ( + create_service_contact_list_schema, +) from app.service.service_data_retention_schema import ( add_service_data_retention_request, - update_service_data_retention_request + update_service_data_retention_request, ) from app.service.service_senders_schema import ( add_service_email_reply_to_request, add_service_letter_contact_block_request, - add_service_sms_sender_request + add_service_sms_sender_request, ) -from app.service.service_broadcast_settings_schema import service_broadcast_settings_schema from app.service.utils import get_guest_list_objects -from app.service.sender import send_notification_to_service_users -from app.service.send_notification import send_one_off_notification, send_pdf_letter_notification -from app.schemas import ( - service_schema, - api_key_schema, - notification_with_template_schema, - notifications_filter_schema, - detailed_service_schema, - email_data_request_schema -) from app.user.users_schema import post_set_permissions_schema -from app.utils import DATE_FORMAT, DATETIME_FORMAT_NO_TIMEZONE, midnight_n_days_ago, pagination_links +from app.utils import ( + DATE_FORMAT, + DATETIME_FORMAT_NO_TIMEZONE, + midnight_n_days_ago, + pagination_links, +) service_blueprint = Blueprint('service', __name__) @@ -367,11 +374,11 @@ def remove_user_from_service(service_id, user_id): # tables. This is so product owner can pass stories as done @service_blueprint.route('//history', methods=['GET']) def get_service_history(service_id): - from app.models import (Service, ApiKey, TemplateHistory) + from app.models import ApiKey, Service, TemplateHistory from app.schemas import ( - service_history_schema, api_key_history_schema, - template_history_schema + service_history_schema, + template_history_schema, ) service_history = Service.get_history_model().query.filter_by(id=service_id).all() @@ -570,7 +577,7 @@ def get_detailed_services(start_date, end_date, only_active=False, include_from_ @service_blueprint.route('//guest-list', methods=['GET']) def get_guest_list(service_id): - from app.models import (EMAIL_TYPE, MOBILE_TYPE) + from app.models import EMAIL_TYPE, MOBILE_TYPE service = dao_fetch_service_by_id(service_id) if not service: diff --git a/app/service/send_notification.py b/app/service/send_notification.py index b1e1e8224..0d1a3b65d 100644 --- a/app/service/send_notification.py +++ b/app/service/send_notification.py @@ -1,7 +1,8 @@ import urllib from flask import current_app -from notifications_utils.s3 import S3ObjectNotFound, s3download as utils_s3download +from notifications_utils.s3 import S3ObjectNotFound +from notifications_utils.s3 import s3download as utils_s3download from sqlalchemy.orm.exc import NoResultFound from app import create_random_identifier @@ -9,26 +10,11 @@ from app.config import QueueNames from app.dao.notifications_dao import _update_notification_status from app.dao.service_email_reply_to_dao import dao_get_reply_to_by_id from app.dao.service_sms_sender_dao import dao_get_service_sms_senders_by_id -from app.notifications.validators import ( - check_service_has_permission, - check_service_over_daily_message_limit, - validate_and_format_recipient, - validate_template, - validate_address) -from app.notifications.process_notifications import ( - persist_notification, - send_notification_to_queue -) -from app.models import ( - KEY_TYPE_NORMAL, - PRIORITY, - SMS_TYPE, - EMAIL_TYPE, - LETTER_TYPE, - NOTIFICATION_DELIVERED, -) from app.dao.services_dao import dao_fetch_service_by_id -from app.dao.templates_dao import dao_get_template_by_id_and_service_id, get_precompiled_letter_template +from app.dao.templates_dao import ( + dao_get_template_by_id_and_service_id, + get_precompiled_letter_template, +) from app.dao.users_dao import get_user_by_id from app.letters.utils import ( get_billable_units_for_letter_page_count, @@ -36,6 +22,25 @@ from app.letters.utils import ( get_page_count, move_uploaded_pdf_to_letters_bucket, ) +from app.models import ( + EMAIL_TYPE, + KEY_TYPE_NORMAL, + LETTER_TYPE, + NOTIFICATION_DELIVERED, + PRIORITY, + SMS_TYPE, +) +from app.notifications.process_notifications import ( + persist_notification, + send_notification_to_queue, +) +from app.notifications.validators import ( + check_service_has_permission, + check_service_over_daily_message_limit, + validate_address, + validate_and_format_recipient, + validate_template, +) from app.v2.errors import BadRequestError diff --git a/app/service/sender.py b/app/service/sender.py index 7052cbfb2..5a99011ae 100644 --- a/app/service/sender.py +++ b/app/service/sender.py @@ -1,10 +1,16 @@ from flask import current_app from app.config import QueueNames -from app.dao.services_dao import dao_fetch_service_by_id, dao_fetch_active_users_for_service +from app.dao.services_dao import ( + dao_fetch_active_users_for_service, + dao_fetch_service_by_id, +) from app.dao.templates_dao import dao_get_template_by_id from app.models import EMAIL_TYPE, KEY_TYPE_NORMAL -from app.notifications.process_notifications import persist_notification, send_notification_to_queue +from app.notifications.process_notifications import ( + persist_notification, + send_notification_to_queue, +) def send_notification_to_service_users(service_id, template_id, personalisation=None, include_user_fields=None): diff --git a/app/service/service_callback_api_schema.py b/app/service/service_callback_api_schema.py index 138dc3cee..0f32a4c71 100644 --- a/app/service/service_callback_api_schema.py +++ b/app/service/service_callback_api_schema.py @@ -1,4 +1,4 @@ -from app.schema_validation.definitions import uuid, https_url +from app.schema_validation.definitions import https_url, uuid create_service_callback_api_schema = { "$schema": "http://json-schema.org/draft-04/schema#", diff --git a/app/service/statistics.py b/app/service/statistics.py index 2191319c2..b9cabbe16 100644 --- a/app/service/statistics.py +++ b/app/service/statistics.py @@ -3,8 +3,8 @@ from datetime import datetime from notifications_utils.timezones import convert_utc_to_bst -from app.models import NOTIFICATION_STATUS_TYPES, NOTIFICATION_TYPES from app.dao.date_util import get_months_for_financial_year +from app.models import NOTIFICATION_STATUS_TYPES, NOTIFICATION_TYPES def format_statistics(statistics): diff --git a/app/service/utils.py b/app/service/utils.py index 04c879777..328043a45 100644 --- a/app/service/utils.py +++ b/app/service/utils.py @@ -2,12 +2,15 @@ import itertools from notifications_utils.recipients import allowed_to_send_to -from app.models import ( - ServiceGuestList, - MOBILE_TYPE, EMAIL_TYPE, - KEY_TYPE_TEST, KEY_TYPE_TEAM, KEY_TYPE_NORMAL) - from app.dao.services_dao import dao_fetch_service_by_id +from app.models import ( + EMAIL_TYPE, + KEY_TYPE_NORMAL, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, + MOBILE_TYPE, + ServiceGuestList, +) def get_recipients_from_request(request_json, key, type): diff --git a/app/status/healthcheck.py b/app/status/healthcheck.py index 995c89e5b..a1971d790 100644 --- a/app/status/healthcheck.py +++ b/app/status/healthcheck.py @@ -1,12 +1,8 @@ -from flask import ( - jsonify, - Blueprint, - request -) +from flask import Blueprint, jsonify, request from app import db, version -from app.dao.services_dao import dao_count_live_services from app.dao.organisation_dao import dao_count_organisations_with_live_services +from app.dao.services_dao import dao_count_live_services status = Blueprint('status', __name__) diff --git a/app/template/rest.py b/app/template/rest.py index 98a302e65..0ff792660 100644 --- a/app/template/rest.py +++ b/app/template/rest.py @@ -2,42 +2,44 @@ import base64 from io import BytesIO import botocore -from PyPDF2.utils import PdfReadError -from flask import ( - Blueprint, - current_app, - jsonify, - request) +from flask import Blueprint, current_app, jsonify, request from notifications_utils import SMS_CHAR_COUNT_LIMIT from notifications_utils.pdf import extract_page_from_pdf from notifications_utils.template import SMSMessageTemplate +from PyPDF2.utils import PdfReadError from requests import post as requests_post from sqlalchemy.orm.exc import NoResultFound from app.dao.notifications_dao import get_notification_by_id from app.dao.services_dao import dao_fetch_service_by_id -from app.dao.template_folder_dao import dao_get_template_folder_by_id_and_service_id +from app.dao.template_folder_dao import ( + dao_get_template_folder_by_id_and_service_id, +) from app.dao.templates_dao import ( - dao_update_template, dao_create_template, - dao_redact_template, - dao_get_template_by_id_and_service_id, dao_get_all_templates_for_service, - dao_get_template_versions, - dao_update_template_reply_to, dao_get_template_by_id, + dao_get_template_by_id_and_service_id, + dao_get_template_versions, + dao_redact_template, + dao_update_template, + dao_update_template_reply_to, get_precompiled_letter_template, ) -from app.errors import ( - register_errors, - InvalidRequest -) +from app.errors import InvalidRequest, register_errors from app.letters.utils import get_letter_pdf_and_metadata -from app.models import SMS_TYPE, Template, SECOND_CLASS, LETTER_TYPE -from app.notifications.validators import service_has_permission, check_reply_to +from app.models import LETTER_TYPE, SECOND_CLASS, SMS_TYPE, Template +from app.notifications.validators import check_reply_to, service_has_permission from app.schema_validation import validate -from app.schemas import (template_schema, template_schema_no_detail, template_history_schema) -from app.template.template_schemas import post_create_template_schema, post_update_template_schema +from app.schemas import ( + template_history_schema, + template_schema, + template_schema_no_detail, +) +from app.template.template_schemas import ( + post_create_template_schema, + post_update_template_schema, +) from app.utils import get_public_notify_type_text template_blueprint = Blueprint('template', __name__, url_prefix='/service//template') diff --git a/app/template/template_schemas.py b/app/template/template_schemas.py index 6c1033940..fb38de232 100644 --- a/app/template/template_schemas.py +++ b/app/template/template_schemas.py @@ -1,7 +1,4 @@ -from app.models import ( - TEMPLATE_PROCESS_TYPE, - TEMPLATE_TYPES, -) +from app.models import TEMPLATE_PROCESS_TYPE, TEMPLATE_TYPES from app.schema_validation.definitions import nullable_uuid, uuid post_create_template_schema = { diff --git a/app/template_folder/rest.py b/app/template_folder/rest.py index 43e631c79..f25cd98a0 100644 --- a/app/template_folder/rest.py +++ b/app/template_folder/rest.py @@ -1,26 +1,28 @@ -from flask import Blueprint, jsonify, request, current_app +from flask import Blueprint, current_app, jsonify, request from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound from app.dao.dao_utils import transactional -from app.dao.templates_dao import dao_get_template_by_id_and_service_id -from app.dao.template_folder_dao import ( - dao_create_template_folder, - dao_get_template_folder_by_id_and_service_id, - dao_update_template_folder, - dao_delete_template_folder +from app.dao.service_user_dao import ( + dao_get_active_service_users, + dao_get_service_user, ) from app.dao.services_dao import dao_fetch_service_by_id -from app.dao.service_user_dao import dao_get_active_service_users -from app.dao.service_user_dao import dao_get_service_user +from app.dao.template_folder_dao import ( + dao_create_template_folder, + dao_delete_template_folder, + dao_get_template_folder_by_id_and_service_id, + dao_update_template_folder, +) +from app.dao.templates_dao import dao_get_template_by_id_and_service_id from app.errors import InvalidRequest, register_errors from app.models import TemplateFolder +from app.schema_validation import validate from app.template_folder.template_folder_schema import ( post_create_template_folder_schema, - post_update_template_folder_schema, post_move_template_folder_schema, + post_update_template_folder_schema, ) -from app.schema_validation import validate template_folder_blueprint = Blueprint( 'template_folder', diff --git a/app/template_statistics/rest.py b/app/template_statistics/rest.py index 2f45dfbba..8188855fc 100644 --- a/app/template_statistics/rest.py +++ b/app/template_statistics/rest.py @@ -1,10 +1,11 @@ from flask import Blueprint, jsonify, request +from app.dao.fact_notification_status_dao import ( + fetch_notification_status_for_service_for_today_and_7_previous_days, +) from app.dao.notifications_dao import dao_get_last_date_template_was_used from app.dao.templates_dao import dao_get_template_by_id_and_service_id -from app.dao.fact_notification_status_dao import fetch_notification_status_for_service_for_today_and_7_previous_days - -from app.errors import register_errors, InvalidRequest +from app.errors import InvalidRequest, register_errors from app.utils import DATETIME_FORMAT template_statistics = Blueprint('template_statistics', diff --git a/app/upload/rest.py b/app/upload/rest.py index b1fd3e56d..7b1f1fb4c 100644 --- a/app/upload/rest.py +++ b/app/upload/rest.py @@ -1,25 +1,18 @@ from datetime import datetime -from flask import ( - Blueprint, - abort, - jsonify, - request, - current_app -) -from app.dao.fact_notification_status_dao import fetch_notification_statuses_for_job -from app.dao.jobs_dao import ( - dao_get_notification_outcomes_for_job +from flask import Blueprint, abort, current_app, jsonify, request + +from app.dao.fact_notification_status_dao import ( + fetch_notification_statuses_for_job, ) +from app.dao.jobs_dao import dao_get_notification_outcomes_for_job from app.dao.uploads_dao import ( dao_get_uploaded_letters_by_print_date, dao_get_uploads_by_service_id, ) -from app.errors import ( - register_errors, -) +from app.errors import register_errors from app.schemas import notification_with_template_schema -from app.utils import pagination_links, midnight_n_days_ago +from app.utils import midnight_n_days_ago, pagination_links upload_blueprint = Blueprint('upload', __name__, url_prefix='/service//upload') diff --git a/app/user/rest.py b/app/user/rest.py index 71956ebd1..f02e2c527 100644 --- a/app/user/rest.py +++ b/app/user/rest.py @@ -3,57 +3,68 @@ import uuid from datetime import datetime from urllib.parse import urlencode -from flask import (jsonify, request, Blueprint, current_app, abort) -from notifications_utils.recipients import is_uk_phone_number, use_numeric_sender +from flask import Blueprint, abort, current_app, jsonify, request +from notifications_utils.recipients import ( + is_uk_phone_number, + use_numeric_sender, +) from sqlalchemy.exc import IntegrityError from app.config import QueueNames +from app.dao.permissions_dao import permission_dao +from app.dao.service_user_dao import ( + dao_get_service_user, + dao_update_service_user, +) +from app.dao.services_dao import dao_fetch_service_by_id +from app.dao.template_folder_dao import ( + dao_get_template_folder_by_id_and_service_id, +) +from app.dao.templates_dao import dao_get_template_by_id from app.dao.users_dao import ( - get_user_by_id, - save_model_user, + count_user_verify_codes, + create_secret_code, create_user_code, + dao_archive_user, + get_user_and_accounts, + get_user_by_email, + get_user_by_id, get_user_code, - use_user_code, + get_users_by_partial_email, increment_failed_login_count, reset_failed_login_count, - get_user_by_email, - get_users_by_partial_email, - create_secret_code, + save_model_user, save_user_attribute, update_user_password, - count_user_verify_codes, - get_user_and_accounts, - dao_archive_user, + use_user_code, +) +from app.errors import InvalidRequest, register_errors +from app.models import ( + EMAIL_TYPE, + KEY_TYPE_NORMAL, + SMS_TYPE, + Permission, + Service, ) -from app.dao.permissions_dao import permission_dao -from app.dao.service_user_dao import dao_get_service_user, dao_update_service_user -from app.dao.services_dao import dao_fetch_service_by_id -from app.dao.templates_dao import dao_get_template_by_id -from app.dao.template_folder_dao import dao_get_template_folder_by_id_and_service_id -from app.models import KEY_TYPE_NORMAL, Permission, Service, SMS_TYPE, EMAIL_TYPE from app.notifications.process_notifications import ( persist_notification, - send_notification_to_queue -) -from app.schemas import ( - email_data_request_schema, - partial_email_data_request_schema, - create_user_schema, - user_update_schema_load_json, - user_update_password_schema_load_json -) -from app.errors import ( - register_errors, - InvalidRequest -) -from app.utils import url_with_token -from app.user.users_schema import ( - post_verify_code_schema, - post_send_user_sms_code_schema, - post_send_user_email_code_schema, - post_set_permissions_schema, + send_notification_to_queue, ) from app.schema_validation import validate +from app.schemas import ( + create_user_schema, + email_data_request_schema, + partial_email_data_request_schema, + user_update_password_schema_load_json, + user_update_schema_load_json, +) +from app.user.users_schema import ( + post_send_user_email_code_schema, + post_send_user_sms_code_schema, + post_set_permissions_schema, + post_verify_code_schema, +) +from app.utils import url_with_token user_blueprint = Blueprint('user', __name__) register_errors(user_blueprint) diff --git a/app/utils.py b/app/utils.py index be0b6f97f..6ba170824 100644 --- a/app/utils.py +++ b/app/utils.py @@ -2,15 +2,14 @@ from datetime import datetime, timedelta import pytz from flask import url_for -from sqlalchemy import func -from notifications_utils.timezones import convert_utc_to_bst from notifications_utils.template import ( - SMSMessageTemplate, + BroadcastMessageTemplate, HTMLEmailTemplate, LetterPrintTemplate, - BroadcastMessageTemplate, + SMSMessageTemplate, ) - +from notifications_utils.timezones import convert_utc_to_bst +from sqlalchemy import func DATETIME_FORMAT_NO_TIMEZONE = "%Y-%m-%d %H:%M:%S.%f" DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" @@ -38,7 +37,7 @@ def url_with_token(data, url, config, base_url=None): def get_template_instance(template, values): - from app.models import SMS_TYPE, EMAIL_TYPE, LETTER_TYPE, BROADCAST_TYPE + from app.models import BROADCAST_TYPE, EMAIL_TYPE, LETTER_TYPE, SMS_TYPE return { SMS_TYPE: SMSMessageTemplate, EMAIL_TYPE: HTMLEmailTemplate, @@ -81,7 +80,12 @@ def get_london_month_from_utc_column(column): def get_public_notify_type_text(notify_type, plural=False): - from app.models import (SMS_TYPE, BROADCAST_TYPE, UPLOAD_DOCUMENT, PRECOMPILED_LETTER) + from app.models import ( + BROADCAST_TYPE, + PRECOMPILED_LETTER, + SMS_TYPE, + UPLOAD_DOCUMENT, + ) notify_type_text = notify_type if notify_type == SMS_TYPE: notify_type_text = 'text message' diff --git a/app/v2/broadcast/__init__.py b/app/v2/broadcast/__init__.py index 0a2b29987..767cdb956 100644 --- a/app/v2/broadcast/__init__.py +++ b/app/v2/broadcast/__init__.py @@ -1,4 +1,5 @@ from flask import Blueprint + from app.v2.errors import register_errors v2_broadcast_blueprint = Blueprint( diff --git a/app/v2/broadcast/post_broadcast.py b/app/v2/broadcast/post_broadcast.py index b0511ef09..c5fae20a8 100644 --- a/app/v2/broadcast/post_broadcast.py +++ b/app/v2/broadcast/post_broadcast.py @@ -1,12 +1,14 @@ from itertools import chain + from flask import current_app, jsonify, request from notifications_utils.polygons import Polygons from notifications_utils.template import BroadcastMessageTemplate -from app import authenticated_service, api_user + +from app import api_user, authenticated_service from app.broadcast_message.translators import cap_xml_to_dict from app.dao.dao_utils import dao_save_object -from app.notifications.validators import check_service_has_permission from app.models import BROADCAST_TYPE, BroadcastMessage, BroadcastStatusType +from app.notifications.validators import check_service_has_permission from app.schema_validation import validate from app.v2.broadcast import v2_broadcast_blueprint from app.v2.broadcast.broadcast_schemas import post_broadcast_schema diff --git a/app/v2/errors.py b/app/v2/errors.py index ec3f13832..bd3e3c7e1 100644 --- a/app/v2/errors.py +++ b/app/v2/errors.py @@ -1,6 +1,6 @@ import json -from flask import jsonify, current_app, request +from flask import current_app, jsonify, request from jsonschema import ValidationError as JsonSchemaValidationError from notifications_utils.recipients import InvalidEmailError from sqlalchemy.exc import DataError diff --git a/app/v2/inbound_sms/__init__.py b/app/v2/inbound_sms/__init__.py index 5c713b2ef..ab7e19365 100644 --- a/app/v2/inbound_sms/__init__.py +++ b/app/v2/inbound_sms/__init__.py @@ -1,4 +1,5 @@ from flask import Blueprint + from app.v2.errors import register_errors v2_inbound_sms_blueprint = Blueprint("v2_inbound_sms", __name__, url_prefix='/v2/received-text-messages') diff --git a/app/v2/inbound_sms/get_inbound_sms.py b/app/v2/inbound_sms/get_inbound_sms.py index 24594a610..762327330 100644 --- a/app/v2/inbound_sms/get_inbound_sms.py +++ b/app/v2/inbound_sms/get_inbound_sms.py @@ -1,4 +1,4 @@ -from flask import jsonify, request, url_for, current_app +from flask import current_app, jsonify, request, url_for from app import authenticated_service from app.dao import inbound_sms_dao diff --git a/app/v2/inbound_sms/inbound_sms_schemas.py b/app/v2/inbound_sms/inbound_sms_schemas.py index e68952a23..068097d76 100644 --- a/app/v2/inbound_sms/inbound_sms_schemas.py +++ b/app/v2/inbound_sms/inbound_sms_schemas.py @@ -1,6 +1,5 @@ from app.schema_validation.definitions import uuid - get_inbound_sms_request = { "$schema": "http://json-schema.org/draft-04/schema#", "description": "schema for query parameters allowed when getting list of received text messages", diff --git a/app/v2/notifications/__init__.py b/app/v2/notifications/__init__.py index 3cfc932c7..4f5a4debd 100644 --- a/app/v2/notifications/__init__.py +++ b/app/v2/notifications/__init__.py @@ -1,4 +1,5 @@ from flask import Blueprint + from app.v2.errors import register_errors v2_notification_blueprint = Blueprint("v2_notifications", __name__, url_prefix='/v2/notifications') diff --git a/app/v2/notifications/get_notifications.py b/app/v2/notifications/get_notifications.py index 7f90f7a9d..e11b8abbe 100644 --- a/app/v2/notifications/get_notifications.py +++ b/app/v2/notifications/get_notifications.py @@ -1,19 +1,22 @@ from io import BytesIO -from flask import jsonify, request, url_for, current_app, send_file +from flask import current_app, jsonify, request, send_file, url_for from app import api_user, authenticated_service from app.dao import notifications_dao from app.letters.utils import get_letter_pdf_and_metadata +from app.models import ( + LETTER_TYPE, + NOTIFICATION_PENDING_VIRUS_CHECK, + NOTIFICATION_TECHNICAL_FAILURE, + NOTIFICATION_VIRUS_SCAN_FAILED, +) from app.schema_validation import validate from app.v2.errors import BadRequestError, PDFNotReadyError from app.v2.notifications import v2_notification_blueprint -from app.v2.notifications.notification_schemas import get_notifications_request, notification_by_id -from app.models import ( - NOTIFICATION_PENDING_VIRUS_CHECK, - NOTIFICATION_VIRUS_SCAN_FAILED, - NOTIFICATION_TECHNICAL_FAILURE, - LETTER_TYPE, +from app.v2.notifications.notification_schemas import ( + get_notifications_request, + notification_by_id, ) diff --git a/app/v2/notifications/notification_schemas.py b/app/v2/notifications/notification_schemas.py index ea534c2f3..e1bbfb596 100644 --- a/app/v2/notifications/notification_schemas.py +++ b/app/v2/notifications/notification_schemas.py @@ -1,11 +1,10 @@ from app.models import ( - NOTIFICATION_STATUS_TYPES, NOTIFICATION_STATUS_LETTER_ACCEPTED, NOTIFICATION_STATUS_LETTER_RECEIVED, + NOTIFICATION_STATUS_TYPES, NOTIFICATION_TYPES, ) -from app.schema_validation.definitions import (uuid, personalisation) - +from app.schema_validation.definitions import personalisation, uuid template = { "$schema": "http://json-schema.org/draft-04/schema#", diff --git a/app/v2/notifications/post_notifications.py b/app/v2/notifications/post_notifications.py index a96f40dc0..827ed3f1d 100644 --- a/app/v2/notifications/post_notifications.py +++ b/app/v2/notifications/post_notifications.py @@ -4,18 +4,21 @@ import uuid from datetime import datetime from boto.exception import SQSError -from flask import request, jsonify, current_app, abort -from notifications_utils.recipients import try_validate_and_format_phone_number +from flask import abort, current_app, jsonify, request from gds_metrics import Histogram +from notifications_utils.recipients import try_validate_and_format_phone_number from app import ( api_user, authenticated_service, - notify_celery, document_download_client, encryption, + notify_celery, +) +from app.celery.letters_pdf_tasks import ( + get_pdf_for_templated_letter, + sanitise_letter, ) -from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter, sanitise_letter from app.celery.research_mode_tasks import create_fake_letter_response_file from app.celery.tasks import save_api_email, save_api_sms from app.clients.document_download import DocumentDownloadError @@ -23,27 +26,30 @@ from app.config import QueueNames, TaskNames from app.dao.templates_dao import get_precompiled_letter_template from app.letters.utils import upload_letter_pdf from app.models import ( - SMS_TYPE, EMAIL_TYPE, - LETTER_TYPE, - PRIORITY, KEY_TYPE_NORMAL, - KEY_TYPE_TEST, KEY_TYPE_TEAM, + KEY_TYPE_TEST, + LETTER_TYPE, NOTIFICATION_CREATED, - NOTIFICATION_SENDING, NOTIFICATION_DELIVERED, NOTIFICATION_PENDING_VIRUS_CHECK, - Notification) + NOTIFICATION_SENDING, + PRIORITY, + SMS_TYPE, + Notification, +) from app.notifications.process_letter_notifications import ( - create_letter_notification + create_letter_notification, ) from app.notifications.process_notifications import ( persist_notification, + send_notification_to_queue_detached, simulated_recipient, - send_notification_to_queue_detached) +) from app.notifications.validators import ( check_if_service_can_send_files_by_email, + check_is_message_too_long, check_rate_limiting, check_service_email_reply_to_id, check_service_has_permission, @@ -51,21 +57,21 @@ from app.notifications.validators import ( validate_address, validate_and_format_recipient, validate_template, - check_is_message_too_long) +) from app.schema_validation import validate from app.utils import DATETIME_FORMAT from app.v2.errors import BadRequestError +from app.v2.notifications import v2_notification_blueprint from app.v2.notifications.create_response import ( create_post_email_response_from_notification, + create_post_letter_response_from_notification, create_post_sms_response_from_notification, - create_post_letter_response_from_notification ) -from app.v2.notifications import v2_notification_blueprint from app.v2.notifications.notification_schemas import ( - post_sms_request, post_email_request, post_letter_request, - post_precompiled_letter_request + post_precompiled_letter_request, + post_sms_request, ) from app.v2.utils import get_valid_json diff --git a/app/v2/template/post_template.py b/app/v2/template/post_template.py index fd67460fe..9f7671b22 100644 --- a/app/v2/template/post_template.py +++ b/app/v2/template/post_template.py @@ -6,8 +6,8 @@ from app.schema_validation import validate from app.v2.errors import BadRequestError from app.v2.template import v2_template_blueprint from app.v2.template.template_schemas import ( + create_post_template_preview_response, post_template_preview_request, - create_post_template_preview_response ) from app.v2.utils import get_valid_json diff --git a/app/v2/template/template_schemas.py b/app/v2/template/template_schemas.py index 47b1bcb99..48c3a606c 100644 --- a/app/v2/template/template_schemas.py +++ b/app/v2/template/template_schemas.py @@ -1,6 +1,5 @@ from app.models import TEMPLATE_TYPES -from app.schema_validation.definitions import uuid, personalisation - +from app.schema_validation.definitions import personalisation, uuid get_template_by_id_request = { "$schema": "http://json-schema.org/draft-04/schema#", diff --git a/app/v2/templates/templates_schemas.py b/app/v2/templates/templates_schemas.py index d5b335874..7aa83a9b5 100644 --- a/app/v2/templates/templates_schemas.py +++ b/app/v2/templates/templates_schemas.py @@ -1,6 +1,7 @@ from app.models import TEMPLATE_TYPES -from app.v2.template.template_schemas import get_template_by_id_response as template - +from app.v2.template.template_schemas import ( + get_template_by_id_response as template, +) get_all_template_request = { "$schema": "http://json-schema.org/draft-04/schema#", diff --git a/app/v2/utils.py b/app/v2/utils.py index 699bf18ed..983c2d0ee 100644 --- a/app/v2/utils.py +++ b/app/v2/utils.py @@ -1,7 +1,7 @@ from flask import request +from werkzeug.exceptions import BadRequest from app.v2.errors import BadRequestError -from werkzeug.exceptions import BadRequest def get_valid_json(): diff --git a/app/xml_schemas/__init__.py b/app/xml_schemas/__init__.py index 4d8d11ef0..8f02f994e 100644 --- a/app/xml_schemas/__init__.py +++ b/app/xml_schemas/__init__.py @@ -1,6 +1,7 @@ -from lxml import etree from pathlib import Path +from lxml import etree + def validate_xml(document, schema_file_name): diff --git a/tests/__init__.py b/tests/__init__.py index 1dd349dcd..42f5b3a6d 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -3,9 +3,9 @@ import uuid from flask import current_app from notifications_python_client.authentication import create_jwt_token -from app.models import ApiKey, KEY_TYPE_NORMAL from app.dao.api_key_dao import save_model_api_key from app.dao.services_dao import dao_fetch_service_by_id +from app.models import KEY_TYPE_NORMAL, ApiKey def create_authorization_header(service_id=None, key_type=KEY_TYPE_NORMAL): diff --git a/tests/app/accept_invite/test_accept_invite_rest.py b/tests/app/accept_invite/test_accept_invite_rest.py index a351eb4de..98c3887f6 100644 --- a/tests/app/accept_invite/test_accept_invite_rest.py +++ b/tests/app/accept_invite/test_accept_invite_rest.py @@ -1,9 +1,10 @@ import uuid import pytest -from flask import json, current_app +from flask import current_app, json from freezegun import freeze_time from notifications_utils.url_safe_token import generate_token + from tests import create_authorization_header diff --git a/tests/app/authentication/test_authentication.py b/tests/app/authentication/test_authentication.py index b40f8b616..c4b9de346 100644 --- a/tests/app/authentication/test_authentication.py +++ b/tests/app/authentication/test_authentication.py @@ -1,29 +1,31 @@ -import jwt -import uuid import time +import uuid from datetime import datetime -from tests.conftest import set_config_values - -import pytest -from flask import json, current_app, request -from freezegun import freeze_time -from notifications_python_client.authentication import create_jwt_token from unittest.mock import call +import jwt +import pytest +from flask import current_app, json, request +from freezegun import freeze_time +from notifications_python_client.authentication import create_jwt_token + from app import api_user +from app.authentication.auth import ( + GENERAL_TOKEN_ERROR_MESSAGE, + AuthError, + requires_admin_auth, + requires_auth, +) from app.dao.api_key_dao import ( - get_unsigned_secrets, - save_model_api_key, - get_unsigned_secret, expire_api_key, get_model_api_keys, + get_unsigned_secret, + get_unsigned_secrets, + save_model_api_key, ) from app.dao.services_dao import dao_fetch_service_by_id - -from app.models import ApiKey, KEY_TYPE_NORMAL -from app.authentication.auth import AuthError, requires_admin_auth, requires_auth, GENERAL_TOKEN_ERROR_MESSAGE - -from tests.conftest import set_config +from app.models import KEY_TYPE_NORMAL, ApiKey +from tests.conftest import set_config, set_config_values @pytest.mark.parametrize('auth_fn', [requires_auth, requires_admin_auth]) diff --git a/tests/app/aws/test_s3.py b/tests/app/aws/test_s3.py index f006a7dde..cbb4fbe9f 100644 --- a/tests/app/aws/test_s3.py +++ b/tests/app/aws/test_s3.py @@ -1,14 +1,14 @@ -from unittest.mock import call from datetime import datetime, timedelta +from unittest.mock import call + import pytest import pytz - from freezegun import freeze_time from app.aws.s3 import ( + get_list_of_files_by_suffix, get_s3_bucket_objects, get_s3_file, - get_list_of_files_by_suffix, ) from tests.app.conftest import datetime_in_past diff --git a/tests/app/billing/test_billing.py b/tests/app/billing/test_billing.py index b734f02f6..c3c5a1209 100644 --- a/tests/app/billing/test_billing.py +++ b/tests/app/billing/test_billing.py @@ -1,24 +1,26 @@ +import json from calendar import monthrange from datetime import datetime, timedelta -import json import pytest from freezegun import freeze_time -from app.models import FactBilling -from app.dao.date_util import get_current_financial_year_start_year, get_month_start_and_end_date_in_utc +from app.billing.rest import update_free_sms_fragment_limit_data from app.dao.annual_billing_dao import dao_get_free_sms_fragment_limit_for_year +from app.dao.date_util import ( + get_current_financial_year_start_year, + get_month_start_and_end_date_in_utc, +) +from app.models import FactBilling +from tests import create_authorization_header from tests.app.db import ( + create_annual_billing, + create_ft_billing, create_notification, create_rate, - create_annual_billing, - create_template, create_service, - create_ft_billing + create_template, ) -from app.billing.rest import update_free_sms_fragment_limit_data - -from tests import create_authorization_header APR_2016_MONTH_START = datetime(2016, 3, 31, 23, 00, 00) APR_2016_MONTH_END = datetime(2016, 4, 30, 22, 59, 59, 99999) diff --git a/tests/app/broadcast_message/test_rest.py b/tests/app/broadcast_message/test_rest.py index d0742b0b8..b067b8bc4 100644 --- a/tests/app/broadcast_message/test_rest.py +++ b/tests/app/broadcast_message/test_rest.py @@ -1,13 +1,23 @@ -from unittest.mock import ANY import uuid +from unittest.mock import ANY -from freezegun import freeze_time import pytest +from freezegun import freeze_time -from app.dao.broadcast_message_dao import dao_get_broadcast_message_by_id_and_service_id -from app.models import BROADCAST_TYPE, BroadcastStatusType, BroadcastEventMessageType - -from tests.app.db import create_broadcast_message, create_template, create_service, create_user +from app.dao.broadcast_message_dao import ( + dao_get_broadcast_message_by_id_and_service_id, +) +from app.models import ( + BROADCAST_TYPE, + BroadcastEventMessageType, + BroadcastStatusType, +) +from tests.app.db import ( + create_broadcast_message, + create_service, + create_template, + create_user, +) def test_get_broadcast_message(admin_request, sample_broadcast_service): diff --git a/tests/app/celery/test_broadcast_message_tasks.py b/tests/app/celery/test_broadcast_message_tasks.py index 28b39a270..c8942ee6b 100644 --- a/tests/app/celery/test_broadcast_message_tasks.py +++ b/tests/app/celery/test_broadcast_message_tasks.py @@ -1,18 +1,11 @@ import uuid from datetime import datetime -from unittest.mock import call, ANY +from unittest.mock import ANY, call -from freezegun import freeze_time -from celery.exceptions import Retry import pytest +from celery.exceptions import Retry +from freezegun import freeze_time -from app.models import ( - BROADCAST_TYPE, - BroadcastStatusType, - BroadcastEventMessageType, - BroadcastProviderMessageStatus -) -from app.clients.cbc_proxy import CBCProxyRetryableException, CBCProxyFatalException from app.celery.broadcast_message_tasks import ( check_provider_message_should_send, get_retry_delay, @@ -20,12 +13,21 @@ from app.celery.broadcast_message_tasks import ( send_broadcast_provider_message, trigger_link_test, ) - +from app.clients.cbc_proxy import ( + CBCProxyFatalException, + CBCProxyRetryableException, +) +from app.models import ( + BROADCAST_TYPE, + BroadcastEventMessageType, + BroadcastProviderMessageStatus, + BroadcastStatusType, +) from tests.app.db import ( - create_template, - create_broadcast_message, create_broadcast_event, - create_broadcast_provider_message + create_broadcast_message, + create_broadcast_provider_message, + create_template, ) from tests.conftest import set_config diff --git a/tests/app/celery/test_ftp_update_tasks.py b/tests/app/celery/test_ftp_update_tasks.py index 715393329..77c3a9ef0 100644 --- a/tests/app/celery/test_ftp_update_tasks.py +++ b/tests/app/celery/test_ftp_update_tasks.py @@ -1,33 +1,38 @@ -from collections import namedtuple, defaultdict -from datetime import datetime, date +from collections import defaultdict, namedtuple +from datetime import date, datetime import pytest -from freezegun import freeze_time from flask import current_app +from freezegun import freeze_time -from app.exceptions import DVLAException, NotificationTechnicalFailureException -from app.models import ( - NotificationHistory, - NOTIFICATION_CREATED, - NOTIFICATION_DELIVERED, - NOTIFICATION_SENDING, - NOTIFICATION_TEMPORARY_FAILURE, - NOTIFICATION_TECHNICAL_FAILURE, - DailySortedLetter -) from app.celery.tasks import ( check_billable_units, get_billing_date_in_bst_from_filename, persist_daily_sorted_letter_counts, process_updates_from_file, + record_daily_sorted_counts, update_letter_notifications_statuses, update_letter_notifications_to_error, update_letter_notifications_to_sent_to_dvla, - record_daily_sorted_counts ) -from app.dao.daily_sorted_letter_dao import dao_get_daily_sorted_letter_by_billing_day - -from tests.app.db import create_notification, create_service_callback_api, create_notification_history +from app.dao.daily_sorted_letter_dao import ( + dao_get_daily_sorted_letter_by_billing_day, +) +from app.exceptions import DVLAException, NotificationTechnicalFailureException +from app.models import ( + NOTIFICATION_CREATED, + NOTIFICATION_DELIVERED, + NOTIFICATION_SENDING, + NOTIFICATION_TECHNICAL_FAILURE, + NOTIFICATION_TEMPORARY_FAILURE, + DailySortedLetter, + NotificationHistory, +) +from tests.app.db import ( + create_notification, + create_notification_history, + create_service_callback_api, +) from tests.conftest import set_config diff --git a/tests/app/celery/test_letters_pdf_tasks.py b/tests/app/celery/test_letters_pdf_tasks.py index db49dec1d..6202e3d99 100644 --- a/tests/app/celery/test_letters_pdf_tasks.py +++ b/tests/app/celery/test_letters_pdf_tasks.py @@ -1,58 +1,55 @@ +from collections import namedtuple +from datetime import datetime, timedelta from unittest.mock import call import boto3 -from collections import namedtuple -from datetime import datetime, timedelta -from moto import mock_s3 -from flask import current_app -from freezegun import freeze_time import pytest from botocore.exceptions import ClientError from celery.exceptions import MaxRetriesExceededError +from flask import current_app +from freezegun import freeze_time +from moto import mock_s3 from sqlalchemy.orm.exc import NoResultFound from app import encryption -from app.errors import VirusScanError -from app.exceptions import NotificationTechnicalFailureException from app.celery.letters_pdf_tasks import ( + _move_invalid_letter_and_update_status, collate_letter_pdfs_to_be_sent, get_key_and_size_of_letters_to_be_sent_to_print, get_pdf_for_templated_letter, group_letters, process_sanitised_letter, - process_virus_scan_failed, process_virus_scan_error, + process_virus_scan_failed, replay_letters_in_error, sanitise_letter, send_letters_volume_email_to_dvla, update_billable_units_for_letter, - _move_invalid_letter_and_update_status, ) from app.config import QueueNames, TaskNames from app.dao.notifications_dao import get_notifications - +from app.errors import VirusScanError +from app.exceptions import NotificationTechnicalFailureException from app.letters.utils import ScanErrorType from app.models import ( INTERNATIONAL_LETTERS, KEY_TYPE_NORMAL, KEY_TYPE_TEST, LETTER_TYPE, - Notification, NOTIFICATION_CREATED, NOTIFICATION_DELIVERED, NOTIFICATION_PENDING_VIRUS_CHECK, NOTIFICATION_TECHNICAL_FAILURE, NOTIFICATION_VALIDATION_FAILED, NOTIFICATION_VIRUS_SCAN_FAILED, + Notification, ) - from tests.app.db import ( create_letter_branding, create_notification, create_service, - create_template + create_template, ) - from tests.conftest import set_config_values diff --git a/tests/app/celery/test_nightly_tasks.py b/tests/app/celery/test_nightly_tasks.py index 9a7bf613c..7844fbc3f 100644 --- a/tests/app/celery/test_nightly_tasks.py +++ b/tests/app/celery/test_nightly_tasks.py @@ -1,5 +1,5 @@ -from datetime import datetime, timedelta, date -from unittest.mock import call, patch, PropertyMock +from datetime import date, datetime, timedelta +from unittest.mock import PropertyMock, call, patch import pytest import pytz @@ -14,6 +14,7 @@ from app.celery.nightly_tasks import ( delete_letter_notifications_older_than_retention, delete_sms_notifications_older_than_retention, get_letter_notifications_still_sending_when_they_shouldnt_be, + letter_raise_alert_if_no_ack_file_for_zip, raise_alert_if_letter_notifications_still_sending, remove_letter_csv_files, remove_sms_email_csv_files, @@ -21,25 +22,24 @@ from app.celery.nightly_tasks import ( send_daily_performance_platform_stats, send_total_sent_notifications_to_performance_platform, timeout_notifications, - letter_raise_alert_if_no_ack_file_for_zip, ) -from app.celery.service_callback_tasks import create_delivery_status_callback_data -from app.clients.performance_platform.performance_platform_client import PerformancePlatformClient +from app.celery.service_callback_tasks import ( + create_delivery_status_callback_data, +) +from app.clients.performance_platform.performance_platform_client import ( + PerformancePlatformClient, +) from app.config import QueueNames from app.exceptions import NotificationTechnicalFailureException -from app.models import ( - LETTER_TYPE, - SMS_TYPE, - EMAIL_TYPE -) +from app.models import EMAIL_TYPE, LETTER_TYPE, SMS_TYPE from tests.app.db import ( + create_ft_notification_status, + create_job, create_notification, create_service, - create_template, - create_job, create_service_callback_api, create_service_data_retention, - create_ft_notification_status + create_template, ) diff --git a/tests/app/celery/test_process_ses_receipts_tasks.py b/tests/app/celery/test_process_ses_receipts_tasks.py index fab6ccaec..693972acd 100644 --- a/tests/app/celery/test_process_ses_receipts_tasks.py +++ b/tests/app/celery/test_process_ses_receipts_tasks.py @@ -3,26 +3,26 @@ from datetime import datetime from freezegun import freeze_time - -from app import statsd_client, encryption +from app import encryption, statsd_client from app.celery.process_ses_receipts_tasks import process_ses_results from app.celery.research_mode_tasks import ( ses_hard_bounce_callback, + ses_notification_callback, ses_soft_bounce_callback, - ses_notification_callback ) -from app.celery.service_callback_tasks import create_delivery_status_callback_data +from app.celery.service_callback_tasks import ( + create_delivery_status_callback_data, +) from app.dao.notifications_dao import get_notification_by_id from app.models import Complaint, Notification from app.notifications.notifications_ses_callback import ( + remove_emails_from_bounce, remove_emails_from_complaint, - remove_emails_from_bounce ) - from tests.app.db import ( create_notification, - ses_complaint_callback, create_service_callback_api, + ses_complaint_callback, ) diff --git a/tests/app/celery/test_provider_tasks.py b/tests/app/celery/test_provider_tasks.py index ce2615c36..eab74c52f 100644 --- a/tests/app/celery/test_provider_tasks.py +++ b/tests/app/celery/test_provider_tasks.py @@ -4,10 +4,13 @@ from celery.exceptions import MaxRetriesExceededError import app from app.celery import provider_tasks -from app.celery.provider_tasks import deliver_sms, deliver_email -from app.clients.sms import SmsClientResponseException +from app.celery.provider_tasks import deliver_email, deliver_sms from app.clients.email import EmailClientNonRetryableException -from app.clients.email.aws_ses import AwsSesClientException, AwsSesClientThrottlingSendRateException +from app.clients.email.aws_ses import ( + AwsSesClientException, + AwsSesClientThrottlingSendRateException, +) +from app.clients.sms import SmsClientResponseException from app.exceptions import NotificationTechnicalFailureException diff --git a/tests/app/celery/test_reporting_tasks.py b/tests/app/celery/test_reporting_tasks.py index 13d33160b..10fe41377 100644 --- a/tests/app/celery/test_reporting_tasks.py +++ b/tests/app/celery/test_reporting_tasks.py @@ -1,27 +1,33 @@ import itertools -from datetime import datetime, timedelta, date +from datetime import date, datetime, timedelta from decimal import Decimal import pytest from freezegun import freeze_time -from app.config import QueueNames from app.celery.reporting_tasks import ( create_nightly_billing, - create_nightly_notification_status, create_nightly_billing_for_day, + create_nightly_notification_status, create_nightly_notification_status_for_day, ) +from app.config import QueueNames from app.dao.fact_billing_dao import get_rate from app.models import ( - FactBilling, - Notification, - LETTER_TYPE, EMAIL_TYPE, - SMS_TYPE, FactNotificationStatus + LETTER_TYPE, + SMS_TYPE, + FactBilling, + FactNotificationStatus, + Notification, +) +from tests.app.db import ( + create_letter_rate, + create_notification, + create_rate, + create_service, + create_template, ) - -from tests.app.db import create_service, create_template, create_notification, create_rate, create_letter_rate def mocker_get_rate( diff --git a/tests/app/celery/test_research_mode_tasks.py b/tests/app/celery/test_research_mode_tasks.py index db03b4383..b30dc9fa9 100644 --- a/tests/app/celery/test_research_mode_tasks.py +++ b/tests/app/celery/test_research_mode_tasks.py @@ -1,23 +1,22 @@ import uuid from unittest.mock import ANY, call -from flask import current_app, json -from freezegun import freeze_time import pytest import requests_mock +from flask import current_app, json +from freezegun import freeze_time -from app.config import QueueNames from app.celery.research_mode_tasks import ( - send_sms_response, - send_email_response, - mmg_callback, - firetext_callback, - ses_notification_callback, + HTTPError, create_fake_letter_response_file, - HTTPError + firetext_callback, + mmg_callback, + send_email_response, + send_sms_response, + ses_notification_callback, ) -from tests.conftest import set_config_values, Matcher - +from app.config import QueueNames +from tests.conftest import Matcher, set_config_values dvla_response_file_matcher = Matcher( 'dvla_response_file', diff --git a/tests/app/celery/test_scheduled_tasks.py b/tests/app/celery/test_scheduled_tasks.py index 6823a85b9..573eacf5b 100644 --- a/tests/app/celery/test_scheduled_tasks.py +++ b/tests/app/celery/test_scheduled_tasks.py @@ -1,43 +1,39 @@ import uuid +from collections import namedtuple from datetime import datetime, timedelta from unittest.mock import call import pytest -from collections import namedtuple from freezegun import freeze_time from mock import mock from app.celery import scheduled_tasks from app.celery.scheduled_tasks import ( + check_for_missing_rows_in_completed_jobs, + check_for_services_with_high_failure_rates_or_sending_to_tv_numbers, + check_if_letters_still_in_created, + check_if_letters_still_pending_virus_check, check_job_status, delete_invitations, delete_verify_codes, - run_scheduled_jobs, replay_created_notifications, - check_if_letters_still_pending_virus_check, - check_if_letters_still_in_created, - check_for_missing_rows_in_completed_jobs, - check_for_services_with_high_failure_rates_or_sending_to_tv_numbers, + run_scheduled_jobs, switch_current_sms_provider_on_slow_delivery, trigger_link_tests, ) -from app.config import QueueNames, Config +from app.config import Config, QueueNames from app.dao.jobs_dao import dao_get_job_by_id from app.dao.provider_details_dao import get_provider_details_by_identifier from app.models import ( - JOB_STATUS_IN_PROGRESS, JOB_STATUS_ERROR, JOB_STATUS_FINISHED, + JOB_STATUS_IN_PROGRESS, NOTIFICATION_DELIVERED, NOTIFICATION_PENDING_VIRUS_CHECK, ) -from tests.conftest import set_config from tests.app import load_example_csv -from tests.app.db import ( - create_notification, - create_template, - create_job, -) +from tests.app.db import create_job, create_notification, create_template +from tests.conftest import set_config def _create_slow_delivery_notification(template, provider='mmg'): diff --git a/tests/app/celery/test_service_callback_tasks.py b/tests/app/celery/test_service_callback_tasks.py index 5450e5fce..3306c9651 100644 --- a/tests/app/celery/test_service_callback_tasks.py +++ b/tests/app/celery/test_service_callback_tasks.py @@ -6,14 +6,17 @@ import requests_mock from freezegun import freeze_time from app import encryption -from app.celery.service_callback_tasks import send_delivery_status_to_service, send_complaint_to_service +from app.celery.service_callback_tasks import ( + send_complaint_to_service, + send_delivery_status_to_service, +) from app.utils import DATETIME_FORMAT from tests.app.db import ( create_complaint, create_notification, - create_service_callback_api, create_service, - create_template + create_service_callback_api, + create_template, ) diff --git a/tests/app/celery/test_tasks.py b/tests/app/celery/test_tasks.py index f7393b1df..4caab5e60 100644 --- a/tests/app/celery/test_tasks.py +++ b/tests/app/celery/test_tasks.py @@ -5,68 +5,67 @@ from unittest.mock import Mock, call import pytest import requests_mock -from freezegun import freeze_time -from requests import RequestException -from sqlalchemy.exc import SQLAlchemyError from celery.exceptions import Retry +from freezegun import freeze_time +from notifications_utils.columns import Row from notifications_utils.template import ( LetterPrintTemplate, PlainTextEmailTemplate, SMSMessageTemplate, ) -from notifications_utils.columns import Row +from requests import RequestException +from sqlalchemy.exc import SQLAlchemyError from app import encryption -from app.celery import provider_tasks -from app.celery import tasks +from app.celery import provider_tasks, tasks from app.celery.tasks import ( - process_job, - process_row, - save_sms, - save_email, - save_letter, + get_recipient_csv_and_template_and_sender_id, process_incomplete_job, process_incomplete_jobs, - s3, - send_inbound_sms_to_service, + process_job, process_returned_letters_list, - get_recipient_csv_and_template_and_sender_id, + process_row, + s3, save_api_email, - save_api_sms + save_api_sms, + save_email, + save_letter, + save_sms, + send_inbound_sms_to_service, ) from app.config import QueueNames from app.dao import jobs_dao, service_email_reply_to_dao, service_sms_sender_dao from app.models import ( + EMAIL_TYPE, + JOB_STATUS_ERROR, + JOB_STATUS_FINISHED, + JOB_STATUS_IN_PROGRESS, + KEY_TYPE_NORMAL, + LETTER_TYPE, + NOTIFICATION_CREATED, + SMS_TYPE, Job, Notification, NotificationHistory, - EMAIL_TYPE, - KEY_TYPE_NORMAL, - JOB_STATUS_FINISHED, - JOB_STATUS_ERROR, - JOB_STATUS_IN_PROGRESS, - LETTER_TYPE, - SMS_TYPE, ReturnedLetter, - NOTIFICATION_CREATED) +) from app.serialised_models import SerialisedService, SerialisedTemplate from app.utils import DATETIME_FORMAT - from tests.app import load_example_csv - from tests.app.db import ( + create_api_key, create_inbound_sms, create_job, create_letter_contact, create_notification, - create_service_inbound_api, + create_notification_history, + create_reply_to_email, create_service, + create_service_inbound_api, + create_service_with_defined_sms_sender, create_template, create_user, - create_reply_to_email, - create_service_with_defined_sms_sender, - create_notification_history, - create_api_key) +) from tests.conftest import set_config_values @@ -754,7 +753,10 @@ def test_save_email_should_use_template_version_from_job_not_latest(sample_email notification = _notification_json(sample_email_template, 'my_email@my_email.com') version_on_notification = sample_email_template.version # Change the template - from app.dao.templates_dao import dao_update_template, dao_get_template_by_id + from app.dao.templates_dao import ( + dao_get_template_by_id, + dao_update_template, + ) sample_email_template.content = sample_email_template.content + " another version of the template" mocker.patch('app.celery.provider_tasks.deliver_email.apply_async') dao_update_template(sample_email_template) diff --git a/tests/app/clients/test_aws_ses.py b/tests/app/clients/test_aws_ses.py index 178b7c63c..fe1384dd7 100644 --- a/tests/app/clients/test_aws_ses.py +++ b/tests/app/clients/test_aws_ses.py @@ -1,10 +1,15 @@ +from unittest.mock import ANY, Mock + import botocore import pytest -from unittest.mock import Mock, ANY from app import aws_ses_client from app.clients.email import EmailClientNonRetryableException -from app.clients.email.aws_ses import get_aws_responses, AwsSesClientException, AwsSesClientThrottlingSendRateException +from app.clients.email.aws_ses import ( + AwsSesClientException, + AwsSesClientThrottlingSendRateException, + get_aws_responses, +) def test_should_return_correct_details_for_delivery(): diff --git a/tests/app/clients/test_cbc_proxy.py b/tests/app/clients/test_cbc_proxy.py index 320ff044d..478c6d550 100644 --- a/tests/app/clients/test_cbc_proxy.py +++ b/tests/app/clients/test_cbc_proxy.py @@ -1,15 +1,21 @@ -from io import BytesIO import json import uuid from collections import namedtuple from datetime import datetime +from io import BytesIO from unittest.mock import Mock, call -from botocore.exceptions import ClientError as BotoClientError import pytest +from botocore.exceptions import ClientError as BotoClientError from app.clients.cbc_proxy import ( - CBCProxyClient, CBCProxyRetryableException, CBCProxyEE, CBCProxyCanary, CBCProxyVodafone, CBCProxyThree, CBCProxyO2 + CBCProxyCanary, + CBCProxyClient, + CBCProxyEE, + CBCProxyO2, + CBCProxyRetryableException, + CBCProxyThree, + CBCProxyVodafone, ) from app.utils import DATETIME_FORMAT diff --git a/tests/app/clients/test_document_download.py b/tests/app/clients/test_document_download.py index 1114f9386..a7910a373 100644 --- a/tests/app/clients/test_document_download.py +++ b/tests/app/clients/test_document_download.py @@ -1,8 +1,11 @@ +import pytest import requests import requests_mock -import pytest -from app.clients.document_download import DocumentDownloadClient, DocumentDownloadError +from app.clients.document_download import ( + DocumentDownloadClient, + DocumentDownloadError, +) @pytest.fixture(scope='function') diff --git a/tests/app/clients/test_firetext.py b/tests/app/clients/test_firetext.py index a95655fab..1052cf480 100644 --- a/tests/app/clients/test_firetext.py +++ b/tests/app/clients/test_firetext.py @@ -1,11 +1,15 @@ -from requests import HTTPError from urllib.parse import parse_qs -from requests.exceptions import ConnectTimeout, ReadTimeout import pytest import requests_mock +from requests import HTTPError +from requests.exceptions import ConnectTimeout, ReadTimeout -from app.clients.sms.firetext import get_firetext_responses, SmsClientResponseException, FiretextClientResponseException +from app.clients.sms.firetext import ( + FiretextClientResponseException, + SmsClientResponseException, + get_firetext_responses, +) @pytest.mark.parametrize('detailed_status_code, result', [ diff --git a/tests/app/clients/test_mmg.py b/tests/app/clients/test_mmg.py index a547e2df5..dd1fc771c 100644 --- a/tests/app/clients/test_mmg.py +++ b/tests/app/clients/test_mmg.py @@ -5,8 +5,7 @@ from requests.exceptions import ConnectTimeout, ReadTimeout from app import mmg_client from app.clients.sms import SmsClientResponseException - -from app.clients.sms.mmg import get_mmg_responses, MMGClientResponseException +from app.clients.sms.mmg import MMGClientResponseException, get_mmg_responses @pytest.mark.parametrize('detailed_status_code, result', [ diff --git a/tests/app/clients/test_performance_platform.py b/tests/app/clients/test_performance_platform.py index c55a004cd..6cca92ffd 100644 --- a/tests/app/clients/test_performance_platform.py +++ b/tests/app/clients/test_performance_platform.py @@ -1,8 +1,10 @@ +import pytest import requests import requests_mock -import pytest -from app.clients.performance_platform.performance_platform_client import PerformancePlatformClient +from app.clients.performance_platform.performance_platform_client import ( + PerformancePlatformClient, +) @pytest.fixture(scope='function') diff --git a/tests/app/commands/test_performance_platform_commands.py b/tests/app/commands/test_performance_platform_commands.py index 8e5186b9e..e29790570 100644 --- a/tests/app/commands/test_performance_platform_commands.py +++ b/tests/app/commands/test_performance_platform_commands.py @@ -1,6 +1,9 @@ from datetime import datetime -from app.commands import backfill_performance_platform_totals, backfill_processing_time +from app.commands import ( + backfill_performance_platform_totals, + backfill_processing_time, +) def test_backfill_processing_time_works_for_correct_dates(mocker, notify_api): diff --git a/tests/app/complaint/test_complaint_rest.py b/tests/app/complaint/test_complaint_rest.py index 0fa97f2d7..c2ad3cbb4 100644 --- a/tests/app/complaint/test_complaint_rest.py +++ b/tests/app/complaint/test_complaint_rest.py @@ -1,11 +1,16 @@ -from datetime import date import json +from datetime import date from flask import url_for from freezegun import freeze_time from tests import create_authorization_header -from tests.app.db import create_complaint, create_service, create_template, create_notification +from tests.app.db import ( + create_complaint, + create_notification, + create_service, + create_template, +) def test_get_all_complaints_returns_complaints_for_multiple_services(client, notify_db_session): diff --git a/tests/app/conftest.py b/tests/app/conftest.py index b1a5222e7..6fbb88e4b 100644 --- a/tests/app/conftest.py +++ b/tests/app/conftest.py @@ -11,51 +11,56 @@ from sqlalchemy.orm.session import make_transient from app import db from app.clients.sms.firetext import FiretextClient from app.dao.api_key_dao import save_model_api_key +from app.dao.broadcast_service_dao import ( + insert_or_update_service_broadcast_settings, +) from app.dao.invited_user_dao import save_invited_user from app.dao.jobs_dao import dao_create_job from app.dao.notifications_dao import dao_create_notification -from app.dao.organisation_dao import dao_create_organisation, dao_add_service_to_organisation -from app.dao.services_dao import (dao_create_service, dao_add_user_to_service) -from app.dao.broadcast_service_dao import insert_or_update_service_broadcast_settings +from app.dao.organisation_dao import ( + dao_add_service_to_organisation, + dao_create_organisation, +) +from app.dao.services_dao import dao_add_user_to_service, dao_create_service from app.dao.templates_dao import dao_create_template from app.dao.users_dao import create_secret_code, create_user_code from app.history_meta import create_history from app.models import ( - Service, - Template, - TemplateHistory, + BROADCAST_TYPE, + EMAIL_TYPE, + KEY_TYPE_NORMAL, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, + LETTER_TYPE, + SERVICE_PERMISSION_TYPES, + SMS_TYPE, ApiKey, + InvitedUser, Job, - Organisation, Notification, NotificationHistory, - InvitedUser, + Organisation, Permission, ProviderDetails, ProviderDetailsHistory, ProviderRates, - ServiceGuestList, - KEY_TYPE_NORMAL, - KEY_TYPE_TEST, - KEY_TYPE_TEAM, - EMAIL_TYPE, - SMS_TYPE, - LETTER_TYPE, - SERVICE_PERMISSION_TYPES, + Service, ServiceEmailReplyTo, - BROADCAST_TYPE, + ServiceGuestList, + Template, + TemplateHistory, ) from tests import create_authorization_header from tests.app.db import ( - create_user, - create_template, - create_notification, - create_service, create_api_key, create_inbound_number, - create_letter_contact, create_invited_org_user, - create_job + create_job, + create_letter_contact, + create_notification, + create_service, + create_template, + create_user, ) diff --git a/tests/app/dao/notification_dao/test_notification_dao.py b/tests/app/dao/notification_dao/test_notification_dao.py index a7efba937..a237bf5fd 100644 --- a/tests/app/dao/notification_dao/test_notification_dao.py +++ b/tests/app/dao/notification_dao/test_notification_dao.py @@ -4,17 +4,20 @@ from functools import partial import pytest from freezegun import freeze_time -from sqlalchemy.exc import SQLAlchemyError, IntegrityError +from sqlalchemy.exc import IntegrityError, SQLAlchemyError from sqlalchemy.orm.exc import NoResultFound - from app.dao.notifications_dao import ( dao_create_notification, dao_delete_notifications_by_id, dao_get_last_notification_added_for_job_id, dao_get_letters_and_sheets_volume_by_postage, - dao_get_notifications_by_recipient_or_reference, + dao_get_letters_to_be_printed, + dao_get_notification_by_reference, dao_get_notification_count_for_job_id, + dao_get_notification_or_history_by_reference, + dao_get_notifications_by_recipient_or_reference, + dao_get_notifications_by_references, dao_timeout_notifications, dao_update_notification, dao_update_notifications_by_reference, @@ -24,35 +27,32 @@ from app.dao.notifications_dao import ( get_notifications_for_job, get_notifications_for_service, is_delivery_slow_for_providers, + notifications_not_yet_sent, update_notification_status_by_id, update_notification_status_by_reference, - dao_get_notification_by_reference, - dao_get_notifications_by_references, - dao_get_notification_or_history_by_reference, - notifications_not_yet_sent, - dao_get_letters_to_be_printed) +) from app.models import ( - Job, - Notification, - NotificationHistory, - NOTIFICATION_STATUS_TYPES, - NOTIFICATION_STATUS_TYPES_FAILED, - NOTIFICATION_TEMPORARY_FAILURE, - NOTIFICATION_SENDING, - NOTIFICATION_PENDING, - NOTIFICATION_SENT, - NOTIFICATION_DELIVERED, + JOB_STATUS_IN_PROGRESS, KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST, - JOB_STATUS_IN_PROGRESS + NOTIFICATION_DELIVERED, + NOTIFICATION_PENDING, + NOTIFICATION_SENDING, + NOTIFICATION_SENT, + NOTIFICATION_STATUS_TYPES, + NOTIFICATION_STATUS_TYPES_FAILED, + NOTIFICATION_TEMPORARY_FAILURE, + Job, + Notification, + NotificationHistory, ) from tests.app.db import ( create_job, create_notification, + create_notification_history, create_service, create_template, - create_notification_history ) diff --git a/tests/app/dao/notification_dao/test_notification_dao_delete_notifications.py b/tests/app/dao/notification_dao/test_notification_dao_delete_notifications.py index 036dc95e2..490d01e64 100644 --- a/tests/app/dao/notification_dao/test_notification_dao_delete_notifications.py +++ b/tests/app/dao/notification_dao/test_notification_dao_delete_notifications.py @@ -1,23 +1,21 @@ -from datetime import ( - datetime, - date, - timedelta -) +from datetime import date, datetime, timedelta + import pytest from flask import current_app from freezegun import freeze_time from app.dao.notifications_dao import ( delete_notifications_older_than_retention_by_type, - insert_notification_history_delete_notifications + insert_notification_history_delete_notifications, ) from app.models import Notification, NotificationHistory from tests.app.db import ( - create_template, create_notification, - create_service_data_retention, + create_notification_history, create_service, - create_notification_history) + create_service_data_retention, + create_template, +) def create_test_data(notification_type, sample_service, days_of_retention=3): diff --git a/tests/app/dao/notification_dao/test_notification_dao_performance_platform.py b/tests/app/dao/notification_dao/test_notification_dao_performance_platform.py index e08627d76..f7253c00d 100644 --- a/tests/app/dao/notification_dao/test_notification_dao_performance_platform.py +++ b/tests/app/dao/notification_dao/test_notification_dao_performance_platform.py @@ -2,9 +2,10 @@ from datetime import date, datetime, timedelta from freezegun import freeze_time -from app.dao.notifications_dao import dao_get_total_notifications_sent_per_day_for_performance_platform +from app.dao.notifications_dao import ( + dao_get_total_notifications_sent_per_day_for_performance_platform, +) from app.models import KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST - from tests.app.db import create_notification BEGINNING_OF_DAY = date(2016, 10, 18) diff --git a/tests/app/dao/notification_dao/test_notification_dao_template_usage.py b/tests/app/dao/notification_dao/test_notification_dao_template_usage.py index 9d5d8c62f..d3d883877 100644 --- a/tests/app/dao/notification_dao/test_notification_dao_template_usage.py +++ b/tests/app/dao/notification_dao/test_notification_dao_template_usage.py @@ -1,6 +1,7 @@ from datetime import datetime, timedelta + from app.dao.notifications_dao import dao_get_last_date_template_was_used -from tests.app.db import create_notification, create_ft_notification_status +from tests.app.db import create_ft_notification_status, create_notification def test_dao_get_last_date_template_was_used_returns_bst_date_from_stats_table( diff --git a/tests/app/dao/test_annual_billing_dao.py b/tests/app/dao/test_annual_billing_dao.py index ac0c4df2f..9df7c7c33 100644 --- a/tests/app/dao/test_annual_billing_dao.py +++ b/tests/app/dao/test_annual_billing_dao.py @@ -1,11 +1,10 @@ -from app.dao.date_util import get_current_financial_year_start_year - from app.dao.annual_billing_dao import ( dao_create_or_update_annual_billing_for_year, dao_get_free_sms_fragment_limit_for_year, dao_update_annual_billing_for_future_years, ) +from app.dao.date_util import get_current_financial_year_start_year from tests.app.db import create_annual_billing diff --git a/tests/app/dao/test_api_key_dao.py b/tests/app/dao/test_api_key_dao.py index 2c39881da..3254a1037 100644 --- a/tests/app/dao/test_api_key_dao.py +++ b/tests/app/dao/test_api_key_dao.py @@ -5,13 +5,13 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound from app.dao.api_key_dao import ( - save_model_api_key, + expire_api_key, get_model_api_keys, - get_unsigned_secrets, get_unsigned_secret, - expire_api_key + get_unsigned_secrets, + save_model_api_key, ) -from app.models import ApiKey, KEY_TYPE_NORMAL +from app.models import KEY_TYPE_NORMAL, ApiKey def test_save_api_key_should_create_new_api_key_and_history(sample_service): diff --git a/tests/app/dao/test_broadcast_message_dao.py b/tests/app/dao/test_broadcast_message_dao.py index a8fb160b5..1b0738a0f 100644 --- a/tests/app/dao/test_broadcast_message_dao.py +++ b/tests/app/dao/test_broadcast_message_dao.py @@ -1,9 +1,15 @@ from datetime import datetime +from app.dao.broadcast_message_dao import ( + create_broadcast_provider_message, + get_earlier_events_for_broadcast_event, +) from app.models import BROADCAST_TYPE, BroadcastEventMessageType -from app.dao.broadcast_message_dao import get_earlier_events_for_broadcast_event, create_broadcast_provider_message - -from tests.app.db import create_broadcast_message, create_template, create_broadcast_event +from tests.app.db import ( + create_broadcast_event, + create_broadcast_message, + create_template, +) def test_get_earlier_events_for_broadcast_event(sample_service): diff --git a/tests/app/dao/test_complaint_dao.py b/tests/app/dao/test_complaint_dao.py index 14b7cac53..b1e21fdb4 100644 --- a/tests/app/dao/test_complaint_dao.py +++ b/tests/app/dao/test_complaint_dao.py @@ -1,5 +1,4 @@ import uuid - from datetime import datetime, timedelta from app.dao.complaint_dao import ( @@ -9,7 +8,12 @@ from app.dao.complaint_dao import ( save_complaint, ) from app.models import Complaint -from tests.app.db import create_service, create_template, create_notification, create_complaint +from tests.app.db import ( + create_complaint, + create_notification, + create_service, + create_template, +) def test_fetch_paginated_complaints(mocker, sample_email_notification): diff --git a/tests/app/dao/test_date_utils.py b/tests/app/dao/test_date_utils.py index 78fa1071e..e7ba33b46 100644 --- a/tests/app/dao/test_date_utils.py +++ b/tests/app/dao/test_date_utils.py @@ -1,12 +1,12 @@ -from datetime import datetime, date +from datetime import date, datetime import pytest from app.dao.date_util import ( - get_financial_year, get_april_fools, - get_month_start_and_end_date_in_utc, + get_financial_year, get_financial_year_for_datetime, + get_month_start_and_end_date_in_utc, ) diff --git a/tests/app/dao/test_email_branding_dao.py b/tests/app/dao/test_email_branding_dao.py index 9e47093d9..df9377cca 100644 --- a/tests/app/dao/test_email_branding_dao.py +++ b/tests/app/dao/test_email_branding_dao.py @@ -1,11 +1,10 @@ from app.dao.email_branding_dao import ( - dao_get_email_branding_options, dao_get_email_branding_by_id, dao_get_email_branding_by_name, + dao_get_email_branding_options, dao_update_email_branding, ) from app.models import EmailBranding - from tests.app.db import create_email_branding diff --git a/tests/app/dao/test_events_dao.py b/tests/app/dao/test_events_dao.py index 3f6226531..c6b523150 100644 --- a/tests/app/dao/test_events_dao.py +++ b/tests/app/dao/test_events_dao.py @@ -1,6 +1,5 @@ from app.dao.events_dao import dao_create_event - from app.models import Event diff --git a/tests/app/dao/test_fact_notification_status_dao.py b/tests/app/dao/test_fact_notification_status_dao.py index 681e86487..bbaf1ae3f 100644 --- a/tests/app/dao/test_fact_notification_status_dao.py +++ b/tests/app/dao/test_fact_notification_status_dao.py @@ -1,27 +1,28 @@ -from datetime import timedelta, datetime, date, time +from datetime import date, datetime, time, timedelta from uuid import UUID -import pytest import mock +import pytest +from freezegun import freeze_time from app.dao.fact_notification_status_dao import ( - update_fact_notification_status, fetch_monthly_notification_statuses_per_service, + fetch_monthly_template_usage_for_service, fetch_notification_status_for_day, fetch_notification_status_for_service_by_month, fetch_notification_status_for_service_for_day, fetch_notification_status_for_service_for_today_and_7_previous_days, fetch_notification_status_totals_for_all_services, fetch_notification_statuses_for_job, - fetch_stats_for_all_services_by_date_range, fetch_monthly_template_usage_for_service, - get_total_sent_notifications_for_day_and_type, get_total_notifications_for_date_range + fetch_stats_for_all_services_by_date_range, + get_total_notifications_for_date_range, + get_total_sent_notifications_for_day_and_type, + update_fact_notification_status, ) from app.models import ( - FactNotificationStatus, - KEY_TYPE_TEST, - KEY_TYPE_TEAM, EMAIL_TYPE, - SMS_TYPE, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, LETTER_TYPE, NOTIFICATION_CREATED, NOTIFICATION_DELIVERED, @@ -32,13 +33,17 @@ from app.models import ( NOTIFICATION_SENT, NOTIFICATION_TECHNICAL_FAILURE, NOTIFICATION_TEMPORARY_FAILURE, + SMS_TYPE, + FactNotificationStatus, ) -from freezegun import freeze_time - from tests.app.db import ( - create_notification, create_service, create_template, create_ft_notification_status, - create_job, create_notification_history, - create_service_data_retention + create_ft_notification_status, + create_job, + create_notification, + create_notification_history, + create_service, + create_service_data_retention, + create_template, ) diff --git a/tests/app/dao/test_fact_processing_time_dao.py b/tests/app/dao/test_fact_processing_time_dao.py index 843dfe576..e731fac8f 100644 --- a/tests/app/dao/test_fact_processing_time_dao.py +++ b/tests/app/dao/test_fact_processing_time_dao.py @@ -3,7 +3,9 @@ from datetime import datetime from freezegun import freeze_time from app.dao import fact_processing_time_dao -from app.dao.fact_processing_time_dao import get_processing_time_percentage_for_date_range +from app.dao.fact_processing_time_dao import ( + get_processing_time_percentage_for_date_range, +) from app.models import FactProcessingTime from tests.app.db import create_process_time diff --git a/tests/app/dao/test_ft_billing_dao.py b/tests/app/dao/test_ft_billing_dao.py index 615ca009f..0bf6250bb 100644 --- a/tests/app/dao/test_ft_billing_dao.py +++ b/tests/app/dao/test_ft_billing_dao.py @@ -1,11 +1,8 @@ +from datetime import date, datetime, timedelta from decimal import Decimal -from datetime import datetime, timedelta, date - -from freezegun import freeze_time - import pytest - +from freezegun import freeze_time from notifications_utils.timezones import convert_utc_to_bst from app import db @@ -13,31 +10,28 @@ from app.dao.fact_billing_dao import ( delete_billing_data_for_service_for_day, fetch_billing_data_for_day, fetch_billing_totals_for_year, - fetch_monthly_billing_for_year, - get_rate, - get_rates_for_billing, - fetch_sms_free_allowance_remainder, - fetch_sms_billing_for_all_services, fetch_letter_costs_for_all_services, fetch_letter_line_items_for_all_services, - fetch_usage_year_for_organisation + fetch_monthly_billing_for_year, + fetch_sms_billing_for_all_services, + fetch_sms_free_allowance_remainder, + fetch_usage_year_for_organisation, + get_rate, + get_rates_for_billing, ) from app.dao.organisation_dao import dao_add_service_to_organisation -from app.models import ( - FactBilling, - NOTIFICATION_STATUS_TYPES, -) +from app.models import NOTIFICATION_STATUS_TYPES, FactBilling from tests.app.db import ( - create_ft_billing, - create_service, - create_template, - create_notification, - create_rate, - create_letter_rate, - create_notification_history, create_annual_billing, + create_ft_billing, + create_letter_rate, + create_notification, + create_notification_history, create_organisation, + create_rate, + create_service, create_service_data_retention, + create_template, set_up_usage_data, ) diff --git a/tests/app/dao/test_inbound_numbers_dao.py b/tests/app/dao/test_inbound_numbers_dao.py index 06538836b..d9f788f3f 100644 --- a/tests/app/dao/test_inbound_numbers_dao.py +++ b/tests/app/dao/test_inbound_numbers_dao.py @@ -2,15 +2,15 @@ import pytest from sqlalchemy.exc import IntegrityError from app.dao.inbound_numbers_dao import ( - dao_get_inbound_numbers, - dao_get_inbound_number_for_service, + dao_allocate_number_for_service, dao_get_available_inbound_numbers, - dao_set_inbound_number_to_service, + dao_get_inbound_number_for_service, + dao_get_inbound_numbers, dao_set_inbound_number_active_flag, - dao_allocate_number_for_service) + dao_set_inbound_number_to_service, +) from app.models import InboundNumber - -from tests.app.db import create_service, create_inbound_number +from tests.app.db import create_inbound_number, create_service def test_get_inbound_numbers(notify_db, notify_db_session, sample_inbound_numbers): diff --git a/tests/app/dao/test_inbound_sms_dao.py b/tests/app/dao/test_inbound_sms_dao.py index b3b3f00db..09f720434 100644 --- a/tests/app/dao/test_inbound_sms_dao.py +++ b/tests/app/dao/test_inbound_sms_dao.py @@ -3,20 +3,22 @@ from itertools import product from freezegun import freeze_time +from app import db from app.dao.inbound_sms_dao import ( - dao_get_inbound_sms_for_service, dao_count_inbound_sms_for_service, - delete_inbound_sms_older_than_retention, dao_get_inbound_sms_by_id, + dao_get_inbound_sms_for_service, dao_get_paginated_inbound_sms_for_service_for_public_api, dao_get_paginated_most_recent_inbound_sms_by_user_number_for_service, + delete_inbound_sms_older_than_retention, ) - from app.models import InboundSmsHistory -from app import db - +from tests.app.db import ( + create_inbound_sms, + create_service, + create_service_data_retention, +) from tests.conftest import set_config -from tests.app.db import create_inbound_sms, create_service, create_service_data_retention def test_get_all_inbound_sms(sample_service): diff --git a/tests/app/dao/test_invited_user_dao.py b/tests/app/dao/test_invited_user_dao.py index 0022fa911..e0abd39c5 100644 --- a/tests/app/dao/test_invited_user_dao.py +++ b/tests/app/dao/test_invited_user_dao.py @@ -1,20 +1,18 @@ -from datetime import datetime, timedelta import uuid +from datetime import datetime, timedelta import pytest from sqlalchemy.orm.exc import NoResultFound from app import db - -from app.models import InvitedUser - from app.dao.invited_user_dao import ( - save_invited_user, + delete_invitations_created_more_than_two_days_ago, get_invited_user, - get_invited_users_for_service, get_invited_user_by_id, - delete_invitations_created_more_than_two_days_ago + get_invited_users_for_service, + save_invited_user, ) +from app.models import InvitedUser from tests.app.db import create_invited_user diff --git a/tests/app/dao/test_jobs_dao.py b/tests/app/dao/test_jobs_dao.py index 64d36997b..c632c496f 100644 --- a/tests/app/dao/test_jobs_dao.py +++ b/tests/app/dao/test_jobs_dao.py @@ -18,14 +18,22 @@ from app.dao.jobs_dao import ( dao_set_scheduled_jobs_to_pending, dao_update_job, find_jobs_with_missing_rows, - find_missing_row_for_job + find_missing_row_for_job, ) from app.models import ( + EMAIL_TYPE, + JOB_STATUS_FINISHED, + LETTER_TYPE, + SMS_TYPE, Job, - EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, - JOB_STATUS_FINISHED ) -from tests.app.db import create_job, create_service, create_template, create_notification, create_service_contact_list +from tests.app.db import ( + create_job, + create_notification, + create_service, + create_service_contact_list, + create_template, +) def test_should_count_of_statuses_for_notifications_associated_with_job(sample_template, sample_job): diff --git a/tests/app/dao/test_letter_branding_dao.py b/tests/app/dao/test_letter_branding_dao.py index effc9efc8..1d1e35949 100644 --- a/tests/app/dao/test_letter_branding_dao.py +++ b/tests/app/dao/test_letter_branding_dao.py @@ -4,10 +4,10 @@ import pytest from sqlalchemy.exc import SQLAlchemyError from app.dao.letter_branding_dao import ( - dao_get_all_letter_branding, dao_create_letter_branding, + dao_get_all_letter_branding, + dao_get_letter_branding_by_id, dao_update_letter_branding, - dao_get_letter_branding_by_id ) from app.models import LetterBranding from tests.app.db import create_letter_branding diff --git a/tests/app/dao/test_organisation_dao.py b/tests/app/dao/test_organisation_dao.py index b0e84c5e7..95dc6b8d6 100644 --- a/tests/app/dao/test_organisation_dao.py +++ b/tests/app/dao/test_organisation_dao.py @@ -6,19 +6,18 @@ from sqlalchemy.exc import IntegrityError, SQLAlchemyError from app import db from app.dao.organisation_dao import ( - dao_get_organisations, + dao_add_service_to_organisation, + dao_add_user_to_organisation, + dao_get_invited_organisation_user, dao_get_organisation_by_email_address, dao_get_organisation_by_id, dao_get_organisation_by_service_id, dao_get_organisation_services, - dao_update_organisation, - dao_add_service_to_organisation, - dao_get_invited_organisation_user, + dao_get_organisations, dao_get_users_for_organisation, - dao_add_user_to_organisation + dao_update_organisation, ) from app.models import Organisation, Service - from tests.app.db import ( create_domain, create_email_branding, diff --git a/tests/app/dao/test_provider_details_dao.py b/tests/app/dao/test_provider_details_dao.py index a25deaa6a..a77f1a52b 100644 --- a/tests/app/dao/test_provider_details_dao.py +++ b/tests/app/dao/test_provider_details_dao.py @@ -1,27 +1,23 @@ -import pytest - from datetime import datetime, timedelta + +import pytest from freezegun import freeze_time from sqlalchemy.sql import desc -from app.models import ProviderDetails, ProviderDetailsHistory from app import notification_provider_clients from app.dao.provider_details_dao import ( + _adjust_provider_priority, + _get_sms_providers_for_update, + dao_adjust_provider_priority_back_to_resting_points, + dao_get_provider_stats, + dao_reduce_sms_provider_priority, + dao_update_provider_details, get_alternative_sms_provider, get_provider_details_by_identifier, get_provider_details_by_notification_type, - dao_update_provider_details, - dao_get_provider_stats, - dao_reduce_sms_provider_priority, - dao_adjust_provider_priority_back_to_resting_points, - _adjust_provider_priority, - _get_sms_providers_for_update, -) -from tests.app.db import ( - create_ft_billing, - create_service, - create_template, ) +from app.models import ProviderDetails, ProviderDetailsHistory +from tests.app.db import create_ft_billing, create_service, create_template from tests.conftest import set_config diff --git a/tests/app/dao/test_provider_rates_dao.py b/tests/app/dao/test_provider_rates_dao.py index 417612781..9b3437ae8 100644 --- a/tests/app/dao/test_provider_rates_dao.py +++ b/tests/app/dao/test_provider_rates_dao.py @@ -1,7 +1,8 @@ from datetime import datetime from decimal import Decimal + from app.dao.provider_rates_dao import create_provider_rates -from app.models import ProviderRates, ProviderDetails +from app.models import ProviderDetails, ProviderRates def test_create_provider_rates(notify_db, notify_db_session, mmg_provider): diff --git a/tests/app/dao/test_returned_letters_dao.py b/tests/app/dao/test_returned_letters_dao.py index e85fb9e7f..ca3046831 100644 --- a/tests/app/dao/test_returned_letters_dao.py +++ b/tests/app/dao/test_returned_letters_dao.py @@ -1,16 +1,16 @@ import uuid -from datetime import datetime, timedelta, date +from datetime import date, datetime, timedelta from freezegun import freeze_time from app.dao.returned_letters_dao import ( - insert_or_update_returned_letters, fetch_most_recent_returned_letter, fetch_recent_returned_letter_count, fetch_returned_letter_summary, - fetch_returned_letters + fetch_returned_letters, + insert_or_update_returned_letters, ) -from app.models import ReturnedLetter, NOTIFICATION_RETURNED_LETTER +from app.models import NOTIFICATION_RETURNED_LETTER, ReturnedLetter from tests.app.db import ( create_notification, create_notification_history, diff --git a/tests/app/dao/test_service_callback_api_dao.py b/tests/app/dao/test_service_callback_api_dao.py index 3b05e2fd1..8f5e1c59c 100644 --- a/tests/app/dao/test_service_callback_api_dao.py +++ b/tests/app/dao/test_service_callback_api_dao.py @@ -5,10 +5,11 @@ from sqlalchemy.exc import SQLAlchemyError from app import encryption from app.dao.service_callback_api_dao import ( - save_service_callback_api, - reset_service_callback_api, get_service_callback_api, - get_service_delivery_status_callback_api_for_service) + get_service_delivery_status_callback_api_for_service, + reset_service_callback_api, + save_service_callback_api, +) from app.models import ServiceCallbackApi from tests.app.db import create_service_callback_api diff --git a/tests/app/dao/test_service_data_retention_dao.py b/tests/app/dao/test_service_data_retention_dao.py index d197b4457..6997b5e26 100644 --- a/tests/app/dao/test_service_data_retention_dao.py +++ b/tests/app/dao/test_service_data_retention_dao.py @@ -6,10 +6,10 @@ from sqlalchemy.exc import IntegrityError from app.dao.service_data_retention_dao import ( fetch_service_data_retention, + fetch_service_data_retention_by_id, + fetch_service_data_retention_by_notification_type, insert_service_data_retention, update_service_data_retention, - fetch_service_data_retention_by_id, - fetch_service_data_retention_by_notification_type ) from app.models import ServiceDataRetention from tests.app.db import create_service, create_service_data_retention diff --git a/tests/app/dao/test_service_email_reply_to_dao.py b/tests/app/dao/test_service_email_reply_to_dao.py index 0696e3528..fbd42d895 100644 --- a/tests/app/dao/test_service_email_reply_to_dao.py +++ b/tests/app/dao/test_service_email_reply_to_dao.py @@ -8,7 +8,8 @@ from app.dao.service_email_reply_to_dao import ( archive_reply_to_email_address, dao_get_reply_to_by_id, dao_get_reply_to_by_service_id, - update_reply_to_email_address) + update_reply_to_email_address, +) from app.errors import InvalidRequest from app.exceptions import ArchiveValidationError from app.models import ServiceEmailReplyTo diff --git a/tests/app/dao/test_service_guest_list_dao.py b/tests/app/dao/test_service_guest_list_dao.py index f38e9482b..100a8960f 100644 --- a/tests/app/dao/test_service_guest_list_dao.py +++ b/tests/app/dao/test_service_guest_list_dao.py @@ -1,15 +1,11 @@ import uuid -from app.models import ( - ServiceGuestList, - EMAIL_TYPE, -) - from app.dao.service_guest_list_dao import ( - dao_fetch_service_guest_list, dao_add_and_commit_guest_list_contacts, - dao_remove_service_guest_list + dao_fetch_service_guest_list, + dao_remove_service_guest_list, ) +from app.models import EMAIL_TYPE, ServiceGuestList from tests.app.db import create_service diff --git a/tests/app/dao/test_service_inbound_api_dao.py b/tests/app/dao/test_service_inbound_api_dao.py index d924c2a70..ba22c3454 100644 --- a/tests/app/dao/test_service_inbound_api_dao.py +++ b/tests/app/dao/test_service_inbound_api_dao.py @@ -5,10 +5,11 @@ from sqlalchemy.exc import SQLAlchemyError from app import encryption from app.dao.service_inbound_api_dao import ( - save_service_inbound_api, - reset_service_inbound_api, get_service_inbound_api, - get_service_inbound_api_for_service) + get_service_inbound_api_for_service, + reset_service_inbound_api, + save_service_inbound_api, +) from app.models import ServiceInboundApi from tests.app.db import create_service_inbound_api diff --git a/tests/app/dao/test_service_letter_contact_dao.py b/tests/app/dao/test_service_letter_contact_dao.py index 5e15473ca..4a996dcb4 100644 --- a/tests/app/dao/test_service_letter_contact_dao.py +++ b/tests/app/dao/test_service_letter_contact_dao.py @@ -1,13 +1,14 @@ import uuid + import pytest from sqlalchemy.exc import SQLAlchemyError from app.dao.service_letter_contact_dao import ( add_letter_contact_for_service, archive_letter_contact, - dao_get_letter_contacts_by_service_id, dao_get_letter_contact_by_id, - update_letter_contact + dao_get_letter_contacts_by_service_id, + update_letter_contact, ) from app.models import ServiceLetterContact from tests.app.db import create_letter_contact, create_service, create_template diff --git a/tests/app/dao/test_service_permissions_dao.py b/tests/app/dao/test_service_permissions_dao.py index 50b5559f8..0378151ff 100644 --- a/tests/app/dao/test_service_permissions_dao.py +++ b/tests/app/dao/test_service_permissions_dao.py @@ -1,9 +1,17 @@ import pytest -from app.dao.service_permissions_dao import dao_fetch_service_permissions, dao_remove_service_permission -from app.models import EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INBOUND_SMS_TYPE - -from tests.app.db import create_service_permission, create_service +from app.dao.service_permissions_dao import ( + dao_fetch_service_permissions, + dao_remove_service_permission, +) +from app.models import ( + EMAIL_TYPE, + INBOUND_SMS_TYPE, + INTERNATIONAL_SMS_TYPE, + LETTER_TYPE, + SMS_TYPE, +) +from tests.app.db import create_service, create_service_permission @pytest.fixture(scope='function') diff --git a/tests/app/dao/test_service_sms_sender_dao.py b/tests/app/dao/test_service_sms_sender_dao.py index 302263acc..7ff440c3c 100644 --- a/tests/app/dao/test_service_sms_sender_dao.py +++ b/tests/app/dao/test_service_sms_sender_dao.py @@ -6,17 +6,19 @@ from sqlalchemy.exc import SQLAlchemyError from app.dao.service_sms_sender_dao import ( archive_sms_sender, dao_add_sms_sender_for_service, - dao_update_service_sms_sender, dao_get_service_sms_senders_by_id, dao_get_sms_senders_by_service_id, - update_existing_sms_sender_with_inbound_number) + dao_update_service_sms_sender, + update_existing_sms_sender_with_inbound_number, +) from app.exceptions import ArchiveValidationError from app.models import ServiceSmsSender from tests.app.db import ( create_inbound_number, create_service, create_service_sms_sender, - create_service_with_inbound_number) + create_service_with_inbound_number, +) def test_dao_get_service_sms_senders_id(notify_db_session): diff --git a/tests/app/dao/test_services_dao.py b/tests/app/dao/test_services_dao.py index 6bc9cd651..3522fc0f0 100644 --- a/tests/app/dao/test_services_dao.py +++ b/tests/app/dao/test_services_dao.py @@ -8,50 +8,88 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound from app import db -from app.dao.inbound_numbers_dao import (dao_get_available_inbound_numbers, - dao_set_inbound_number_active_flag, - dao_set_inbound_number_to_service) +from app.dao.inbound_numbers_dao import ( + dao_get_available_inbound_numbers, + dao_set_inbound_number_active_flag, + dao_set_inbound_number_to_service, +) from app.dao.organisation_dao import dao_add_service_to_organisation -from app.dao.service_permissions_dao import (dao_add_service_permission, - dao_remove_service_permission) -from app.dao.service_user_dao import (dao_get_service_user, - dao_update_service_user) -from app.dao.services_dao import (dao_add_user_to_service, dao_create_service, - dao_fetch_active_users_for_service, - dao_fetch_all_services, - dao_fetch_all_services_by_user, - dao_fetch_live_services_data, - dao_fetch_service_by_id, - dao_fetch_service_by_inbound_number, - dao_fetch_stats_for_service, - dao_fetch_todays_stats_for_all_services, - dao_fetch_todays_stats_for_service, - dao_find_services_sending_to_tv_numbers, - dao_find_services_with_high_failure_rates, - dao_remove_user_from_service, - dao_resume_service, dao_suspend_service, - dao_update_service, - delete_service_and_all_associated_db_objects, - fetch_todays_total_message_count, - get_services_by_partial_name, get_live_services_with_organisation) +from app.dao.service_permissions_dao import ( + dao_add_service_permission, + dao_remove_service_permission, +) +from app.dao.service_user_dao import ( + dao_get_service_user, + dao_update_service_user, +) +from app.dao.services_dao import ( + dao_add_user_to_service, + dao_create_service, + dao_fetch_active_users_for_service, + dao_fetch_all_services, + dao_fetch_all_services_by_user, + dao_fetch_live_services_data, + dao_fetch_service_by_id, + dao_fetch_service_by_inbound_number, + dao_fetch_stats_for_service, + dao_fetch_todays_stats_for_all_services, + dao_fetch_todays_stats_for_service, + dao_find_services_sending_to_tv_numbers, + dao_find_services_with_high_failure_rates, + dao_remove_user_from_service, + dao_resume_service, + dao_suspend_service, + dao_update_service, + delete_service_and_all_associated_db_objects, + fetch_todays_total_message_count, + get_live_services_with_organisation, + get_services_by_partial_name, +) from app.dao.users_dao import create_user_code, save_model_user -from app.models import (EMAIL_TYPE, INTERNATIONAL_SMS_TYPE, KEY_TYPE_NORMAL, - KEY_TYPE_TEAM, KEY_TYPE_TEST, LETTER_TYPE, SMS_TYPE, - UPLOAD_LETTERS, - ApiKey, InvitedUser, Job, Notification, - NotificationHistory, Organisation, Permission, Service, - ServicePermission, ServiceUser, Template, - TemplateHistory, User, VerifyCode, - user_folder_permissions, INTERNATIONAL_LETTERS) -from tests.app.db import (create_annual_billing, create_api_key, - create_email_branding, create_ft_billing, - create_inbound_number, create_invited_user, - create_letter_branding, create_notification, - create_notification_history, create_organisation, - create_service, - create_service_with_defined_sms_sender, - create_service_with_inbound_number, create_template, - create_template_folder, create_user) +from app.models import ( + EMAIL_TYPE, + INTERNATIONAL_LETTERS, + INTERNATIONAL_SMS_TYPE, + KEY_TYPE_NORMAL, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, + LETTER_TYPE, + SMS_TYPE, + UPLOAD_LETTERS, + ApiKey, + InvitedUser, + Job, + Notification, + NotificationHistory, + Organisation, + Permission, + Service, + ServicePermission, + ServiceUser, + Template, + TemplateHistory, + User, + VerifyCode, + user_folder_permissions, +) +from tests.app.db import ( + create_annual_billing, + create_api_key, + create_email_branding, + create_ft_billing, + create_inbound_number, + create_invited_user, + create_letter_branding, + create_notification, + create_notification_history, + create_organisation, + create_service, + create_service_with_defined_sms_sender, + create_service_with_inbound_number, + create_template, + create_template_folder, + create_user, +) def test_create_service(notify_db_session): diff --git a/tests/app/dao/test_template_folder_dao.py b/tests/app/dao/test_template_folder_dao.py index ac9ce444c..5a638c290 100644 --- a/tests/app/dao/test_template_folder_dao.py +++ b/tests/app/dao/test_template_folder_dao.py @@ -1,6 +1,9 @@ from app import db from app.dao.service_user_dao import dao_get_service_user -from app.dao.template_folder_dao import dao_delete_template_folder, dao_update_template_folder +from app.dao.template_folder_dao import ( + dao_delete_template_folder, + dao_update_template_folder, +) from app.models import user_folder_permissions from tests.app.db import create_template_folder diff --git a/tests/app/dao/test_templates_dao.py b/tests/app/dao/test_templates_dao.py index 4aae9a1cd..3c7dae016 100644 --- a/tests/app/dao/test_templates_dao.py +++ b/tests/app/dao/test_templates_dao.py @@ -1,25 +1,25 @@ from datetime import datetime +import pytest from freezegun import freeze_time from sqlalchemy.orm.exc import NoResultFound -import pytest from app.dao.templates_dao import ( dao_create_template, - dao_get_template_by_id_and_service_id, dao_get_all_templates_for_service, - dao_update_template, + dao_get_template_by_id_and_service_id, dao_get_template_versions, - dao_redact_template, dao_update_template_reply_to + dao_redact_template, + dao_update_template, + dao_update_template_reply_to, ) from app.models import ( Template, TemplateFolder, TemplateHistory, - TemplateRedacted + TemplateRedacted, ) - -from tests.app.db import create_template, create_letter_contact +from tests.app.db import create_letter_contact, create_template @pytest.mark.parametrize('template_type, subject', [ diff --git a/tests/app/dao/test_uploads_dao.py b/tests/app/dao/test_uploads_dao.py index 13cdb3034..194f60745 100644 --- a/tests/app/dao/test_uploads_dao.py +++ b/tests/app/dao/test_uploads_dao.py @@ -1,15 +1,19 @@ from datetime import datetime, timedelta + from freezegun import freeze_time -from app.dao.uploads_dao import dao_get_uploads_by_service_id, dao_get_uploaded_letters_by_print_date -from app.models import LETTER_TYPE, JOB_STATUS_IN_PROGRESS +from app.dao.uploads_dao import ( + dao_get_uploaded_letters_by_print_date, + dao_get_uploads_by_service_id, +) +from app.models import JOB_STATUS_IN_PROGRESS, LETTER_TYPE from tests.app.db import ( create_job, - create_service, - create_service_data_retention, - create_service_contact_list, - create_template, create_notification, + create_service, + create_service_contact_list, + create_service_data_retention, + create_template, ) diff --git a/tests/app/dao/test_users_dao.py b/tests/app/dao/test_users_dao.py index 9c3658e0f..bbd0f575a 100644 --- a/tests/app/dao/test_users_dao.py +++ b/tests/app/dao/test_users_dao.py @@ -1,32 +1,39 @@ -from datetime import datetime, timedelta import uuid +from datetime import datetime, timedelta +import pytest from freezegun import freeze_time from sqlalchemy.exc import DataError from sqlalchemy.orm.exc import NoResultFound -import pytest from app import db -from app.dao.service_user_dao import dao_get_service_user, dao_update_service_user +from app.dao.service_user_dao import ( + dao_get_service_user, + dao_update_service_user, +) from app.dao.users_dao import ( - save_model_user, - save_user_attribute, - get_user_by_id, - delete_model_user, - increment_failed_login_count, - reset_failed_login_count, - get_user_by_email, - delete_codes_older_created_more_than_a_day_ago, - update_user_password, count_user_verify_codes, create_secret_code, - user_can_be_archived, dao_archive_user, + delete_codes_older_created_more_than_a_day_ago, + delete_model_user, + get_user_by_email, + get_user_by_id, + increment_failed_login_count, + reset_failed_login_count, + save_model_user, + save_user_attribute, + update_user_password, + user_can_be_archived, ) from app.errors import InvalidRequest from app.models import EMAIL_AUTH_TYPE, User, VerifyCode - -from tests.app.db import create_permissions, create_service, create_template_folder, create_user +from tests.app.db import ( + create_permissions, + create_service, + create_template_folder, + create_user, +) @freeze_time('2020-01-28T12:00:00') diff --git a/tests/app/db.py b/tests/app/db.py index 6a399a548..c1cddf53d 100644 --- a/tests/app/db.py +++ b/tests/app/db.py @@ -1,6 +1,6 @@ import random import uuid -from datetime import datetime, date, timedelta +from datetime import date, datetime, timedelta import pytest @@ -11,64 +11,69 @@ from app.dao.inbound_sms_dao import dao_create_inbound_sms from app.dao.invited_org_user_dao import save_invited_org_user from app.dao.invited_user_dao import save_invited_user from app.dao.jobs_dao import dao_create_job -from app.dao.notifications_dao import ( - dao_create_notification, +from app.dao.notifications_dao import dao_create_notification +from app.dao.organisation_dao import ( + dao_add_service_to_organisation, + dao_create_organisation, ) -from app.dao.organisation_dao import dao_create_organisation, dao_add_service_to_organisation from app.dao.permissions_dao import permission_dao from app.dao.service_callback_api_dao import save_service_callback_api from app.dao.service_data_retention_dao import insert_service_data_retention from app.dao.service_inbound_api_dao import save_service_inbound_api from app.dao.service_permissions_dao import dao_add_service_permission -from app.dao.service_sms_sender_dao import update_existing_sms_sender_with_inbound_number, dao_update_service_sms_sender -from app.dao.services_dao import dao_create_service, dao_add_user_to_service +from app.dao.service_sms_sender_dao import ( + dao_update_service_sms_sender, + update_existing_sms_sender_with_inbound_number, +) +from app.dao.services_dao import dao_add_user_to_service, dao_create_service from app.dao.templates_dao import dao_create_template, dao_update_template from app.dao.users_dao import save_model_user from app.models import ( + EMAIL_TYPE, + KEY_TYPE_NORMAL, + LETTER_TYPE, + MOBILE_TYPE, + SMS_TYPE, + AnnualBilling, ApiKey, + BroadcastEvent, + BroadcastMessage, + BroadcastProvider, + BroadcastProviderMessage, + BroadcastProviderMessageNumber, + BroadcastStatusType, + Complaint, DailySortedLetter, - InboundSms, - InboundNumber, - Job, - Notification, + Domain, EmailBranding, + FactBilling, + FactNotificationStatus, + FactProcessingTime, + InboundNumber, + InboundSms, + InvitedOrganisationUser, + InvitedUser, + Job, + LetterBranding, LetterRate, + Notification, + NotificationHistory, Organisation, Permission, Rate, + ReturnedLetter, Service, - ServiceEmailReplyTo, - ServiceInboundApi, ServiceCallbackApi, + ServiceContactList, + ServiceEmailReplyTo, + ServiceGuestList, + ServiceInboundApi, ServiceLetterContact, ServicePermission, ServiceSmsSender, - ServiceGuestList, Template, - User, - EMAIL_TYPE, - MOBILE_TYPE, - SMS_TYPE, - LETTER_TYPE, - KEY_TYPE_NORMAL, - AnnualBilling, - InvitedOrganisationUser, - FactBilling, - FactNotificationStatus, - Complaint, - InvitedUser, TemplateFolder, - LetterBranding, - Domain, - NotificationHistory, - ReturnedLetter, - ServiceContactList, - BroadcastMessage, - BroadcastStatusType, - BroadcastEvent, - BroadcastProvider, - BroadcastProviderMessage, - BroadcastProviderMessageNumber, FactProcessingTime + User, ) diff --git a/tests/app/delivery/test_send_to_providers.py b/tests/app/delivery/test_send_to_providers.py index 1cad72af3..6f99b1f94 100644 --- a/tests/app/delivery/test_send_to_providers.py +++ b/tests/app/delivery/test_send_to_providers.py @@ -10,30 +10,31 @@ from notifications_utils.recipients import validate_and_format_phone_number from requests import HTTPError import app -from app import notification_provider_clients, mmg_client, firetext_client +from app import firetext_client, mmg_client, notification_provider_clients from app.dao import notifications_dao from app.dao.provider_details_dao import get_provider_details_by_identifier from app.delivery import send_to_providers from app.delivery.send_to_providers import get_html_email_options, get_logo_url from app.exceptions import NotificationTechnicalFailureException from app.models import ( - Notification, - EmailBranding, - KEY_TYPE_NORMAL, - KEY_TYPE_TEST, - KEY_TYPE_TEAM, - BRANDING_ORG, BRANDING_BOTH, - BRANDING_ORG_BANNER + BRANDING_ORG, + BRANDING_ORG_BANNER, + KEY_TYPE_NORMAL, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, + EmailBranding, + Notification, ) from app.serialised_models import SerialisedService from tests.app.db import ( - create_service, - create_template, + create_email_branding, create_notification, create_reply_to_email, + create_service, create_service_sms_sender, - create_service_with_defined_sms_sender, create_email_branding + create_service_with_defined_sms_sender, + create_template, ) @@ -208,7 +209,10 @@ def test_send_sms_should_use_template_version_from_notification_not_latest( version_on_notification = sample_template.version # Change the template - from app.dao.templates_dao import dao_update_template, dao_get_template_by_id + from app.dao.templates_dao import ( + dao_get_template_by_id, + dao_update_template, + ) sample_template.content = sample_template.content + " another version of the template" dao_update_template(sample_template) t = dao_get_template_by_id(sample_template.id) diff --git a/tests/app/email_branding/test_rest.py b/tests/app/email_branding/test_rest.py index df2208fde..80ed00e66 100644 --- a/tests/app/email_branding/test_rest.py +++ b/tests/app/email_branding/test_rest.py @@ -1,6 +1,6 @@ import pytest -from app.models import EmailBranding, BRANDING_ORG +from app.models import BRANDING_ORG, EmailBranding from tests.app.db import create_email_branding diff --git a/tests/app/events/test_rest.py b/tests/app/events/test_rest.py index e60217a8a..dcb6be114 100644 --- a/tests/app/events/test_rest.py +++ b/tests/app/events/test_rest.py @@ -1,4 +1,5 @@ import json + from tests import create_authorization_header diff --git a/tests/app/inbound_number/test_rest.py b/tests/app/inbound_number/test_rest.py index afb8aaff1..62e66b51a 100644 --- a/tests/app/inbound_number/test_rest.py +++ b/tests/app/inbound_number/test_rest.py @@ -1,6 +1,5 @@ from app.dao.inbound_numbers_dao import dao_get_inbound_number_for_service - -from tests.app.db import create_service, create_inbound_number +from tests.app.db import create_inbound_number, create_service def test_rest_get_inbound_numbers_when_none_set_returns_empty_list(admin_request): diff --git a/tests/app/inbound_sms/test_rest.py b/tests/app/inbound_sms/test_rest.py index 7b249a800..a0b364267 100644 --- a/tests/app/inbound_sms/test_rest.py +++ b/tests/app/inbound_sms/test_rest.py @@ -4,7 +4,10 @@ import pytest from freezegun import freeze_time from tests.app.db import ( - create_inbound_sms, create_service, create_service_with_inbound_number, create_service_data_retention + create_inbound_sms, + create_service, + create_service_data_retention, + create_service_with_inbound_number, ) diff --git a/tests/app/invite/test_invite_rest.py b/tests/app/invite/test_invite_rest.py index 5c3d85df4..58ff4a41a 100644 --- a/tests/app/invite/test_invite_rest.py +++ b/tests/app/invite/test_invite_rest.py @@ -1,8 +1,9 @@ import json + import pytest from flask import current_app -from app.models import Notification, SMS_AUTH_TYPE, EMAIL_AUTH_TYPE +from app.models import EMAIL_AUTH_TYPE, SMS_AUTH_TYPE, Notification from tests import create_authorization_header from tests.app.db import create_invited_user diff --git a/tests/app/job/test_rest.py b/tests/app/job/test_rest.py index ebec526e1..f9adb40ac 100644 --- a/tests/app/job/test_rest.py +++ b/tests/app/job/test_rest.py @@ -1,18 +1,16 @@ import json import uuid -from datetime import datetime, timedelta, date +from datetime import date, datetime, timedelta from unittest.mock import ANY -from freezegun import freeze_time import pytest import pytz +from freezegun import freeze_time import app.celery.tasks from app.dao.templates_dao import dao_update_template -from app.models import JOB_STATUS_TYPES, JOB_STATUS_PENDING - +from app.models import JOB_STATUS_PENDING, JOB_STATUS_TYPES from tests import create_authorization_header -from tests.conftest import set_config from tests.app.db import ( create_ft_notification_status, create_job, @@ -21,6 +19,7 @@ from tests.app.db import ( create_service_contact_list, create_template, ) +from tests.conftest import set_config def test_get_job_with_invalid_service_id_returns404(client, sample_service): diff --git a/tests/app/letters/test_letter_utils.py b/tests/app/letters/test_letter_utils.py index b9f4f4405..bca8ff5a6 100644 --- a/tests/app/letters/test_letter_utils.py +++ b/tests/app/letters/test_letter_utils.py @@ -1,22 +1,29 @@ -import pytest from datetime import datetime -import dateutil import boto3 +import dateutil +import pytest from flask import current_app from freezegun import freeze_time from moto import mock_s3 from app.letters.utils import ( + ScanErrorType, get_bucket_name_and_prefix_for_notification, - get_letter_pdf_filename, + get_folder_name, get_letter_pdf_and_metadata, + get_letter_pdf_filename, letter_print_day, + move_failed_pdf, move_sanitised_letter_to_test_or_live_pdf_bucket, upload_letter_pdf, - ScanErrorType, move_failed_pdf, get_folder_name ) -from app.models import KEY_TYPE_NORMAL, KEY_TYPE_TEST, PRECOMPILED_TEMPLATE_NAME, NOTIFICATION_VALIDATION_FAILED +from app.models import ( + KEY_TYPE_NORMAL, + KEY_TYPE_TEST, + NOTIFICATION_VALIDATION_FAILED, + PRECOMPILED_TEMPLATE_NAME, +) from tests.app.db import create_notification FROZEN_DATE_TIME = "2018-03-14 17:00:00" diff --git a/tests/app/notifications/rest/test_send_notification.py b/tests/app/notifications/rest/test_send_notification.py index f856d743b..f13398d9e 100644 --- a/tests/app/notifications/rest/test_send_notification.py +++ b/tests/app/notifications/rest/test_send_notification.py @@ -1,34 +1,42 @@ import random import string -import pytest -from flask import (json, current_app) +import pytest +from flask import current_app, json from freezegun import freeze_time from notifications_python_client.authentication import create_jwt_token from notifications_utils import SMS_CHAR_COUNT_LIMIT import app from app.dao import notifications_dao -from app.models import ( - SMS_TYPE, EMAIL_TYPE, - ApiKey, KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST, Notification, NotificationHistory -) -from app.dao.templates_dao import dao_get_all_templates_for_service, dao_update_template -from app.dao.services_dao import dao_update_service from app.dao.api_key_dao import save_model_api_key +from app.dao.services_dao import dao_update_service +from app.dao.templates_dao import ( + dao_get_all_templates_for_service, + dao_update_template, +) from app.errors import InvalidRequest -from app.models import Template +from app.models import ( + EMAIL_TYPE, + KEY_TYPE_NORMAL, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, + SMS_TYPE, + ApiKey, + Notification, + NotificationHistory, + Template, +) from app.service.send_notification import send_one_off_notification from app.v2.errors import RateLimitError - from tests import create_authorization_header from tests.app.db import ( create_api_key, create_notification, + create_reply_to_email, create_service, create_service_guest_list, create_template, - create_reply_to_email, ) diff --git a/tests/app/notifications/test_notifications_ses_callback.py b/tests/app/notifications/test_notifications_ses_callback.py index f7909115e..179aa5564 100644 --- a/tests/app/notifications/test_notifications_ses_callback.py +++ b/tests/app/notifications/test_notifications_ses_callback.py @@ -5,12 +5,12 @@ from sqlalchemy.exc import SQLAlchemyError from app.dao.notifications_dao import get_notification_by_id from app.models import Complaint from app.notifications.notifications_ses_callback import handle_complaint - from tests.app.db import ( - create_notification, ses_complaint_callback_malformed_message_id, - ses_complaint_callback_with_missing_complaint_type, + create_notification, + create_notification_history, ses_complaint_callback, - create_notification_history + ses_complaint_callback_malformed_message_id, + ses_complaint_callback_with_missing_complaint_type, ) diff --git a/tests/app/notifications/test_process_client_response.py b/tests/app/notifications/test_process_client_response.py index 926599d01..e4bc103e9 100644 --- a/tests/app/notifications/test_process_client_response.py +++ b/tests/app/notifications/test_process_client_response.py @@ -5,9 +5,13 @@ import pytest from freezegun import freeze_time from app import statsd_client +from app.celery.process_sms_client_response_tasks import ( + process_sms_client_response, +) +from app.celery.service_callback_tasks import ( + create_delivery_status_callback_data, +) from app.clients import ClientException -from app.celery.process_sms_client_response_tasks import process_sms_client_response -from app.celery.service_callback_tasks import create_delivery_status_callback_data from app.models import NOTIFICATION_TECHNICAL_FAILURE from tests.app.db import create_service_callback_api diff --git a/tests/app/notifications/test_process_letter_notifications.py b/tests/app/notifications/test_process_letter_notifications.py index 7744aa142..9bebba06a 100644 --- a/tests/app/notifications/test_process_letter_notifications.py +++ b/tests/app/notifications/test_process_letter_notifications.py @@ -1,7 +1,7 @@ -from app.models import LETTER_TYPE -from app.models import Notification -from app.models import NOTIFICATION_CREATED -from app.notifications.process_letter_notifications import create_letter_notification +from app.models import LETTER_TYPE, NOTIFICATION_CREATED, Notification +from app.notifications.process_letter_notifications import ( + create_letter_notification, +) from app.serialised_models import SerialisedTemplate diff --git a/tests/app/notifications/test_process_notification.py b/tests/app/notifications/test_process_notification.py index a063b9b79..7b22282fa 100644 --- a/tests/app/notifications/test_process_notification.py +++ b/tests/app/notifications/test_process_notification.py @@ -1,27 +1,26 @@ import datetime import uuid +from collections import namedtuple import pytest from boto3.exceptions import Boto3Error -from sqlalchemy.exc import SQLAlchemyError from freezegun import freeze_time -from collections import namedtuple - -from app.models import ( - Notification, - NotificationHistory, - LETTER_TYPE +from notifications_utils.recipients import ( + validate_and_format_email_address, + validate_and_format_phone_number, ) +from sqlalchemy.exc import SQLAlchemyError + +from app.models import LETTER_TYPE, Notification, NotificationHistory from app.notifications.process_notifications import ( create_content_for_notification, persist_notification, send_notification_to_queue, - simulated_recipient + simulated_recipient, ) from app.serialised_models import SerialisedTemplate -from notifications_utils.recipients import validate_and_format_phone_number, validate_and_format_email_address from app.v2.errors import BadRequestError -from tests.app.db import create_service, create_template, create_api_key +from tests.app.db import create_api_key, create_service, create_template def test_create_content_for_notification_passes(sample_email_template): diff --git a/tests/app/notifications/test_receive_notification.py b/tests/app/notifications/test_receive_notification.py index 2f1960166..a08caf3b1 100644 --- a/tests/app/notifications/test_receive_notification.py +++ b/tests/app/notifications/test_receive_notification.py @@ -5,18 +5,21 @@ import pytest from flask import json from freezegun import freeze_time +from app.models import EMAIL_TYPE, INBOUND_SMS_TYPE, SMS_TYPE, InboundSms from app.notifications.receive_notifications import ( - format_mmg_message, - format_mmg_datetime, create_inbound_sms_object, - strip_leading_forty_four, + format_mmg_datetime, + format_mmg_message, has_inbound_sms_permissions, + strip_leading_forty_four, unescape_string, ) - -from app.models import InboundSms, EMAIL_TYPE, SMS_TYPE, INBOUND_SMS_TYPE +from tests.app.db import ( + create_inbound_number, + create_service, + create_service_with_inbound_number, +) from tests.conftest import set_config -from tests.app.db import create_inbound_number, create_service, create_service_with_inbound_number def firetext_post(client, data, auth=True, password='testkey'): diff --git a/tests/app/notifications/test_rest.py b/tests/app/notifications/test_rest.py index a481ff9ad..e92ee8f55 100644 --- a/tests/app/notifications/test_rest.py +++ b/tests/app/notifications/test_rest.py @@ -1,17 +1,16 @@ import uuid import pytest -from flask import json, current_app -from notifications_python_client.authentication import create_jwt_token +from flask import current_app, json from freezegun import freeze_time +from notifications_python_client.authentication import create_jwt_token -from app.dao.notifications_dao import dao_update_notification from app.dao.api_key_dao import save_model_api_key +from app.dao.notifications_dao import dao_update_notification from app.dao.templates_dao import dao_update_template -from app.models import ApiKey, KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST - +from app.models import KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST, ApiKey from tests import create_authorization_header -from tests.app.db import create_notification, create_api_key +from tests.app.db import create_api_key, create_notification @pytest.mark.parametrize('type', ('email', 'sms', 'letter')) diff --git a/tests/app/notifications/test_validators.py b/tests/app/notifications/test_validators.py index f40d99ffa..a99de221a 100644 --- a/tests/app/notifications/test_validators.py +++ b/tests/app/notifications/test_validators.py @@ -1,54 +1,51 @@ +from unittest.mock import ANY + import pytest -from freezegun import freeze_time from flask import current_app +from freezegun import freeze_time from notifications_utils import SMS_CHAR_COUNT_LIMIT import app from app.dao import templates_dao -from app.models import ( - EMAIL_TYPE, - INTERNATIONAL_LETTERS, - LETTER_TYPE, - SMS_TYPE, +from app.models import EMAIL_TYPE, INTERNATIONAL_LETTERS, LETTER_TYPE, SMS_TYPE +from app.notifications.process_notifications import ( + create_content_for_notification, ) -from app.notifications.process_notifications import create_content_for_notification from app.notifications.validators import ( - check_is_message_too_long, check_if_service_can_send_files_by_email, + check_is_message_too_long, check_notification_content_is_not_empty, - check_service_over_daily_message_limit, - check_template_is_for_notification_type, - check_template_is_active, - check_service_over_api_rate_limit, - check_service_email_reply_to_id, - check_service_sms_sender_id, - check_service_letter_contact_id, check_reply_to, + check_service_email_reply_to_id, + check_service_letter_contact_id, + check_service_over_api_rate_limit, + check_service_over_daily_message_limit, + check_service_sms_sender_id, + check_template_is_active, + check_template_is_for_notification_type, service_can_send_to_recipient, validate_address, validate_and_format_recipient, validate_template, ) -from app.serialised_models import SerialisedService, SerialisedTemplate, SerialisedAPIKeyCollection +from app.serialised_models import ( + SerialisedAPIKeyCollection, + SerialisedService, + SerialisedTemplate, +) from app.utils import get_template_instance - -from app.v2.errors import ( - BadRequestError, - TooManyRequestsError, - RateLimitError) - -from tests.conftest import set_config +from app.v2.errors import BadRequestError, RateLimitError, TooManyRequestsError from tests.app.db import ( create_api_key, create_letter_contact, create_notification, create_reply_to_email, create_service, - create_service_sms_sender, create_service_guest_list, + create_service_sms_sender, create_template, ) -from unittest.mock import ANY +from tests.conftest import set_config # all of these tests should have redis enabled (except where we specifically disable it) diff --git a/tests/app/organisation/test_invite_rest.py b/tests/app/organisation/test_invite_rest.py index f7f771b3d..eae278e0e 100644 --- a/tests/app/organisation/test_invite_rest.py +++ b/tests/app/organisation/test_invite_rest.py @@ -1,7 +1,6 @@ import pytest -from app.models import Notification, INVITE_PENDING - +from app.models import INVITE_PENDING, Notification from tests.app.db import create_invited_org_user diff --git a/tests/app/organisation/test_rest.py b/tests/app/organisation/test_rest.py index 94a2e73eb..a3734083a 100644 --- a/tests/app/organisation/test_rest.py +++ b/tests/app/organisation/test_rest.py @@ -1,23 +1,25 @@ -from datetime import datetime - import uuid +from datetime import datetime import pytest from freezegun import freeze_time +from app.dao.organisation_dao import ( + dao_add_service_to_organisation, + dao_add_user_to_organisation, +) from app.dao.services_dao import dao_archive_service from app.models import Organisation -from app.dao.organisation_dao import dao_add_service_to_organisation, dao_add_user_to_organisation from tests.app.db import ( + create_annual_billing, create_domain, create_email_branding, + create_ft_billing, create_letter_branding, create_organisation, create_service, - create_user, create_template, - create_ft_billing, - create_annual_billing + create_user, ) diff --git a/tests/app/performance_dashboard/test_rest.py b/tests/app/performance_dashboard/test_rest.py index d56b43c59..29127bdc5 100644 --- a/tests/app/performance_dashboard/test_rest.py +++ b/tests/app/performance_dashboard/test_rest.py @@ -1,5 +1,10 @@ from datetime import date -from tests.app.db import create_template, create_ft_notification_status, create_process_time + +from tests.app.db import ( + create_ft_notification_status, + create_process_time, + create_template, +) def test_performance_dashboard(sample_service, admin_request): diff --git a/tests/app/performance_platform/test_processing_time.py b/tests/app/performance_platform/test_processing_time.py index f9f0ac9b4..bee1a485c 100644 --- a/tests/app/performance_platform/test_processing_time.py +++ b/tests/app/performance_platform/test_processing_time.py @@ -1,13 +1,13 @@ -from datetime import datetime, timedelta, date +from datetime import date, datetime, timedelta from freezegun import freeze_time from app.models import FactProcessingTime -from tests.app.db import create_notification from app.performance_platform.processing_time import ( + send_processing_time_data, send_processing_time_to_performance_platform, - send_processing_time_data ) +from tests.app.db import create_notification @freeze_time('2016-10-18T02:00') diff --git a/tests/app/performance_platform/test_total_sent_notifications.py b/tests/app/performance_platform/test_total_sent_notifications.py index 326ed4bd8..87204f434 100644 --- a/tests/app/performance_platform/test_total_sent_notifications.py +++ b/tests/app/performance_platform/test_total_sent_notifications.py @@ -1,13 +1,12 @@ -from datetime import datetime, date +from datetime import date, datetime from freezegun import freeze_time from app.performance_platform.total_sent_notifications import ( + get_total_sent_notifications_for_day, send_total_notifications_sent_for_day_stats, - get_total_sent_notifications_for_day ) - -from tests.app.db import create_template, create_ft_notification_status +from tests.app.db import create_ft_notification_status, create_template def test_send_total_notifications_sent_for_day_stats_stats_creates_correct_call(mocker, client): diff --git a/tests/app/platform_stats/test_rest.py b/tests/app/platform_stats/test_rest.py index ecd5bcd56..663beb62c 100644 --- a/tests/app/platform_stats/test_rest.py +++ b/tests/app/platform_stats/test_rest.py @@ -4,11 +4,16 @@ import pytest from freezegun import freeze_time from app.errors import InvalidRequest -from app.models import SMS_TYPE, EMAIL_TYPE -from app.platform_stats.rest import validate_date_range_is_within_a_financial_year +from app.models import EMAIL_TYPE, SMS_TYPE +from app.platform_stats.rest import ( + validate_date_range_is_within_a_financial_year, +) from tests.app.db import ( - create_service, create_template, create_ft_notification_status, create_notification, - set_up_usage_data + create_ft_notification_status, + create_notification, + create_service, + create_template, + set_up_usage_data, ) diff --git a/tests/app/provider_details/test_rest.py b/tests/app/provider_details/test_rest.py index 307928658..a9847f6f3 100644 --- a/tests/app/provider_details/test_rest.py +++ b/tests/app/provider_details/test_rest.py @@ -3,7 +3,6 @@ from flask import json from freezegun import freeze_time from app.models import ProviderDetails, ProviderDetailsHistory - from tests import create_authorization_header from tests.app.db import create_ft_billing diff --git a/tests/app/public_contracts/__init__.py b/tests/app/public_contracts/__init__.py index c8dd707d3..4b7607888 100644 --- a/tests/app/public_contracts/__init__.py +++ b/tests/app/public_contracts/__init__.py @@ -1,7 +1,7 @@ import os -from flask import json import jsonschema +from flask import json from jsonschema import Draft4Validator diff --git a/tests/app/public_contracts/test_GET_notification.py b/tests/app/public_contracts/test_GET_notification.py index 005f2c93d..ccb27f4d7 100644 --- a/tests/app/public_contracts/test_GET_notification.py +++ b/tests/app/public_contracts/test_GET_notification.py @@ -1,9 +1,13 @@ -from . import return_json_from_response, validate_v0, validate -from app.models import ApiKey, KEY_TYPE_NORMAL from app.dao.api_key_dao import save_model_api_key -from app.v2.notifications.notification_schemas import get_notification_response, get_notifications_response +from app.models import KEY_TYPE_NORMAL, ApiKey +from app.v2.notifications.notification_schemas import ( + get_notification_response, + get_notifications_response, +) from tests import create_authorization_header +from . import return_json_from_response, validate, validate_v0 + def _get_notification(client, notification, url): save_model_api_key(ApiKey( diff --git a/tests/app/public_contracts/test_POST_notification.py b/tests/app/public_contracts/test_POST_notification.py index 058cf3194..6e5621740 100644 --- a/tests/app/public_contracts/test_POST_notification.py +++ b/tests/app/public_contracts/test_POST_notification.py @@ -1,8 +1,9 @@ from flask import json -from . import return_json_from_response, validate_v0 from tests import create_authorization_header +from . import return_json_from_response, validate_v0 + def _post_notification(client, template, url, to): data = { diff --git a/tests/app/service/test_api_key_endpoints.py b/tests/app/service/test_api_key_endpoints.py index b412fea5f..c89d47829 100644 --- a/tests/app/service/test_api_key_endpoints.py +++ b/tests/app/service/test_api_key_endpoints.py @@ -2,8 +2,8 @@ import json from flask import url_for -from app.models import ApiKey, KEY_TYPE_NORMAL from app.dao.api_key_dao import expire_api_key +from app.models import KEY_TYPE_NORMAL, ApiKey from tests import create_authorization_header from tests.app.db import create_api_key, create_service, create_user diff --git a/tests/app/service/test_archived_service.py b/tests/app/service/test_archived_service.py index 9642e5a3e..19fe479c1 100644 --- a/tests/app/service/test_archived_service.py +++ b/tests/app/service/test_archived_service.py @@ -5,13 +5,12 @@ import pytest from freezegun import freeze_time from app import db -from app.models import Service -from app.dao.services_dao import dao_archive_service, dao_fetch_service_by_id from app.dao.api_key_dao import expire_api_key +from app.dao.services_dao import dao_archive_service, dao_fetch_service_by_id from app.dao.templates_dao import dao_update_template - +from app.models import Service from tests import create_authorization_header, unwrap_function -from tests.app.db import create_template, create_api_key +from tests.app.db import create_api_key, create_template def test_archive_only_allows_post(client, notify_db_session): diff --git a/tests/app/service/test_callback_rest.py b/tests/app/service/test_callback_rest.py index 33e92b14f..1de3d45da 100644 --- a/tests/app/service/test_callback_rest.py +++ b/tests/app/service/test_callback_rest.py @@ -1,11 +1,7 @@ import uuid -from tests.app.db import ( - create_service_inbound_api, - create_service_callback_api -) - -from app.models import ServiceInboundApi, ServiceCallbackApi +from app.models import ServiceCallbackApi, ServiceInboundApi +from tests.app.db import create_service_callback_api, create_service_inbound_api def test_create_service_inbound_api(admin_request, sample_service): diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index bdd95b5fb..1878befb0 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -1,19 +1,36 @@ import json import uuid -from datetime import datetime, timedelta, date +from datetime import date, datetime, timedelta from unittest.mock import ANY import pytest -from flask import url_for, current_app +from flask import current_app, url_for from freezegun import freeze_time from app.dao.organisation_dao import dao_add_service_to_organisation from app.dao.service_sms_sender_dao import dao_get_sms_senders_by_service_id -from app.dao.services_dao import dao_add_user_to_service, dao_remove_user_from_service from app.dao.service_user_dao import dao_get_service_user +from app.dao.services_dao import ( + dao_add_user_to_service, + dao_remove_user_from_service, +) from app.dao.templates_dao import dao_redact_template from app.dao.users_dao import save_model_user from app.models import ( + BROADCAST_TYPE, + EMAIL_AUTH_TYPE, + EMAIL_TYPE, + INBOUND_SMS_TYPE, + INTERNATIONAL_LETTERS, + INTERNATIONAL_SMS_TYPE, + KEY_TYPE_NORMAL, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, + LETTER_TYPE, + NOTIFICATION_RETURNED_LETTER, + SERVICE_PERMISSION_TYPES, + SMS_TYPE, + UPLOAD_LETTERS, EmailBranding, InboundNumber, Notification, @@ -25,46 +42,32 @@ from app.models import ( ServicePermission, ServiceSmsSender, User, - KEY_TYPE_NORMAL, - KEY_TYPE_TEAM, - KEY_TYPE_TEST, - EMAIL_TYPE, - SMS_TYPE, - LETTER_TYPE, - BROADCAST_TYPE, - INTERNATIONAL_LETTERS, - INTERNATIONAL_SMS_TYPE, - INBOUND_SMS_TYPE, - EMAIL_AUTH_TYPE, - NOTIFICATION_RETURNED_LETTER, - UPLOAD_LETTERS, - SERVICE_PERMISSION_TYPES, ) from tests import create_authorization_header from tests.app.db import ( + create_annual_billing, + create_api_key, + create_domain, + create_email_branding, create_ft_billing, create_ft_notification_status, + create_inbound_number, + create_job, + create_letter_branding, + create_letter_contact, + create_notification, + create_notification_history, + create_organisation, + create_reply_to_email, + create_returned_letter, create_service, + create_service_sms_sender, + create_service_with_defined_sms_sender, create_service_with_inbound_number, create_template, create_template_folder, - create_notification, - create_reply_to_email, - create_letter_contact, - create_inbound_number, - create_service_sms_sender, - create_service_with_defined_sms_sender, - create_letter_branding, - create_organisation, - create_domain, - create_email_branding, - create_annual_billing, - create_returned_letter, - create_notification_history, - create_job, - create_api_key + create_user, ) -from tests.app.db import create_user def test_get_service_list(client, service_factory): diff --git a/tests/app/service/test_schema.py b/tests/app/service/test_schema.py index 886a030e8..cff2c646b 100644 --- a/tests/app/service/test_schema.py +++ b/tests/app/service/test_schema.py @@ -6,7 +6,8 @@ from jsonschema import ValidationError from app.schema_validation import validate from app.service.service_callback_api_schema import ( - update_service_callback_api_schema) + update_service_callback_api_schema, +) def test_service_callback_api_schema_validates(): diff --git a/tests/app/service/test_send_one_off_notification.py b/tests/app/service/test_send_one_off_notification.py index b10b21ac4..1fe29292f 100644 --- a/tests/app/service/test_send_one_off_notification.py +++ b/tests/app/service/test_send_one_off_notification.py @@ -5,10 +5,10 @@ import pytest from notifications_utils import SMS_CHAR_COUNT_LIMIT from notifications_utils.recipients import InvalidPhoneError -from app.v2.errors import BadRequestError, TooManyRequestsError from app.config import QueueNames -from app.dao.service_guest_list_dao import dao_add_and_commit_guest_list_contacts -from app.service.send_notification import send_one_off_notification +from app.dao.service_guest_list_dao import ( + dao_add_and_commit_guest_list_contacts, +) from app.models import ( EMAIL_TYPE, KEY_TYPE_NORMAL, @@ -19,14 +19,15 @@ from app.models import ( Notification, ServiceGuestList, ) - +from app.service.send_notification import send_one_off_notification +from app.v2.errors import BadRequestError, TooManyRequestsError from tests.app.db import ( - create_user, - create_reply_to_email, create_letter_contact, - create_service_sms_sender, + create_reply_to_email, create_service, - create_template + create_service_sms_sender, + create_template, + create_user, ) diff --git a/tests/app/service/test_send_pdf_letter_notification.py b/tests/app/service/test_send_pdf_letter_notification.py index f5772095c..c374691bb 100644 --- a/tests/app/service/test_send_pdf_letter_notification.py +++ b/tests/app/service/test_send_pdf_letter_notification.py @@ -2,12 +2,12 @@ import uuid import pytest from freezegun import freeze_time +from notifications_utils.s3 import S3ObjectNotFound from app.dao.notifications_dao import get_notification_by_id from app.models import EMAIL_TYPE, LETTER_TYPE, UPLOAD_LETTERS from app.service.send_notification import send_pdf_letter_notification from app.v2.errors import BadRequestError, TooManyRequestsError -from notifications_utils.s3 import S3ObjectNotFound from tests.app.db import create_service diff --git a/tests/app/service/test_sender.py b/tests/app/service/test_sender.py index 4b1cd0938..dc33a6c14 100644 --- a/tests/app/service/test_sender.py +++ b/tests/app/service/test_sender.py @@ -1,11 +1,9 @@ import pytest - from flask import current_app from app.dao.services_dao import dao_add_user_to_service -from app.models import Notification, EMAIL_TYPE, SMS_TYPE +from app.models import EMAIL_TYPE, SMS_TYPE, Notification from app.service.sender import send_notification_to_service_users - from tests.app.conftest import notify_service as create_notify_service from tests.app.db import create_service, create_template, create_user diff --git a/tests/app/service/test_service_contact_list_rest.py b/tests/app/service/test_service_contact_list_rest.py index 82a1fc1cb..5730879dc 100644 --- a/tests/app/service/test_service_contact_list_rest.py +++ b/tests/app/service/test_service_contact_list_rest.py @@ -1,14 +1,14 @@ -import pytest import uuid - from datetime import datetime, timedelta +import pytest + from app.models import ServiceContactList from tests.app.db import ( create_job, + create_service, create_service_contact_list, create_service_data_retention, - create_service, create_template, ) diff --git a/tests/app/service/test_service_guest_list.py b/tests/app/service/test_service_guest_list.py index 8133f8e22..54af1ebaa 100644 --- a/tests/app/service/test_service_guest_list.py +++ b/tests/app/service/test_service_guest_list.py @@ -1,14 +1,12 @@ -import uuid import json +import uuid +from app.dao.service_guest_list_dao import ( + dao_add_and_commit_guest_list_contacts, +) +from app.models import EMAIL_TYPE, MOBILE_TYPE, ServiceGuestList from tests import create_authorization_header -from app.models import ( - ServiceGuestList, - MOBILE_TYPE, EMAIL_TYPE) - -from app.dao.service_guest_list_dao import dao_add_and_commit_guest_list_contacts - def test_get_guest_list_returns_data(client, sample_service_guest_list): service_id = sample_service_guest_list.service_id diff --git a/tests/app/service/test_statistics.py b/tests/app/service/test_statistics.py index ba40dc796..5b5fa2134 100644 --- a/tests/app/service/test_statistics.py +++ b/tests/app/service/test_statistics.py @@ -2,8 +2,8 @@ import collections from datetime import datetime from unittest.mock import Mock -from freezegun import freeze_time import pytest +from freezegun import freeze_time from app.service.statistics import ( add_monthly_notification_status_stats, @@ -11,7 +11,7 @@ from app.service.statistics import ( create_stats_dict, create_zeroed_stats_dicts, format_admin_stats, - format_statistics + format_statistics, ) StatsRow = collections.namedtuple('row', ('notification_type', 'status', 'count')) diff --git a/tests/app/service/test_statistics_rest.py b/tests/app/service/test_statistics_rest.py index 519612de5..a4b778f11 100644 --- a/tests/app/service/test_statistics_rest.py +++ b/tests/app/service/test_statistics_rest.py @@ -1,24 +1,23 @@ import uuid -from datetime import datetime, date +from datetime import date, datetime import pytest from freezegun import freeze_time from app.models import ( EMAIL_TYPE, - SMS_TYPE, + KEY_TYPE_NORMAL, + KEY_TYPE_TEAM, + KEY_TYPE_TEST, LETTER_TYPE, PRECOMPILED_TEMPLATE_NAME, - KEY_TYPE_TEST, - KEY_TYPE_TEAM, - KEY_TYPE_NORMAL, + SMS_TYPE, ) - from tests.app.db import ( + create_ft_notification_status, + create_notification, create_service, create_template, - create_notification, - create_ft_notification_status ) diff --git a/tests/app/service/test_suspend_resume_service.py b/tests/app/service/test_suspend_resume_service.py index 997e3101d..c66b8b6e0 100644 --- a/tests/app/service/test_suspend_resume_service.py +++ b/tests/app/service/test_suspend_resume_service.py @@ -1,9 +1,7 @@ +import uuid from datetime import datetime import pytest - -import uuid - from freezegun import freeze_time from app.models import Service diff --git a/tests/app/service/test_utils.py b/tests/app/service/test_utils.py index 71b2770bb..279608764 100644 --- a/tests/app/service/test_utils.py +++ b/tests/app/service/test_utils.py @@ -1,6 +1,7 @@ -from app.dao.date_util import get_current_financial_year_start_year from freezegun import freeze_time +from app.dao.date_util import get_current_financial_year_start_year + # see get_financial_year for conversion of financial years. @freeze_time("2017-03-31 22:59:59.999999") diff --git a/tests/app/template/test_rest.py b/tests/app/template/test_rest.py index 9096ed95d..79610d09c 100644 --- a/tests/app/template/test_rest.py +++ b/tests/app/template/test_rest.py @@ -8,26 +8,30 @@ from datetime import datetime, timedelta import botocore import pytest import requests_mock -from PyPDF2.utils import PdfReadError from freezegun import freeze_time from notifications_utils import SMS_CHAR_COUNT_LIMIT +from PyPDF2.utils import PdfReadError - +from app.dao.templates_dao import ( + dao_get_template_by_id, + dao_get_template_versions, + dao_redact_template, + dao_update_template, +) from app.models import ( BROADCAST_TYPE, EMAIL_TYPE, LETTER_TYPE, SMS_TYPE, Template, - TemplateHistory + TemplateHistory, ) -from app.dao.templates_dao import ( - dao_get_template_by_id, dao_get_template_versions, dao_redact_template, dao_update_template -) - from tests import create_authorization_header from tests.app.db import ( - create_service, create_letter_contact, create_template, create_notification, + create_letter_contact, + create_notification, + create_service, + create_template, create_template_folder, ) from tests.conftest import set_config_values diff --git a/tests/app/template/test_rest_history.py b/tests/app/template/test_rest_history.py index 0d72ee63c..90d52ed01 100644 --- a/tests/app/template/test_rest_history.py +++ b/tests/app/template/test_rest_history.py @@ -1,6 +1,8 @@ import json -from datetime import (datetime, date) +from datetime import date, datetime + from flask import url_for + from app.dao.templates_dao import dao_update_template from tests import create_authorization_header from tests.app.db import create_letter_contact diff --git a/tests/app/template_folder/test_template_folder_rest.py b/tests/app/template_folder/test_template_folder_rest.py index 118de04e8..a2951a05c 100644 --- a/tests/app/template_folder/test_template_folder_rest.py +++ b/tests/app/template_folder/test_template_folder_rest.py @@ -4,8 +4,12 @@ import pytest from app.dao.service_user_dao import dao_get_service_user from app.models import TemplateFolder - -from tests.app.db import create_service, create_template_folder, create_template, create_user +from tests.app.db import ( + create_service, + create_template, + create_template_folder, + create_user, +) def test_get_folders_for_service(admin_request, notify_db_session): diff --git a/tests/app/test_cloudfoundry_config.py b/tests/app/test_cloudfoundry_config.py index 8e1e5b158..2c8b5a71a 100644 --- a/tests/app/test_cloudfoundry_config.py +++ b/tests/app/test_cloudfoundry_config.py @@ -1,9 +1,12 @@ -import os import json +import os import pytest -from app.cloudfoundry_config import extract_cloudfoundry_config, set_config_env_vars +from app.cloudfoundry_config import ( + extract_cloudfoundry_config, + set_config_env_vars, +) @pytest.fixture diff --git a/tests/app/test_config.py b/tests/app/test_config.py index dc5d79725..84fe1e549 100644 --- a/tests/app/test_config.py +++ b/tests/app/test_config.py @@ -1,5 +1,5 @@ -import os import importlib +import os from unittest import mock import pytest diff --git a/tests/app/test_cronitor.py b/tests/app/test_cronitor.py index 8e1aaa6b4..dcf494e7a 100644 --- a/tests/app/test_cronitor.py +++ b/tests/app/test_cronitor.py @@ -1,10 +1,9 @@ from urllib import parse -import requests import pytest +import requests from app.cronitor import cronitor - from tests.conftest import set_config_values diff --git a/tests/app/test_model.py b/tests/app/test_model.py index 10e0cd5cc..7d473fc2a 100644 --- a/tests/app/test_model.py +++ b/tests/app/test_model.py @@ -1,35 +1,33 @@ import pytest - from freezegun import freeze_time from sqlalchemy.exc import IntegrityError from app import encryption from app.models import ( - ServiceGuestList, - Notification, - SMS_TYPE, - MOBILE_TYPE, EMAIL_TYPE, + MOBILE_TYPE, NOTIFICATION_CREATED, NOTIFICATION_DELIVERED, - NOTIFICATION_SENDING, - NOTIFICATION_PENDING, NOTIFICATION_FAILED, + NOTIFICATION_PENDING, + NOTIFICATION_SENDING, NOTIFICATION_STATUS_LETTER_ACCEPTED, NOTIFICATION_STATUS_LETTER_RECEIVED, NOTIFICATION_STATUS_TYPES_FAILED, NOTIFICATION_TECHNICAL_FAILURE, - PRECOMPILED_TEMPLATE_NAME + PRECOMPILED_TEMPLATE_NAME, + SMS_TYPE, + Notification, + ServiceGuestList, ) - from tests.app.db import ( - create_notification, - create_service, create_inbound_number, - create_reply_to_email, create_letter_contact, + create_notification, + create_reply_to_email, + create_service, create_template, - create_template_folder + create_template_folder, ) diff --git a/tests/app/test_schemas.py b/tests/app/test_schemas.py index df66bff93..a270d7062 100644 --- a/tests/app/test_schemas.py +++ b/tests/app/test_schemas.py @@ -2,7 +2,10 @@ import pytest from marshmallow import ValidationError from sqlalchemy import desc -from app.dao.provider_details_dao import dao_update_provider_details, get_provider_details_by_identifier +from app.dao.provider_details_dao import ( + dao_update_provider_details, + get_provider_details_by_identifier, +) from app.models import ProviderDetailsHistory from tests.app.db import create_api_key diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py index d8e117eab..7cc084eaf 100644 --- a/tests/app/test_utils.py +++ b/tests/app/test_utils.py @@ -1,17 +1,16 @@ -from datetime import datetime, date +from datetime import date, datetime import pytest from freezegun import freeze_time +from app.models import Notification, NotificationHistory from app.utils import ( format_sequential_number, get_london_midnight_in_utc, get_midnight_for_day_before, get_notification_table_to_use, - midnight_n_days_ago + midnight_n_days_ago, ) -from app.models import Notification, NotificationHistory - from tests.app.db import create_service_data_retention diff --git a/tests/app/upload/test_rest.py b/tests/app/upload/test_rest.py index 400d0b3d9..50af3edf1 100644 --- a/tests/app/upload/test_rest.py +++ b/tests/app/upload/test_rest.py @@ -1,9 +1,14 @@ -from datetime import datetime, timedelta, date +from datetime import date, datetime, timedelta from freezegun import freeze_time -from app.models import LETTER_TYPE, JOB_STATUS_FINISHED, JOB_STATUS_PENDING -from tests.app.db import create_job, create_notification, create_template, create_ft_notification_status +from app.models import JOB_STATUS_FINISHED, JOB_STATUS_PENDING, LETTER_TYPE +from tests.app.db import ( + create_ft_notification_status, + create_job, + create_notification, + create_template, +) from tests.conftest import set_config diff --git a/tests/app/user/test_rest.py b/tests/app/user/test_rest.py index 91088a555..a6f4dd55a 100644 --- a/tests/app/user/test_rest.py +++ b/tests/app/user/test_rest.py @@ -1,25 +1,33 @@ import json -import pytest -import mock -from uuid import UUID from datetime import datetime +from uuid import UUID -from flask import url_for, current_app +import mock +import pytest +from flask import current_app, url_for from freezegun import freeze_time +from app.dao.permissions_dao import default_service_permissions +from app.dao.service_user_dao import ( + dao_get_service_user, + dao_update_service_user, +) from app.models import ( - User, - Permission, + EMAIL_AUTH_TYPE, MANAGE_SETTINGS, MANAGE_TEMPLATES, - Notification, SMS_AUTH_TYPE, - EMAIL_AUTH_TYPE + Notification, + Permission, + User, ) -from app.dao.permissions_dao import default_service_permissions -from app.dao.service_user_dao import dao_get_service_user, dao_update_service_user from tests import create_authorization_header -from tests.app.db import create_service, create_template_folder, create_organisation, create_user +from tests.app.db import ( + create_organisation, + create_service, + create_template_folder, + create_user, +) def test_get_user_list(admin_request, sample_service): diff --git a/tests/app/user/test_rest_verify.py b/tests/app/user/test_rest_verify.py index 16661a57f..4176357c8 100644 --- a/tests/app/user/test_rest_verify.py +++ b/tests/app/user/test_rest_verify.py @@ -1,26 +1,16 @@ import json import uuid -from datetime import ( - datetime, - timedelta -) +from datetime import datetime, timedelta import pytest -from flask import url_for, current_app +from flask import current_app, url_for from freezegun import freeze_time -from app.dao.users_dao import create_user_code -from app.dao.services_dao import dao_update_service, dao_fetch_service_by_id -from app.models import ( - Notification, - User, - VerifyCode, - EMAIL_TYPE, - SMS_TYPE -) -from app import db import app.celery.tasks - +from app import db +from app.dao.services_dao import dao_fetch_service_by_id, dao_update_service +from app.dao.users_dao import create_user_code +from app.models import EMAIL_TYPE, SMS_TYPE, Notification, User, VerifyCode from tests import create_authorization_header diff --git a/tests/app/v2/broadcast/test_post_broadcast.py b/tests/app/v2/broadcast/test_post_broadcast.py index 80c629dcc..9edd65e69 100644 --- a/tests/app/v2/broadcast/test_post_broadcast.py +++ b/tests/app/v2/broadcast/test_post_broadcast.py @@ -1,10 +1,14 @@ -import pytest - -from flask import json -from tests import create_authorization_header from unittest.mock import ANY + +import pytest +from flask import json + +from app.dao.broadcast_message_dao import ( + dao_get_broadcast_message_by_id_and_service_id, +) +from tests import create_authorization_header + from . import sample_cap_xml_documents -from app.dao.broadcast_message_dao import dao_get_broadcast_message_by_id_and_service_id def test_broadcast_for_service_without_permission_returns_400( diff --git a/tests/app/v2/inbound_sms/test_get_inbound_sms.py b/tests/app/v2/inbound_sms/test_get_inbound_sms.py index 7231ed9b9..fdede69cf 100644 --- a/tests/app/v2/inbound_sms/test_get_inbound_sms.py +++ b/tests/app/v2/inbound_sms/test_get_inbound_sms.py @@ -1,7 +1,11 @@ from flask import json, url_for from tests import create_authorization_header -from tests.app.db import create_inbound_sms, create_service_inbound_api, create_service_callback_api +from tests.app.db import ( + create_inbound_sms, + create_service_callback_api, + create_service_inbound_api, +) def test_get_inbound_sms_returns_200( diff --git a/tests/app/v2/inbound_sms/test_inbound_sms_schemas.py b/tests/app/v2/inbound_sms/test_inbound_sms_schemas.py index c2e32f93a..95c710137 100644 --- a/tests/app/v2/inbound_sms/test_inbound_sms_schemas.py +++ b/tests/app/v2/inbound_sms/test_inbound_sms_schemas.py @@ -2,13 +2,12 @@ import pytest from flask import json, url_for from jsonschema.exceptions import ValidationError +from app.schema_validation import validate from app.v2.inbound_sms.inbound_sms_schemas import ( get_inbound_sms_request, get_inbound_sms_response, - get_inbound_sms_single_response + get_inbound_sms_single_response, ) -from app.schema_validation import validate - from tests import create_authorization_header from tests.app.db import create_inbound_sms diff --git a/tests/app/v2/notifications/test_get_notifications.py b/tests/app/v2/notifications/test_get_notifications.py index 1844e21b8..cf1dc0f9a 100644 --- a/tests/app/v2/notifications/test_get_notifications.py +++ b/tests/app/v2/notifications/test_get_notifications.py @@ -1,13 +1,11 @@ import datetime + import pytest from flask import json, url_for from app.utils import DATETIME_FORMAT from tests import create_authorization_header -from tests.app.db import ( - create_notification, - create_template, -) +from tests.app.db import create_notification, create_template @pytest.mark.parametrize('billable_units, provider', [ diff --git a/tests/app/v2/notifications/test_notification_schemas.py b/tests/app/v2/notifications/test_notification_schemas.py index 006c3f4d3..c41e9c12b 100644 --- a/tests/app/v2/notifications/test_notification_schemas.py +++ b/tests/app/v2/notifications/test_notification_schemas.py @@ -5,14 +5,15 @@ from flask import json from freezegun import freeze_time from jsonschema import ValidationError -from app.models import NOTIFICATION_CREATED, EMAIL_TYPE +from app.models import EMAIL_TYPE, NOTIFICATION_CREATED from app.schema_validation import validate +from app.v2.notifications.notification_schemas import get_notifications_request from app.v2.notifications.notification_schemas import ( - get_notifications_request, - post_sms_request as post_sms_request_schema, - post_email_request as post_email_request_schema + post_email_request as post_email_request_schema, +) +from app.v2.notifications.notification_schemas import ( + post_sms_request as post_sms_request_schema, ) - valid_get_json = {} diff --git a/tests/app/v2/notifications/test_post_letter_notifications.py b/tests/app/v2/notifications/test_post_letter_notifications.py index fd68511dd..bb733621f 100644 --- a/tests/app/v2/notifications/test_post_letter_notifications.py +++ b/tests/app/v2/notifications/test_post_letter_notifications.py @@ -1,32 +1,30 @@ import uuid from unittest.mock import ANY -from flask import json -from flask import url_for import pytest +from flask import json, url_for from app.config import QueueNames from app.models import ( - Job, - Notification, EMAIL_TYPE, + INTERNATIONAL_LETTERS, KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST, LETTER_TYPE, NOTIFICATION_CREATED, - NOTIFICATION_SENDING, NOTIFICATION_DELIVERED, NOTIFICATION_PENDING_VIRUS_CHECK, + NOTIFICATION_SENDING, SMS_TYPE, - INTERNATIONAL_LETTERS, + Job, + Notification, ) from app.schema_validation import validate from app.v2.errors import RateLimitError from app.v2.notifications.notification_schemas import post_letter_response - from tests import create_authorization_header -from tests.app.db import create_service, create_template, create_letter_contact +from tests.app.db import create_letter_contact, create_service, create_template from tests.conftest import set_config_values test_address = { diff --git a/tests/app/v2/notifications/test_post_notifications.py b/tests/app/v2/notifications/test_post_notifications.py index 37d28ef9b..7b13fe828 100644 --- a/tests/app/v2/notifications/test_post_notifications.py +++ b/tests/app/v2/notifications/test_post_notifications.py @@ -4,30 +4,31 @@ from unittest.mock import call import pytest from boto.exception import SQSError +from flask import current_app, json from app.dao import templates_dao from app.dao.service_sms_sender_dao import dao_update_service_sms_sender from app.models import ( EMAIL_TYPE, + INTERNATIONAL_SMS_TYPE, NOTIFICATION_CREATED, SMS_TYPE, - INTERNATIONAL_SMS_TYPE + Notification, ) -from flask import json, current_app - -from app.models import Notification from app.schema_validation import validate from app.v2.errors import RateLimitError -from app.v2.notifications.notification_schemas import post_sms_response, post_email_response +from app.v2.notifications.notification_schemas import ( + post_email_response, + post_sms_response, +) from tests import create_authorization_header - from tests.app.db import ( - create_service, - create_template, + create_api_key, create_reply_to_email, + create_service, create_service_sms_sender, create_service_with_inbound_number, - create_api_key + create_template, ) from tests.conftest import set_config_values diff --git a/tests/app/v2/template/test_get_template.py b/tests/app/v2/template/test_get_template.py index 5f26519a5..a3c8a711e 100644 --- a/tests/app/v2/template/test_get_template.py +++ b/tests/app/v2/template/test_get_template.py @@ -1,11 +1,10 @@ import pytest - from flask import json -from app.models import (TEMPLATE_TYPES, EMAIL_TYPE, SMS_TYPE, LETTER_TYPE,) +from app.models import EMAIL_TYPE, LETTER_TYPE, SMS_TYPE, TEMPLATE_TYPES from app.utils import DATETIME_FORMAT from tests import create_authorization_header -from tests.app.db import create_template, create_letter_contact +from tests.app.db import create_letter_contact, create_template valid_version_params = [None, 1] diff --git a/tests/app/v2/template/test_post_template.py b/tests/app/v2/template/test_post_template.py index e74ff7dc4..229192a73 100644 --- a/tests/app/v2/template/test_post_template.py +++ b/tests/app/v2/template/test_post_template.py @@ -1,5 +1,4 @@ import pytest - from flask import json from app.models import EMAIL_TYPE, LETTER_TYPE, TEMPLATE_TYPES diff --git a/tests/app/v2/template/test_template_schemas.py b/tests/app/v2/template/test_template_schemas.py index 1ac8a0cbc..f5b804cb6 100644 --- a/tests/app/v2/template/test_template_schemas.py +++ b/tests/app/v2/template/test_template_schemas.py @@ -2,17 +2,16 @@ import uuid import pytest from flask import json - -from app.models import EMAIL_TYPE, SMS_TYPE, TEMPLATE_TYPES -from app.v2.template.template_schemas import ( - get_template_by_id_response, - get_template_by_id_request, - post_template_preview_request, - post_template_preview_response -) -from app.schema_validation import validate from jsonschema.exceptions import ValidationError +from app.models import EMAIL_TYPE, SMS_TYPE, TEMPLATE_TYPES +from app.schema_validation import validate +from app.v2.template.template_schemas import ( + get_template_by_id_request, + get_template_by_id_response, + post_template_preview_request, + post_template_preview_response, +) valid_json_get_response = { 'id': str(uuid.uuid4()), diff --git a/tests/app/v2/templates/test_get_templates.py b/tests/app/v2/templates/test_get_templates.py index b70bb564d..37a0062bc 100644 --- a/tests/app/v2/templates/test_get_templates.py +++ b/tests/app/v2/templates/test_get_templates.py @@ -1,9 +1,9 @@ -import pytest - -from flask import json from itertools import product -from app.models import TEMPLATE_TYPES, EMAIL_TYPE +import pytest +from flask import json + +from app.models import EMAIL_TYPE, TEMPLATE_TYPES from tests import create_authorization_header from tests.app.db import create_template diff --git a/tests/app/v2/templates/test_templates_schemas.py b/tests/app/v2/templates/test_templates_schemas.py index f6a5639c8..ae1376695 100644 --- a/tests/app/v2/templates/test_templates_schemas.py +++ b/tests/app/v2/templates/test_templates_schemas.py @@ -2,15 +2,14 @@ import uuid import pytest from flask import json - -from app.models import EMAIL_TYPE, SMS_TYPE, TEMPLATE_TYPES -from app.v2.templates.templates_schemas import ( - get_all_template_request, - get_all_template_response -) -from app.schema_validation import validate from jsonschema.exceptions import ValidationError +from app.models import EMAIL_TYPE, SMS_TYPE, TEMPLATE_TYPES +from app.schema_validation import validate +from app.v2.templates.templates_schemas import ( + get_all_template_request, + get_all_template_response, +) valid_json_get_all_response = [ { diff --git a/tests/app/v2/test_errors.py b/tests/app/v2/test_errors.py index 04a488ed6..bdc5c73c7 100644 --- a/tests/app/v2/test_errors.py +++ b/tests/app/v2/test_errors.py @@ -7,9 +7,10 @@ from sqlalchemy.exc import DataError def app_for_test(): import flask from flask import Blueprint + + from app import init_app from app.authentication.auth import AuthError from app.v2.errors import BadRequestError, TooManyRequestsError - from app import init_app app = flask.Flask(__name__) app.config['TESTING'] = True diff --git a/tests/conftest.py b/tests/conftest.py index fa7e3d17d..16db669e2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,11 +1,11 @@ -from contextlib import contextmanager import os +from contextlib import contextmanager -from flask import Flask -from alembic.command import upgrade -from alembic.config import Config import pytest import sqlalchemy +from alembic.command import upgrade +from alembic.config import Config +from flask import Flask from app import create_app, db from app.dao.provider_details_dao import get_provider_details_by_identifier