]>
git.ipfire.org Git - ipfire.org.git/blob - 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
.published
.year
53 return self
.published
.month
57 return self
.__entry
.updated
61 return self
.__entry
.markdown
65 return self
.render(self
.markdown
, 400)
67 def render(self
, text
, limit
=0):
68 return self
.planet
.render(text
, limit
)
72 return self
.render(self
.markdown
)
76 return Accounts().search(self
.__entry
.author_id
)
80 __metaclass__
= Singleton
84 return Databases().webapp
86 def get_authors(self
):
88 for author
in self
.db
.query("SELECT DISTINCT author_id FROM planet"):
89 author
= Accounts().search(author
.author_id
)
91 authors
.append(author
)
93 return sorted(authors
)
96 res
= self
.db
.query("SELECT DISTINCT YEAR(published) AS year \
97 FROM planet ORDER BY year DESC")
99 return [row
.year
for row
in res
]
101 def get_entry_by_slug(self
, slug
):
102 entry
= self
.db
.get("SELECT * FROM planet WHERE slug = %s", slug
)
104 return PlanetEntry(entry
)
106 def get_entry_by_id(self
, id):
107 entry
= self
.db
.get("SELECT * FROM planet WHERE id = %s", id)
109 return PlanetEntry(entry
)
111 def _limit_and_offset_query(self
, limit
=None, offset
=None):
116 query
+= "LIMIT %d,%d" % (offset
, limit
)
118 query
+= "LIMIT %d" % limit
122 def get_entries(self
, limit
=3, offset
=None):
123 query
= "SELECT * FROM planet WHERE acknowledged='Y' ORDER BY published DESC"
125 # Respect limit and offset
126 query
+= self
._limit
_and
_offset
_query
(limit
=limit
, offset
=offset
)
129 for entry
in self
.db
.query(query
):
130 entries
.append(PlanetEntry(entry
))
134 def get_entries_by_author(self
, author_id
, limit
=None, offset
=None):
135 query
= "SELECT * FROM planet WHERE author_id = '%s'" % author_id
136 query
+= " AND acknowledged='Y' ORDER BY published DESC"
138 # Respect limit and offset
139 query
+= self
._limit
_and
_offset
_query
(limit
=limit
, offset
=offset
)
141 entries
= self
.db
.query(query
)
143 return [PlanetEntry(e
) for e
in entries
]
145 def get_entries_by_year(self
, year
):
146 entries
= self
.db
.query("SELECT * FROM planet \
147 WHERE YEAR(published) = %s ORDER BY published DESC", year
)
149 return [PlanetEntry(e
) for e
in entries
]
151 def render(self
, text
, limit
=0):
152 if limit
and len(text
) >= limit
:
153 text
= text
[:limit
] + "..."
154 return textile
.textile(text
)
156 def _generate_slug(self
, title
):
157 slug
= unicodedata
.normalize("NFKD", title
).encode("ascii", "ignore")
158 slug
= re
.sub(r
"[^\w]+", " ", slug
)
159 slug
= "-".join(slug
.lower().strip().split())
165 e
= self
.db
.get("SELECT * FROM planet WHERE slug = %s", slug
)
172 def update_entry(self
, entry
):
173 self
.db
.execute("UPDATE planet SET title = %s, markdown = %s WHERE id = %s",
174 entry
.title
, entry
.markdown
, entry
.id)
176 def save_entry(self
, entry
):
177 slug
= self
._generate
_slug
(entry
.title
)
179 self
.db
.execute("INSERT INTO planet(author_id, title, slug, markdown, published) "
180 "VALUES(%s, %s, %s, %s, UTC_TIMESTAMP())", entry
.author
.uid
, entry
.title
,
181 slug
, entry
.markdown
)
183 def search(self
, what
):
184 entries
= self
.db
.query("SELECT *, MATCH(markdown, title) AGAINST(%s) AS score \
185 FROM planet WHERE MATCH(markdown, title) AGAINST(%s) ORDER BY score DESC", what
, what
)
187 return [PlanetEntry(e
) for e
in entries
]