]> git.ipfire.org Git - ipfire.org.git/blob - src/web/wiki.py
wiki: Add custom 404 page
[ipfire.org.git] / src / web / wiki.py
1 #!/usr/bin/python3
2
3 import tornado.web
4
5 from . import auth
6 from . import base
7 from . import ui_modules
8
9 class PageHandler(auth.CacheMixin, base.BaseHandler):
10 def write_error(self, status_code, **kwargs):
11 # Render a custom page for 404
12 if status_code == 404:
13 self.render("wiki/404.html", **kwargs)
14 return
15
16 # Otherwise raise this to one layer above
17 super().write_error(status_code, **kwargs)
18
19 @tornado.web.removeslash
20 def get(self, page):
21 page = self.backend.wiki.get_page(page)
22
23 # If the page does not exist, we send 404
24 if not page or page.was_deleted():
25 raise tornado.web.HTTPError(404)
26
27 # Fetch the latest revision
28 latest_revision = page.get_latest_revision()
29
30 # Render page
31 self.render("wiki/page.html", page=page, latest_revision=latest_revision)
32
33 @tornado.web.authenticated
34 def post(self, page):
35 content = self.get_argument("content", None)
36
37 # Delete the page if content is empty
38 if not content:
39 with self.db.transaction():
40 self.backend.wiki.delete_page(page, self.current_user)
41
42 return self.redirect("/")
43
44 # Create a new page in the database
45 page = self.backend.wiki.create_page(page, self.current_user, content)
46
47 # Redirect
48 self.redirect(page.url)
49
50
51 class SearchHandler(auth.CacheMixin, base.BaseHandler):
52 @base.blacklisted
53 def get(self):
54 q = self.get_argument("q")
55
56 pages = self.backend.wiki.search(q, limit=50)
57 if not pages:
58 raise tornado.web.HTTPError(404, "Nothing found")
59
60 self.render("wiki/search-results.html", q=q, pages=pages)
61
62
63 class RecentChangesHandler(auth.CacheMixin, base.BaseHandler):
64 def get(self):
65 recent_changes = self.backend.wiki.get_recent_changes(limit=50)
66
67 self.render("wiki/recent-changes.html", recent_changes=recent_changes)
68
69
70 class WikiListModule(ui_modules.UIModule):
71 def render(self, pages):
72 return self.render_string("wiki/modules/list.html", pages=pages)
73
74
75 class WikiNavbarModule(ui_modules.UIModule):
76 def render(self, page, suffix=None):
77 breadcrumbs = self.backend.wiki.make_breadcrumbs(page.url)
78
79 return self.render_string("wiki/modules/navbar.html",
80 breadcrumbs=breadcrumbs, page_title=page.title, suffix=suffix)