Coverage for gws-app/gws/base/database/layer.py: 89%
47 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 13:35 +0200
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 13:35 +0200
1"""Base layer for database tables."""
3from typing import Optional
5import gws
6import gws.base.database
7import gws.base.layer
8import gws.lib.bounds
9import gws.base.feature
10import gws.lib.crs
11import gws.lib.shape
12import gws.config.util
15class Config(gws.base.layer.Config):
16 """Database layer."""
18 dbUid: Optional[str]
19 """UID of the database provider."""
20 tableName: str
21 """Table name, optionally schema-qualified."""
24class Object(gws.base.layer.vector.Object):
25 """Base vector layer for a database table.
27 Shows the features of one table. Provides subclasses with the database
28 provider, the table description and default models and finders of the
29 layer's type for the table.
30 """
32 db: gws.DatabaseProvider
33 """Database provider."""
34 tableName: str
35 """Table name, optionally schema-qualified."""
37 def configure(self):
38 self.configure_layer()
40 def configure_provider(self):
41 return gws.config.util.configure_database_provider_for(self)
43 def configure_sources(self):
44 self.tableName = self.cfg('tableName') or self.cfg('_defaultTableName')
45 desc = self.db.describe(self.tableName)
46 if not desc:
47 raise gws.Error(f'table not found or not readable: {self.tableName!r}')
48 self.geometryType = desc.geometryType
49 self.geometryCrs = gws.lib.crs.get(desc.geometrySrid)
50 return True
52 def configure_models(self):
53 return gws.config.util.configure_models_for(self, with_default=True)
55 def create_model(self, cfg):
56 """Create a model of the layer's type for the layer's table.
58 Args:
59 cfg: Model configuration, or ``None`` for the default model.
61 Returns:
62 The model object.
63 """
64 return self.create_child(
65 gws.ext.object.model,
66 cfg,
67 type=self.extType,
68 _defaultDb=self.db,
69 _defaultTableName=self.tableName
70 )
72 def configure_extent(self):
73 if super().configure_extent():
74 return True
75 b = self.db.table_bounds(self.tableName)
76 if b:
77 ext = gws.lib.bounds.wgs_extent(b, pad=True)
78 if ext:
79 self.wgsExtent = ext
80 return True
82 def configure_search(self):
83 if super().configure_search():
84 return True
85 self.finders.append(self.create_finder(None))
86 return True
88 def create_finder(self, cfg):
89 """Create a finder of the layer's type for the layer's table.
91 Args:
92 cfg: Finder configuration, or ``None`` for the default finder.
94 Returns:
95 The finder object.
96 """
97 return self.create_child(
98 gws.ext.object.finder,
99 cfg,
100 type=self.extType,
101 _defaultDb=self.db,
102 _defaultTableName=self.tableName
103 )