]> git.ipfire.org Git - ipfire.org.git/blob - src/web/wiki.py
wiki: Automatically resize images
[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 ActionUploadHandler(auth.CacheMixin, base.BaseHandler):
10 @tornado.web.authenticated
11 def post(self):
12 path = self.get_argument("path")
13
14 try:
15 filename, data, mimetype = self.get_file("file")
16
17 # XXX check valid mimetypes
18
19 with self.db.transaction():
20 file = self.backend.wiki.upload(path, filename, data,
21 mimetype=mimetype, author=self.current_user,
22 address=self.get_remote_ip())
23
24 except TypeError as e:
25 raise e
26
27 self.redirect("%s/files" % path)
28
29
30 class FilesHandler(auth.CacheMixin, base.BaseHandler):
31 @tornado.web.authenticated
32 def get(self, path):
33 files = self.backend.wiki.get_files(path)
34
35 self.render("wiki/files/index.html", path=path, files=files)
36
37
38 class FileHandler(auth.CacheMixin, base.BaseHandler):
39 def get(self, path):
40 file = self.backend.wiki.get_file_by_path(path)
41 if not file:
42 raise tornado.web.HTTPError(404, "Could not find %s" % path)
43
44 size = self.get_argument_int("s", None)
45
46 # Check if image should be resized
47 if file.is_image() and size:
48 blob = file.get_thumbnail(size)
49 else:
50 blob = file.blob
51
52 # Set headers
53 self.set_header("Content-Type", file.mimetype or "application/octet-stream")
54 self.set_header("Content-Length", len(blob))
55
56 # Deliver content
57 self.finish(blob)
58
59
60 class PageHandler(auth.CacheMixin, base.BaseHandler):
61 @property
62 def action(self):
63 return self.get_argument("action", None)
64
65 def write_error(self, status_code, **kwargs):
66 # Render a custom page for 404
67 if status_code == 404:
68 self.render("wiki/404.html", **kwargs)
69 return
70
71 # Otherwise raise this to one layer above
72 super().write_error(status_code, **kwargs)
73
74 @tornado.web.removeslash
75 def get(self, page):
76 # Check if we are asked to render a certain revision
77 revision = self.get_argument("revision", None)
78
79 # Fetch the wiki page
80 page = self.backend.wiki.get_page(page, revision=revision)
81
82 # Edit
83 if self.action == "edit":
84 if not self.current_user:
85 raise tornado.web.HTTPError(401)
86
87 # Empty page if it was deleted
88 if page and page.was_deleted():
89 page = None
90
91 # Render page
92 self.render("wiki/edit.html", page=page)
93 return
94
95 # Revisions
96 elif self.action == "revisions":
97 self.render("wiki/revisions.html", page=page)
98 return
99
100 # If the page does not exist, we send 404
101 if not page or page.was_deleted():
102 raise tornado.web.HTTPError(404)
103
104 # Fetch the latest revision
105 latest_revision = page.get_latest_revision()
106
107 # Render page
108 self.render("wiki/page.html", page=page, latest_revision=latest_revision)
109
110 @tornado.web.authenticated
111 def post(self, page):
112 content = self.get_argument("content", None)
113 changes = self.get_argument("changes")
114
115 # Create a new page in the database
116 with self.db.transaction():
117 page = self.backend.wiki.create_page(page,
118 self.current_user, content, changes=changes, address=self.get_remote_ip())
119
120 # Redirect back
121 if page.was_deleted():
122 self.redirect("/")
123 else:
124 self.redirect(page.url)
125
126 # Update the search index
127 with self.db.transaction():
128 self.backend.wiki.refresh()
129
130
131 class SearchHandler(auth.CacheMixin, base.BaseHandler):
132 @base.blacklisted
133 def get(self):
134 q = self.get_argument("q")
135
136 pages = self.backend.wiki.search(q, limit=50)
137
138 self.render("wiki/search-results.html", q=q, pages=pages)
139
140
141 class RecentChangesHandler(auth.CacheMixin, base.BaseHandler):
142 def get(self):
143 recent_changes = self.backend.wiki.get_recent_changes(limit=50)
144
145 self.render("wiki/recent-changes.html", recent_changes=recent_changes)
146
147
148 class WikiListModule(ui_modules.UIModule):
149 def render(self, pages, link_revision=False, show_breadcrumbs=True, show_changes=False):
150 return self.render_string("wiki/modules/list.html", link_revision=link_revision,
151 pages=pages, show_breadcrumbs=show_breadcrumbs, show_changes=show_changes)
152
153
154 class WikiNavbarModule(ui_modules.UIModule):
155 def render(self, suffix=None):
156 _ = self.locale.translate
157
158 breadcrumbs = self.backend.wiki.make_breadcrumbs(self.request.path)
159
160 # Don't search for a title for the file manager
161 if self.request.path.endswith("/files"):
162 title = _("Files")
163 else:
164 title = self.backend.wiki.get_page_title(self.request.path)
165
166 return self.render_string("wiki/modules/navbar.html",
167 breadcrumbs=breadcrumbs, page_title=title, suffix=suffix)