Coverage for portality / models / news.py: 63%
60 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-05 00:09 +0100
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-05 00:09 +0100
1from portality.dao import DomainObject as DomainObject
2from copy import deepcopy
4from portality.lib import dates
7class News(DomainObject):
8 """~~News:Model~~"""
9 __type__ = "news"
11 @classmethod
12 def by_remote_id(cls, remote_id):
13 # ~~->News:Query~~
14 q = NewsQuery(remote_id)
15 es_result = cls.query(q=q.query())
16 records = [News(**r.get("_source")) for r in es_result.get("hits", {}).get("hits", [])]
17 return records
19 @classmethod
20 def latest(cls, n):
21 q = NewsQuery(size=n)
22 es_result = cls.query(q=q.query())
23 records = [News(**r.get("_source")) for r in es_result.get("hits", {}).get("hits", [])]
24 return records
26 @property
27 def remote_id(self): return self.data.get("remote_id")
28 @remote_id.setter
29 def remote_id(self, rid): self.data["remote_id"] = rid
31 @property
32 def url(self): return self.data.get("url")
33 @url.setter
34 def url(self, link): self.data["url"] = link
36 @property
37 def title(self): return self.data.get("title")
38 @title.setter
39 def title(self, t): self.data["title"] = t
41 @property
42 def updated(self): return self.data.get("updated")
43 @updated.setter
44 def updated(self, date): self.data["updated"] = date
46 @property
47 def published(self): return self.data.get("published")
48 @published.setter
49 def published(self, date): self.data["published"] = date
51 @property
52 def summary(self): return self.data.get("summary")
53 @summary.setter
54 def summary(self, s): self.data["summary"] = s
56 def published_formatted(self, format="%-d %B %Y"):
57 try:
58 dt = dates.parse(self.published)
59 return dt.strftime(format)
60 except:
61 return self.published
64class NewsQuery(object):
65 """~~News:Query->Elasticsearch:Technology~~"""
66 _remote_term = { "term" : { "remote_id.exact" : "<remote id>" } }
68 def __init__(self, remote_id=None, size=5):
69 self.remote_id = remote_id
70 self.size = size
72 def query(self):
73 q = {"track_total_hits": True, "query" : {}, "size" : self.size, "sort" : {"published" : {"order" : "desc", "unmapped_type" : "date"}}}
74 if self.remote_id is not None:
75 rt = deepcopy(self._remote_term)
76 rt["term"]["remote_id.exact"] = self.remote_id
77 q["query"].update(rt)
78 else:
79 q["query"]["match_all"] = {}
80 return q