"""Report Payment model.""" from urllib.parse import urlparse from abacus_common_logic.connectors.database import db from abacus_common_logic.models.base import BaseModel from sqlalchemy import Enum, select from payment.config import Config from payment.connectors import s3 from payment.constants.constants import REPORT_TYPE class ReportPayment(BaseModel): """Report Payment model.""" __tablename__ = 'report_payment' report_payment_id = db.Column(db.Integer, primary_key=True) target_type = db.Column(db.String(64), nullable=False) target_id = db.Column(db.Integer, nullable=False) report_type = db.Column( Enum(*REPORT_TYPE, name='report_type', create_type=False, nullable=False) ) report_export_url = db.Column(db.String(180), nullable=False) __table_args__ = ( db.UniqueConstraint( 'target_type', 'target_id', 'report_type', name='uidx_report_payment', ), ) @property def original_filename(self) -> str | None: """Get original_filename from s3 object.""" metadata = None if self.report_export_url and self.report_type == REPORT_TYPE.APPROVAL: metadata = s3.get_object_metadata_by_s3_url(self.report_export_url) if metadata: return metadata['Metadata'].get('original_filename') def create_presigned_url(self) -> str: """Create presigned URL for report.""" bucket = Config.S3_PAYMENTS_BUCKET_NAME parsed_url = urlparse(self.report_export_url) key = parsed_url.path[1:] client = s3.get_s3_client() presigned_url = s3.create_presigned_url(bucket, client, key) return presigned_url @classmethod def get_by_target_and_type( cls, target_type: str, target_id: int, report_type: str ) -> 'ReportPayment | None': """Get ReportPayment by target_type and target_id.""" return ( db.session.execute( select(cls).where( cls.target_type == target_type, cls.target_id == target_id, cls.report_type == report_type, ) ) .scalars() .first() ) @classmethod def get_all_by_target( cls, target_type: str, target_id: int ) -> list['ReportPayment']: """Get all ReportPayments by target_type and target_id.""" return ( db.session.execute( select(cls).where( cls.target_type == target_type, cls.target_id == target_id, ) ) .scalars() .all() )