def default_templates(self): base = gws.dirname(__file__) + '/templates' return [ gws.Config( type='py', path=f'{base}/getCapabilities.py', subject='ows.GetCapabilities', mimeTypes=['xml'], access='all:allow', ), gws.Config( type='py', path=f'{base}/getRecords.py', subject='ows.getRecords', mimeTypes=['xml'], access='all:allow', ), gws.Config( type='py', path=f'{base}/getRecordById.py', subject='ows.GetRecordById', mimeTypes=['xml'], access='all:allow', ), gws.Config( type='py', path=f'{base}/record.py', subject='ows.Record', mimeTypes=['xml'], access='all:allow', ), ]
def export(self, req: gws.IWebRequest, p: ExportParams) -> ExportResponse: """Export Flurstueck features""" project = req.require_project(p.projectUid) fp = p.findParams fp.projectUid = project.uid fp.localeUid = p.localeUid res = self._find(req, fp, self.limit) if not res.features: raise gws.base.web.error.NotFound() combined_rules: t.List[gws.base.model.Rule] = [] group_indexes = sorted(int(i) for i in p.groupIndexes) for i in group_indexes: combined_rules.extend(self.export_groups[i].data_model.rules) combined_model = self.root.create_object( gws.base.model.Object, gws.Config(rules=combined_rules), shared=True, key=group_indexes) csv_bytes = util.export.to_csv(self, res.features, combined_model) return ExportResponse(content=csv_bytes, mime='text/csv')
def _render_html_boxes(self, tri): # iterate the template XML tree, find `LayoutHtml` blocks # and create a dict block.uuid -> rendered_html tri_for_boxes = gws.TemplateRenderInput(context=tri.context, crs=tri.crs, dpi=tri.dpi, locale_uid=tri.locale_uid, maps=tri.maps, out_mime=gws.lib.mime.HTML, user=tri.user) boxes = {} for el in self.template.elements: if el.type != 'html': continue text = el.attributes.get('html', '') tpl = self.root.create_object('gws.ext.template.html', gws.Config(text=text)) res = tpl.render(tri_for_boxes) if res.content != text: boxes[el.uuid] = res.content return boxes
def create_from_path(root: gws.IRoot, path, parent: gws.Node = None, shared: bool = False) -> t.Optional['Object']: for ext, typ in _types.items(): if path.endswith(ext): return create(root, gws.Config(type=typ, path=path), parent, shared)
def default_templates(self): return [ gws.Config( type='py', path=gws.dirname(__file__) + '/templates/getCapabilities.py', subject='ows.GetCapabilities', mimeTypes=['xml'], access='all:allow', ), gws.Config( type='py', path=gws.dirname(__file__) + '/templates/describeCoverage.py', subject='ows.DescribeCoverage', mimeTypes=['xml'], access='all:allow', ), ]
def configure_search(self): if not super().configure_search(): self.search_providers.append( self.root.create_object( 'gws.ext.search.provider.postgres', gws.Config(_provider=self.provider, _table=self.table), shared=True, key=[self.provider.uid, self.table.name])) return True
def default_templates(self): return [ gws.Config( type='py', path=gws.dirname(__file__) + '/templates/getCapabilities.py', subject='ows.GetCapabilities', mimeTypes=['xml'], access='all:allow', ), # NB use the wfs template gws.Config( type='py', path=gws.dirname(__file__) + '/../wfs/templates/getFeature.py', subject='ows.GetFeatureInfo', mimeTypes=['xml', 'gml', 'gml3'], access='all:allow', ), ]
def configure_search(obj: gws.IOwsClient, search_class): slf = gws.gis.source.LayerFilter(is_queryable=True) queryable_layers = gws.gis.source.filter_layers(obj.source_layers, slf) if queryable_layers: t.cast(gws.ILayer, obj).search_providers.append( obj.require_child( search_class, gws.Config(_provider=obj.provider, _source_layers=queryable_layers))) return True
def table_data_model_config(self, table: gws.SqlTable) -> gws.Config: rules = [] for col in self.describe(table): if col.is_geometry: continue rules.append( gws.base.model.Rule( title=col.name, name=col.name, source=col.name, type=col.type, editable=not col.is_key, )) return gws.Config( rules=rules, geometryType=table.geometry_column.type if table.geometry_column else None, crs=table.geometry_column.srid if table.geometry_column else None, )
def configure(self): ds = self.var('_data_source') cfg = { 'database': ds['dbname'], 'host': ds['host'], 'port': ds['port'], 'user': ds['user'], 'password': ds['password'], } self.extra_where = [] sql = ds.get('sql') if sql: self.extra_where = [sql.replace('%', '%%')] self.db = gws.base.db.postgres.provider.create(self.root, cfg, shared=True) self.table = self.db.configure_table( gws.Config(name=ds.get('table'), geometryColumn=ds.get('geometryColumn')))
import gws.base.api import gws.base.client import gws.base.map import gws.base.printer import gws.base.search import gws.base.template import gws.base.web import gws.lib.metadata import gws.types as t _DEFAULT_TEMPLATES = [ gws.Config( type='html', path=gws.dirname(__file__) + '/templates/project_description.cx.html', subject='project.description', access=[{ 'role': 'all', 'type': 'allow' }], ), ] class Config(gws.WithAccess): """Project configuration""" api: t.Optional[gws.base.api.Config] #: project-specific actions assets: t.Optional[ gws.base.web.DocumentRootConfig] #: project-specific assets options client: t.Optional[ gws.base.client.Config] #: project-specific gws client configuration
def _dct2cfg(d): if isinstance(d, dict): return gws.Config({k: _dct2cfg(v) for k, v in d.items()}) if isinstance(d, (list, tuple)): return [_dct2cfg(v) for v in d] return d
def configure(self): self.version = gws.VERSION self.qgis_version = '' self._devopts = self.var('developer') or {} if self._devopts: gws.log.warn('developer mode enabled') self.set_uid('APP') if self.var('server.qgis.enabled'): qgis_server = gws.import_from_path('gws/plugin/qgis/server.py') self.qgis_version = qgis_server.version() s = f'GWS version {self.version}' if self.qgis_version: s += f', QGis {self.qgis_version}' gws.log.info('*' * 40) gws.log.info(s) gws.log.info('*' * 40) self.locale_uids = self.var('locales') or ['en_CA'] self.monitor = self.require_child(gws.server.monitor.Object, self.var('server.monitor')) self.metadata = gws.lib.metadata.from_config(self.var('metadata')) p = self.var('fonts.dir') if p: gws.lib.font.install_fonts(p) # NB the order of initialization is important # - db # - helpers # - auth providers # - actions, client, web # - finally, projects self.dbs = self.create_children('gws.ext.db.provider', self.var('db.providers')) # helpers are always created, no matter configured or not cnf = {c.get('type'): c for c in self.var('helpers', default=[])} for class_name in self.root.specs.real_class_names('gws.ext.helper'): desc = self.root.specs.object_descriptor(class_name) if desc.ext_type not in cnf: gws.log.debug(f'ad-hoc helper {desc.ext_type!r} will be created') cfg = gws.Config(type=desc.ext_type) cnf[desc.ext_type] = gws.config.parse(self.root.specs, cfg, 'gws.ext.helper.Config') self.helpers = self.create_children('gws.ext.helper', list(cnf.values())) self.auth = self.require_child(gws.base.auth.manager.Object, self.var('auth')) # @TODO default API self.api = self.require_child(gws.base.api.Object, self.var('api')) p = self.var('web.sites') or [gws.base.web.DEFAULT_SITE] ssl = bool(self.var('web.ssl')) cfgs = [gws.merge(c, ssl=ssl) for c in p] self.web_sites = self.create_children(gws.base.web.site.Object, cfgs) self.client = self.create_child_if_config(gws.base.client.Object, self.var('client')) self.projects = [] for cfg in self.var('projects', default=[]): # @TODO: parallel config? self.projects.append(self.create_child(gws.base.project.Object, cfg))
import gws.lib.net import gws.base.web.error _INDEX_TABLE_NAME = 'dprocon_house' _LOG_TABLE_NAME = 'dprocon_log' _cwd = os.path.dirname(__file__) _DEFAULT_TEMPLATES = [ gws.Config(subject='feature.description', type='html', text=''' <p class="head">{title}</p> <table> @each attributes as k, v <tr> <td>{k | html}</td> <td align=right>{v | html}</td> </tr> @end </table> ''') ] class Config(gws.WithAccess): """D-Procon connector action""" cacheTime: gws.Duration = '24h' #: request cache life time dataTableName: str #: table to store consolidated results dataTablePattern: str #: pattern for result tables to consolidate
class ExportGroupProps(gws.Props): index: int title: str _DEFAULT_EXPORT_GROUPS = [ gws.Config( title='Basisdaten', dataModel=gws.Config(rules=[ gws.Config(source='gemeinde', title='Gemeinde'), gws.Config(source='gemarkung_id', title='Gemarkung ID'), gws.Config(source='gemarkung', title='Gemarkung'), gws.Config(source='flurnummer', title='Flurnummer', type=gws.AttributeType.int), gws.Config( source='zaehler', title='Zähler', type=gws.AttributeType.int), gws.Config(source='nenner', title='Nenner'), gws.Config(source='flurstuecksfolge', title='Folge'), gws.Config(source='amtlicheflaeche', title='Fläche', type=gws.AttributeType.float), gws.Config(source='x', title='X', type=gws.AttributeType.float), gws.Config(source='y', title='Y', type=gws.AttributeType.float), ])), gws.Config(title='Lage', dataModel=gws.Config(rules=[ gws.Config(source='lage_strasse', title='FS Strasse'), gws.Config(source='lage_hausnummer', title='FS Hnr'), ])), gws.Config(title='Gebäude',
import gws.types as t import gws.base.search.provider import gws.base.template import gws.lib.extent import gws.lib.feature import gws.lib.shape import gws.lib.json2 import gws.lib.net _NOMINATIM_CRS = gws.EPSG_4326 _NOMINATIM_URL = 'https://nominatim.openstreetmap.org/search' _DEFAULT_TEMPLATES = [ gws.Config(subject='feature.teaser', type='html', text=''' <p class="head">{name | html}</p> '''), gws.Config(subject='feature.description', type='html', text=''' <p class="head">{name | html}</p> <p class="text">{content | html}</p> '''), ] class Config(gws.base.search.provider.Config): """Nominatim (OSM) search provider""" country: t.Optional[str] #: country to limit the search
class Config(gws.WithAccess): """GekoS action""" crs: gws.Crs = '' #: CRS for gekos data db: t.Optional[str] #: database provider uid sources: t.Optional[t.List[SourceConfig]] #: gek-online instances position: t.Optional[PositionConfig] #: position correction for points table: gws.base.db.SqlTableConfig #: sql table configuration templates: t.Optional[t.List[ gws.ext.template.Config]] #: feature formatting templates _DEFAULT_TEMPLATES = [ gws.Config(subject='feature.title', type='html', text='{vollnummer}'), gws.Config( subject='feature.teaser', type='html', text='Flurstück {vollnummer}', ) ] class Object(gws.base.api.Action): def configure(self): self.alkis = t.cast(gws.ext.helper.alkis.Object, self.root.find_first('gws.ext.helper.alkis')) self.crs: gws.Crs = self.var('crs') self.db = t.cast(