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

Blacklists support #115

Open
wants to merge 7 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
152 changes: 150 additions & 2 deletions newsletter/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,16 @@
from sorl.thumbnail.admin import AdminImageMixin

from .models import (
Newsletter, Subscription, Article, Message, Submission
Newsletter, Subscription, Article, Message, Submission, Blacklist
)

from django.utils.timezone import now

from copy import deepcopy
from random import randint

from .admin_forms import *
from .admin_blacklist_forms import *
from .admin_utils import *

from .settings import newsletter_settings
Expand Down Expand Up @@ -218,6 +222,8 @@ class MessageAdmin(admin.ModelAdmin, ExtendibleModelAdminMixin):

inlines = [ArticleInline, ]

actions = ['duplicate_message']

""" List extensions """
def admin_title(self, obj):
return '<a href="%d/">%s</a>' % (obj.id, obj.title)
Expand All @@ -244,6 +250,29 @@ def preview(self, request, object_id):
RequestContext(request, {}),
)

""" Actions """
def duplicate_message(modeladmin, request, queryset):
title_suffix = " (Copy)"
slug_suffix = "-" + str(randint(1000, 99999))

original_message_id = None
new_message_id = None
for message in queryset:
new_message = deepcopy(message)
original_message_id = new_message.id
new_message.id = None
new_message.slug = new_message.slug + slug_suffix
new_message.title = new_message.title + title_suffix
new_message.save()
new_message_id = new_message.id
# Duplicate the articles as well
for article in Article.objects.filter(post_id=original_message_id):
new_article = deepcopy(article)
new_article.id = None
new_article.post_id = new_message_id
new_article.save()
duplicate_message.short_description = "Duplicate selected messages"

@xframe_options_sameorigin
def preview_html(self, request, object_id):
message = self._getobj(request, object_id)
Expand Down Expand Up @@ -432,7 +461,7 @@ def subscribers_import(self, request):

def subscribers_import_confirm(self, request):
# If no addresses are in the session, start all over.
if not 'addresses' in request.session:
if 'addresses' not in request.session:
return HttpResponseRedirect('../')

addresses = request.session['addresses']
Expand Down Expand Up @@ -486,7 +515,126 @@ def get_urls(self):
return my_urls + urls


class BlacklistAdmin(admin.ModelAdmin, ExtendibleModelAdminMixin):
form = BlacklistAdminForm
list_display = ('name', 'email', 'newsletter_name')
list_display_links = ('name', 'email')
list_filter = ()
search_fields = (
'name_field', 'email_field', 'user__first_name', 'user__last_name',
'user__email'
)
readonly_fields = ()
date_hierarchy = ''
actions = []

""" List extensions """
def newsletter_name(self, obj):
if obj.newsletter is None:
return "Global Blacklist"
else:
return obj.newsletter

""" Views """
def blacklist_import(self, request):
if request.POST:
form = BlacklistImportForm(request.POST, request.FILES)
form.importing_blacklist = True
if form.is_valid():
request.session['addresses'] = form.get_addresses()
if form.get_newsletter():
request.session['newsletter'] = form.get_newsletter()
else:
request.session['newsletter'] = 0
return HttpResponseRedirect('confirm/')
else:
form = ImportForm()

return render_to_response(
"admin/newsletter/blacklist/importform.html",
{'form': form},
RequestContext(request, {}),
)

def blacklist_import_confirm(self, request):
# If no addresses are in the session, start all over.
if 'addresses' not in request.session:
return HttpResponseRedirect('../')

addresses = request.session['addresses']
newsletter = request.session['newsletter']
logger.debug('Confirming addresses: %s', addresses)
if request.POST:
form = ConfirmForm(request.POST)
if form.is_valid():
try:
for email_address in addresses.keys():
new_blacklist = Blacklist(
email_field=email_address,
name=addresses[email_address])
# 0 means no newsletter is selected,
# which means this user is going into the
# Global Blacklist
if newsletter != 0:
new_blacklist.newsletter_id = newsletter
new_blacklist.save()
finally:
del request.session['addresses']
del request.session['newsletter']

messages.success(
request,
_('%s blacklist have been successfully added.') %
len(addresses)
)

return HttpResponseRedirect('../../')
else:
form = ConfirmForm()

newsletter_name = _("the Global Blacklist")
if newsletter != 0:
try:
newsletter_name = Newsletter.objects.get(pk=newsletter).title
except Newsletter.DoesNotExist:
pass

return render_to_response(
"admin/newsletter/blacklist/confirmimportform.html",
{
'form': form,
'blacklist_people': addresses,
'newsletter_name': newsletter_name
},
RequestContext(request, {}),
)

""" URLs """
def get_urls(self):
urls = super(BlacklistAdmin, self).get_urls()

my_urls = patterns(
'',
url(r'^import/$',
self._wrap(self.blacklist_import),
name=self._view_name('import')),
url(r'^import/confirm/$',
self._wrap(self.blacklist_import_confirm),
name=self._view_name('import_confirm')),

# Translated JS strings - these should be app-wide but are
# only used in this part of the admin. For now, leave them here.
url(r'^jsi18n/$',
'django.views.i18n.javascript_catalog',
{'packages': ('newsletter',)},
name='newsletter_js18n')
)

return my_urls + urls


admin.site.register(Newsletter, NewsletterAdmin)
admin.site.register(Submission, SubmissionAdmin)
admin.site.register(Message, MessageAdmin)
admin.site.register(Subscription, SubscriptionAdmin)
admin.site.register(Blacklist, BlacklistAdmin)
Loading