Coverage for gws-app/gws/base/model/manager.py: 0%
48 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-17 01:37 +0200
1"""Model manager."""
3from typing import Optional, cast
5import gws
6from . import default_model
9class Object(gws.ModelManager):
10 def get_model(self, uid, user=None, access=None):
11 model = cast(gws.Model, self.root.get(uid, gws.ext.object.model))
12 if not model:
13 return
14 if user and access and not user.can(access, model):
15 return
16 return model
18 def find_model(self, *objects, user=None, access=None):
19 for obj in objects:
20 if not obj:
21 continue
22 p = self._find(obj, user, access)
23 if p:
24 return p
26 def _find(self, obj, user, access):
27 for model in getattr(obj, 'models', []):
28 if user and access and not user.can(access, model):
29 continue
30 return model
32 def editable_models(self, project, user):
33 res = {}
35 def _collect(obj):
36 for model in getattr(obj, 'models', []):
37 if model.isEditable and user.can_edit(model):
38 res[model.uid] = model
40 if project.map:
41 for la in project.map.rootLayer.descendants():
42 _collect(la)
44 _collect(project)
45 _collect(self.root.app)
47 queue = []
48 for model in res.values():
49 queue.extend(model.related_models())
51 while queue:
52 model = queue.pop(0)
53 if model.uid in res:
54 continue
55 if not user.can_read(model):
56 continue
57 res[model.uid] = model
58 queue.extend(model.related_models())
60 return sorted(res.values(), key=lambda m: m.title)
62 def default_model(self):
63 return self.root.create_shared(default_model.Object, uid='gws.base.core.default_model.Object')