]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/webapp/backend/planet.py
5 import tornado
.database
8 from accounts
import Accounts
9 from databases
import Databases
11 from misc
import Singleton
13 class PlanetEntry(object):
14 def __init__(self
, entry
=None):
18 self
.__entry
= tornado
.database
.Row({
24 def set(self
, key
, val
):
25 self
.__entry
[key
] = val
33 return self
.__entry
.id
37 return self
.__entry
.slug
41 return self
.__entry
.title
45 return self
.__entry
.published
49 return self
.__entry
.updated
53 return self
.__entry
.markdown
57 return self
.render(self
.markdown
, 400)
59 def render(self
, text
, limit
=0):
60 return self
.planet
.render(text
, limit
)
64 return self
.render(self
.markdown
)
68 return Accounts().search(self
.__entry
.author_id
)
72 __metaclass__
= Singleton
76 return Databases().webapp
78 def get_authors(self
):
80 for author
in self
.db
.query("SELECT DISTINCT author_id FROM planet"):
81 author
= Accounts().search(author
.author_id
)
83 authors
.append(author
)
85 return sorted(authors
)
87 def get_entry_by_slug(self
, slug
):
88 entry
= self
.db
.get("SELECT * FROM planet WHERE slug = %s", slug
)
90 return PlanetEntry(entry
)
92 def get_entry_by_id(self
, id):
93 entry
= self
.db
.get("SELECT * FROM planet WHERE id = %s", id)
95 return PlanetEntry(entry
)
97 def _limit_and_offset_query(self
, limit
=None, offset
=None):
102 query
+= "LIMIT %d,%d" % (offset
, limit
)
104 query
+= "LIMIT %d" % limit
108 def get_entries(self
, limit
=3, offset
=None):
109 query
= "SELECT * FROM planet WHERE acknowledged='Y' ORDER BY published DESC"
111 # Respect limit and offset
112 query
+= self
._limit
_and
_offset
_query
(limit
=limit
, offset
=offset
)
115 for entry
in self
.db
.query(query
):
116 entries
.append(PlanetEntry(entry
))
120 def get_entries_by_author(self
, author_id
, limit
=None, offset
=None):
121 query
= "SELECT * FROM planet WHERE author_id = '%s'" % author_id
122 query
+= " AND acknowledged='Y' ORDER BY published DESC"
124 # Respect limit and offset
125 query
+= self
._limit
_and
_offset
_query
(limit
=limit
, offset
=offset
)
127 entries
= self
.db
.query(query
)
129 return [PlanetEntry(e
) for e
in entries
]
131 def render(self
, text
, limit
=0):
132 if limit
and len(text
) >= limit
:
133 text
= text
[:limit
] + "..."
134 return textile
.textile(text
)
136 def _generate_slug(self
, title
):
137 slug
= unicodedata
.normalize("NFKD", title
).encode("ascii", "ignore")
138 slug
= re
.sub(r
"[^\w]+", " ", slug
)
139 slug
= "-".join(slug
.lower().strip().split())
145 e
= self
.db
.get("SELECT * FROM planet WHERE slug = %s", slug
)
152 def update_entry(self
, entry
):
153 self
.db
.execute("UPDATE planet SET title = %s, markdown = %s WHERE id = %s",
154 entry
.title
, entry
.markdown
, entry
.id)
156 def save_entry(self
, entry
):
157 slug
= self
._generate
_slug
(entry
.title
)
159 self
.db
.execute("INSERT INTO planet(author_id, title, slug, markdown, published) "
160 "VALUES(%s, %s, %s, %s, UTC_TIMESTAMP())", entry
.author
.uid
, entry
.title
,
161 slug
, entry
.markdown
)