from flask import render_template, redirect, url_for, flash from flask_atlas_auth import claims_required, current_user from webargs import fields from webargs.flaskparser import use_kwargs from core_notifications.auth.claims import Role from core_notifications.helpers.ordering import QueryOrdering from core_notifications.helpers.pagination import QueryPagination from core_notifications.models import ( DNAAccount, Image, Template, TemplateVersion, ) from core_notifications.settings import Settings from . import templating from .forms import TemplateForm from .services import ( CreateTemplateService, RenderLiquidService, UpdateTemplateService, SendTestEmailService, EnableDisableTemplateService, ) @templating.route("/templates", methods=["GET"]) @claims_required([Role(Role.Values.admin)]) @use_kwargs( { "page": fields.Int(load_default=1), "per_page": fields.Int(load_default=Settings.ITEMS_PER_PAGE), "order": fields.Str(load_default=""), }, location="query", ) def list_templates(page, per_page, order): ordering = QueryOrdering( Template.query.with_relations(), [ Template.id, Template.name, Template.created_at, Template.updated_at, Template.created_by_name, Template.updated_by_name, ], order, default_is_desc=True, ) pagination = QueryPagination( page=page, per_page=per_page, query=ordering.query ) return render_template( "templating/list_templates.html", templates=pagination.items, ordering=ordering, pagination=pagination, ) @templating.route("/templates/create", methods=["GET", "POST"]) @claims_required([Role(Role.Values.admin)]) def create_template(): form = TemplateForm(email=current_user.email) dna_account = DNAAccount.from_user(current_user) if form.validate_on_submit(): template = CreateTemplateService.execute( dna_account=dna_account, **form.data ) if form.data.get("action") == form.Actions.SEND.name: SendTestEmailService.execute(template, current_user.email) flash("The test email is being sent", "positive") return redirect( url_for(".update_template", template_id=template.id) ) else: return redirect(url_for(".list_templates")) subject_preview = RenderLiquidService.execute( form.data.get("subject"), form.data.get("context"), ) preview = RenderLiquidService.execute( form.data.get("source"), form.data.get("context"), ) return render_template( "templating/edit_template.html", form=form, subject_preview=subject_preview, preview=preview, images=Image.query.desc().all(), ) @templating.route("/templates/", methods=["GET", "POST"]) @claims_required([Role(Role.Values.admin)]) def update_template(template_id): template = Template.query.get_or_404(template_id) dna_account = DNAAccount.from_user(current_user) form = TemplateForm(obj=template, email=current_user.email) if form.validate_on_submit(): UpdateTemplateService.execute( template, dna_account=dna_account, **form.data ) if form.data.get("action") == form.Actions.SEND.name: SendTestEmailService.execute( template, form.data.get("email") or current_user.email ) flash("The test email is being send", "positive") else: return redirect(url_for(".list_templates")) elif form.errors_messages: flash(form.errors_messages, "negative") subject_preview = RenderLiquidService.execute( form.data.get("subject"), form.data.get("context"), ) preview = RenderLiquidService.execute( form.data.get("source"), form.data.get("context"), ) print(form.errors) return render_template( "templating/edit_template.html", form=form, subject_preview=subject_preview, preview=preview, images=Image.query.desc().all(), ) @templating.route("/templates/versions/", methods=["GET"]) @claims_required([Role(Role.Values.admin)]) def template_version(version_id): version = TemplateVersion.query.get_or_404(version_id) return render_template("templating/template_version.html", version=version) @templating.route( "/templates//enable_disable", methods=["POST"] ) @claims_required([Role(Role.Values.admin)]) @use_kwargs( { "is_active": fields.Bool(load_default=False), }, location="form", ) def template_enable_disable(template_id, is_active): dna_account = DNAAccount.from_user(current_user) template = Template.query.get_or_404(template_id) EnableDisableTemplateService.execute( template, is_active=is_active, dna_account=dna_account ) return redirect(url_for("templating.list_templates"))