"""Payment Group Payment Report model.""" from abacus_common_logic.connectors.database import db from abacus_common_logic.models.base import BaseModel from sqlalchemy import delete from payment.connectors import s3 from payment.constants.constants import REPORT_TYPE class ReportPaymentGroupPayment(BaseModel): """Payment Group Payment Report model.""" __tablename__ = 'report_payment_group_payment' report_payment_group_payment_id = db.Column(db.Integer, primary_key=True) payment_group_payment_id = db.Column( db.Integer, db.ForeignKey('payment_group_payment.payment_group_payment_id'), nullable=False, ) report_type = db.Column(db.String(32), nullable=False) report_export_url = db.Column(db.String(180), nullable=False) __table_args__ = ( db.UniqueConstraint( 'payment_group_payment_id', 'report_type', name='payment_group_payment_report_type_unique_constraint', ), ) @classmethod def hard_delete_by_payment_group_payment( cls, payment_group_payment_id, commit: bool = True ): """Hard delete reports by payment_group_payment_id. Args: payment_group_payment_id: ID of the payment group payment commit: whether to commit the transaction """ db.session.execute( delete(cls) .where(cls.payment_group_payment_id == payment_group_payment_id) .execution_options(synchronize_session=False) ) if commit: db.session.commit() @classmethod def delete_by_id(cls, report_id: int) -> None: """Hard delete a single report record by its primary key. Args: report_id: Primary key of the report to delete """ db.session.execute( delete(cls) .where(cls.report_payment_group_payment_id == report_id) .execution_options(synchronize_session=False) ) db.session.commit() @property def original_filename(self): """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')