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()
|