예제 #1
0
    def __init__(self, server_iface: qgis.server.QgsServerInterface):
        super().__init__(server_iface)

        self.server_iface = server_iface
        self.initialized = False

        try:
            config.init(
                os.environ.get("GEOMAPFISH_CONFIG",
                               "/etc/qgisserver/geomapfish.yaml"))

            c2cwsgiutils.broadcast.init()

            DBSession = create_session_factory(  # noqa: ignore=N806
                config.get("sqlalchemy_slave.url"),
                config.get_config().get("sqlalchemy", {}))

            if "GEOMAPFISH_OGCSERVER" in os.environ:
                self.single = True
                self.ogcserver_accesscontrol = OGCServerAccessControl(
                    server_iface,
                    os.environ["GEOMAPFISH_OGCSERVER"],
                    os.environ["QGIS_PROJECT_FILE"],
                    config.get("srid"),
                    DBSession,
                )

                LOG.info("Use OGC server named '%s'.",
                         os.environ["GEOMAPFISH_OGCSERVER"])
                self.initialized = True
            elif "GEOMAPFISH_ACCESSCONTROL_CONFIG" in os.environ:
                self.single = False
                self.ogcserver_accesscontrols = {}
                with open(os.environ["GEOMAPFISH_ACCESSCONTROL_CONFIG"]
                          ) as ac_config_file:
                    ac_config = yaml.safe_load(ac_config_file.read())

                for map_, map_config in ac_config.get("map_config").items():
                    map_config["access_control"] = OGCServerAccessControl(
                        server_iface, map_config["ogc_server"], map_,
                        config.get("srid"), DBSession)
                    self.ogcserver_accesscontrols[map_] = map_config
                LOG.info("Use config '%s'.",
                         os.environ["GEOMAPFISH_ACCESSCONTROL_CONFIG"])
                self.initialized = True
            else:
                LOG.error(
                    "The environment variable 'GEOMAPFISH_OGCSERVER' or "
                    "'GEOMAPFISH_ACCESSCONTROL_CONFIG' is not defined.", )

        except Exception:  # pylint: disable=broad-except
            LOG.error("Cannot setup GeoMapFishAccessControl", exc_info=True)

        server_iface.registerAccessControl(
            self, int(os.environ.get("GEOMAPFISH_POSITION", 100)))
예제 #2
0
    def __init__(self, server_iface):
        super().__init__(server_iface)

        self.server_iface = server_iface

        try:
            config.init(
                os.environ.get('GEOMAPFISH_CONFIG',
                               '/etc/qgisserver/geomapfish.yaml'))

            c2cwsgiutils.broadcast.init(None)

            configure_mappers()
            engine = sqlalchemy.create_engine(
                config.get('sqlalchemy_slave.url'))
            session_factory = sessionmaker()
            session_factory.configure(bind=engine)
            DBSession = scoped_session(session_factory)  # noqa: N806

            if "GEOMAPFISH_OGCSERVER" in os.environ:
                self.single = True
                self.ogcserver_accesscontrol = OGCServerAccessControl(
                    server_iface, os.environ['GEOMAPFISH_OGCSERVER'],
                    config.get('srid'), DBSession)

                QgsMessageLog.logMessage("Use OGC server named '{}'.".format(
                    os.environ["GEOMAPFISH_OGCSERVER"]))
            elif "GEOMAPFISH_ACCESSCONTROL_CONFIG" in os.environ:
                self.single = False
                self.ogcserver_accesscontrols = {}
                with open(os.environ["GEOMAPFISH_ACCESSCONTROL_CONFIG"]
                          ) as ac_config_file:
                    ac_config = yaml.safe_load(ac_config_file.read())

                for map_, map_config in ac_config.get("map_config").items():
                    map_config["access_control"] = OGCServerAccessControl(
                        server_iface, map_config["ogc_server"],
                        config.get('srid'), DBSession)
                    self.ogcserver_accesscontrols[map_] = map_config
                QgsMessageLog.logMessage("Use config '{}'.".format(
                    os.environ["GEOMAPFISH_ACCESSCONTROL_CONFIG"]))
            else:
                raise GMFException(
                    "The environment variable 'GEOMAPFISH_OGCSERVER' or "
                    "'GEOMAPFISH_ACCESSCONTROL_CONFIG' is not defined.")

        except Exception:
            QgsMessageLog.logMessage(''.join(
                traceback.format_exception(*sys.exc_info())))
            raise

        server_iface.registerAccessControl(
            self, int(os.environ.get("GEOMAPFISH_POSITION", 100)))
예제 #3
0
 def _collect_print_config(config, filename):
     result = []
     for template_ in list(config.get("templates").keys()):
         result.append(
             Message(None, template_, None, [], "", "",
                     (filename, "template/{}".format(template_))))
         result += [
             Message(
                 None, attribute, None, [], "", "",
                 (filename, "template/{}/{}".format(template_, attribute)))
             for attribute in list(
                 config.get("templates")[template_].attributes.keys())
         ]
     return result
