feat: add scoped device catalog and unlimited custom area hierarchy
This commit is contained in:
+10
-6
@@ -81,6 +81,9 @@ class Accounts:
|
||||
ptz_control = data.get('ptzControl', old.get('ptzControl', False) if old else False)
|
||||
if not isinstance(ptz_control, bool):
|
||||
raise a.Problem('云台权限格式不正确')
|
||||
descendants = data.get('includeSubspaces', old.get('includeSubspaces', False) if old else False)
|
||||
if not isinstance(descendants, bool):
|
||||
raise a.Problem('下级区域授权格式不正确')
|
||||
disabled = data.get('disabled', False)
|
||||
if not isinstance(disabled, bool):
|
||||
raise a.Problem('账号状态不正确')
|
||||
@@ -113,10 +116,10 @@ class Accounts:
|
||||
credentials = self.password(password) if password or not old else {k: old[k] for k in ('salt', 'hash')}
|
||||
user = dict(id=uid, username=username, name=a.clean_text(data.get('name', username), 80, True),
|
||||
role=role, disabled=disabled, familyId=family, siteIds=sorted(set(sites)), familyAccess=access, ptzControl=ptz_control,
|
||||
personId=person, relatedToId=related,
|
||||
personId=person, relatedToId=related, includeSubspaces=descendants,
|
||||
relationship=a.clean_text(data.get('relationship', ''), 40), **credentials)
|
||||
# Revoke sessions when credentials or authorization change, not for label edits.
|
||||
if old and any(old.get(k) != user.get(k) for k in ('hash', 'role', 'familyId', 'siteIds', 'familyAccess', 'disabled', 'username', 'ptzControl', 'personId')):
|
||||
if old and any(old.get(k) != user.get(k) for k in ('hash', 'role', 'familyId', 'siteIds', 'includeSubspaces', 'familyAccess', 'disabled', 'username', 'ptzControl', 'personId')):
|
||||
a.DB.execute('DELETE FROM sessions WHERE user_id=?', (uid,))
|
||||
a.save_object('users', user)
|
||||
a.audit('更新账号' if old else '建立账号', username)
|
||||
@@ -154,7 +157,7 @@ class Accounts:
|
||||
site = self.a.get_object('sites', camera.get('siteId'))
|
||||
if site:
|
||||
self.a.HOUSEHOLDS.owns(user, site)
|
||||
if not self.a.HOUSEHOLDS.manager(user) and camera.get('siteId') not in user['siteIds']:
|
||||
if not self.a.HOUSEHOLDS.manager(user) and camera.get('siteId') not in self.a.HOUSEHOLDS.site_ids(user):
|
||||
raise self.a.Problem('没有这个空间的访问权限', 403)
|
||||
return camera
|
||||
|
||||
@@ -171,16 +174,17 @@ class Accounts:
|
||||
family = self.a.HOUSEHOLDS.scope(user)
|
||||
state['familyId'] = family
|
||||
state['households'] = self.a.HOUSEHOLDS.list(user)
|
||||
for key in ('sites', 'assets', 'cameras', 'recorders'):
|
||||
state[key] = [x for x in state[key] if self.a.HOUSEHOLDS.family_of(x) == family]
|
||||
for key in ('sites', 'assets', 'cameras', 'recorders', 'devices'):
|
||||
state[key] = [x for x in state.get(key, []) if self.a.HOUSEHOLDS.family_of(x) == family]
|
||||
if user['role'] != 'admin':
|
||||
state['scan'] = {}
|
||||
state['storage'] = {}
|
||||
if self.a.HOUSEHOLDS.manager(user):
|
||||
return state
|
||||
permitted = set(user['siteIds'])
|
||||
permitted = self.a.HOUSEHOLDS.site_ids(user)
|
||||
state['sites'] = [s for s in state['sites'] if s['id'] in permitted]
|
||||
state['assets'] = [s for s in state['assets'] if s['siteId'] in permitted]
|
||||
state['devices'] = [s for s in state['devices'] if s['siteId'] in permitted]
|
||||
fields = ('id', 'name', 'siteId', 'assetId', 'point', 'enabled', 'ready', 'recordingActive', 'archiveSource')
|
||||
state['cameras'] = [{k: c.get(k) for k in fields} for c in state['cameras'] if c['siteId'] in permitted]
|
||||
state['recorders'] = []
|
||||
|
||||
Reference in New Issue
Block a user