]> git.ipfire.org Git - ipfire.org.git/blob - src/web/wiki.py
a3d4e65bd67f7d211641fd41121680ed3c4b7e6d
[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 @property
11 def action(self):
12 return self.get_argument("action", None)
13
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
23 @tornado.web.removeslash
24 def get(self, page):
25 # Check if we are asked to render a certain revision
26 revision = self.get_argument("revision", None)
27
28 # Fetch the wiki page
29 page = self.backend.wiki.get_page(page, revision=revision)
30
31 # Edit
32 if self.action == "edit":
33 if not self.current_user:
34 raise tornado.web.HTTPError(401)
35
36 # Empty page if it was deleted
37 if page and page.was_deleted():
38 page = None
39
40 # Render page
41 self.render("wiki/edit.html", page=page)
42 return
43
44 # Revisions
45 elif self.action == "revisions":
46 self.render("wiki/revisions.html", page=page)
47 return
48
49 # If the page does not exist, we send 404
50 if not page or page.was_deleted():
51 raise tornado.web.HTTPError(404)
52
53 # Fetch the latest revision
54 latest_revision = page.get_latest_revision()
55
56 # Render page
57 self.render("wiki/page.html", page=page, latest_revision=latest_revision)
58
59 @tornado.web.authenticated
60 def post(self, page):
61 content = self.get_argument("content", None)
62 changes = self.get_argument("changes")
63
64 # Create a new page in the database
65 with self.db.transaction():
66 page = self.backend.wiki.create_page(page,
67 self.current_user, content, changes=changes, address=self.get_remote_ip())
68
69 # Redirect back
70 if page.was_deleted():
71 self.redirect("/")
72 else:
73 self.redirect(page.url)
74
75 # Update the search index
76 with self.db.transaction():
77 self.backend.wiki.refresh()
78
79
80 class SearchHandler(auth.CacheMixin, base.BaseHandler):
81 @base.blacklisted
82 def get(self):
83 q = self.get_argument("q")
84
85 pages = self.backend.wiki.search(q, limit=50)
86
87 self.render("wiki/search-results.html", q=q, pages=pages)
88
89
90 class RecentChangesHandler(auth.CacheMixin, base.BaseHandler):
91 def get(self):
92 recent_changes = self.backend.wiki.get_recent_changes(limit=50)
93
94 self.render("wiki/recent-changes.html", recent_changes=recent_changes)
95
96
97 class WikiListModule(ui_modules.UIModule):
98 def render(self, pages, link_revision=False, show_breadcrumbs=True, show_changes=False):
99 return self.render_string("wiki/modules/list.html", link_revision=link_revision,
100 pages=pages, show_breadcrumbs=show_breadcrumbs, show_changes=show_changes)
101
102
103 class WikiNavbarModule(ui_modules.UIModule):
104 def render(self, page, suffix=None):
105 breadcrumbs = self.backend.wiki.make_breadcrumbs(page.url)
106
107 return self.render_string("wiki/modules/navbar.html",
108 breadcrumbs=breadcrumbs, page_title=page.title, suffix=suffix)