예제 #4
0
def downgrade():
    schema = config['schema']
    staticschema = config.get('schema_static')
    parentschema = config.get('parentschema')

    op.create_table(
        'user',
        Column('type', String(10), nullable=False),
        Column('id', Integer, primary_key=True),
        Column('username', Unicode, unique=True, nullable=False),
        Column('password', Unicode, nullable=False),
        Column('email', Unicode, nullable=False),
        Column('is_password_changed', Boolean, default=False),
        Column('role_id', Integer, ForeignKey(schema + '.role.id'), nullable=False),
        schema=schema,
    )
    parent_column = ''
    parent_select = ''
    parent_join = ''
    if parentschema is not None and parentschema is not '':  # pragma: no cover
        op.add_column(
            'user',
            Column('parent_role_id', Integer, ForeignKey(parentschema + '.role.id')),
            schema=schema
        )
        parent_column = ', parent_role_id'
        parent_select = ', pr.id'
        parent_join = (
            'LEFT OUTER JOIN {parentschema}.role AS pr ON (pr.name = u.parent_role_name)'.format(
                parentschema=parentschema,
            )
        )

    op.execute(
        'INSERT INTO %(schema)s.user '
        '(type, username, password, email, is_password_changed, role_id%(parent_column)s) ('
        'SELECT u.type, u.username, u.password, u.email, '
        'u.is_password_changed, r.id%(parent_select)s '
        'FROM %(staticschema)s.user AS u '
        'LEFT OUTER JOIN %(schema)s.role AS r ON (r.name = u.role_name) %(parent_join)s'
        ')' % {
            'staticschema': staticschema,
            'schema': schema,
            'parent_select': parent_select,
            'parent_column': parent_column,
            'parent_join': parent_join,
        }
    )

    op.drop_table('user', schema=staticschema)
예제 #5
0
def downgrade() -> None:
    """Downgrade."""
    schema = config["schema"]
    staticschema = config.get("schema_static")
    parentschema = config.get("parentschema")

    op.create_table(
        "user",
        Column("type", String(10), nullable=False),
        Column("id", Integer, primary_key=True),
        Column("username", Unicode, unique=True, nullable=False),
        Column("password", Unicode, nullable=False),
        Column("email", Unicode, nullable=False),
        Column("is_password_changed", Boolean, default=False),
        Column("role_id",
               Integer,
               ForeignKey(schema + ".role.id"),
               nullable=False),
        schema=schema,
    )
    parent_column = ""
    parent_select = ""
    parent_join = ""
    if parentschema is not None and parentschema != "":
        op.add_column("user",
                      Column("parent_role_id", Integer,
                             ForeignKey(parentschema + ".role.id")),
                      schema=schema)
        parent_column = ", parent_role_id"
        parent_select = ", pr.id"
        parent_join = "LEFT OUTER JOIN {parentschema}.role AS pr ON (pr.name = u.parent_role_name)".format(
            parentschema=parentschema)

    op.execute(
        "INSERT INTO %(schema)s.user "
        "(type, username, password, email, is_password_changed, role_id%(parent_column)s) ("
        "SELECT u.type, u.username, u.password, u.email, "
        "u.is_password_changed, r.id%(parent_select)s "
        "FROM %(staticschema)s.user AS u "
        "LEFT OUTER JOIN %(schema)s.role AS r ON (r.name = u.role_name) %(parent_join)s"
        ")" % {
            "staticschema": staticschema,
            "schema": schema,
            "parent_select": parent_select,
            "parent_column": parent_column,
            "parent_join": parent_join,
        })

    op.drop_table("user", schema=staticschema)
