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
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 22:59 +0200
1from typing import Optional
3import gws
4import gws.base.shape
5import gws.lib.style
6import gws.lib.svg
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
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 = ''
34 def __repr__(self):
35 try:
36 return f'<feature {self.model.uid}:{self.uid()}>'
37 except:
38 return f'<feature ?>'
40 def uid(self):
41 if self.model.uidName:
42 return str(self.attributes.get(self.model.uidName))
43 return ''
45 def shape(self):
46 if self.model.geometryName:
47 return self.attributes.get(self.model.geometryName)
49 def get(self, name, default=None):
50 return self.attributes.get(name, default)
52 def has(self, name):
53 return name in self.attributes
55 def set(self, name, value):
56 self.attributes[name] = value
57 return self
59 def raw(self, name):
60 return self.record.attributes.get(name)
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
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
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)