Coverage for gws-app/gws/base/feature/__init__.py: 83%

58 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-10-16 22:59 +0200

1from typing import Optional 

2 

3import gws 

4import gws.base.shape 

5import gws.lib.style 

6import gws.lib.svg 

7 

8 

9def new( 

10 model: gws.Model, 

11 attributes: Optional[dict] = None, 

12 record: Optional[gws.FeatureRecord] = None, 

13 props: Optional[gws.FeatureProps] = None 

14) -> gws.Feature: 

15 f = Feature(model) 

16 f.attributes = attributes or {} 

17 f.record = record or gws.FeatureRecord(attributes={}) 

18 f.props = props or gws.FeatureProps(attributes={}) 

19 return f 

20 

21 

22class Feature(gws.Feature): 

23 def __init__(self, model: gws.Model): 

24 self.attributes = {} 

25 self.category = '' 

26 self.cssSelector = '' 

27 self.errors = [] 

28 self.isNew = False 

29 self.model = model 

30 self.views = {} 

31 self.createWithFeatures = [] 

32 self.insertedPrimaryKey = '' 

33 

34 def __repr__(self): 

35 try: 

36 return f'<feature {self.model.uid}:{self.uid()}>' 

37 except: 

38 return f'<feature ?>' 

39 

40 def uid(self): 

41 if self.model.uidName: 

42 return str(self.attributes.get(self.model.uidName)) 

43 return '' 

44 

45 def shape(self): 

46 if self.model.geometryName: 

47 return self.attributes.get(self.model.geometryName) 

48 

49 def get(self, name, default=None): 

50 return self.attributes.get(name, default) 

51 

52 def has(self, name): 

53 return name in self.attributes 

54 

55 def set(self, name, value): 

56 self.attributes[name] = value 

57 return self 

58 

59 def raw(self, name): 

60 return self.record.attributes.get(name) 

61 

62 def render_views(self, templates, **kwargs): 

63 tri = gws.TemplateRenderInput( 

64 args=gws.u.merge( 

65 self.attributes, 

66 kwargs, 

67 feature=self 

68 )) 

69 for tpl in templates: 

70 view_name = tpl.subject.split('.')[-1] 

71 self.views[view_name] = tpl.render(tri).content 

72 return self 

73 

74 def transform_to(self, crs) -> gws.Feature: 

75 if self.shape(): 

76 self.attributes[self.model.geometryName] = self.shape().transformed_to(crs) 

77 return self 

78 

79 def to_svg(self, view, label=None, style=None): 

80 if not self.shape(): 

81 return [] 

82 shape = self.shape().transformed_to(view.bounds.crs) 

83 return gws.lib.svg.shape_to_fragment(shape, view, label, style)