Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 03313f4

Browse files
🧁 Create views and URIs for NewsLink management
1 parent 65e88ba commit 03313f4

File tree

2 files changed

+176
-2
lines changed

2 files changed

+176
-2
lines changed

‎src/organizer/urls.py‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
from django.urls import path
33

44
from .views import (
5+
NewsLinkCreate,
6+
NewsLinkDelete,
7+
NewsLinkDetail,
8+
NewsLinkUpdate,
59
StartupCreate,
610
StartupDelete,
711
StartupDetail,
@@ -40,6 +44,28 @@
4044
StartupUpdate.as_view(),
4145
name="startup_update",
4246
),
47+
path(
48+
"startup/<str:startup_slug>/add_article/",
49+
NewsLinkCreate.as_view(),
50+
name="newslink_create",
51+
),
52+
path(
53+
"startup/<str:startup_slug>/<str:newslink_slug>/",
54+
NewsLinkDetail.as_view(),
55+
name="newslink_detail",
56+
),
57+
path(
58+
"startup/<str:startup_slug>/<str:newslink_slug>/"
59+
"delete/",
60+
NewsLinkDelete.as_view(),
61+
name="newslink_delete",
62+
),
63+
path(
64+
"startup/<str:startup_slug>/<str:newslink_slug>/"
65+
"update/",
66+
NewsLinkUpdate.as_view(),
67+
name="newslink_update",
68+
),
4369
path("tag/", TagList.as_view(), name="tag_list"),
4470
path(
4571
"tag/create/",

‎src/organizer/views.py‎

Lines changed: 150 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,163 @@
11
"""Views for Organizer App"""
2+
from django.shortcuts import (
3+
get_object_or_404,
4+
redirect,
5+
render,
6+
)
27
from django.urls import reverse_lazy
38
from django.views.generic import (
49
CreateView,
510
DeleteView,
611
DetailView,
712
ListView,
813
UpdateView,
14+
View,
915
)
1016

11-
from .forms import StartupForm, TagForm
12-
from .models import Startup, Tag
17+
from .forms import NewsLinkForm, StartupForm, TagForm
18+
from .models import NewsLink, Startup, Tag
19+
20+
21+
class NewsLinkCreate(View):
22+
"""Create a link to an article about a startup"""
23+
24+
def get(self, request, startup_slug):
25+
"""Display form to create new NewsLinks"""
26+
startup = get_object_or_404(
27+
Startup, slug=startup_slug
28+
)
29+
context = {
30+
"form": NewsLinkForm(),
31+
"startup": startup,
32+
"update": False,
33+
}
34+
template_name = "newslink/form.html"
35+
return render(request, template_name, context)
36+
37+
def post(self, request, startup_slug):
38+
"""Process form submission with new NewsLink data"""
39+
newslink_form = NewsLinkForm(request.POST)
40+
if newslink_form.is_valid():
41+
newslink = newslink_form.save()
42+
return redirect(newslink)
43+
startup = get_object_or_404(
44+
Startup, slug=startup_slug
45+
)
46+
context = {
47+
"form": newslink_form,
48+
"startup": startup,
49+
"update": False,
50+
}
51+
template_name = "newslink/form.html"
52+
return render(request, template_name, context)
53+
54+
55+
class NewsLinkDelete(View):
56+
"""Delete a link to an article about a startup"""
57+
58+
def get(self, request, startup_slug, newslink_slug):
59+
"""Ask for confirmation of deletion"""
60+
newslink = get_object_or_404(
61+
NewsLink,
62+
startup__slug=startup_slug,
63+
slug=newslink_slug,
64+
)
65+
context = {
66+
"newslink": newslink,
67+
"startup": newslink.startup,
68+
}
69+
template_name = "newslink/confirm_delete.html"
70+
return render(request, template_name, context)
71+
72+
def post(self, request, startup_slug, newslink_slug):
73+
"""Delete specified NewsLink"""
74+
newslink = get_object_or_404(
75+
NewsLink,
76+
startup__slug=startup_slug,
77+
slug=newslink_slug,
78+
)
79+
newslink.delete()
80+
startup = get_object_or_404(
81+
Startup, slug=startup_slug
82+
)
83+
return redirect(startup)
84+
85+
86+
class NewsLinkDetail(View):
87+
"""Redirect /<startup>/<newslink>/ to /<startup>/"""
88+
89+
def get(self, request, startup_slug, newslink_slug):
90+
"""Redirect user to Startup page"""
91+
# We could redirect like so:
92+
#
93+
# return redirect(
94+
# reverse(
95+
# "startup_detail",
96+
# kwargs={"slug": startup_slug},
97+
# )
98+
# )
99+
#
100+
# The advantage of the code above is that we avoid a
101+
# database query.
102+
#
103+
# However, this means we will not show a 404 if the
104+
# NewsLink slug does not exist. For correctness, we
105+
# therefore check the existence of the NewsLink, and
106+
# then redirect.
107+
newslink = get_object_or_404(
108+
NewsLink,
109+
startup__slug=startup_slug,
110+
slug=newslink_slug,
111+
)
112+
# NewsLink.get_absolute_url returns the detail page
113+
# of startup, so we could use:
114+
# return redirect(newslink)
115+
#
116+
# However, it may also be surprising/confusing, so
117+
# we opt instead for the code below.
118+
return redirect(newslink.startup)
119+
120+
121+
class NewsLinkUpdate(View):
122+
"""Update a link to an article about a startup"""
123+
124+
def get(self, request, startup_slug, newslink_slug):
125+
"""Display pre-filled form to update NewsLink"""
126+
newslink = get_object_or_404(
127+
NewsLink,
128+
startup__slug=startup_slug,
129+
slug=newslink_slug,
130+
)
131+
context = {
132+
"form": NewsLinkForm(instance=newslink),
133+
"newslink": newslink,
134+
"startup": newslink.startup,
135+
"update": True,
136+
}
137+
template_name = "newslink/form.html"
138+
return render(request, template_name, context)
139+
140+
def post(self, request, startup_slug, newslink_slug):
141+
"""Process form submission with NewsLink data"""
142+
newslink = get_object_or_404(
143+
NewsLink,
144+
startup__slug=startup_slug,
145+
slug=newslink_slug,
146+
)
147+
newslink_form = NewsLinkForm(
148+
request.POST, instance=newslink
149+
)
150+
if newslink_form.is_valid():
151+
newslink = newslink_form.save()
152+
return redirect(newslink)
153+
context = {
154+
"form": newslink_form,
155+
"newslink": newslink,
156+
"startup": newslink.startup,
157+
"update": True,
158+
}
159+
template_name = "newslink/form.html"
160+
return render(request, template_name, context)
13161

14162

15163
class TagList(ListView):

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /