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()
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
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
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