]> git.ipfire.org Git - ipfire.org.git/blame - src/web/wiki.py
wiki: Fix creating deleted pages
[ipfire.org.git] / src / web / wiki.py
CommitLineData
181d08f3
MT
1#!/usr/bin/python3
2
3import tornado.web
4
5from . import auth
6from . import base
6ac7e934 7from . import ui_modules
181d08f3
MT
8
9class PageHandler(auth.CacheMixin, base.BaseHandler):
d398ca08
MT
10 @property
11 def action(self):
12 return self.get_argument("action", None)
13
a446dcb9
MT
14 def write_error(self, status_code, **kwargs):
15 # Render a custom page for 404
16 if status_code == 404:
17 self.render("wiki/404.html", **kwargs)
18 return
19
20 # Otherwise raise this to one layer above
21 super().write_error(status_code, **kwargs)
22
181d08f3
MT
23 @tornado.web.removeslash
24 def get(self, page):
25 page = self.backend.wiki.get_page(page)
26
d398ca08
MT
27 # Edit
28 if self.action == "edit":
29 if not self.current_user:
30 raise tornado.web.HTTPError(401)
31
32 # Empty page if it was deleted
addc4eb7 33 if page and page.was_deleted():
d398ca08
MT
34 page = None
35
36 # Render login
37 return self.render("wiki/edit.html", page=page)
38
181d08f3
MT
39 # If the page does not exist, we send 404
40 if not page or page.was_deleted():
41 raise tornado.web.HTTPError(404)
42
43 # Fetch the latest revision
44 latest_revision = page.get_latest_revision()
45
46 # Render page
47 self.render("wiki/page.html", page=page, latest_revision=latest_revision)
48
49 @tornado.web.authenticated
495e9dc4 50 def post(self, page):
181d08f3 51 content = self.get_argument("content", None)
d398ca08 52 changes = self.get_argument("changes")
181d08f3 53
181d08f3 54 # Create a new page in the database
d398ca08
MT
55 with self.db.transaction():
56 page = self.backend.wiki.create_page(page,
495e9dc4 57 self.current_user, content, changes=changes, address=self.get_remote_ip())
181d08f3 58
df01767e
MT
59 # Redirect back
60 if page.was_deleted():
61 self.redirect("/")
62 else:
63 self.redirect(page.url)
181d08f3
MT
64
65
66class SearchHandler(auth.CacheMixin, base.BaseHandler):
67 @base.blacklisted
68 def get(self):
69 q = self.get_argument("q")
70
71 pages = self.backend.wiki.search(q, limit=50)
72 if not pages:
73 raise tornado.web.HTTPError(404, "Nothing found")
74
75 self.render("wiki/search-results.html", q=q, pages=pages)
6ac7e934
MT
76
77
f9db574a
MT
78class RecentChangesHandler(auth.CacheMixin, base.BaseHandler):
79 def get(self):
80 recent_changes = self.backend.wiki.get_recent_changes(limit=50)
81
82 self.render("wiki/recent-changes.html", recent_changes=recent_changes)
83
84
85class WikiListModule(ui_modules.UIModule):
66a814d9 86 def render(self, pages, show_breadcrumbs=True, show_changes=False):
d398ca08 87 return self.render_string("wiki/modules/list.html",
66a814d9 88 pages=pages, show_breadcrumbs=show_breadcrumbs, show_changes=show_changes)
f9db574a
MT
89
90
6ac7e934
MT
91class WikiNavbarModule(ui_modules.UIModule):
92 def render(self, page, suffix=None):
93 breadcrumbs = self.backend.wiki.make_breadcrumbs(page.url)
94
95 return self.render_string("wiki/modules/navbar.html",
96 breadcrumbs=breadcrumbs, page_title=page.title, suffix=suffix)