# -*- coding: utf-8 -*- from django.views.generic import CreateView, ListView, UpdateView, DeleteView, FormView, DetailView from django.conf import settings from django.utils import translation from django.utils.translation import ugettext_lazy as _ from django.forms.formsets import formset_factory from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import get_object_or_404 from django.core.urlresolvers import reverse_lazy from HTMLParser import HTMLParseError from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment, ContactMailingStatus from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm, AttachmentForm from emencia.django.newsletter.mailer import Mailer from ..forms import ContactFilterForm, ContactImportForm from ..utils.excel import ExcelResponse from functions.admin_views import paginate_results class ContactList(FormView): paginate_by = settings.ADMIN_PAGINATION model = Contact template_name = 'admin/newsletters/contact_list.html' form_class = ContactFilterForm queryset = Contact.objects.all() def get_form(self, form_class): if self.request.GET: return form_class(self.request.GET) else: return form_class(**self.get_form_kwargs()) def get(self, request, *args, **kwargs): if request.GET: form_class = self.get_form_class() form = self.get_form(form_class) if form.is_valid(): return self.form_valid(form) else: return self.form_invalid(form) else: return super(ContactList, self).get(request, *args, **kwargs) def form_valid(self, form): qs, _ = form.filter() result = paginate_results(qs, page=self.request.GET.get('page')) context = self.get_context_data(form=form) context.update({'object_list': result}) return self.render_to_response(context) def get_context_data(self, **kwargs): context = super(ContactList, self).get_context_data(**kwargs) qs = self.model.objects.all() result = paginate_results(qs, page=self.request.GET.get('page')) context['object_list'] = result return context class DeleteContact(DeleteView): model = Contact success_url = reverse_lazy('newsletters_contact_list') template_name = 'admin/newsletters/confirm_delete.html' class UpdateContact(UpdateView): model = ContactSettings form_class = ContactSettingsForm template_name = 'admin/newsletters/contact.html' success_url = '/admin/newsletters/contact/all/' def form_valid(self, form): self.object = form.save() self.object.theme = form.cleaned_data['theme'] self.object.country = form.cleaned_data['country'] self.object.area = form.cleaned_data['area'] self.object.city = form.cleaned_data['city'] self.object.save() return HttpResponseRedirect(self.get_success_url()) def get_initial(self): lang = translation.get_language() obj = self.object.contact data = self.initial.copy() city = ','.join(['%s:%s'%(item.id, item.name) for item in self.object.city.filter(translations__language_code=lang)]) data.update({'first_name': obj.first_name, 'subscriber': obj.subscriber, 'valid': obj.valid, 'tester': obj.tester, 'city':city}) return data class MailingListView(ListView): paginate_by = settings.ADMIN_PAGINATION model = MailingList template_name = 'admin/newsletters/mailing_list.html' class DeleteMailingList(DeleteView): model = MailingList template_name = 'admin/newsletters/confirm_delete.html' success_url = reverse_lazy('newsletters_mailinglist') class UpdateMailingList(UpdateView): model = MailingList form_class = MailingListForm template_name = 'admin/newsletters/mailing_list_object.html' success_url = '/admin/newsletters/mailinglist/all/' def get_success_url(self): return self.success_url class CreateMailingList(CreateView): model = MailingList form_class = MailingListForm template_name = 'admin/newsletters/mailing_list_object.html' success_url = '/admin/newsletters/mailinglist/all/' def form_valid(self, form): obj = form.save() filter_form = ContactFilterForm(self.request.GET) if filter_form.is_valid(): contacts, _ = filter_form.filter() obj.subscribers = contacts obj.save() return HttpResponseRedirect(self.success_url) from django.forms.models import modelformset_factory class NewsletterCreate(CreateView): model = Newsletter form_class = NewsletterForm template_name = 'admin/newsletters/newsletter_object.html' success_url = '/admin/newsletters/newsletters/all/' def get_formset(self): AttachmentFormSet = formset_factory(AttachmentForm) if self.request.POST: return AttachmentFormSet(self.request.POST, self.request.FILES) else: return AttachmentFormSet() def get_context_data(self, **kwargs): context = super(NewsletterCreate, self).get_context_data(**kwargs) context['attachment_formset'] = self.get_formset() return context def form_valid(self, form): self.object = form.save() self.object.test_contacts = form.cleaned_data['test_contacts'] formset = self.get_formset() if formset.is_valid(): for item in formset.forms: if item.is_valid() and item.has_changed(): instance = item.save(commit=False) instance.newsletter = self.object instance.save() return HttpResponseRedirect(self.success_url) class NewsletterUpdate(UpdateView): model = Newsletter form_class = NewsletterForm template_name = 'admin/newsletters/newsletter_object.html' success_url = '/admin/newsletters/newsletters/all/' def get_formset(self): if self.request.POST: AttachmentFormSet = modelformset_factory(Attachment, form=AttachmentForm, exclude=('newsletter',)) else: AttachmentFormSet = modelformset_factory(Attachment, form=AttachmentForm, exclude=('newsletter',)) if self.request.POST: return AttachmentFormSet(self.request.POST, self.request.FILES, queryset=self.object.attachment_set.all()) else: return AttachmentFormSet(queryset=self.object.attachment_set.all()) def get_context_data(self, **kwargs): context = super(NewsletterUpdate, self).get_context_data(**kwargs) context['attachment_formset'] = self.get_formset() return context def form_valid(self, form): self.object = form.save() self.object.test_contacts = form.cleaned_data['test_contacts'] formset = self.get_formset() if formset.is_valid(): for item in formset.forms: if item.is_valid() and item.has_changed(): instance = item.save(commit=False) instance.newsletter = self.object instance.save() return HttpResponseRedirect(self.success_url) class NewsletterListView(ListView): paginate_by = settings.ADMIN_PAGINATION model = Newsletter template_name = 'admin/newsletters/newsletter_list.html' success_url = '/admin/newsletters/newsletters/all/' def send_test_newsletter(request, pk): newsletter = get_object_or_404(Newsletter, pk=pk) if newsletter.test_contacts.count(): mailer = Mailer(newsletter, test=True) try: mailer.run() except HTMLParseError: return HttpResponse(_('Unable send newsletter, due to errors within HTML.')) else: return HttpResponse(u'Нет тестовых контактов') redirect = request.META.get('HTTP_REFERER', '/admin/newsletter/newsletter/all/') return HttpResponseRedirect(redirect) class NewsletterHistory(ListView): model = ContactMailingStatus template_name = 'admin/newsletters/newsletter_history.html' paginate_by = 50 def get_queryset(self): self.newsletter = get_object_or_404(Newsletter, pk=self.kwargs['pk']) qs = self.newsletter.contactmailingstatus_set.select_related('contact', 'link').all() if self.request.GET.get('filter'): qs = qs.filter(status=self.request.GET['filter']) return qs def get_context_data(self, **kwargs): context = super(NewsletterHistory, self).get_context_data(**kwargs) context['newsletter'] = self.newsletter context['choices'] = ContactMailingStatus.STATUS_CHOICES return context class NewsletterStatistics(DetailView): model = Newsletter template_name = 'admin/newsletters/newsletter_stat.html' def get_context_data(self, **kwargs): context = super(NewsletterStatistics, self).get_context_data(**kwargs) sent = self.object.contactmailingstatus_set.filter(status=ContactMailingStatus.SENT).count() errors = self.object.contactmailingstatus_set.filter(status=ContactMailingStatus.ERROR).count() opened = self.object.contactmailingstatus_set.filter(status=ContactMailingStatus.OPENED).count() unsubscribed = self.object.contactmailingstatus_set.filter(status=ContactMailingStatus.UNSUBSCRIPTION).count() no_data = self.object.contactmailingstatus_set.filter(status=ContactMailingStatus.ANNOUNCE_NO_DATA).count() links = self.object.contactmailingstatus_set.filter(status=ContactMailingStatus.LINK_OPENED).count() CMS = ContactMailingStatus opened_percent = 0 if opened or sent == 0 else (float(opened)/sent)*100 unsub_percent = 0 if unsubscribed or sent == 0 else (float(unsubscribed)/sent)*100 stat = { 'sent':{'data':sent, 'filter':""}, 'errors':{ 'data':errors, 'filter':CMS.ERROR}, 'opened':{'data': opened, 'filter': CMS.OPENED, 'percent': opened_percent}, 'unsub':{'data': unsubscribed, 'filter': CMS.UNSUBSCRIPTION, 'percent': unsub_percent}, 'no_data':{'data': no_data, 'filter': CMS.ANNOUNCE_NO_DATA}, 'links':{'data': links, 'filter': CMS.LINK_OPENED}} context.update({'stat': stat}) return context class ExportContacts(FormView): form_class = ContactFilterForm def get(self, request=None, *args, **kwargs): form = self.form_class(request.GET) if form.is_valid(): qs, title = form.filter() if qs.count(): columns = ('email', 'first_name') return ExcelResponse(qs, title, columns,'contacts') return HttpResponseRedirect(self.request.META['HTTP_REFERER']) class ImportContacts(FormView): form_class = ContactImportForm success_url = reverse_lazy("newsletters_contact_list") template_name = 'admin/import templates/import_contacts.html' def form_valid(self, form): form.save() return HttpResponseRedirect(self.get_success_url())