# -*- coding: utf-8 -*- """Views for emencia.django.newsletter Mailing List""" from datetime import datetime, timedelta from django.template import RequestContext from django.shortcuts import get_object_or_404 from django.shortcuts import render_to_response from django.contrib import messages from django.http import HttpResponseRedirect from django.views.generic import DetailView, TemplateView, RedirectView, FormView from django.core.urlresolvers import reverse_lazy from django.contrib import messages from django.utils.translation import ugettext as _ from django.forms.formsets import formset_factory from emencia.django.newsletter.mailer import Mailer from emencia.django.newsletter.utils.tokens import untokenize from emencia.django.newsletter.models import Newsletter, MailingList, ContactMailingStatus, Contact, ContactSettings from emencia.django.newsletter.forms import SubscribeSettingsForm, SendtoFriendForm def view_mailinglist_unsubscribe(request, slug, uidb36, token): """hard Unsubscribe a contact to a mailing list""" newsletter = get_object_or_404(Newsletter, slug=slug) contact = untokenize(uidb36, token) already_unsubscribed = contact in newsletter.mailing_list.unsubscribers.all() if not already_unsubscribed: newsletter.mailing_list.unsubscribers.add(contact) newsletter.mailing_list.save() already_unsubscribed = True params = dict(newsletter=newsletter, contact=contact, status=ContactMailingStatus.UNSUBSCRIPTION) if newsletter.ab_testing: try: ab_state = ContactMailingStatus.objects.filter( newsletter=newsletter, contact=contact, status__in=(ContactMailingStatus.SENT_TEST, ContactMailingStatus.SENT), ).order_by('-creation_date')[0].ab params.update({'ab': ab_state}) except: pass ContactMailingStatus.objects.create(**params) return HttpResponseRedirect(reverse_lazy('newsletter_mailinglist_unsubscribe_success')) def view_mailinglist_subscribe(request, form_class, mailing_list_id=None): """ A simple view that shows a form for subscription for a mailing list(s). """ subscribed = False mailing_list = None if mailing_list_id: mailing_list = get_object_or_404(MailingList, id=mailing_list_id) if request.POST and not subscribed: form = form_class(request.POST) if form.is_valid(): form.save(mailing_list) subscribed = True else: form = form_class() return render_to_response('newsletter/mailing_list_subscribe.html', {'subscribed': subscribed, 'mailing_list': mailing_list, 'form': form}, context_instance=RequestContext(request)) class UnsubscribeView(DetailView): model = Newsletter template_name = 'client/newsletters/unsubscribe_form.html' def get_object(self, queryset=None): return get_object_or_404(Newsletter, slug=self.kwargs.get('slug')) def get_announce_form(self): contact = untokenize(self.kwargs.get('uidb36'), self.kwargs.get('token')) self.contact= contact setting = contact.contactsettings initial = {'email': contact.email} initial['city'] = ','.join(['%s:%s'%(item.id, item.name) for item in set(setting.city.all())]) if setting.exponent_practicum or setting.organiser_practicum or setting.theme.exists(): initial['get_announce'] = True # north america check if setting.area.filter(id=SubscribeSettingsForm.NA_ID).exists(): initial['na_expo'] = True # asia check if setting.area.filter(id=SubscribeSettingsForm.ASIA_ID).exists(): initial['asia_expo'] = True # europe check if setting.area.filter(id=SubscribeSettingsForm.EUROPE_ID).exists(): initial['europe_expo'] = True form = SubscribeSettingsForm(instance=setting, initial=initial, contact=contact) return form def get_context_data(self, **kwargs): context = super(UnsubscribeView, self).get_context_data(**kwargs) context['subscribe'] = self.get_announce_form() # params = dict(newsletter=self.object, contact=self.contact, status=ContactMailingStatus.UNSUBSCRIPTION) if self.object.ab_testing: try: ab_state = ContactMailingStatus.objects.filter( newsletter=self.object, contact=self.contact, status__in=(ContactMailingStatus.SENT_TEST, ContactMailingStatus.SENT), ).order_by('-creation_date')[0].ab params.update({'ab': ab_state}) except: pass ContactMailingStatus.objects.create(**params) return context def unsubscription_handle(request): if request.POST: email = request.POST.get('email') contact = get_object_or_404(Contact, email=email) setting = contact.contactsettings form = SubscribeSettingsForm(request.POST, instance=setting) if form.is_valid(): setting = form.save(commit=False) setting.contact = contact setting.save() form.save_m2m() form.save_additional_fields(setting) if form.cleaned_data.get('get_announce'): messages.add_message(request, messages.INFO, _(u'Настройки вашой подписки успешно сохранены')) else: contact.subscriber = False contact.save() return HttpResponseRedirect(reverse_lazy('newsletter_mailinglist_unsubscribe_success')) class UnsubscriptionSuccess(TemplateView): template_name = 'client/newsletters/unsubscribe_success.html' class AuthMailingSettings(RedirectView): url = reverse_lazy('accounts-mailing_settings') def get(self, request, *args, **kwargs): self.contact = untokenize(self.kwargs.get('uidb36'), self.kwargs.get('token')) request.session['ml_contact_pk'] = self.contact.pk return super(AuthMailingSettings, self).get(request, *args, **kwargs) class SendtoFriendView(TemplateView): # form_class = SendtoFriendForm formset_class = formset_factory(SendtoFriendForm, extra=5, max_num=5) template_name = 'client/newsletters/sendmail_to_friend.html' message_template_name = 'client/newsletters/sendmail_to_friend_message.html' def dispatch(self, request, *args, **kwargs): self.message_template = False self.formset = self.formset_class(request.POST or None) self.newsletter = get_object_or_404(Newsletter, slug=kwargs.get('slug')) self.contact = untokenize(self.kwargs.get('uidb36'), self.kwargs.get('token')) last_send = request.session.get('last_friend_send') if last_send and datetime.now() - last_send < timedelta(hours=1): self.add_msg(_(u'В целях направленных на борьбу со спамом, пересылать письма можно не чаще чем раз в час.')) return super(SendtoFriendView, self).dispatch(request, *args, **kwargs) def add_msg(self, msg): self.message_template = True messages.add_message(self.request, messages.INFO, msg) def post(self, request, *args, **kwargs): if self.formset.is_valid(): contacts = [] for form in self.formset: contacts.append({ 'name': form.cleaned_data.get('first_name'), 'email': form.cleaned_data.get('email') }) self.send_mail(contacts) request.session['last_friend_send'] = datetime.now() self.add_msg(_(u'Мы успешно переслали письмо вашим друзьям. Спасибо что Вы с нами!')) return self.get(request, *args, **kwargs) def get_template_names(self): if self.message_template: return [self.message_template_name] return super(SendtoFriendView, self).get_template_names() def send_mail(self, contacts): mailer = Mailer(self.newsletter) mailer.settings_links = False mailer.send_to_friends(self.contact, contacts) def get_context_data(self, **kwargs): ctx = super(SendtoFriendView, self).get_context_data(**kwargs) ctx['formset'] = self.formset ctx['newsletter'] = self.newsletter ctx['contact'] = self.contact return ctx