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

1"""Base layer for database tables.""" 

2 

3from typing import Optional 

4 

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 

13 

14 

15class Config(gws.base.layer.Config): 

16 """Database layer.""" 

17 

18 dbUid: Optional[str] 

19 """UID of the database provider.""" 

20 tableName: str 

21 """Table name, optionally schema-qualified.""" 

22 

23 

24class Object(gws.base.layer.vector.Object): 

25 """Base vector layer for a database table. 

26 

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 """ 

31 

32 db: gws.DatabaseProvider 

33 """Database provider.""" 

34 tableName: str 

35 """Table name, optionally schema-qualified.""" 

36 

37 def configure(self): 

38 self.configure_layer() 

39 

40 def configure_provider(self): 

41 return gws.config.util.configure_database_provider_for(self) 

42 

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 

51 

52 def configure_models(self): 

53 return gws.config.util.configure_models_for(self, with_default=True) 

54 

55 def create_model(self, cfg): 

56 """Create a model of the layer's type for the layer's table. 

57 

58 Args: 

59 cfg: Model configuration, or ``None`` for the default model. 

60 

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 ) 

71 

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 

81 

82 def configure_search(self): 

83 if super().configure_search(): 

84 return True 

85 self.finders.append(self.create_finder(None)) 

86 return True 

87 

88 def create_finder(self, cfg): 

89 """Create a finder of the layer's type for the layer's table. 

90 

91 Args: 

92 cfg: Finder configuration, or ``None`` for the default finder. 

93 

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 )