예제 #6
0
def upgrade():
    schema = config["schema"]
    staticschema = config["schema_static"]
    parentschema = config.get("parentschema")

    engine = op.get_bind().engine
    if type(engine).__name__ != "MockConnection" and op.get_context(
    ).dialect.has_table(engine, "user",
                        schema=staticschema):  # pragma: no cover
        return

    op.create_table(
        "user",
        Column("type", String(10), nullable=False),
        Column("id", Integer, primary_key=True),
        Column("username", Unicode, unique=True, nullable=False),
        Column("password", Unicode, nullable=False),
        Column("email", Unicode, nullable=False),
        Column("is_password_changed", Boolean, default=False),
        Column("role_name", String),
        schema=staticschema,
    )
    parent_column = ""
    parent_select = ""
    parent_join = ""
    if parentschema is not None and parentschema != "":  # pragma: no cover
        op.add_column("user",
                      Column("parent_role_name", String),
                      schema=staticschema)
        parent_column = ", parent_role_name"
        parent_select = ", pr.name"
        parent_join = "LEFT OUTER JOIN {parentschema!s}.role AS pr ON (pr.id = u.parent_role_id)".format(
            parentschema=parentschema)

    try:
        op.execute(
            "INSERT INTO %(staticschema)s.user "
            "(type, username, password, email, is_password_changed, role_name%(parent_column)s) ("
            "SELECT u.type, u.username, u.password, u.email, "
            "u.is_password_changed, r.name%(parent_select)s "
            "FROM %(schema)s.user AS u "
            "LEFT OUTER JOIN %(schema)s.role AS r ON (r.id = u.role_id) %(parent_join)s"
            ")" % {
                "staticschema": staticschema,
                "schema": schema,
                "parent_select": parent_select,
                "parent_column": parent_column,
                "parent_join": parent_join,
            })
        op.drop_table("user", schema=schema)
    except Exception:
        op.execute(
            "INSERT INTO %(staticschema)s.user (type, username, email, password, role) "
            "VALUES ( 'user', 'admin', '*****@*****.**', '%(pass)s', 'role_admin')"
            % {
                "staticschema": staticschema,
                "pass": sha1("admin".encode("utf-8")).hexdigest()
            })
예제 #7
0
    def __init__(self, server_iface):
        super().__init__(server_iface)

        self.server_iface = server_iface
        self.initialized = False

        try:
            config.init(
                os.environ.get("GEOMAPFISH_CONFIG",
                               "/etc/qgisserver/geomapfish.yaml"))

            c2cwsgiutils.broadcast.init()

            configure_mappers()
            db_match = re.match(".*(@[^@]+)$",
                                config.get("sqlalchemy_slave.url"))
            QgsMessageLog.logMessage(
                "Connect to the database: ***{}".format(
                    db_match.group(1) if db_match else ""),
                "GeoMapFishAccessControl",
                level=Qgis.Info,
            )
            engine = sqlalchemy.create_engine(
                config["sqlalchemy_slave.url"],
                **(config.get_config().get("sqlalchemy", {})))
            session_factory = sessionmaker()
            session_factory.configure(bind=engine)
            DBSession = scoped_session(session_factory)  # noqa: N806

            if "GEOMAPFISH_OGCSERVER" in os.environ:
                self.single = True
                self.ogcserver_accesscontrol = OGCServerAccessControl(
                    server_iface, os.environ["GEOMAPFISH_OGCSERVER"],
                    config.get("srid"), DBSession)

                QgsMessageLog.logMessage(
                    "Use OGC server named '{}'.".format(
                        os.environ["GEOMAPFISH_OGCSERVER"]),
                    "GeoMapFishAccessControl",
                    level=Qgis.Info,
                )
                self.initialized = True
            elif "GEOMAPFISH_ACCESSCONTROL_CONFIG" in os.environ:
                self.single = False
                self.ogcserver_accesscontrols = {}
                with open(os.environ["GEOMAPFISH_ACCESSCONTROL_CONFIG"]
                          ) as ac_config_file:
                    ac_config = yaml.safe_load(ac_config_file.read())

                for map_, map_config in ac_config.get("map_config").items():
                    map_config["access_control"] = OGCServerAccessControl(
                        server_iface, map_config["ogc_server"],
                        config.get("srid"), DBSession)
                    self.ogcserver_accesscontrols[map_] = map_config
                QgsMessageLog.logMessage(
                    "Use config '{}'.".format(
                        os.environ["GEOMAPFISH_ACCESSCONTROL_CONFIG"]),
                    "GeoMapFishAccessControl",
                    level=Qgis.Info,
                )
                self.initialized = True
            else:
                QgsMessageLog.logMessage(
                    "The environment variable 'GEOMAPFISH_OGCSERVER' or "
                    "'GEOMAPFISH_ACCESSCONTROL_CONFIG' is not defined.",
                    "GeoMapFishAccessControl",
                    level=Qgis.Critical,
                )

        except Exception:
            print("".join(traceback.format_exception(*sys.exc_info())))
            QgsMessageLog.logMessage(
                "".join(traceback.format_exception(*sys.exc_info())),
                "GeoMapFishAccessControl",
                level=Qgis.Critical,
            )

        server_iface.registerAccessControl(
            self, int(os.environ.get("GEOMAPFISH_POSITION", 100)))
