You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
8.6 KiB
207 lines
8.6 KiB
# -*- 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 |