"""Helper methods.""" from datetime import datetime from lib import config from lib import constants from lib.abacus_event import AbacusEvent from lib.utils import aws from lib.utils import event from lib.utils import ows from lib.utils import paths PARENT_TABLE_NAME = 'payment_group_payment' def get_event_from_params(dag_run: dict, **kwargs) -> AbacusEvent: """Get event from params passed to task callbacks. Args: dag_run (dict): a dag's config Returns: instance of an AbacusEvent """ abacus_event = event.get_abacus_event(dag_run, **kwargs) event.validate_event_for_handler( abacus_event, event_name=constants.DAG_PAYMENTS_UPLOAD_APPROVAL_EVENT_NAME, target_type=constants.DAG_PAYMENTS_UPLOAD_APPROVAL_TARGET_TYPE ) return abacus_event def get_abacus_state(action_name: str, payment_group_payment_id: int) -> dict: """Find specified action in list of payment_group_payment actions. Args: action_name (str): name of the action for to get details payment_group_payment_id (int): ID of the payment_group_payment Returns: the specified action details """ abacus_states = ows.get_abacus_states(PARENT_TABLE_NAME, payment_group_payment_id) action_state = next( (action for action in abacus_states if action['action_name'] == action_name), None ) if not action_state: raise ValueError(f'{action_name} state not found') return action_state def build_upload_approval_archive_location( payment_group_payment_id: int, payment_name: str, original_filename: str ): """Build S3 path to archive an upload approval. Args: payment_group_payment_id (int): ID of the payment_group_payment payment_name (str): name of the payment_group_payment Returns: a namedtuple of the S3 key and url """ approval_archive_path = build_upload_approval_archive_path( payment_group_payment_id, payment_name) file_name = build_archived_payment_upload_approval_file_name( payment_name, original_filename) path = aws.join(approval_archive_path, file_name) return aws.location(path, bucket_name=config.S3_PAYMENTS_BUCKET_NAME) def build_upload_approval_archive_path( payment_group_payment_id: int, payment_name: str) -> str: """Build S3 path for a payment upload approval. Args: payment_group_payment_id (int): ID of the payment_group_payment payment_name (str): name of the payment_group_payment Returns: a path to a payment upload approval archive directory in S3. """ approval_path = build_upload_approval_path(payment_group_payment_id, payment_name) return aws.join(approval_path, constants.DIRECTORY_ARCHIVE) def build_upload_approval_path( payment_group_payment_id: int, payment_name: str) -> str: """Build S3 path for a payment upload approval. Args: payment_group_payment_id (int): ID of the payment_group_payment payment_name (str): name of the payment_group_payment Returns: a path to a payment upload approval directory in S3. """ payment_slug = paths.build_payments_slug(payment_group_payment_id, payment_name) return aws.join(payment_slug, constants.DIRECTORY_APPROVALS) def build_archived_payment_upload_approval_file_name( payment_name: str, original_filename: str) -> str: """Construct an filename with a timestamp to archive a payment upload_approval. Args: payment_name (str): name of the payment_group_payment Returns: payment summary filename as payment_name-YYYY-MM-DD-HH:MM:SS.MS-ORIGFILENAME """ today = datetime.now() return ( f'{aws.sanitize(payment_name)}-' f'{aws.sanitize(str(today))}-' f'{original_filename}' )