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

1"""Model manager.""" 

2 

3from typing import Optional, cast 

4 

5import gws 

6from . import default_model 

7 

8 

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 

17 

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 

25 

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 

31 

32 def editable_models(self, project, user): 

33 res = {} 

34 

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 

39 

40 if project.map: 

41 for la in project.map.rootLayer.descendants(): 

42 _collect(la) 

43 

44 _collect(project) 

45 _collect(self.root.app) 

46 

47 queue = [] 

48 for model in res.values(): 

49 queue.extend(model.related_models()) 

50 

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()) 

59 

60 return sorted(res.values(), key=lambda m: m.title) 

61 

62 def default_model(self): 

63 return self.root.create_shared(default_model.Object, uid='gws.base.core.default_model.Object')