From: Michael Tremer Date: Tue, 14 Jul 2015 19:49:26 +0000 (+0200) Subject: Move translation of news to an extra table X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2cb93d130044564faa708a3af3381a94cec5f444;p=ipfire.org.git Move translation of news to an extra table We won't release any news in non-English any more but of course we want to preserve the old ones. --- diff --git a/webapp/backend/news.py b/webapp/backend/news.py index 51dfd448..dbdffde8 100644 --- a/webapp/backend/news.py +++ b/webapp/backend/news.py @@ -3,14 +3,35 @@ from misc import Object class News(Object): - def get(self, uuid, lang="en"): - return self.db.get("SELECT * FROM news WHERE uuid = %s AND lang = %s \ - AND published IS NOT NULL AND published <= NOW()", uuid, lang) + def get(self, uuid, locale=None): + res = self.db.get("SELECT * FROM news WHERE uuid = %s \ + AND published IS NOT NULL AND published <= NOW()", uuid) - def get_by_slug(self, slug): - return self.db.get("SELECT * FROM news WHERE slug = %s \ + if res and locale: + res = self._translate_news_one(res, locale=locale) + + return res + + def get_by_id(self, id, locale=None): + res = self.db.get("SELECT * FROM news WHERE id = %s \ + AND published IS NOT NULL AND published <= NOW()", id) + + if res and locale: + res = self._translate_news_one(res, locale=locale) + + return res + + def get_by_slug(self, slug, locale=None): + res = self.db.get("SELECT * FROM news WHERE slug = %s \ AND published IS NOT NULL AND published <= NOW()", slug) + if res: + return res + + res = self.db.get("SELECT news_id FROM news_translations WHERE slug = %s", slug) + if res: + return self.get_by_id(res.news_id, locale=locale) + def get_latest(self, author=None, locale=None, limit=1, offset=0): query = "SELECT * FROM news WHERE published IS NOT NULL AND published <= NOW()" args = [] @@ -19,10 +40,6 @@ class News(Object): query += " AND author_id = %s" args.append(author) - if locale: - query += " AND lang = %s" - args.append(locale.code[:2]) - query += " ORDER BY published DESC" if limit: @@ -33,20 +50,42 @@ class News(Object): query += " OFFSET %s" args.append(offset) - return self.db.query(query, *args) + news = self.db.query(query, *args) + + if locale: + news = self._translate_news(news, locale=locale) + + return news def get_by_year(self, year, locale=None): - query = "SELECT * FROM news WHERE published IS NOT NULL AND published <= NOW() \ - AND EXTRACT(YEAR FROM published) = %s" - args = [year,] + res = self.db.query("SELECT * FROM news \ + WHERE published IS NOT NULL AND published <= NOW() \ + AND EXTRACT(YEAR FROM published) = %s ORDER BY published DESC", year) - if locale: - query += " AND lang = %s" - args.append(locale.code[:2]) + if res and locale: + res = self._translate_news(res, locale=locale) - query += " ORDER BY published DESC" + return res + + def _translate_news(self, news, locale): + ret = [] + + for n in news: + n = self._translate_news_one(n, locale) + ret.append(n) + + return ret + + def _translate_news_one(self, news, locale): + lang = locale.code[:2] + + res = self.db.get("SELECT * FROM news_translations \ + WHERE news_id = %s AND lang = %s", news.id, lang) + + if res: + news.update(res) - return self.db.query(query, *args) + return news @property def years(self): diff --git a/webapp/handlers.py b/webapp/handlers.py index aef63b74..8a2ca66f 100644 --- a/webapp/handlers.py +++ b/webapp/handlers.py @@ -74,7 +74,7 @@ class IndexHandler(BaseHandler): def get_latest_news(self, count=5): latest_news = [] - for news in self.news.get_latest(limit=count, locale=self.locale): + for news in self.news.get_latest(limit=count): latest_news.append(("news", news)) for post in self.planet.get_entries(limit=count): diff --git a/webapp/handlers_news.py b/webapp/handlers_news.py index 18fd7f70..26a05cac 100644 --- a/webapp/handlers_news.py +++ b/webapp/handlers_news.py @@ -30,7 +30,7 @@ class NewsItemHandler(BaseHandler): This handler displays a whole page full of a single news item. """ def get(self, slug): - news = self.news.get_by_slug(slug) + news = self.news.get_by_slug(slug, locale=self.locale) if not news: raise tornado.web.HTTPError(404)