2026-05-02 20:14:02 +09:00

81 lines
2.6 KiB
Python

from django import forms
from django.utils.safestring import mark_safe
from .models import ContactFormSubmission, NewsletterTemplate
class NewsletterSubscribeForm(forms.Form):
email = forms.EmailField(max_length=254)
class NewsletterUnsubscribeForm(forms.Form):
email = forms.EmailField(
max_length=254,
required=False,
widget=forms.EmailInput(
attrs={
"readonly": "readonly",
"aria-readonly": "true",
}
),
)
token = forms.CharField(max_length=1024, widget=forms.HiddenInput())
class ContactForm(forms.ModelForm):
class Meta:
model = ContactFormSubmission
fields = ["name", "contact", "email", "category", "message", "source_page"]
widgets = {
"source_page": forms.HiddenInput(),
}
class GrapesJSEditorWidget(forms.Textarea):
class Media:
js = (
"js/newsletter_template_editor.js",
)
css = {
"all": (
"css/newsletter_template_editor.css",
)
}
def render(self, name, value, attrs=None, renderer=None):
attrs = attrs or {}
attrs["data-newsletter-html-input"] = "1"
textarea = super().render(name, value, attrs, renderer)
editor_shell = """
<div class="newsletter-editor-shell">
<div class="help warning">
GrapesJS editor will load from local static assets:
<code>/static/vendor/grapesjs/grapes.min.js</code> and
<code>/static/vendor/grapesjs-preset-newsletter/grapesjs-preset-newsletter.min.js</code>.
If missing, fallback textarea remains available.
</div>
<div class="newsletter-editor-toolbar">
<button type="button" class="button button-small button-secondary" data-newsletter-load-editor>
Load visual editor
</button>
</div>
<div id="newsletter-grapesjs-editor" class="newsletter-grapesjs-editor" hidden></div>
</div>
"""
return mark_safe(f"{editor_shell}{textarea}")
class NewsletterTemplateAdminForm(forms.ModelForm):
class Meta:
model = NewsletterTemplate
fields = ["name", "subject", "template_json", "template_html"]
widgets = {
"template_json": forms.HiddenInput(attrs={"data-newsletter-json-input": "1"}),
"template_html": GrapesJSEditorWidget(
attrs={
"rows": 18,
"placeholder": "Use {{email_body}} as the content placeholder.",
}
),
}