コード例 #1
0
 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',
         ),
     ]
コード例 #2
0
    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')
コード例 #3
0
ファイル: template.py プロジェクト: gbd-consult/gbd-websuite
    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
コード例 #4
0
ファイル: core.py プロジェクト: gbd-consult/gbd-websuite
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)
コード例 #5
0
 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',
         ),
     ]
コード例 #6
0
ファイル: layer.py プロジェクト: gbd-consult/gbd-websuite
 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
コード例 #7
0
 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',
         ),
     ]
コード例 #8
0
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
コード例 #9
0
ファイル: provider.py プロジェクト: gbd-consult/gbd-websuite
    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,
        )
コード例 #10
0
ファイル: pgsearch.py プロジェクト: gbd-consult/gbd-websuite
    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')))
コード例 #11
0
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
コード例 #12
0
ファイル: __init__.py プロジェクト: gbd-consult/gbd-websuite
 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
コード例 #13
0
ファイル: __init__.py プロジェクト: gbd-consult/gbd-websuite
    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))
コード例 #14
0
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
コード例 #15
0
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',
コード例 #16
0
ファイル: __init__.py プロジェクト: gbd-consult/gbd-websuite
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
コード例 #17
0
ファイル: __init__.py プロジェクト: gbd-consult/gbd-websuite

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(