]>
git.ipfire.org Git - ipfire.org.git/blob - src/backend/wiki.py
8 from .decorators
import *
10 class Wiki(misc
.Object
):
11 def _get_pages(self
, query
, *args
):
12 res
= self
.db
.query(query
, *args
)
15 yield Page(self
.backend
, row
.id, data
=row
)
17 def _get_page(self
, query
, *args
):
18 res
= self
.db
.get(query
, *args
)
21 return Page(self
.backend
, res
.id, data
=res
)
23 def get_page_title(self
, page
, default
=None):
24 doc
= self
.get_page(page
)
30 def get_page(self
, page
, revision
=None):
31 page
= Page
.sanitise_page_name(page
)
35 return self
._get
_page
("SELECT * FROM wiki WHERE page = %s \
36 AND timestamp = %s", page
, revision
)
38 return self
._get
_page
("SELECT * FROM wiki WHERE page = %s \
39 ORDER BY timestamp DESC LIMIT 1", page
)
41 def get_recent_changes(self
, limit
=None):
42 return self
._get
_pages
("SELECT * FROM wiki \
43 WHERE timestamp >= NOW() - INTERVAL '4 weeks' \
44 ORDER BY timestamp DESC LIMIT %s", limit
)
46 def create_page(self
, page
, author
, content
, changes
=None, address
=None):
47 page
= Page
.sanitise_page_name(page
)
49 return self
._get
_page
("INSERT INTO wiki(page, author_uid, markdown, changes, address) \
50 VALUES(%s, %s, %s, %s, %s) RETURNING *", page
, author
.uid
, content
or None, changes
, address
)
52 def delete_page(self
, page
, author
, **kwargs
):
53 # Do nothing if the page does not exist
54 if not self
.get_page(page
):
57 # Just creates a blank last version of the page
58 self
.create_page(page
, author
=author
, content
=None, **kwargs
)
62 parts
= list(e
for e
in url
.split("/") if e
)
64 num_parts
= len(parts
)
65 for i
in range(num_parts
):
66 yield "/".join(parts
[:i
])
68 def make_breadcrumbs(self
, url
):
69 for part
in self
._split
_url
(url
):
70 title
= self
.get_page_title(part
, os
.path
.basename(part
))
72 yield ("/%s" % part
, title
)
75 class Page(misc
.Object
):
76 def init(self
, id, data
=None):
80 def __lt__(self
, other
):
81 if isinstance(other
, self
.__class
__):
82 if self
.page
== other
.page
:
83 return self
.timestamp
< other
.timestamp
85 return self
.page
< other
.page
88 def sanitise_page_name(page
):
92 # Make sure that the page name does NOT end with a /
93 if page
.endswith("/"):
96 # Make sure the page name starts with a /
97 if not page
.startswith("/"):
100 # Remove any double slashes
101 page
= page
.replace("//", "/")
111 return self
.data
.page
115 return self
._title
or self
.page
[1:]
119 if not self
.markdown
:
122 # Find first H1 headline in markdown
123 markdown
= self
.markdown
.splitlines()
125 m
= re
.match(r
"^# (.*)( #)?$", markdown
[0])
131 if self
.data
.author_uid
:
132 return self
.backend
.accounts
.get_by_uid(self
.data
.author_uid
)
134 def _render(self
, text
):
135 logging
.debug("Rendering %s" % self
)
137 # Borrow this from the blog
138 return self
.backend
.blog
._render
_text
(text
, lang
="markdown")
142 return self
.data
.markdown
146 return self
.data
.html
or self
._render
(self
.markdown
)
150 return self
.data
.timestamp
152 def was_deleted(self
):
153 return self
.markdown
is None
156 def breadcrumbs(self
):
157 return self
.backend
.wiki
.make_breadcrumbs(self
.page
)
159 def get_latest_revision(self
):
160 revisions
= self
.get_revisions()
162 # Return first object
163 for rev
in revisions
:
166 def get_revisions(self
):
167 return self
.backend
.wiki
._get
_pages
("SELECT * FROM wiki \
168 WHERE page = %s ORDER BY timestamp DESC", self
.page
)
172 return self
.data
.changes
178 parts
= self
.page
.split("/")
181 sidebar
= self
.backend
.wiki
.get_page(os
.path
.join(*parts
, "sidebar"))