예제 #8
0
    def __init__(self, server_iface: qgis.server.QgsServerInterface):
        super().__init__(server_iface)

        self.server_iface = server_iface
        self.initialized = False

        try:
            config.init(
                os.environ.get("GEOMAPFISH_CONFIG",
                               "/etc/qgisserver/geomapfish.yaml"))

            c2cwsgiutils.broadcast.init()

            DBSession = create_session_factory(  # noqa: ignore=N806
                config.get("sqlalchemy_slave.url"),
                config.get_config().get("sqlalchemy", {}))

            if "GEOMAPFISH_OGCSERVER" in os.environ:
                self.single = True
                self.ogcserver_accesscontrol = OGCServerAccessControl(
                    server_iface,
                    os.environ["GEOMAPFISH_OGCSERVER"],
                    os.environ["QGIS_PROJECT_FILE"],
                    config.get("srid"),
                    DBSession,
                )

                LOG.info("Use OGC server named '%s'.",
                         os.environ["GEOMAPFISH_OGCSERVER"])
                self.initialized = True
            elif "GEOMAPFISH_ACCESSCONTROL_CONFIG" in os.environ:
                self.single = False
                self.ogcserver_accesscontrols = {}
                with open(os.environ["GEOMAPFISH_ACCESSCONTROL_CONFIG"],
                          encoding="utf-8") as ac_config_file:
                    ac_config = yaml.safe_load(ac_config_file.read())

                for map_, map_config in ac_config.get("map_config").items():
                    map_config["access_control"] = OGCServerAccessControl(
                        server_iface, map_config["ogc_server"], map_,
                        config.get("srid"), DBSession)
                    self.ogcserver_accesscontrols[map_] = map_config
                LOG.info("Use config '%s'.",
                         os.environ["GEOMAPFISH_ACCESSCONTROL_CONFIG"])
                self.initialized = True
            elif "GEOMAPFISH_ACCESSCONTROL_BASE_URL" in os.environ:
                self.ogcserver_accesscontrols = {}
                single_ogc_server = None
                base_url = Url(os.environ["GEOMAPFISH_ACCESSCONTROL_BASE_URL"])
                session = DBSession()
                try:
                    from c2cgeoportal_commons.models.main import (  # pylint: disable=import-outside-toplevel
                        OGCServer, )

                    for ogcserver in session.query(OGCServer).all():
                        errors: Set[str] = set()
                        url = get_url2(
                            f"The OGC server '{ogcserver.name}'",
                            ogcserver.url,
                            None,
                            errors,
                            config.get_config().get("servers", {}),
                        )

                        if errors:
                            LOG.warning(
                                "Ignoring OGC server '%s', get error on parsing URL:\n%s",
                                ogcserver.name,
                                "\n".join(errors),
                            )
                            continue
                        if url is None:
                            LOG.warning(
                                "Ignoring OGC server '%s', the URL is None",
                                ogcserver.name)
                            continue
                        if (base_url.scheme == url.scheme
                                and base_url.netloc == url.netloc
                                and base_url.path == url.path):
                            query = url.query_lower
                            if "map" not in query:
                                if single_ogc_server is None:
                                    single_ogc_server = ogcserver
                                    LOG.debug(
                                        "OGC server '%s', 'map' is not in the parameters => single server?",
                                        ogcserver.name,
                                    )
                                else:
                                    LOG.error(
                                        "OGC server '%s', 'map' is not in the parameters and we already have a single OCG server '%s'",
                                        ogcserver.name,
                                        single_ogc_server.name,
                                    )
                                continue

                            map_ = url.query_lower["map"]
                            self.ogcserver_accesscontrols[map_] = {
                                "ogcserver":
                                ogcserver.name,
                                "access_control":
                                OGCServerAccessControl(
                                    server_iface,
                                    ogcserver.name,
                                    map_,
                                    config.get("srid"),
                                    DBSession,
                                    ogcserver=ogcserver,
                                ),
                            }
                            LOG.info("OGC server '%s' registered for map",
                                     ogcserver.name)
                        else:
                            LOG.debug(
                                "Ignoring OGC server '%s', Don't match the base URL '%s' and '%s'",
                                ogcserver.name,
                                base_url,
                                url,
                            )
                    if self.ogcserver_accesscontrols and single_ogc_server is not None:
                        if os.environ.get("QGIS_PROJECT_FILE"):
                            LOG.error(
                                "We have OGC servers with and without parameter MAP and a value in QGIS_PROJECT_FILE, fallback to single OGC server mode."
                            )
                            self.ogcserver_accesscontrols = {}
                        else:
                            LOG.error(
                                "We have OGC servers with and without parameter MAP but no value in QGIS_PROJECT_FILE, fallback to multiple OGC server mode."
                            )
                            single_ogc_server = None
                    if single_ogc_server is not None:
                        self.single = True
                        self.ogcserver_accesscontrol = OGCServerAccessControl(
                            server_iface,
                            single_ogc_server.name,
                            os.environ["QGIS_PROJECT_FILE"],
                            config.get("srid"),
                            DBSession,
                            single_ogc_server,
                        )

                        LOG.info("Use OGC server named '%s'.",
                                 single_ogc_server.name)
                    else:
                        self.single = False
                    self.initialized = True
                finally:
                    session.close()
            else:
                LOG.error(
                    "The environment variable 'GEOMAPFISH_OGCSERVER', 'GEOMAPFISH_ACCESSCONTROL_CONFIG' "
                    "or 'GEOMAPFISH_ACCESSCONTROL_BASE_URL' should be defined.",
                )

        except Exception:  # pylint: disable=broad-except
            LOG.error("Cannot setup GeoMapFishAccessControl", exc_info=True)

        server_iface.registerAccessControl(
            self, int(os.environ.get("GEOMAPFISH_POSITION", 100)))
