maccesch / cmsplugin-contact

Extendable contact plugin for django-cms with spam protection and i18n
BSD 2-Clause "Simplified" License
71 stars 62 forks source link

Can't subclass models.Contact #15

Closed dsh2dsh closed 13 years ago

dsh2dsh commented 13 years ago

Hello!

Could you change models.py a little and convert Contact class into abstract class? Something like

class BaseContact(CMSPlugin):
    class Meta:
        abstract = True

    # all fields here

class Contact(BaseContact):
    pass

I'd like to add more fields into my contact form, but I can't subclass non abstract model. Django CMS doesn't allow it. After that change I could subclass BaseContact and add more fileds into my new subclassed model.

Also, it would be nice to change cms_plugin.ContactPlugin for easier subclassing. May be something like

class ContactPlugin(CMSPluginBase):
    contact_form = ContactForm
    email_template = "cmsplugin_contact/email.txt"

    def create_form(self, instance, request):
        if instance.get_spam_protection_method_display() == 'Akismet':
            AkismetContactForm.aksimet_api_key = instance.akismet_api_key
            class ContactForm(self.contact_form, AkismetContactForm):
                pass
            FormClass = ContactForm
        elif instance.get_spam_protection_method_display() == 'ReCAPTCHA':
            RecaptchaContactForm.recaptcha_public_key = getattr(
                settings, "RECAPTCHA_PUBLIC_KEY",
                instance.recaptcha_public_key)
            RecaptchaContactForm.recaptcha_private_key = getattr(
                settings, "RECAPTCHA_PRIVATE_KEY",
                instance.recaptcha_private_key)
            RecaptchaContactForm.recaptcha_theme = instance.recaptcha_theme
            class ContactForm(self.contact_form, RecaptchaContactForm):
                pass
            FormClass = ContactForm
        else:
            class ContactForm(self.contact_form, HoneyPotContactForm):
                pass
            FormClass = ContactForm

        if request.method == "POST":
            return FormClass(request, data=request.POST)
        else:
            return FormClass(request)

    def send(self, form, site_email):
        subject = form.cleaned_data['subject']
        if not subject:
            subject = _('No subject')
        email_message = EmailMessage(
            render_to_string("cmsplugin_contact/subject.txt", {
                'subject': subject,
            }),
            render_to_string(self.email_template, {
                'data': form.cleaned_data,
            }),
            form.cleaned_data['email'],
            [site_email],
            headers = {
                'Reply-To': form.cleaned_data['email']
            },)
        email_message.send(fail_silently=True)

In this case anyone can subclass ContactPlugin and override model, form, contact_form and email_template properties without copying some code from ContactPlugin.

Thank you!

dsh2dsh commented 13 years ago

Could you take a look into

https://github.com/dsh2dsh/cmsplugin-contact

I've added some code for easier subclassing cmsplugin_contact.

Thanks!

mitar commented 13 years ago

Can you make a pull request with those changes?

dsh2dsh commented 13 years ago

Done, I've make the request.

maccesch commented 13 years ago

Thanks!