# -*- coding: utf-8 -*- from django.views.generic import CreateView, ListView, UpdateView, DeleteView, FormView 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 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 = ContactSettings 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 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())