def upgrade():
    schema = config['schema']
    schema_static = config['schema_static']
    parentschema = config.get('parentschema')
    srid = config.get('srid')

    engine = op.get_bind().engine
    if type(engine).__name__ != 'MockConnection' and \
            op.get_context().dialect.has_table(
                engine, 'functionality', schema=schema):  # pragma: no cover
        return

    op.create_table(
        'functionality',
        Column('id', Integer, primary_key=True),
        Column('name', Unicode, nullable=False),
        Column('value', Unicode, nullable=False),
        Column('description', Unicode),
        schema=schema,
    )
    op.create_table(
        'treeitem',
        Column('type', String(10), nullable=False),
        Column('id', Integer, primary_key=True),
        Column('name', Unicode),
        Column('order', Integer, nullable=False),
        Column('metadataURL', Unicode),
        schema=schema,
    )
    op.create_table(
        'restrictionarea',
        Column('id', Integer, primary_key=True),
        Column('name', Unicode),
        Column('description', Unicode),
        Column('readwrite', Boolean, default=False),
        schema=schema,
    )
    op.execute("SELECT AddGeometryColumn('%(schema)s', 'restrictionarea', "
               "'area', %(srid)s, 'POLYGON', 2)" % {
                   'schema': schema,
                   'srid': srid
               })
    op.create_table(
        'shorturl',
        Column('id', Integer, primary_key=True),
        Column('url', Unicode(1000)),
        Column('ref', String(20), index=True, unique=True, nullable=False),
        Column('creator_email', Unicode(200)),
        Column('creation', DateTime),
        Column('last_hit', DateTime),
        Column('nb_hits', Integer),
        schema=schema_static,
    )

    op.create_table(
        'role',
        Column('id', Integer, primary_key=True),
        Column('name', Unicode, unique=True, nullable=False),
        Column('description', Unicode),
        schema=schema,
    )
    op.execute("SELECT AddGeometryColumn('%(schema)s', 'role', "
               "'extent', %(srid)s, 'POLYGON', 2)" % {
                   'schema': schema,
                   'srid': srid
               })
    role = Table(
        'role',
        MetaData(),
        Column('name', Unicode, unique=True, nullable=False),
        schema=schema,
    )
    op.bulk_insert(role, [{'name': 'role_admin'}])

    op.create_table(
        'layer',
        Column('id',
               Integer,
               ForeignKey(schema + '.treeitem.id'),
               primary_key=True),
        Column('public', Boolean, default=True),
        Column('inMobileViewer', Boolean, default=True),
        Column('inDesktopViewer', Boolean, default=True),
        Column('isChecked', Boolean, default=True),
        Column('icon', Unicode),
        Column('layerType', Unicode(12)),
        Column('url', Unicode),
        Column('imageType', Unicode(10)),
        Column('style', Unicode),
        Column('dimensions', Unicode),
        Column('matrixSet', Unicode),
        Column('wmsUrl', Unicode),
        Column('wmsLayers', Unicode),
        Column('queryLayers', Unicode),
        Column('kml', Unicode),
        Column('isSingleTile', Boolean),
        Column('legend', Boolean, default=True),
        Column('legendImage', Unicode),
        Column('legendRule', Unicode),
        Column('isLegendExpanded', Boolean, default=False),
        Column('minResolution', Float),
        Column('maxResolution', Float),
        Column('disclaimer', Unicode),
        Column('identifierAttributeField', Unicode),
        Column('geoTable', Unicode),
        Column('excludeProperties', Unicode),
        Column('timeMode', Unicode(8)),
        schema=schema,
    )
    op.create_table(
        'role_restrictionarea',
        Column('role_id',
               Integer,
               ForeignKey(schema + '.role.id'),
               primary_key=True),
        Column('restrictionarea_id',
               Integer,
               ForeignKey(schema + '.restrictionarea.id'),
               primary_key=True),
        schema=schema,
    )
    op.create_table(
        'tsearch',
        Column('id', Integer, primary_key=True),
        Column('label', Unicode),
        Column('layer_name', Unicode),
        Column('role_id',
               Integer,
               ForeignKey(schema + '.role.id'),
               nullable=True),
        Column('public', Boolean, server_default='true'),
        Column('ts', TsVector),
        Column('params', Unicode, nullable=True),
        schema=schema,
    )
    op.execute("SELECT AddGeometryColumn('%(schema)s', 'tsearch', 'the_geom', "
               "%(srid)s, 'GEOMETRY', 2)" % {
                   'schema': schema,
                   'srid': srid
               })
    op.create_index('tsearch_ts_idx',
                    'tsearch', ['ts'],
                    schema=schema,
                    postgresql_using='gin')
    op.create_table(
        'treegroup',
        Column('id',
               Integer,
               ForeignKey(schema + '.treeitem.id'),
               primary_key=True),
        schema=schema,
    )

    op.create_table(
        'user',
        Column('type', String(10), nullable=False),
        Column('id', Integer, primary_key=True),
        Column('username', Unicode, unique=True, nullable=False),
        Column('password', Unicode, nullable=False),
        Column('email', Unicode, nullable=False),
        Column('is_password_changed', Boolean, default=False),
        Column('role_id',
               Integer,
               ForeignKey(schema + '.role.id'),
               nullable=False),
        schema=schema,
    )
    if parentschema is not None and parentschema is not '':  # pragma: no cover
        op.add_column('user',
                      Column('parent_role_id', Integer,
                             ForeignKey(parentschema + '.role.id')),
                      schema=schema)
    op.execute(
        "INSERT INTO %(schema)s.user (type, username, email, password, role_id) "
        "(SELECT 'user', 'admin', '*****@*****.**', '%(pass)s', r.id "
        "FROM %(schema)s.role AS r "
        "WHERE r.name = 'role_admin')" % {
            'schema': schema,
            'pass': sha1('admin'.encode('utf-8')).hexdigest()
        })

    op.create_table(
        'role_functionality',
        Column('role_id',
               Integer,
               ForeignKey(schema + '.role.id'),
               primary_key=True),
        Column('functionality_id',
               Integer,
               ForeignKey(schema + '.functionality.id'),
               primary_key=True),
        schema=schema,
    )
    op.create_table(
        'user_functionality',
        Column('user_id',
               Integer,
               ForeignKey(schema + '.user.id'),
               primary_key=True),
        Column('functionality_id',
               Integer,
               ForeignKey(schema + '.functionality.id'),
               primary_key=True),
        schema=schema,
    )
    op.create_table(
        'layergroup',
        Column('id',
               Integer,
               ForeignKey(schema + '.treegroup.id'),
               primary_key=True),
        Column('isExpanded', Boolean),
        Column('isInternalWMS', Boolean),
        # children have radio button instance of check box
        Column('isBaseLayer', Boolean),
        schema=schema,
    )
    op.create_table(
        'layer_restrictionarea',
        Column('layer_id',
               Integer,
               ForeignKey(schema + '.layer.id'),
               primary_key=True),
        Column('restrictionarea_id',
               Integer,
               ForeignKey(schema + '.restrictionarea.id'),
               primary_key=True),
        schema=schema,
    )
    op.create_table(
        'layergroup_treeitem',
        Column('treegroup_id',
               Integer,
               ForeignKey(schema + '.treegroup.id'),
               primary_key=True),
        Column('treeitem_id',
               Integer,
               ForeignKey(schema + '.treeitem.id'),
               primary_key=True),
        schema=schema,
    )
    op.create_table(
        'theme',
        Column('id',
               Integer,
               ForeignKey(schema + '.treegroup.id'),
               primary_key=True),
        Column('icon', Unicode),
        Column('inMobileViewer', Boolean, default=False),
        Column('inDesktopViewer', Boolean, default=True),
        schema=schema,
    )
    op.create_table(
        'theme_functionality',
        Column('theme_id',
               Integer,
               ForeignKey(schema + '.theme.id'),
               primary_key=True),
        Column('functionality_id',
               Integer,
               ForeignKey(schema + '.functionality.id'),
               primary_key=True),
        schema=schema,
    )

    op.execute("INSERT INTO {schema}.treeitem (type, name, \"order\") "
               "VALUES ('group', 'background', 0)".format(schema=schema))
    op.execute('INSERT INTO {schema}.treegroup (id) SELECT id '
               'FROM {schema}.treeitem'.format(schema=schema))
    op.execute('INSERT INTO {schema}.layergroup (id) SELECT id '
               'FROM {schema}.treeitem'.format(schema=schema))
