# -*- coding: utf-8 -*- import json from django.core.urlresolvers import reverse_lazy from django.views.generic import TemplateView, FormView from django.http import HttpResponse from django.shortcuts import redirect from emencia.django.newsletter.forms import ContactForm from emencia.django.newsletter.models import Contact, MailingList from emencia.django.newsletter.forms import ( SubscribeAssideForm, MailingSettingsForm ) from accounts.models import User from accounts.views import GetUserMixin from functions.http import JsonResponse from city.models import City class SubscribeView(GetUserMixin, FormView): """ Представление для подписки не/авторизованных пользователей """ template_name = 'client/newsletters/mailing_settings.html' form_class = MailingSettingsForm def get_object(self): return self.get_user() def get(self, request, *args, **kwargs): self.object = self.get_object() return super(SubscribeView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): self.object = self.get_object() return super(SubscribeView, self).post(request, *args, **kwargs) def form_valid(self, form): if self.request.POST.get('save'): contact = form.save() if not self.request.user.is_authenticated(): contact.send_activation() if self.request.is_ajax(): data = {'success': True} if self.request.POST.get('save'): data['redirect_url'] = str(self.get_success_url()) return JsonResponse(data) return redirect(self.get_success_url()) def form_invalid(self, form): if self.request.is_ajax(): data = { 'form_errors': form.errors, } return JsonResponse(data, status=400) return self.render_to_response(self.get_context_data(form=form)) def get_initial(self): data = super(SubscribeView, self).get_initial() if self.request.GET.get('email'): data['email'] = self.request.GET['email'] if self.request.GET.get('first_name'): data['first_name'] = self.request.GET['first_name'] return data def get_form_kwargs(self): kwargs = super(SubscribeView, self).get_form_kwargs() if self.request.user.is_authenticated(): kwargs.update({'instance': self.object}) return kwargs def get_success_url(self): if not self.request.user.is_authenticated(): return reverse_lazy('subscription_activation_send') return reverse_lazy('newsletter_subscription') def get_context_data(self, **kwargs): ctx = super(SubscribeView, self).get_context_data(**kwargs) ctx['object'] = self.object ctx['r_cities'] = self.get_russian_cities() ctx['checked_th'] = self.get_checked_th() if self.object is not None: if self.request.GET.get('unsibscribe') and self.object.subscriber: self.object.unsubscribe() ctx['unsubscribe_success'] = True elif not self.object.subscriber: ctx['unsubscribed'] = True return ctx def get_russian_cities(self): """ :return: города России """ return City.used.russia() def get_checked_th(self): """ :return: выбранные пользователем темы """ if self.object is not None: return self.object.themes.values_list('pk', flat=True) return [] class ActivationView(TemplateView): http_method_names = ['get'] template_name = 'registration/activate.html' def get(self, request, *args, **kwargs): activated_contact = self.activate(request, *args, **kwargs) # add to announce list m = MailingList.objects.get(id=1) m.subscribers.add(activated_contact) if activated_contact: success_url = self.get_success_url(request, activated_contact) try: to, args, kwargs = success_url return redirect(to, *args, **kwargs) except ValueError: return redirect(success_url) return super(ActivationView, self).get(request, *args, **kwargs) def activate(self, request, activation_key): """ Implement account-activation logic here. """ activated_contact = Contact.objects.activate(activation_key) return activated_contact def get_success_url(self, request, user): return ('subscription_activation_complete', (), {}) def subscribe_aside(request): if request.POST: response = {'success': False} form = SubscribeAssideForm(request.POST) if form.is_valid(): email = form.cleaned_data['email'] try: user = User.objects.get(username=email) except User.DoesNotExist: user = None contact = Contact.objects.create_contact(email, user) contact_setting = form.save(commit=False) contact_setting.contact = contact contact_setting.exponent_practicum = True contact_setting.organiser_practicum = True contact_setting.save() form.save_m2m() response['success'] = True else: errors = form.errors if 'theme' in errors: errors['id_subscription_theme'] = errors['theme'] response['errors'] = errors return HttpResponse(json.dumps(response, indent=2), content_type='application/json') else: return HttpResponse('not form request') def popup_validate(request): response = {'success': False} if request.GET: form = ContactForm(request.GET) if form.is_valid(): contact = form.save() contact.send_activation() response['success'] = True response['redirect'] = True response['redirect_url'] = SubscribeView.success_url else: response['errors'] = form.errors return HttpResponse(json.dumps(response, indent=2), content_type='application/json') def landing_partisipation_validate(request): response = {'success': False} if request.method == 'POST' and request.is_ajax(): form = ContactForm(request.POST) if form.is_valid(): contact = form.save() contact.send_activation() response['success'] = True else: response['errors'] = form.errors return HttpResponse(json.dumps(response), content_type='application/json')