diff --git a/app/dao/template_email_files_dao.py b/app/dao/template_email_files_dao.py index 8a70726ded..f83bfa5f92 100644 --- a/app/dao/template_email_files_dao.py +++ b/app/dao/template_email_files_dao.py @@ -21,24 +21,39 @@ def dao_create_template_email_file(template_email_file: TemplateEmailFile): @autocommit -def dao_get_template_email_files_by_template_id(template_id, template_version=None): +def dao_get_template_email_files_by_template_id(template_id, template_version=None, get_pending=False): if template_version: - query = ( - select(TemplateEmailFileHistory) - .where(TemplateEmailFileHistory.template_id == template_id) - .where(TemplateEmailFileHistory.template_version <= template_version) - # .where(TemplateEmailFileHistory.archived_at.is_(None)) - .order_by(TemplateEmailFileHistory.id) - .order_by(TemplateEmailFileHistory.version.desc()) - .distinct(TemplateEmailFileHistory.id) - ) + if get_pending: + query = ( + select(TemplateEmailFileHistory) + .where(TemplateEmailFileHistory.template_id == template_id) + .where(TemplateEmailFileHistory.template_version <= template_version) + .order_by(TemplateEmailFileHistory.id) + .order_by(TemplateEmailFileHistory.version.desc()) + .distinct(TemplateEmailFileHistory.id) + ) + else: + query = ( + select(TemplateEmailFileHistory) + .where(TemplateEmailFileHistory.template_id == template_id) + .where(TemplateEmailFileHistory.template_version <= template_version) + .where(TemplateEmailFileHistory.pending.is_(False)) + .order_by(TemplateEmailFileHistory.id) + .order_by(TemplateEmailFileHistory.version.desc()) + .distinct(TemplateEmailFileHistory.id) + ) # prune archived after the fact # return db.session.execute(query).all() return list(filter(lambda x: not x.archived_at, list(chain.from_iterable(db.session.execute(query).all())))) + if get_pending: + return TemplateEmailFile.query.filter( + TemplateEmailFile.template_id == template_id, TemplateEmailFile.archived_at.is_(None) + ).all() return TemplateEmailFile.query.filter( TemplateEmailFile.template_id == template_id, TemplateEmailFile.archived_at.is_(None), + TemplateEmailFile.pending == False, ).all() diff --git a/app/models.py b/app/models.py index 407d3952ce..d8aea10b79 100644 --- a/app/models.py +++ b/app/models.py @@ -1301,6 +1301,7 @@ class TemplateEmailFileBase(db.Model): created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow) updated_at = db.Column(db.DateTime, nullable=True, onupdate=datetime.datetime.utcnow) archived_at = db.Column(db.DateTime, nullable=True) + pending = db.Column(db.Boolean, default=False, nullable=True) def serialize(self) -> SerializedTemplateEmailFile: return SerializedTemplateEmailFile( @@ -1309,6 +1310,7 @@ def serialize(self) -> SerializedTemplateEmailFile: link_text=self.link_text, retention_period=self.retention_period, validate_users_email=self.validate_users_email, + pending=self.pending, ) @declared_attr diff --git a/app/models_types.py b/app/models_types.py index 270d10a5fb..c81a43a8df 100644 --- a/app/models_types.py +++ b/app/models_types.py @@ -359,3 +359,4 @@ class SerializedTemplateEmailFile(TypedDict): link_text: str retention_period: int validate_users_email: bool + pending: bool diff --git a/migrations/.current-alembic-head b/migrations/.current-alembic-head index 0a7343dac7..c0886edf40 100644 --- a/migrations/.current-alembic-head +++ b/migrations/.current-alembic-head @@ -1 +1 @@ -0544_email_file_retention_fix +0545_add_pending_column diff --git a/migrations/versions/0545_add_pending_column.py b/migrations/versions/0545_add_pending_column.py new file mode 100644 index 0000000000..e891947e28 --- /dev/null +++ b/migrations/versions/0545_add_pending_column.py @@ -0,0 +1,44 @@ +""" + +Create Date: 2025-02-10 17:07:41.828494 +Revision ID: 0544_email_file_retention_fix +Revises: 0543_letter_rates_from_5_01_26 + +""" + +revision = "0545_add_pending_column" +down_revision = "0544_email_file_retention_fix" + + +from alembic import op +from sqlalchemy import text + + +def upgrade(): + conn = op.get_bind() + conn.execute(text("ALTER TABLE template_email_files ADD COLUMN pending boolean")) + conn.execute(text("ALTER TABLE template_email_files_history ADD COLUMN pending boolean")) + conn.execute(text(""" + ALTER TABLE + template_email_files + ALTER COLUMN + pending + SET DEFAULT + false + """)) + conn.execute(text(""" + ALTER TABLE + template_email_files_history + ALTER COLUMN + pending + SET DEFAULT + false + """)) + conn.execute(text("UPDATE template_email_files SET pending = false")) + conn.execute(text("UPDATE template_email_files_history SET pending = false")) + + +def downgrade(): + conn = op.get_bind() + conn.execute(text("ALTER TABLE template_email_files DROP COLUMN pending")) + conn.execute(text("ALTER TABLE template_email_files_history DROP COLUMN pending")) diff --git a/tests/app/db.py b/tests/app/db.py index 90407d4731..7327377f43 100644 --- a/tests/app/db.py +++ b/tests/app/db.py @@ -199,6 +199,7 @@ def create_template_email_file( link_text="follow this link", retention_period=90, validate_users_email=True, + pending=False, ): data = { "filename": filename, @@ -207,6 +208,7 @@ def create_template_email_file( "validate_users_email": validate_users_email, "template_id": template_id, "created_by_id": created_by_id, + "pending": pending, } template_email_file = TemplateEmailFile(**data) dao_create_template_email_file(template_email_file)