diff --git a/app/admin_model.py b/app/admin_model.py index 4f7e6d0c..36c69c77 100644 --- a/app/admin_model.py +++ b/app/admin_model.py @@ -611,6 +611,26 @@ class NewsletterAdmin(SLModelView): else: flash(error_msg, "error") + @action( + "clone_newsletter", + "Clone this newsletter", + ) + def clone_newsletter(self, newsletter_ids): + if len(newsletter_ids) != 1: + flash("you can only select 1 newsletter", "error") + return + + newsletter_id = newsletter_ids[0] + newsletter: Newsletter = Newsletter.get(newsletter_id) + new_newsletter = Newsletter.create( + subject=newsletter.subject, + html=newsletter.html, + plain_text=newsletter.plain_text, + commit=True, + ) + + flash(f"Newsletter {new_newsletter.subject} has been cloned", "success") + class NewsletterUserAdmin(SLModelView): column_searchable_list = ["id"] diff --git a/app/models.py b/app/models.py index 92936179..69f825e3 100644 --- a/app/models.py +++ b/app/models.py @@ -3517,7 +3517,7 @@ class PartnerSubscription(Base, ModelMixin): class Newsletter(Base, ModelMixin): __tablename__ = "newsletter" - subject = sa.Column(sa.String(), nullable=False, unique=True, index=True) + subject = sa.Column(sa.String(), nullable=False, index=True) html = sa.Column(sa.Text) plain_text = sa.Column(sa.Text) diff --git a/migrations/versions/2023_110714_4bc54632d9aa_.py b/migrations/versions/2023_110714_4bc54632d9aa_.py new file mode 100644 index 00000000..874b4941 --- /dev/null +++ b/migrations/versions/2023_110714_4bc54632d9aa_.py @@ -0,0 +1,31 @@ +"""empty message + +Revision ID: 4bc54632d9aa +Revises: 46ecb648a47e +Create Date: 2023-11-07 14:02:17.610226 + +""" +import sqlalchemy_utils +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '4bc54632d9aa' +down_revision = '46ecb648a47e' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index('ix_newsletter_subject', table_name='newsletter') + op.create_index(op.f('ix_newsletter_subject'), 'newsletter', ['subject'], unique=False) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_newsletter_subject'), table_name='newsletter') + op.create_index('ix_newsletter_subject', 'newsletter', ['subject'], unique=True) + # ### end Alembic commands ### diff --git a/static/images/coupon.png b/static/images/coupon.png index c7cccbfc..99f21aab 100644 Binary files a/static/images/coupon.png and b/static/images/coupon.png differ