]> git.ipfire.org Git - ipfire.org.git/blobdiff - src/backend/wiki.py
wiki: Simplify code when saving a page
[ipfire.org.git] / src / backend / wiki.py
index a5635bebe0f9be033050c127188b066c3f581bdc..5a285ea8f88e3e639db3d6082e1be048126965a5 100644 (file)
@@ -2,6 +2,7 @@
 
 import logging
 import markdown2
+import os.path
 import re
 
 from . import misc
@@ -26,40 +27,48 @@ class Wiki(misc.Object):
                for row in res:
                        yield Page(self.backend, row.id, data=row)
 
+       def _get_page(self, query, *args):
+               res = self.db.get(query, *args)
+
+               if res:
+                       return Page(self.backend, res.id, data=res)
+
+       def get_page_title(self, page, default=None):
+               doc = self.get_page(page)
+               if doc:
+                       return doc.title
+
+               return default
+
        def get_page(self, page, revision=None):
                page = Page.sanitise_page_name(page)
                assert page
 
                if revision:
-                       res = self.db.get("SELECT * FROM wiki WHERE page = %s \
+                       return self._get_page("SELECT * FROM wiki WHERE page = %s \
                                AND timestamp = %s", page, revision)
                else:
-                       res = self.db.get("SELECT * FROM wiki WHERE page = %s \
+                       return self._get_page("SELECT * FROM wiki WHERE page = %s \
                                ORDER BY timestamp DESC LIMIT 1", page)
 
-               if res:
-                       return Page(self.backend, res.id, data=res)
-
-       def get_recent_changes(self):
+       def get_recent_changes(self, limit=None):
                return self._get_pages("SELECT * FROM wiki \
-                       WHERE timestamp >= NOW() - INTERVAL '4 weeks' ORDER BY timestamp DESC")
+                       WHERE timestamp >= NOW() - INTERVAL '4 weeks' \
+                       ORDER BY timestamp DESC LIMIT %s", limit)
 
-       def create_page(self, page, author, markdown):
+       def create_page(self, page, author, content, changes=None, address=None):
                page = Page.sanitise_page_name(page)
 
-               res = self.db.get("INSERT INTO wiki(page, author_id, markdown) \
-                       VALUES(%s, %s, %s) RETURNING id", page, author.id, markdown)
-
-               if res:
-                       return self.get_page_by_id(res.id)
+               return self._get_page("INSERT INTO wiki(page, author_uid, markdown, changes, address) \
+                       VALUES(%s, %s, %s, %s, %s) RETURNING *", page, author.uid, content or None, changes, address)
 
-       def delete_page(self, page, author):
+       def delete_page(self, page, author, **kwargs):
                # Do nothing if the page does not exist
                if not self.get_page(page):
                        return
 
                # Just creates a blank last version of the page
-               self.create_page(page, author, None)
+               self.create_page(page, author=author, content=None, **kwargs)
 
        @staticmethod
        def _split_url(url):
@@ -108,7 +117,7 @@ class Page(misc.Object):
 
        @property
        def url(self):
-               return "/%s" % self.page
+               return self.page
 
        @property
        def page(self):
@@ -130,6 +139,11 @@ class Page(misc.Object):
                if m:
                        return m.group(1)
 
+       @lazy_property
+       def author(self):
+               if self.data.author_uid:
+                       return self.backend.accounts.get_by_uid(self.data.author_uid)
+
        def _render(self, text):
                logging.debug("Rendering %s" % self)
 
@@ -157,3 +171,20 @@ class Page(misc.Object):
 
        def get_latest_revision(self):
                return self.backend.wiki.get_page(self.page)
+
+       @property
+       def changes(self):
+               return self.data.changes
+
+       # Sidebar
+
+       @lazy_property
+       def sidebar(self):
+               parts = self.page.split("/")
+
+               while parts:
+                       sidebar = self.backend.wiki.get_page(os.path.join(*parts, "sidebar"))
+                       if sidebar:
+                               return sidebar
+
+                       parts.pop()