Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Amazon SES integration + HTML escaping issues fixed #57

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions emencia/django/newsletter/admin/newsletter.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""ModelAdmin for Newsletter"""
from HTMLParser import HTMLParseError

from django.conf import settings
from django import forms
from django.db.models import Q
from django.contrib import admin
Expand All @@ -13,6 +14,9 @@
from emencia.django.newsletter.mailer import Mailer
from emencia.django.newsletter.settings import USE_TINYMCE
from emencia.django.newsletter.settings import USE_WORKGROUPS

CAN_USE_CMS = "emencia.django.newsletter.cmsplugin_newsletter" in settings.INSTALLED_APPS

try:
CAN_USE_PREMAILER = True
from emencia.django.newsletter.utils.premailer import Premailer
Expand All @@ -39,7 +43,7 @@ class BaseNewsletterAdmin(admin.ModelAdmin):
list_filter = ('status', 'sending_date', 'creation_date', 'modification_date')
search_fields = ('title', 'content', 'header_sender', 'header_reply')
filter_horizontal = ['test_contacts']
fieldsets = ((None, {'fields': ('title', 'content',)}),
fieldsets = ((None, {'fields': ('title', 'content')}),
(_('Receivers'), {'fields': ('mailing_list', 'test_contacts',)}),
(_('Sending'), {'fields': ('sending_date', 'status',)}),
(_('Miscellaneous'), {'fields': ('server', 'header_sender',
Expand Down Expand Up @@ -167,8 +171,13 @@ def make_cancel_sending(self, request, queryset):
self.message_user(request, _('%s newletters are cancelled') % queryset.count())
make_cancel_sending.short_description = _('Cancel the sending')

if CAN_USE_CMS:
from emencia.django.newsletter.cmsplugin_newsletter import forms as cms_forms

class NewsletterAdmin(BaseNewsletterAdmin):
form = cms_forms.NewsletterCMSForm

if USE_TINYMCE:
elif USE_TINYMCE:
from tinymce.widgets import TinyMCE

class NewsletterTinyMCEForm(forms.ModelForm):
Expand All @@ -182,4 +191,4 @@ class NewsletterAdmin(BaseNewsletterAdmin):
form = NewsletterTinyMCEForm
else:
class NewsletterAdmin(BaseNewsletterAdmin):
pass
pass
64 changes: 64 additions & 0 deletions emencia/django/newsletter/cmsplugin_newsletter/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import re

from django.conf import settings
from django import forms
from django.forms.widgets import Select, MultiWidget
from django.utils import translation

import cms.forms.fields

from emencia.django.newsletter.models import Newsletter

class PageSelectWidget(MultiWidget):
"""A widget that allows selecting a page by first selecting a site and then
a page on that site in a two step process.
"""
orig_url = re.compile(r"<!--CMS Origin URL: http://.*/\?site=(\d+)&page=(\d+)&lang=(\w+)-->", flags=re.MULTILINE)

def __init__(self, attrs=None):

widgets = (Select(choices=settings.LANGUAGES),
cms.forms.widgets.PageSelectWidget()
)

super(PageSelectWidget, self).__init__(widgets, attrs)

def decompress(self, value):
'''parses the content of HTML and if finds origin URL, then decomposes it into the
dropdown settings. The format of HTML comment:
<!--CMS Origin URL: http://<site_domain_name>/<page_absolute_url>/?site=<site_pk>&page=<page_pk>&lang=<lang>-->
'''

res=[translation.get_language(), []]
if value:
m = self.orig_url.search(value)

if m.groups():
res = [m.group(3), [m.group(1),m.group(2),m.group(2)] ]

return res

class CMSPageField(forms.fields.MultiValueField):
widget = PageSelectWidget

def __init__(self, required=True, widget=None, label=None, initial=None,
help_text=None):
fields = (forms.fields.ChoiceField(choices=settings.LANGUAGES),
cms.forms.fields.PageSelectFormField(None)
)
super(CMSPageField, self).__init__(fields=fields, widget=widget,
label=label, initial=initial, help_text=help_text)

def compress(self, data_list):

lang, page = data_list
url = page.get_absolute_url(language=lang)
url = "http://%s/%s%s?site=%s&page=%s&lang=%s" % (page.site.domain, lang, url, page.site.pk, page.pk, lang)

return url

class NewsletterCMSForm(forms.ModelForm):
content = CMSPageField()

class Meta:
model = Newsletter
15 changes: 10 additions & 5 deletions emencia/django/newsletter/models.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""Models for emencia.django.newsletter"""
from smtplib import SMTP
from smtplib import SMTP, SMTP_SSL
from smtplib import SMTPHeloError
from datetime import datetime
from datetime import timedelta
Expand Down Expand Up @@ -52,11 +52,16 @@ class SMTPServer(models.Model):

def connect(self):
"""Connect the SMTP Server"""
smtp = SMTP(smart_str(self.host), int(self.port))
smtp.ehlo_or_helo_if_needed()
if self.tls:
smtp.starttls()
if self.port == 465:
smtp = SMTP_SSL(smart_str(self.host), int(self.port))
else:
smtp = SMTP(smart_str(self.host), int(self.port))
smtp.ehlo_or_helo_if_needed()

if self.tls:
smtp.starttls()

smtp.ehlo_or_helo_if_needed()

if self.user or self.password:
smtp.login(smart_str(self.user), smart_str(self.password))
Expand Down
5 changes: 3 additions & 2 deletions emencia/django/newsletter/utils/newsletter.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ def body_insertion(content, insertion, end=False):
if not content.startswith('<body'):
content = '<body>%s</body>' % content
soup = BeautifulSoup(content)
soup_ins = BeautifulSoup(insertion)

if end:
soup.body.append(insertion)
soup.body.append(soup_ins)
else:
soup.body.insert(0, insertion)
soup.body.insert(0, soup_ins)

if USE_PRETTIFY:
return soup.prettify()
Expand Down
2 changes: 2 additions & 0 deletions emencia/django/newsletter/utils/premailer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from urllib2 import urlopen
from lxml.html import parse
from lxml.html import tostring
from lxml import etree


_css_comments = re.compile(r'/\*.*?\*/', re.MULTILINE | re.DOTALL)
Expand Down Expand Up @@ -82,6 +83,7 @@ def __init__(self, url, include_star_selectors=False):
self.url = url
try:
self.page = parse(self.url).getroot()
self.page.body.append(etree.Comment('CMS Origin URL: %s' % url))
except:
raise PremailerError('Could not parse the html')

Expand Down