#!/usr/bin/python
+import datetime
import feedparser
import re
import textile
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 \
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:
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
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