Ejemplo n.º 1
0
    def vector_tiles(self) -> Response:
        settings = self.request.registry.settings["vector_tiles"]
        grid = FreeTileGrid(settings["resolutions"],
                            max_extent=settings["extent"],
                            tile_size=256)

        layer_name = self.request.matchdict["layer_name"]

        z = int(self.request.matchdict["z"])
        x = int(self.request.matchdict["x"])
        y = int(self.request.matchdict["y"])
        coord = TileCoord(z, x, y)
        minx, miny, maxx, maxy = grid.extent(coord, 0)

        layer = (DBSession.query(main.LayerVectorTiles.sql).filter(
            main.LayerVectorTiles.name == layer_name).one_or_none())
        if layer is None:
            raise HTTPNotFound(
                f"Not found any vector tile layer named {layer_name}")

        raw_sql = layer[0].format(
            envelope=
            f"ST_MakeEnvelope({minx}, {miny}, {maxx}, {maxy}, {settings['srid']})"
        )

        result = DBSession.execute(raw_sql)
        for row in result:
            set_common_headers(self.request, "vector_tiles", Cache.PUBLIC)
            response = self.request.response
            response.content_type = "application/vnd.mapbox-vector-tile"
            response.body = row[0].tobytes()
            return response
    def test_mixing_get_class_and_queries(self):
        """ This test shows that we can mix the use of DBSession
        and the db reflection API. """
        from c2cgeoportal_geoportal.lib.dbreflection import get_class
        from c2cgeoportal_commons.models import DBSession
        from sqlalchemy import text
        import transaction

        self._create_table("table_c")

        DBSession.execute(text("SELECT id FROM table_c"))

        modelclass = get_class("table_c")
        self.assertEqual(modelclass.__name__, "Table_c")

        # This commits the transaction created by DBSession.execute. This
        # is required here in the test because tearDown does table.drop,
        # which will block forever if the transaction is not committed.
        transaction.commit()
Ejemplo n.º 3
0
    def __download(self, num):
        if self.staging:
            url = "%s?ids=%s&token=%s" % (
                 self.config["casipo"]["staging_url"],
                 num,
                 self.config["casipo"]["fme_token"])
        else:
            url = "%s?ids=%s&token=%s" % (
                 self.config["casipo"]["prod_url"],
                 num,
                 self.config["casipo"]["fme_token"])
        db_ecadastre = DBSessions['ecadastre']
        cnt = 0
        try:
            sql = "select nextval_daily ('casipo_seq')"
            results = DBSession.execute(sql)
            for res in results:
                cnt = res[0]
        except Exception as e:
            log.exception(e)
        try:
            f = urllib.request.urlopen(url, None, 1800)
            data = f
            # YYYYMMJJ_Commune_Extrait_CASIPO_nn.pdf
            commune = ""
            sql = "select commune_administrative FROM DIFFDATA.communes_adm_cad_sections WHERE code_commune = " + str(int(num[0:3])) + " GROUP BY commune_administrative"
            results = db_ecadastre.execute(sql)
            for res in results:
                commune = res['commune_administrative']

            self.filename = '/tmp/%s_%s_Extrait_CASIPO_%s.pdf' % (str(datetime.datetime.now().strftime("%Y%m%d")), commune, str(cnt))
            with open(self.filename, 'wb') as fp:
                shutil.copyfileobj(data, fp)
        except Exception as e:
            log.exception(e)
            data = None
            log.debug(url)
        return
Ejemplo n.º 4
0
class Import:
    def __init__(self, options):
        self.options = options
        self.imported = set()

        settings = get_config("config.yaml")
        package = settings["package"]

        self.fts_languages = settings["fulltextsearch"]["languages"]
        self.languages = settings["available_locale_names"]

        # must be done only once we have loaded the project config
        from c2cgeoportal_commons.models import DBSession
        from c2cgeoportal_commons.models.main import FullTextSearch, Interface, Theme, Role

        self.session = DBSession()
        self.session.execute(FullTextSearch.__table__.delete().where(
            FullTextSearch.from_theme == True))  # noqa

        self._ = {}
        for lang in self.languages:
            self._[lang] = translation("{}-client".format(package),
                                       os.path.join(package, "locale/"),
                                       [lang])

        query = self.session.query(Interface)
        if options.interfaces is not None:
            query = query.filter(Interface.name.in_(options.interfaces))
        self.interfaces = query.all()

        self.public_theme = {}
        self.public_group = {}
        for interface in self.interfaces:
            self.public_theme[interface.id] = []
            self.public_group[interface.id] = []

        for theme in self.session.query(Theme).filter_by(public=True).all():
            self._add_theme(theme)

        for role in self.session.query(Role).all():
            for theme in self.session.query(Theme).all():
                self._add_theme(theme, role)

        transaction.commit()

    def _add_fts(self, item, interface, action, role):
        from c2cgeoportal_commons.models.main import FullTextSearch

        key = (item.name if self.options.name else item.id, interface.id,
               role.id if role is not None else None)
        if key not in self.imported:
            self.imported.add(key)
            for lang in self.languages:
                fts = FullTextSearch()
                fts.label = self._unicode_str(self._[lang].gettext(item.name))
                fts.role = role
                fts.interface = interface
                fts.lang = lang
                fts.public = role is None
                fts.ts = func.to_tsvector(self.fts_languages[lang], fts.label)
                fts.actions = [{
                    "action": action,
                    "data": item.name,
                }]
                fts.from_theme = True
                self.session.add(fts)

    def _add_theme(self, theme, role=None):
        fill = False
        for interface in self.interfaces:
            if interface in theme.interfaces:
                for child in theme.children:
                    fill = self._add_block(child, interface, role) or fill

                if fill and self.options.themes:
                    if role is None:
                        self.public_theme[interface.id].append(theme.id)

                    if role is None or theme.id not in self.public_theme[
                            interface.id]:
                        self._add_fts(theme, interface, "add_theme", role)

    def _add_block(self, group, interface, role):
        return self._add_group(group, interface, self.options.blocks, role)

    def _add_folder(self, group, interface, role):
        return self._add_group(group, interface, self.options.folders, role)

    def _add_group(self, group, interface, export, role):
        from c2cgeoportal_commons.models.main import LayerGroup

        fill = False
        for child in group.children:
            if isinstance(child, LayerGroup):
                fill = self._add_folder(child, interface, role) or fill
            else:
                fill = self._add_layer(child, interface, role) or fill

        if fill and export:
            if role is None:
                self.public_group[interface.id].append(group.id)

            if role is None or group.id not in self.public_group[interface.id]:
                self._add_fts(group, interface, "add_group", role)

        return fill

    @staticmethod
    def _layer_visible(layer, role):
        for restrictionarea in layer.restrictionareas:
            if role in restrictionarea.roles:
                return True
        return False

    def _add_layer(self, layer, interface, role):
        from c2cgeoportal_commons.models.main import LayerV1

        if isinstance(layer, LayerV1):
            return False

        if role is None:
            fill = layer.public and interface in layer.interfaces
        else:
            fill = interface in layer.interfaces and not layer.public and \
                self._layer_visible(layer, role)

        if fill and self.options.layers:
            self._add_fts(layer, interface, "add_layer", role)

        return fill

    @staticmethod
    def _unicode_str(string):
        return string.decode('utf-8') if isinstance(string, str) else string
