feat: scoped responsibility selectors, home card layouts and network topology
This commit is contained in:
@@ -113,12 +113,42 @@ class Households:
|
||||
def label(uid):
|
||||
account = self.a.get_object('users', uid)
|
||||
return account.get('name', '') if account else ''
|
||||
inventory = [x for table in ('devices','assets','recorders') for x in self.a.objects(table)]
|
||||
def network_summary(home):
|
||||
devices = [x for x in inventory if self.family_of(x) == home['id'] and
|
||||
(self.manager(user) or x.get('siteId') in self.site_ids(user))]
|
||||
return dict(deviceCount=len(devices), networkAccesses=sorted({x.get('networkAccess','unknown') for x in devices}))
|
||||
return [dict({k: v for k, v in row.items() if k != 'coverData' and (k != 'leadershipHistory' or self.manager(user))}, ownerName=label(row.get('ownerId')), successorName=label(row.get('successorId')),
|
||||
**network_summary(row),
|
||||
coverUrl=('/api/households/cover?id='+row['id']+'&v='+row.get('coverRevision','0')) if row.get('coverData') or row.get('coverRef') else '',
|
||||
canAssignOwner=user['role'] == 'admin' or row.get('ownerId') == user['id'],
|
||||
members=sum(self.family_of(u) == row['id'] for u in self.a.objects('users')),
|
||||
sites=sum(self.family_of(s) == row['id'] for s in self.a.objects('sites'))) for row in rows]
|
||||
|
||||
def layout(self, user):
|
||||
saved = self.a.setting('householdLayout:'+user['id'], {})
|
||||
allowed = {h['id'] for h in self.list(user)}
|
||||
return dict(revision=saved.get('revision', 0), columns=saved.get('columns', 2), rows=saved.get('rows', 2),
|
||||
groupCity=saved.get('groupCity', False), order=[x for x in saved.get('order', []) if x in allowed])
|
||||
|
||||
def save_layout(self, data, user):
|
||||
a = self.a
|
||||
with a.LOCK:
|
||||
old = self.layout(user)
|
||||
if set(data) != {'revision','columns','rows','groupCity','order'}:
|
||||
raise a.Problem('卡片布局参数不正确')
|
||||
if type(data['revision']) is not int or data['revision'] != old['revision']:
|
||||
raise a.Problem('布局已被更新,请刷新后重新排列', 409)
|
||||
for key in ('columns','rows'):
|
||||
if type(data[key]) is not int or not 1 <= data[key] <= 4:
|
||||
raise a.Problem('行数和列数须为 1 到 4')
|
||||
order = data['order']
|
||||
allowed = {h['id'] for h in self.list(user)}
|
||||
if type(data['groupCity']) is not bool or not isinstance(order, list) or len(order) > 1000 or any(not isinstance(x,str) or x not in allowed for x in order) or len(order) != len(set(order)):
|
||||
raise a.Problem('请选择有权访问的家庭/场所,排列不能重复')
|
||||
a.set_setting('householdLayout:'+user['id'], dict(data, revision=old['revision']+1))
|
||||
return self.layout(user)
|
||||
|
||||
def leadership(self, data, user):
|
||||
"""Explicit handover; a backup already has management access during an emergency."""
|
||||
a = self.a
|
||||
|
||||
Reference in New Issue
Block a user