]> git.ipfire.org Git - ipfire.org.git/blame - src/web/blog.py
backend: show checksum on thank-you page
[ipfire.org.git] / src / web / blog.py
CommitLineData
12e5de7e
MT
1#!/usr/bin/python
2
9ea64cef 3import datetime
9fa06206 4import dateutil
f0714277 5import email.utils
12e5de7e
MT
6import tornado.web
7
124a8404 8from . import base
f91dfcc7
MT
9from . import ui_modules
10
28e09035 11class IndexHandler(base.AnalyticsMixin, base.BaseHandler):
8a897d25 12 def get(self):
d8710471 13 latest_post = None
8a897d25 14
d8710471
RH
15 # Fetch the search query
16 q = self.get_argument("q", None)
9d020f28 17
d8710471
RH
18 # If the user is searching, perform the search
19 if q:
20 posts = self.backend.blog.search(q)
54b9fef8 21
d8710471
RH
22 # Otherwise fetch the latest posts
23 else:
24 posts = self.backend.blog.get_newest(limit=10)
25
26 # Extract the latest post
27 latest_post = posts.pop(0)
28
29 self.render("blog/index.html", q=q, posts=posts, latest_post=latest_post)
8a897d25
MT
30
31
28e09035 32class FeedHandler(base.AnalyticsMixin, base.BaseHandler):
f0714277 33 def get(self):
bc586673 34 posts = self.backend.blog.get_newest(limit=10)
b2ed0760
MT
35 if not posts:
36 raise tornado.web.HTTPError(404)
f0714277 37
9d020f28
MT
38 # Allow this to be cached for 10 minutes
39 self.set_expires(600)
f0714277
MT
40
41 # Set correct content type
a7d34bc5 42 self.set_header("Content-Type", "application/atom+xml")
f0714277 43
b2ed0760
MT
44 # Render the feed
45 self.render("blog/feed.xml", posts=posts,
a7d34bc5 46 now=datetime.datetime.now())
f0714277
MT
47
48
28e09035 49class PostHandler(base.AnalyticsMixin, base.BaseHandler):
12e5de7e 50 def get(self, slug):
a3ba761a 51 post = self.backend.blog.get_by_slug(slug)
0a6875dc 52 if not post:
12e5de7e
MT
53 raise tornado.web.HTTPError(404)
54
0a6875dc 55 self.render("blog/post.html", post=post)
f91dfcc7
MT
56
57
da24ac0a 58class PublishHandler(base.BaseHandler):
e8788b7f
MT
59 @tornado.web.authenticated
60 def prepare(self):
61 # Check if the user has permissions
62 if not self.current_user.is_blog_author():
63 raise tornado.web.HTTPError(403)
64
9fa06206
MT
65 @tornado.web.authenticated
66 def get(self, slug):
a3ba761a 67 post = self.backend.blog.get_by_slug(slug)
9fa06206
MT
68 if not post:
69 raise tornado.web.HTTPError(404)
70
71 # Check if current_user is allowed to edit the post
72 if not post.is_editable(self.current_user):
73 raise tornado.web.HTTPError(403)
74
75 # Is the post already published?
76 if post.is_published():
77 raise tornado.web.HTTPError(400, "Post is already published")
78
79 self.render("blog/publish.html", post=post)
80
9ea64cef
MT
81 @tornado.web.authenticated
82 def post(self, slug):
a3ba761a 83 post = self.backend.blog.get_by_slug(slug)
9ea64cef
MT
84 if not post:
85 raise tornado.web.HTTPError(404)
86
9fa06206
MT
87 # Check if current_user is allowed to edit the post
88 if not post.is_editable(self.current_user):
89 raise tornado.web.HTTPError(403)
90
9ea64cef
MT
91 # Is the post already published?
92 if post.is_published():
93 raise tornado.web.HTTPError(400, "Post is already published")
94
9fa06206
MT
95 when = self.get_argument("when", None)
96 if when:
97 when = dateutil.parser.parse(when)
fe40c0fa 98
9ea64cef
MT
99 # Publish the post
100 with self.db.transaction():
9fa06206 101 post.publish(when)
9ea64cef 102
e1e14385 103 self.redirect("/blog/%s" % post.slug)
9ea64cef
MT
104
105
da24ac0a 106class DraftsHandler(base.BaseHandler):
e8788b7f
MT
107 @tornado.web.authenticated
108 def prepare(self):
109 # Check if the user has permissions
110 if not self.current_user.is_blog_author():
111 raise tornado.web.HTTPError(403)
112
0b342a05
MT
113 @tornado.web.authenticated
114 def get(self):
115 drafts = self.backend.blog.get_drafts(author=self.current_user)
116
117 self.render("blog/drafts.html", drafts=drafts)
118
119
28e09035 120class YearHandler(base.AnalyticsMixin, base.BaseHandler):
7e64f6a3
MT
121 def get(self, year):
122 posts = self.backend.blog.get_by_year(year)
123 if not posts:
124 raise tornado.web.HTTPError(404, "There are no posts in %s" % year)
125
126 self.render("blog/year.html", posts=posts, year=year)
127
128
4d657f4f 129class WriteHandler(base.BaseHandler):
e8788b7f
MT
130 @tornado.web.authenticated
131 def prepare(self):
132 # Check if the user has permissions
133 if not self.current_user.is_blog_author():
134 raise tornado.web.HTTPError(403)
135
541c952b
MT
136 @tornado.web.authenticated
137 def get(self):
4d657f4f 138 self.render("blog/write.html", post=None)
541c952b
MT
139
140 @tornado.web.authenticated
141 def post(self):
142 title = self.get_argument("title")
143 text = self.get_argument("text")
dc035dce 144 tags = self.get_argument("tags", "").split(" ")
541c952b
MT
145
146 with self.db.transaction():
147 post = self.backend.blog.create_post(title, text,
148 author=self.current_user, tags=tags)
149
4d657f4f
MT
150 # Redirect to the new post
151 self.redirect("/blog/%s" % post.slug)
541c952b
MT
152
153
da24ac0a 154class EditHandler(base.BaseHandler):
541c952b
MT
155 @tornado.web.authenticated
156 def get(self, slug):
a3ba761a 157 post = self.backend.blog.get_by_slug(slug)
541c952b
MT
158 if not post:
159 raise tornado.web.HTTPError(404)
160
e8a81a70
MT
161 # Check if post is editable
162 if not post.is_editable(self.current_user):
163 raise tornado.web.HTTPError(403, "%s cannot edit %s" % (self.current_user, post))
541c952b 164
4d657f4f 165 self.render("blog/write.html", post=post)
541c952b
MT
166
167 @tornado.web.authenticated
168 def post(self, slug):
a3ba761a 169 post = self.backend.blog.get_by_slug(slug)
541c952b 170 if not post:
4d657f4f 171 raise tornado.web.HTTPError(404, "Could not find post %s" % slug)
541c952b 172
e8a81a70
MT
173 # Check if post is editable
174 if not post.is_editable(self.current_user):
175 raise tornado.web.HTTPError(403, "%s cannot edit %s" % (self.current_user, post))
541c952b 176
93725180 177 # Save updated content
541c952b 178 with self.db.transaction():
93725180
MT
179 post.update(
180 title = self.get_argument("title"),
181 text = self.get_argument("text"),
dc035dce 182 tags = self.get_argument("tags", "").split(" "),
93725180 183 )
541c952b 184
4d657f4f
MT
185 # Redirect to the post
186 self.redirect("/blog/%s" % post.slug)
541c952b
MT
187
188
da24ac0a 189class DeleteHandler(base.BaseHandler):
914238a5
MT
190 @tornado.web.authenticated
191 def get(self, slug):
a3ba761a 192 post = self.backend.blog.get_by_slug(slug)
914238a5
MT
193 if not post:
194 raise tornado.web.HTTPError(404)
195
196 # Check if post is editable
197 if not post.is_editable(self.current_user):
198 raise tornado.web.HTTPError(403, "%s cannot edit %s" % (self.current_user, post))
199
200 self.render("blog/delete.html", post=post)
201
202 @tornado.web.authenticated
203 def post(self, slug):
a3ba761a 204 post = self.backend.blog.get_by_slug(slug)
914238a5
MT
205 if not post:
206 raise tornado.web.HTTPError(404)
207
208 # Check if post is editable
209 if not post.is_editable(self.current_user):
210 raise tornado.web.HTTPError(403, "%s cannot edit %s" % (self.current_user, post))
211
212 with self.db.transaction():
213 post.delete()
214
215 # Return to drafts
216 self.redirect("/drafts")
217
218
56801afb
MT
219class DebugEmailHandler(base.BaseHandler):
220 @tornado.web.authenticated
221 def get(self, slug):
222 if not self.current_user.is_staff():
223 raise tornado.web.HTTPError(403)
224
225 # Fetch the post
226 post = self.backend.blog.get_by_slug(slug)
227 if not post:
228 raise tornado.web.HTTPError(404, "Could not find post %s" % slug)
229
230 self.render("blog/messages/announcement.html", account=self.current_user, post=post)
231
232
7e64f6a3
MT
233class HistoryNavigationModule(ui_modules.UIModule):
234 def render(self):
235 return self.render_string("blog/modules/history-navigation.html",
39a3e9b4 236 years=self.backend.blog.years)
7e64f6a3
MT
237
238
239class ListModule(ui_modules.UIModule):
feb245e0
MT
240 def render(self, posts, relative=False, show_author=True):
241 return self.render_string("blog/modules/list.html",
242 posts=posts, relative=relative, show_author=show_author)