Ejemplo n.º 5
0
class Import:
    def __init__(self, options):
        self.options = options
        self.imported = set()

        settings = get_config("config.yaml")
        package = settings["package"]

        self.fts_languages = settings["fulltextsearch"]["languages"]
        self.languages = settings["available_locale_names"]

        # must be done only once we have loaded the project config
        from c2cgeoportal_commons.models import DBSession
        from c2cgeoportal_commons.models.main import FullTextSearch, Interface, Theme, Role

        self.session = DBSession()
        self.session.execute(FullTextSearch.__table__.delete().where(FullTextSearch.from_theme == True))  # noqa

        self._ = {}
        for lang in self.languages:
            self._[lang] = translation(
                "{}-client".format(package), os.path.join(package, "locale/"), [lang])

        query = self.session.query(Interface)
        if options.interfaces is not None:
            query = query.filter(
                Interface.name.in_(options.interfaces)
            )
        self.interfaces = query.all()

        self.public_theme = {}
        self.public_group = {}
        for interface in self.interfaces:
            self.public_theme[interface.id] = []
            self.public_group[interface.id] = []

        for theme in self.session.query(Theme).filter_by(public=True).all():
            self._add_theme(theme)

        for role in self.session.query(Role).all():
            for theme in self.session.query(Theme).all():
                self._add_theme(theme, role)

        transaction.commit()

    def _add_fts(self, item, interface, action, role):
        from c2cgeoportal_commons.models.main import FullTextSearch

        key = (
            item.name if self.options.name else item.id,
            interface.id,
            role.id if role is not None else None
        )
        if key not in self.imported:
            self.imported.add(key)
            for lang in self.languages:
                fts = FullTextSearch()
                fts.label = self._[lang].gettext(item.name)
                fts.role = role
                fts.interface = interface
                fts.lang = lang
                fts.public = role is None
                fts.ts = func.to_tsvector(self.fts_languages[lang], fts.label)
                fts.actions = [{
                    "action": action,
                    "data": item.name,
                }]
                fts.from_theme = True
                self.session.add(fts)

    def _add_theme(self, theme, role=None):
        fill = False
        for interface in self.interfaces:
            if interface in theme.interfaces:
                for child in theme.children:
                    fill = self._add_block(child, interface, role) or fill

                if fill and self.options.themes:
                    if role is None:
                        self.public_theme[interface.id].append(theme.id)

                    if role is None or theme.id not in self.public_theme[interface.id]:
                        self._add_fts(theme, interface, "add_theme", role)

    def _add_block(self, group, interface, role):
        return self._add_group(group, interface, self.options.blocks, role)

    def _add_folder(self, group, interface, role):
        return self._add_group(group, interface, self.options.folders, role)

    def _add_group(self, group, interface, export, role):
        from c2cgeoportal_commons.models.main import LayerGroup

        fill = False
        for child in group.children:
            if isinstance(child, LayerGroup):
                fill = self._add_folder(child, interface, role) or fill
            else:
                fill = self._add_layer(child, interface, role) or fill

        if fill and export:
            if role is None:
                self.public_group[interface.id].append(group.id)

            if role is None or group.id not in self.public_group[interface.id]:
                self._add_fts(group, interface, "add_group", role)

        return fill

    @staticmethod
    def _layer_visible(layer, role):
        for restrictionarea in layer.restrictionareas:
            if role in restrictionarea.roles:
                return True
        return False

    def _add_layer(self, layer, interface, role):
        from c2cgeoportal_commons.models.main import LayerV1

        if isinstance(layer, LayerV1):
            return False

        if role is None:
            fill = layer.public and interface in layer.interfaces
        else:
            fill = interface in layer.interfaces and not layer.public and \
                self._layer_visible(layer, role)

        if fill and self.options.layers:
            self._add_fts(layer, interface, "add_layer", role)

        return fill