"""ModelAdmin for MailingList""" from datetime import datetime from django.contrib import admin from django.conf.urls.defaults import url from django.conf.urls.defaults import patterns from django.utils.encoding import smart_str from django.core.urlresolvers import reverse from django.shortcuts import get_object_or_404 from django.utils.translation import ugettext_lazy as _ from django.http import HttpResponseRedirect from emencia.django.newsletter.models import Contact from emencia.django.newsletter.models import MailingList from emencia.django.newsletter.settings import USE_WORKGROUPS 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_mailinglists_pk from emencia.django.newsletter.utils.vcard import vcard_contacts_export_response from emencia.django.newsletter.utils.excel import ExcelResponse class MailingListAdmin(admin.ModelAdmin): date_hierarchy = 'creation_date' list_display = ('creation_date', 'name', 'description', 'subscribers_count', 'unsubscribers_count', 'exportation_links') list_editable = ('name', 'description') list_filter = ('creation_date', 'modification_date') search_fields = ('name', 'description',) filter_horizontal = ['subscribers', 'unsubscribers'] fieldsets = ((None, {'fields': ('name', 'description',)}), (None, {'fields': ('subscribers',)}), (None, {'fields': ('unsubscribers',)}), ) actions = ['merge_mailinglist'] actions_on_top = False actions_on_bottom = True def queryset(self, request): queryset = super(MailingListAdmin, self).queryset(request) if not request.user.is_superuser and USE_WORKGROUPS: mailinglists_pk = request_workgroups_mailinglists_pk(request) queryset = queryset.filter(pk__in=mailinglists_pk) return queryset def save_model(self, request, mailinglist, form, change): workgroups = [] if not mailinglist.pk and not request.user.is_superuser \ and USE_WORKGROUPS: workgroups = request_workgroups(request) mailinglist.save() for workgroup in workgroups: workgroup.mailinglists.add(mailinglist) def formfield_for_manytomany(self, db_field, request, **kwargs): if 'subscribers' in db_field.name and not request.user.is_superuser \ and USE_WORKGROUPS: contacts_pk = request_workgroups_contacts_pk(request) kwargs['queryset'] = Contact.objects.filter(pk__in=contacts_pk) return super(MailingListAdmin, self).formfield_for_manytomany( db_field, request, **kwargs) def merge_mailinglist(self, request, queryset): """Merge multiple mailing list""" if queryset.count() == 1: self.message_user(request, _('Please select a least 2 mailing list.')) return None subscribers = {} unsubscribers = {} for ml in queryset: for contact in ml.subscribers.all(): subscribers[contact] = '' for contact in ml.unsubscribers.all(): unsubscribers[contact] = '' when = str(datetime.now()).split('.')[0] new_mailing = MailingList(name=_('Merging list at %s') % when, description=_('Mailing list created by merging at %s') % when) new_mailing.save() new_mailing.subscribers = subscribers.keys() new_mailing.unsubscribers = unsubscribers.keys() if not request.user.is_superuser and USE_WORKGROUPS: for workgroup in request_workgroups(request): workgroup.mailinglists.add(new_mailing) self.message_user(request, _('%s succesfully created by merging.') % new_mailing) return HttpResponseRedirect(reverse('admin:newsletter_mailinglist_change', args=[new_mailing.pk])) merge_mailinglist.short_description = _('Merge selected mailinglists') def exportation_links(self, mailinglist): """Display links for exportation""" return u'%s / %s' % ( reverse('admin:newsletter_mailinglist_export_excel', args=[mailinglist.pk]), _('Excel'), reverse('admin:newsletter_mailinglist_export_vcard', args=[mailinglist.pk]), _('VCard')) exportation_links.allow_tags = True exportation_links.short_description = _('Export') def exportion_vcard(self, request, mailinglist_id): """Export subscribers in the mailing in VCard""" mailinglist = get_object_or_404(MailingList, pk=mailinglist_id) name = 'contacts_%s' % smart_str(mailinglist.name) return vcard_contacts_export_response(mailinglist.subscribers.all(), name) def exportion_excel(self, request, mailinglist_id): """Export subscribers in the mailing in Excel""" mailinglist = get_object_or_404(MailingList, pk=mailinglist_id) name = 'contacts_%s' % smart_str(mailinglist.name) return ExcelResponse(mailinglist.subscribers.all(), name) def get_urls(self): urls = super(MailingListAdmin, self).get_urls() my_urls = patterns('', url(r'^export/vcard/(?P\d+)/$', self.admin_site.admin_view(self.exportion_vcard), name='newsletter_mailinglist_export_vcard'), url(r'^export/excel/(?P\d+)/$', self.admin_site.admin_view(self.exportion_excel), name='newsletter_mailinglist_export_excel')) return my_urls + urls