You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

185 lines
8.2 KiB

"""ModelAdmin for Newsletter"""
from HTMLParser import HTMLParseError
from django import forms
from django.db.models import Q
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from emencia.django.newsletter.models import Contact
from emencia.django.newsletter.models import Newsletter
from emencia.django.newsletter.models import Attachment
from emencia.django.newsletter.models import MailingList
from emencia.django.newsletter.mailer import Mailer
from emencia.django.newsletter.settings import USE_TINYMCE
from emencia.django.newsletter.settings import USE_WORKGROUPS
try:
CAN_USE_PREMAILER = True
from emencia.django.newsletter.utils.premailer import Premailer
from emencia.django.newsletter.utils.premailer import PremailerError
except ImportError:
CAN_USE_PREMAILER = False
from emencia.django.newsletter.utils.workgroups import request_workgroups
from emencia.django.newsletter.utils.workgroups import request_workgroups_contacts_pk
from emencia.django.newsletter.utils.workgroups import request_workgroups_newsletters_pk
from emencia.django.newsletter.utils.workgroups import request_workgroups_mailinglists_pk
class AttachmentAdminInline(admin.TabularInline):
model = Attachment
extra = 1
fieldsets = ((None, {'fields': (('title', 'file_attachment'))}),)
class BaseNewsletterAdmin(admin.ModelAdmin):
date_hierarchy = 'creation_date'
list_display = ('title', 'mailing_list', 'server', 'status',
'sending_date', 'creation_date', 'modification_date',
'historic_link', 'statistics_link')
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',)}),
(_('Receivers'), {'fields': ('mailing_list', 'test_contacts',)}),
(_('Sending'), {'fields': ('sending_date', 'status',)}),
(_('Miscellaneous'), {'fields': ('server', 'header_sender',
'header_reply', 'slug'),
'classes': ('collapse',)}),
)
prepopulated_fields = {'slug': ('title',)}
inlines = (AttachmentAdminInline,)
actions = ['send_mail_test', 'make_ready_to_send', 'make_cancel_sending']
actions_on_top = False
actions_on_bottom = True
def get_actions(self, request):
actions = super(BaseNewsletterAdmin, self).get_actions(request)
if not request.user.has_perm('newsletter.can_change_status'):
del actions['make_ready_to_send']
del actions['make_cancel_sending']
return actions
def queryset(self, request):
queryset = super(BaseNewsletterAdmin, self).queryset(request)
if not request.user.is_superuser and USE_WORKGROUPS:
newsletters_pk = request_workgroups_newsletters_pk(request)
queryset = queryset.filter(pk__in=newsletters_pk)
return queryset
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'mailing_list' and \
not request.user.is_superuser and USE_WORKGROUPS:
mailinglists_pk = request_workgroups_mailinglists_pk(request)
kwargs['queryset'] = MailingList.objects.filter(pk__in=mailinglists_pk)
return db_field.formfield(**kwargs)
return super(BaseNewsletterAdmin, self).formfield_for_foreignkey(
db_field, request, **kwargs)
def formfield_for_choice_field(self, db_field, request, **kwargs):
if db_field.name == 'status' and \
not request.user.has_perm('newsletter.can_change_status'):
kwargs['choices'] = ((Newsletter.DRAFT, _('Default')),)
return db_field.formfield(**kwargs)
return super(BaseNewsletterAdmin, self).formfield_for_choice_field(
db_field, request, **kwargs)
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == 'test_contacts':
queryset = Contact.objects.filter(tester=True)
if not request.user.is_superuser and USE_WORKGROUPS:
contacts_pk = request_workgroups_contacts_pk(request)
queryset = queryset.filter(pk__in=contacts_pk)
kwargs['queryset'] = queryset
return super(BaseNewsletterAdmin, self).formfield_for_manytomany(
db_field, request, **kwargs)
def save_model(self, request, newsletter, form, change):
workgroups = []
if not newsletter.pk and not request.user.is_superuser \
and USE_WORKGROUPS:
workgroups = request_workgroups(request)
if newsletter.content.startswith('http://'):
if CAN_USE_PREMAILER:
try:
premailer = Premailer(newsletter.content.strip())
newsletter.content = premailer.transform()
except PremailerError:
self.message_user(request, _('Unable to download HTML, due to errors within.'))
else:
self.message_user(request, _('Please install lxml for parsing an URL.'))
if not request.user.has_perm('newsletter.can_change_status'):
newsletter.status = form.initial.get('status', Newsletter.DRAFT)
newsletter.save()
for workgroup in workgroups:
workgroup.newsletters.add(newsletter)
def historic_link(self, newsletter):
"""Display link for historic"""
if newsletter.contactmailingstatus_set.count():
return u'<a href="%s">%s</a>' % (newsletter.get_historic_url(), _('View historic'))
return _('Not available')
historic_link.allow_tags = True
historic_link.short_description = _('Historic')
def statistics_link(self, newsletter):
"""Display link for statistics"""
if newsletter.status == Newsletter.SENDING or \
newsletter.status == Newsletter.SENT:
return u'<a href="%s">%s</a>' % (newsletter.get_statistics_url(), _('View statistics'))
return _('Not available')
statistics_link.allow_tags = True
statistics_link.short_description = _('Statistics')
def send_mail_test(self, request, queryset):
"""Send newsletter in test"""
for newsletter in queryset:
if newsletter.test_contacts.count():
mailer = Mailer(newsletter, test=True)
try:
mailer.run()
except HTMLParseError:
self.message_user(request, _('Unable send newsletter, due to errors within HTML.'))
continue
self.message_user(request, _('%s succesfully sent.') % newsletter)
else:
self.message_user(request, _('No test contacts assigned for %s.') % newsletter)
send_mail_test.short_description = _('Send test email')
def make_ready_to_send(self, request, queryset):
"""Make newsletter ready to send"""
queryset = queryset.filter(status=Newsletter.DRAFT)
for newsletter in queryset:
newsletter.status = Newsletter.WAITING
newsletter.save()
self.message_user(request, _('%s newletters are ready to send') % queryset.count())
make_ready_to_send.short_description = _('Make ready to send')
def make_cancel_sending(self, request, queryset):
"""Cancel the sending of newsletters"""
queryset = queryset.filter(Q(status=Newsletter.WAITING) |
Q(status=Newsletter.SENDING))
for newsletter in queryset:
newsletter.status = Newsletter.CANCELED
newsletter.save()
self.message_user(request, _('%s newletters are cancelled') % queryset.count())
make_cancel_sending.short_description = _('Cancel the sending')
if USE_TINYMCE:
from tinymce.widgets import TinyMCE
class NewsletterTinyMCEForm(forms.ModelForm):
content = forms.CharField(
widget=TinyMCE(attrs={'cols': 150, 'rows': 80}))
class Meta:
model = Newsletter
class NewsletterAdmin(BaseNewsletterAdmin):
form = NewsletterTinyMCEForm
else:
class NewsletterAdmin(BaseNewsletterAdmin):
pass