Coverage for portality/models/editors.py: 92%
91 statements
« prev ^ index » next coverage.py v6.4.2, created at 2022-09-21 00:49 +0100
« prev ^ index » next coverage.py v6.4.2, created at 2022-09-21 00:49 +0100
1from portality.dao import DomainObject, ScrollInitialiseException
2from portality.models import Account
5class EditorGroup(DomainObject):
6 """
7 ~~EditorGroup:Model~~
8 """
9 __type__ = "editor_group"
11 @classmethod
12 def group_exists_by_name(cls, name):
13 q = EditorGroupQuery(name)
14 res = cls.query(q=q.query())
15 ids = [hit.get("_source", {}).get("id") for hit in res.get("hits", {}).get("hits", []) if "_source" in hit]
16 if len(ids) == 0:
17 return None
18 if len(ids) > 0:
19 return ids[0]
21 @classmethod
22 def _groups_by_x(cls, **kwargs):
23 """ Generalised editor groups by maned / editor / associate """
24 # ~~-> EditorGroupMember:Query~~
25 q = EditorGroupMemberQuery(**kwargs)
26 try:
27 return [g for g in cls.iterate(q.query(), page_size=100)]
28 except ScrollInitialiseException:
29 # If there's no mapping for editor groups, the account definitely has no assignments.
30 return []
32 @classmethod
33 def groups_by_maned(cls, maned):
34 return cls._groups_by_x(maned=maned)
36 @classmethod
37 def groups_by_editor(cls, editor):
38 return cls._groups_by_x(editor=editor)
40 @classmethod
41 def groups_by_associate(cls, associate):
42 return cls._groups_by_x(associate=associate)
44 @property
45 def name(self):
46 return self.data.get("name")
48 def set_name(self, val):
49 self.data["name"] = val
51 @property
52 def maned(self):
53 return self.data.get("maned")
55 def set_maned(self, val):
56 self.data["maned"] = val
58 def get_maned_account(self):
59 return Account.pull(self.maned)
61 @property
62 def editor(self):
63 return self.data.get("editor")
65 def set_editor(self, val):
66 self.data["editor"] = val
68 def get_editor_account(self):
69 return Account.pull(self.editor)
71 @property
72 def associates(self):
73 return self.data.get("associates", [])
75 def set_associates(self, val):
76 if not isinstance(val, list):
77 val = [val]
78 self.data["associates"] = val
80 def add_associate(self, val):
81 if "associates" not in self.data:
82 self.data["associates"] = []
83 self.data["associates"].append(val)
85 def get_associate_accounts(self):
86 accs = []
87 for a in self.associates:
88 acc = Account.pull(a)
89 accs.append(acc)
90 return accs
92 def is_member(self, account_name):
93 """ Determine if an account is a member of this Editor Group """
94 all_eds = self.associates + [self.editor]
95 return account_name in all_eds
98class EditorGroupQuery(object):
99 def __init__(self, name):
100 self.name = name
102 def query(self):
103 q = {
104 "track_total_hits" : True,
105 "query": {"term": {"name.exact": self.name}}
106 }
107 return q
110class EditorGroupMemberQuery(object):
111 """
112 ~~EditorGroupMember:Query->Elasticsearch:Technology~~
113 """
114 def __init__(self, editor=None, associate=None, maned=None):
115 self.editor = editor
116 self.associate = associate
117 self.maned = maned
119 def query(self):
120 q = {
121 "track_total_hits": True,
122 "query": {"bool": {"should": []}},
123 "sort": {"name.exact": {"order" : "asc"}}
124 }
125 if self.editor is not None:
126 et = {"term": {"editor.exact": self.editor}}
127 q["query"]["bool"]["should"].append(et)
128 if self.associate is not None:
129 at = {"term": {"associates.exact": self.associate}}
130 q["query"]["bool"]["should"].append(at)
131 if self.maned is not None:
132 mt = {"term" : {"maned.exact" : self.maned}}
133 q["query"]["bool"]["should"].append(mt)
134 return q