]> git.ipfire.org Git - ipfire.org.git/blobdiff - src/backend/blog.py
blog: Add drafts section
[ipfire.org.git] / src / backend / blog.py
index 980cc676265115c41d4865d096d3675250c39a66..89a8d5e9914793d1020f60c4ae7d32234853e284 100644 (file)
@@ -1,5 +1,6 @@
 #!/usr/bin/python
 
+import datetime
 import feedparser
 import re
 import textile
@@ -56,6 +57,18 @@ class Blog(misc.Object):
                                AND published_at <= NOW() \
                        ORDER BY published_at DESC", year)
 
+       def get_drafts(self, author=None, limit=None):
+               if author:
+                       return self._get_posts("SELECT * FROM blog \
+                               WHERE author_uid = %s \
+                                       AND (published_at IS NULL OR published_at > NOW()) \
+                               ORDER BY COALESCE(updated_at, created_at) DESC LIMIT %s",
+                               author.uid, limit)
+
+               return self._get_posts("SELECT * FROM blog \
+                       WHERE (published_at IS NULL OR published_at > NOW()) \
+                       ORDER BY COALESCE(updated_at, created_at) DESC LIMIT %s", limit)
+
        def search(self, query, limit=None):
                return self._get_posts("SELECT blog.* FROM blog \
                        LEFT JOIN blog_search_index search_index ON blog.id = search_index.post_id \
@@ -63,6 +76,14 @@ class Blog(misc.Object):
                                ORDER BY ts_rank(search_index.document, to_tsquery('english', %s)) DESC \
                        LIMIT %s", query, query, limit)
 
+       def create_post(self, title, text, author, tags=[]):
+               """
+                       Creates a new post and returns the resulting Post object
+               """
+               return self._get_post("INSERT INTO blog(title, slug, text, author_uid, tags) \
+                       VALUES(%s, %s, %s, %s, %s) RETURNING *", title, self._make_slug(title),
+                       text, author.uid, list(tags))
+
        def _make_slug(self, s):
                # Remove any non-ASCII characters
                try:
@@ -167,10 +188,22 @@ class Post(misc.Object):
                self.id   = id
                self.data = data
 
-       @property
-       def title(self):
+       # Title
+
+       def get_title(self):
                return self.data.title
 
+       def set_title(self, title):
+               self.db.execute("UPDATE blog SET title = %s \
+                       WHERE id = %s", title, self.id)
+
+               # Update slug if post is not published, yet
+               if not self.is_published():
+                       self.db.execute("UPDATE blog SET slug = %s \
+                               WHERE id = %s", self.backend.blog._make_slug(title), self.id)
+
+       title = property(get_title, set_title)
+
        @property
        def slug(self):
                return self.data.slug
@@ -187,25 +220,72 @@ class Post(misc.Object):
        def created_at(self):
                return self.data.created_at
 
+       # Published?
+
        @property
        def published_at(self):
                return self.data.published_at
 
+       def is_published(self):
+               """
+                       Returns True if the post is already published
+               """
+               return self.published_at and self.published_at <= datetime.datetime.now()
+
+       def publish(self):
+               if self.is_published():
+                       return
+
+               self.db.execute("UPDATE blog SET published_at = NOW() \
+                       WHERE id = %s", self.id)
+
+               # Update search indices
+               self.backend.blog.refresh()
+
+       # Updated?
+
        @property
-       def markdown(self):
-               return self.data.markdown
+       def updated_at(self):
+               return self.data.updated_at
+
+       def updated(self):
+               self.db.execute("UPDATE blog SET updated_at = NOW() \
+                       WHERE id = %s", self.id)
+
+               # Update search indices
+               self.backend.blog.refresh()
+
+       # Text
+
+       def get_text(self):
+               return self.data.text
+
+       def set_text(self, text):
+               self.db.execute("UPDATE blog SET text = %s \
+                       WHERE id = %s", text, self.id)
+
+       text = property(get_text, set_text)
+
+       # HTML
 
        @property
        def html(self):
                """
                        Returns this post as rendered HTML
                """
-               return self.data.html or textile.textile(self.markdown.decode("utf-8"))
+               return self.data.html or textile.textile(self.text.decode("utf-8"))
 
-       @property
-       def tags(self):
+       # Tags
+
+       def get_tags(self):
                return self.data.tags
 
+       def set_tags(self, tags):
+               self.db.execute("UPDATE blog SET tags = %s \
+                       WHERE id = %s", list(tags), self.id)
+
+       tags = property(get_tags, set_tags)
+
        @property
        def link(self):
                return self.data.link