def upgrade() -> None:
    schema = config["schema"]
    schema_static = config["schema_static"]
    parentschema = config.get("parentschema")
    srid = config.get("srid")

    engine = op.get_bind().engine
    if type(engine).__name__ != "MockConnection" and op.get_context().dialect.has_table(
        engine, "functionality", schema=schema
    ):
        return

    op.create_table(
        "functionality",
        Column("id", Integer, primary_key=True),
        Column("name", Unicode, nullable=False),
        Column("value", Unicode, nullable=False),
        Column("description", Unicode),
        schema=schema,
    )
    op.create_table(
        "treeitem",
        Column("type", String(10), nullable=False),
        Column("id", Integer, primary_key=True),
        Column("name", Unicode),
        Column("order", Integer, nullable=False),
        Column("metadataURL", Unicode),
        schema=schema,
    )
    op.create_table(
        "restrictionarea",
        Column("id", Integer, primary_key=True),
        Column("name", Unicode),
        Column("description", Unicode),
        Column("readwrite", Boolean, default=False),
        schema=schema,
    )
    op.execute(
        "SELECT AddGeometryColumn('%(schema)s', 'restrictionarea', "
        "'area', %(srid)s, 'POLYGON', 2)" % {"schema": schema, "srid": srid}
    )
    op.create_table(
        "shorturl",
        Column("id", Integer, primary_key=True),
        Column("url", Unicode(1000)),
        Column("ref", String(20), index=True, unique=True, nullable=False),
        Column("creator_email", Unicode(200)),
        Column("creation", DateTime),
        Column("last_hit", DateTime),
        Column("nb_hits", Integer),
        schema=schema_static,
    )

    op.create_table(
        "role",
        Column("id", Integer, primary_key=True),
        Column("name", Unicode, unique=True, nullable=False),
        Column("description", Unicode),
        schema=schema,
    )
    op.execute(
        "SELECT AddGeometryColumn('%(schema)s', 'role', "
        "'extent', %(srid)s, 'POLYGON', 2)" % {"schema": schema, "srid": srid}
    )
    role = Table("role", MetaData(), Column("name", Unicode, unique=True, nullable=False), schema=schema)
    op.bulk_insert(role, [{"name": "role_admin"}])

    op.create_table(
        "layer",
        Column("id", Integer, ForeignKey(schema + ".treeitem.id"), primary_key=True),
        Column("public", Boolean, default=True),
        Column("inMobileViewer", Boolean, default=True),
        Column("inDesktopViewer", Boolean, default=True),
        Column("isChecked", Boolean, default=True),
        Column("icon", Unicode),
        Column("layerType", Unicode(12)),
        Column("url", Unicode),
        Column("imageType", Unicode(10)),
        Column("style", Unicode),
        Column("dimensions", Unicode),
        Column("matrixSet", Unicode),
        Column("wmsUrl", Unicode),
        Column("wmsLayers", Unicode),
        Column("queryLayers", Unicode),
        Column("kml", Unicode),
        Column("isSingleTile", Boolean),
        Column("legend", Boolean, default=True),
        Column("legendImage", Unicode),
        Column("legendRule", Unicode),
        Column("isLegendExpanded", Boolean, default=False),
        Column("minResolution", Float),
        Column("maxResolution", Float),
        Column("disclaimer", Unicode),
        Column("identifierAttributeField", Unicode),
        Column("geoTable", Unicode),
        Column("excludeProperties", Unicode),
        Column("timeMode", Unicode(8)),
        schema=schema,
    )
    op.create_table(
        "role_restrictionarea",
        Column("role_id", Integer, ForeignKey(schema + ".role.id"), primary_key=True),
        Column("restrictionarea_id", Integer, ForeignKey(schema + ".restrictionarea.id"), primary_key=True),
        schema=schema,
    )
    op.create_table(
        "tsearch",
        Column("id", Integer, primary_key=True),
        Column("label", Unicode),
        Column("layer_name", Unicode),
        Column("role_id", Integer, ForeignKey(schema + ".role.id"), nullable=True),
        Column("public", Boolean, server_default="true"),
        Column("ts", TsVector),
        Column("params", Unicode, nullable=True),
        schema=schema,
    )
    op.execute(
        "SELECT AddGeometryColumn('%(schema)s', 'tsearch', 'the_geom', "
        "%(srid)s, 'GEOMETRY', 2)" % {"schema": schema, "srid": srid}
    )
    op.create_index("tsearch_ts_idx", "tsearch", ["ts"], schema=schema, postgresql_using="gin")
    op.create_table(
        "treegroup",
        Column("id", Integer, ForeignKey(schema + ".treeitem.id"), primary_key=True),
        schema=schema,
    )

    op.create_table(
        "user",
        Column("type", String(10), nullable=False),
        Column("id", Integer, primary_key=True),
        Column("username", Unicode, unique=True, nullable=False),
        Column("password", Unicode, nullable=False),
        Column("email", Unicode, nullable=False),
        Column("is_password_changed", Boolean, default=False),
        Column("role_id", Integer, ForeignKey(schema + ".role.id"), nullable=False),
        schema=schema,
    )
    if parentschema is not None and parentschema != "":
        op.add_column(
            "user", Column("parent_role_id", Integer, ForeignKey(parentschema + ".role.id")), schema=schema
        )
    op.execute(
        "INSERT INTO %(schema)s.user (type, username, email, password, role_id) "
        "(SELECT 'user', 'admin', '*****@*****.**', '%(pass)s', r.id "
        "FROM %(schema)s.role AS r "
        "WHERE r.name = 'role_admin')" % {"schema": schema, "pass": sha1("admin".encode("utf-8")).hexdigest()}
    )

    op.create_table(
        "role_functionality",
        Column("role_id", Integer, ForeignKey(schema + ".role.id"), primary_key=True),
        Column("functionality_id", Integer, ForeignKey(schema + ".functionality.id"), primary_key=True),
        schema=schema,
    )
    op.create_table(
        "user_functionality",
        Column("user_id", Integer, ForeignKey(schema + ".user.id"), primary_key=True),
        Column("functionality_id", Integer, ForeignKey(schema + ".functionality.id"), primary_key=True),
        schema=schema,
    )
    op.create_table(
        "layergroup",
        Column("id", Integer, ForeignKey(schema + ".treegroup.id"), primary_key=True),
        Column("isExpanded", Boolean),
        Column("isInternalWMS", Boolean),
        # children have radio button instance of check box
        Column("isBaseLayer", Boolean),
        schema=schema,
    )
    op.create_table(
        "layer_restrictionarea",
        Column("layer_id", Integer, ForeignKey(schema + ".layer.id"), primary_key=True),
        Column("restrictionarea_id", Integer, ForeignKey(schema + ".restrictionarea.id"), primary_key=True),
        schema=schema,
    )
    op.create_table(
        "layergroup_treeitem",
        Column("treegroup_id", Integer, ForeignKey(schema + ".treegroup.id"), primary_key=True),
        Column("treeitem_id", Integer, ForeignKey(schema + ".treeitem.id"), primary_key=True),
        schema=schema,
    )
    op.create_table(
        "theme",
        Column("id", Integer, ForeignKey(schema + ".treegroup.id"), primary_key=True),
        Column("icon", Unicode),
        Column("inMobileViewer", Boolean, default=False),
        Column("inDesktopViewer", Boolean, default=True),
        schema=schema,
    )
    op.create_table(
        "theme_functionality",
        Column("theme_id", Integer, ForeignKey(schema + ".theme.id"), primary_key=True),
        Column("functionality_id", Integer, ForeignKey(schema + ".functionality.id"), primary_key=True),
        schema=schema,
    )

    op.execute(
        'INSERT INTO {schema}.treeitem (type, name, "order") '
        "VALUES ('group', 'background', 0)".format(schema=schema)
    )
    op.execute(
        "INSERT INTO {schema}.treegroup (id) SELECT id " "FROM {schema}.treeitem".format(schema=schema)
    )
    op.execute(
        "INSERT INTO {schema}.layergroup (id) SELECT id " "FROM {schema}.treeitem".format(schema=schema)
    )
