summaryrefslogtreecommitdiff
path: root/aggregator/views.py
blob: 4355a0e4ad7316c371b29aa8b7abd4854d4dc331 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import gettext as _
from django.views.generic.list import ListView

from .forms import FeedModelForm
from .models import APPROVED_FEED, Feed, FeedItem, FeedType, LocalDjangoCommunity


def index(request):
    """
    Displays the latest feeds of each type.
    """
    feeds = []
    for ft in FeedType.objects.all():
        recent_items = ft.items()[0:5]
        if recent_items:
            feeds.append((ft, recent_items))
    ctx = {"feedtype_list": feeds}
    return render(request, "aggregator/index.html", ctx)


class FeedListView(ListView):
    """
    Shows the latest feeds for the given type.
    """

    paginate_by = 25

    def get_queryset(self):
        self.feed_type = get_object_or_404(
            FeedType, slug=self.kwargs.pop("feed_type_slug")
        )
        return FeedItem.objects.filter(
            feed__feed_type=self.feed_type, feed__approval_status=APPROVED_FEED
        ).select_related("feed")

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["feed_type"] = self.feed_type
        return context


@login_required
def my_feeds(request):
    """
    Lets the user see, edit, and delete all of their owned feeds.
    """
    feed_types = FeedType.objects.all()
    if not request.user.is_superuser:
        feed_types = feed_types.filter(can_self_add=True)

    ctx = {"feeds": Feed.objects.filter(owner=request.user), "feed_types": feed_types}
    return render(request, "aggregator/my-feeds.html", ctx)


@login_required
def add_feed(request, feed_type_slug):
    """
    Lets users add new feeds to the aggregator.

    Users only get to add new feeds of types indicated as "can self add."
    """
    ft = get_object_or_404(FeedType, slug=feed_type_slug, can_self_add=True)
    if not ft.can_self_add and not request.user.is_superuser:
        return render(request, "aggregator/denied.html")

    instance = Feed(feed_type=ft, owner=request.user)
    f = FeedModelForm(request.POST or None, instance=instance)
    if f.is_valid():
        f.save()
        messages.add_message(
            request,
            messages.INFO,
            _(
                "Your feed has entered moderation. "
                "Please allow up to 1 week for processing."
            ),
        )
        return redirect("community-index")

    ctx = {"form": f, "feed_type": ft, "adding": True}
    return render(request, "aggregator/edit-feed.html", ctx)


@login_required
def edit_feed(request, feed_id):
    """
    Lets a user edit a feed they've previously added.

    Only feeds the user "owns" can be edited.
    """
    feed = get_object_or_404(Feed, pk=feed_id, owner=request.user)
    f = FeedModelForm(request.POST or None, instance=feed)
    if f.is_valid():
        f.save()
        return redirect("community-my-feeds")

    ctx = {"form": f, "feed": feed, "adding": False}
    return render(request, "aggregator/edit-feed.html", ctx)


@login_required
def delete_feed(request, feed_id):
    """
    Lets a user delete a feed they've previously added.

    Only feeds the user "owns" can be deleted.
    """
    feed = get_object_or_404(Feed, pk=feed_id, owner=request.user)
    if request.method == "POST":
        feed.delete()
        return redirect("community-my-feeds")
    return render(request, "aggregator/delete-confirm.html", {"feed": feed})


class LocalDjangoCommunitiesListView(ListView):
    """
    Shows a list of community meetups
    """

    model = LocalDjangoCommunity
    context_object_name = "django_communities"
    template_name = "aggregator/local-django-community.html"

    def get_queryset(self):
        return self.model.objects.all().order_by("continent").values()