# -*- coding: utf-8 -*-
import logging
from django.conf import settings
from django.db.models import Q
from django.shortcuts import redirect, resolve_url
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.views.generic.base import TemplateView
from django.views.generic.edit import ModelFormMixin
from django_powerbank.views import Http403
from django_powerbank.views.auth import AbstractAccessView
from pascal_templates.views import CreateView, DetailView, UpdateView
from . import forms, models, signals
from .utils import validate_password
log = logging.getLogger(__name__)
[docs]class OptOutConfirm(CreateView):
model = models.OptOut
template_name = "django_opt_out/OptOut/form.html"
form_class = forms.OptOutForm
[docs] def email_confirmed(self):
email = self.request.GET.get('email', None)
auth = self.request.GET.get('auth', None)
if email and auth:
return validate_password(email, auth)
[docs] def get_initial(self):
return self.request.GET.dict()
[docs] def get_context_data(self, **kwargs):
kwargs['tags'] = self.get_tags()
signals.send_signal(signals.opt_out_visited, self.__class__, view=self, request=self.request, context=kwargs)
return super(OptOutConfirm, self).get_context_data(**kwargs)
[docs] def get_success_url(self):
goodbye_view = settings.OPT_OUT_GOODBYE_VIEW or "django_opt_out:OptOutSuccess"
return resolve_url(goodbye_view, pk=self.object.pk, secret=self.object.secret, email=self.object.email)
[docs]class OptOutBase(AbstractAccessView):
[docs] def check_authorization(self, *args, **kwargs):
# noinspection PyUnresolvedReferences
item = self.get_object()
email = self.kwargs['email']
secret = self.kwargs['secret']
if item.secret != secret or item.email != email:
msg = _("Request authentication failed, secret or email is incorrect.")
raise Http403(msg)
[docs]class OptOutSuccess(OptOutBase, DetailView):
model = models.OptOut
template_name = "django_opt_out/OptOut/success.html"
[docs] def post(self, request, *args, **kwargs):
self.object = self.get_object()
self.object.delete()
signals.send_signal(signals.opt_out_deleted, self.__class__, view=self, request=self.request, opt_out=self.object)
return redirect('django_opt_out:OptOutRemoved')
[docs]class OptOutRemoved(TemplateView):
template_name = "django_opt_out/OptOut/removed.html"
[docs]class OptOutUpdate(OptOutBase, UpdateView):
model = models.OptOut
form_class = forms.OptOutForm
template_name = "django_opt_out/OptOut/form.html"
[docs] def get_success_url(self):
return resolve_url("django_opt_out:OptOutSuccess", self.object.pk, self.object.secret, self.object.email)