summaryrefslogtreecommitdiff
path: root/app/lttr/views.py
blob: 79b8e7202d8f53ece4e544a5dd4d7a6972455729 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import socket
from django.views.generic import ListView, CreateView, TemplateView, FormView
from django.views.generic.detail import DetailView
from django.views.generic.dates import YearArchiveView, MonthArchiveView
from django.contrib.syndication.views import Feed
from django.template.response import TemplateResponse
from django.contrib.auth import get_user_model
from django.db.models import Q
from django.shortcuts import get_object_or_404, redirect
from django.conf import settings
from django.urls import reverse, reverse_lazy

from utils.views import PaginatedListView

from smtplib import SMTPException
from .models import NewsletterMailing, Subscriber, Newsletter
from .forms import SubscribeRequestForm, UpdateForm

ACTIONS = ('subscribe', 'unsubscribe', 'update')


class NewsletterMailingDetail(DetailView):
    model = NewsletterMailing
    slug_field = "slug"

    def get_queryset(self):
        queryset = super(NewsletterMailingDetail, self).get_queryset()
        return queryset.select_related('location').prefetch_related('field_notes').prefetch_related('books')

    def get_object(self, queryset=None):
        obj = super(NewsletterMailingDetail, self).get_object(queryset=queryset)
        self.location = obj.location
        return obj

    def get_context_data(self, **kwargs):
        context = super(NewsletterMailingDetail, self).get_context_data(**kwargs)
        return context


class NewsletterSubscribedView(TemplateView):
    template_name = "lttr/subscribed.html"


class NewsletterListView(CreateView):
    """
    Return a subscribe form and list of Newsletter posts in reverse chronological order
    """
    model = Subscriber
    form_class = SubscribeRequestForm
    action = 'subscribe'

    def get_form_kwargs(self):
        kwargs = super(NewsletterListView, self).get_form_kwargs()
        kwargs['newsletter'] = Newsletter.objects.get(title="Friends of a Long Year")
        return kwargs

    def get_context_data(self, **kwargs):
        context = super(NewsletterListView, self).get_context_data(**kwargs)
        context['mailings'] = NewsletterMailing.objects.filter(status=1)
        return context

    def get_success_url(self):
        return reverse_lazy('lttr:subscribed')

    def form_valid(self, form, **kwargs):
        form.instance.user, created = get_user_model().objects.get_or_create(
                email=form.cleaned_data['email_field'],
                username=form.cleaned_data['email_field']
        )
        self.object = form.save()
        try:
            self.object.send_activation_email(action=self.action)

        except (SMTPException, socket.error) as e:
            print(e)
            self.error = True

            # Although form was valid there was error while sending email,
            # so stay at the same url.
            return super(NewsletterListView, self).form_invalid(form)
        return super(NewsletterListView, self).form_valid(form)


class ConfirmSubscriptionView(DetailView):
    model = Subscriber
    template_name = "lttr/confirm_activate.html"

    def get_object(self):
        obj = Subscriber.objects.get(newsletter__slug=self.kwargs['slug'], activation_code=self.kwargs['activation_code'])
        if obj.subscribed is False:
            obj.update('subscribe')
        return obj


class UnsubscribeRequestView(DetailView):
    model = Subscriber
    template_name = "lttr/unsubscribe.html"

    def get_object(self):
        obj = Subscriber.objects.get(newsletter__slug=self.kwargs['slug'])
        if obj.subscribed is True:
            obj.update('unsubscribe')
        return obj