]> git.ipfire.org Git - ipfire.org.git/blob - src/backend/news.py
.gitignore: Add .vscode
[ipfire.org.git] / src / backend / news.py
1 #!/usr/bin/python
2
3 from misc import Object
4
5 class News(Object):
6 def get(self, uuid, locale=None):
7 res = self.db.get("SELECT * FROM news WHERE uuid = %s \
8 AND published IS NOT NULL AND published <= NOW()", uuid)
9
10 if res and locale:
11 res = self._translate_news_one(res, locale=locale)
12
13 return res
14
15 def get_by_id(self, id, locale=None):
16 res = self.db.get("SELECT * FROM news WHERE id = %s \
17 AND published IS NOT NULL AND published <= NOW()", id)
18
19 if res and locale:
20 res = self._translate_news_one(res, locale=locale)
21
22 return res
23
24 def get_by_slug(self, slug, locale=None):
25 res = self.db.get("SELECT * FROM news WHERE slug = %s \
26 AND published IS NOT NULL AND published <= NOW()", slug)
27
28 if res:
29 return res
30
31 res = self.db.get("SELECT news_id FROM news_translations WHERE slug = %s", slug)
32 if res:
33 return self.get_by_id(res.news_id, locale=locale)
34
35 def get_latest(self, author=None, locale=None, limit=1, offset=0):
36 query = "SELECT * FROM news WHERE published IS NOT NULL AND published <= NOW()"
37 args = []
38
39 if author:
40 query += " AND author_id = %s"
41 args.append(author)
42
43 query += " ORDER BY published DESC"
44
45 if limit:
46 query += " LIMIT %s"
47 args.append(limit)
48
49 if offset:
50 query += " OFFSET %s"
51 args.append(offset)
52
53 news = self.db.query(query, *args)
54
55 if locale:
56 news = self._translate_news(news, locale=locale)
57
58 return news
59
60 def get_by_year(self, year, locale=None):
61 res = self.db.query("SELECT * FROM news \
62 WHERE published IS NOT NULL AND published <= NOW() \
63 AND EXTRACT(YEAR FROM published) = %s ORDER BY published DESC", year)
64
65 if res and locale:
66 res = self._translate_news(res, locale=locale)
67
68 return res
69
70 def _translate_news(self, news, locale):
71 ret = []
72
73 for n in news:
74 n = self._translate_news_one(n, locale)
75 ret.append(n)
76
77 return ret
78
79 def _translate_news_one(self, news, locale):
80 lang = locale.code[:2]
81
82 res = self.db.get("SELECT * FROM news_translations \
83 WHERE news_id = %s AND lang = %s", news.id, lang)
84
85 if res:
86 news.update(res)
87
88 return news
89
90 @property
91 def years(self):
92 query = self.db.query("SELECT DISTINCT EXTRACT(YEAR FROM published)::integer AS year FROM news \
93 WHERE published IS NOT NULL AND published <= NOW() ORDER BY year DESC")
94
95 return [r.year for r in query]