예제 #11
0
def upgrade():
    schema = config['schema']
    staticschema = config['schema_static']
    parentschema = config.get('parentschema')

    engine = op.get_bind().engine
    if type(engine).__name__ != 'MockConnection' and \
            op.get_context().dialect.has_table(
                engine, 'user', schema=staticschema):  # pragma: no cover
        return

    op.create_table(
        'user',
        Column('type', String(10), nullable=False),
        Column('id', Integer, primary_key=True),
        Column('username', Unicode, unique=True, nullable=False),
        Column('password', Unicode, nullable=False),
        Column('email', Unicode, nullable=False),
        Column('is_password_changed', Boolean, default=False),
        Column('role_name', String),
        schema=staticschema,
    )
    parent_column = ''
    parent_select = ''
    parent_join = ''
    if parentschema is not None and parentschema is not '':  # pragma: no cover
        op.add_column(
            'user',
            Column('parent_role_name', String),
            schema=staticschema
        )
        parent_column = ', parent_role_name'
        parent_select = ', pr.name'
        parent_join = (
            'LEFT OUTER JOIN {parentschema!s}.role AS pr ON (pr.id = u.parent_role_id)'.format(
                parentschema=parentschema,
            )
        )

    try:
        op.execute(
            'INSERT INTO %(staticschema)s.user '
            '(type, username, password, email, is_password_changed, role_name%(parent_column)s) ('
            'SELECT u.type, u.username, u.password, u.email, '
            'u.is_password_changed, r.name%(parent_select)s '
            'FROM %(schema)s.user AS u '
            'LEFT OUTER JOIN %(schema)s.role AS r ON (r.id = u.role_id) %(parent_join)s'
            ')' % {
                'staticschema': staticschema,
                'schema': schema,
                'parent_select': parent_select,
                'parent_column': parent_column,
                'parent_join': parent_join,
            }
        )
        op.drop_table('user', schema=schema)
    except Exception:
        op.execute(
            "INSERT INTO %(staticschema)s.user (type, username, email, password, role) "
            "VALUES ( 'user', 'admin', '*****@*****.**', '%(pass)s', 'role_admin')" % {
                'staticschema': staticschema,
                'pass': sha1('admin'.encode('utf-8')).hexdigest()
            }
        )