Exemplo n.º 1
0
    def _collect_app_config(cls, config, filename):
        # Collect raster layers names
        raster = [
            Message(None, raster_layer, None, [], "", "",
                    (filename, "raster/{}".format(raster_layer)))
            for raster_layer in list(config["vars"].get("raster", {}).keys())
        ]
        # Collect layers enum values (for filters)
        settings = get_config("config.yaml")
        from c2cgeoportal.pyramid_ import init_dbsessions
        init_dbsessions(settings)
        from c2cgeoportal.models import DBSessions
        from c2cgeoportal.views.layers import Layers
        enums = []
        enum_layers = config["vars"].get("layers", {}).get("enum", {})
        for layername in list(enum_layers.keys()):
            layerinfos = enum_layers.get(layername, {})
            attributes = layerinfos.get("attributes", {})
            for fieldname in list(attributes.keys()):
                values = cls._enumerate_attributes_values(
                    DBSessions, Layers, layerinfos, fieldname)
                for value, in values:
                    if value != "":
                        msgid = value if isinstance(value, str) else value
                        location = "/layers/{}/values/{}/{}".format(
                            layername, fieldname,
                            value.encode("ascii", errors="replace")
                            if isinstance(value, str) else value)
                        enums.append(
                            Message(None, msgid, None, [], "", "",
                                    (filename, location)))

        return raster + enums
Exemplo n.º 2
0
    def __call__(self, filename, options):
        messages = []

        self.env = bootstrap(filename)
        with open("project.yaml") as f:
            self.package = yaml.load(f)
        self.config = get_config(".build/config.yaml")

        try:
            from c2cgeoportal.models import DBSession, Theme, LayerGroup, \
                LayerWMS, LayerWMTS, FullTextSearch

            self._import(Theme, messages)
            self._import(LayerGroup, messages)
            self._import(LayerWMS, messages, self._import_layer_wms)
            self._import(LayerWMTS, messages, self._import_layer_wmts)
        except ProgrammingError as e:
            print(colorize(
                "ERROR: The database is probably not up to date "
                "(should be ignored when happen during the upgrade)",
                RED
            ))
            print(colorize(e, RED))

        for ln, in DBSession.query(FullTextSearch.layer_name).distinct().all():
            if ln is not None and ln != "":
                messages.append(Message(
                    None, ln, None, [], u"", u"",
                    ("fts", ln.encode("ascii", errors="replace"))
                ))

        return messages
Exemplo n.º 3
0
 def __init__(self):
     super().__init__()
     self.config = get_config("geoportal/config.yaml") if os.path.exists("geoportal/config.yaml") else None
     if os.path.exists("project.yaml"):
         with open("project.yaml") as f:
             self.package = yaml.safe_load(f)
     else:
         self.package = None
Exemplo n.º 4
0
    def test_get_config(self):
        from c2c.template import get_config

        os.environ['AA'] = '11'
        os.environ['BB_CC'] = '22_33'
        os.environ['DD_EE'] = '44_55'

        config = get_config('c2c/tests/config.yaml')

        self.assertEquals(config['aa'], '11')
        self.assertEquals(config['bb']['cc'], '22_33')
        self.assertEquals(config['dd.ee'], '44_55')
Exemplo n.º 5
0
    def __call__(self, filename, options):
        messages = []

        try:
            self.env = bootstrap(filename)
            with open("project.yaml") as f:
                self.package = yaml.safe_load(f)
            self.config = get_config("config.yaml")

            try:
                from c2cgeoportal_commons.models import DBSession
                from c2cgeoportal_commons.models.main import Theme, LayerGroup, \
                    LayerWMS, LayerWMTS, FullTextSearch

                self._import(Theme, messages)
                self._import(LayerGroup, messages)
                self._import(LayerWMS, messages, self._import_layer_wms)
                self._import(LayerWMTS, messages, self._import_layer_wmts)

                for ln, in DBSession.query(
                        FullTextSearch.layer_name).distinct().all():
                    if ln is not None and ln != "":
                        messages.append(
                            Message(
                                None, ln, None, [], "", "",
                                ("fts", ln.encode("ascii", errors="replace"))))
            except ProgrammingError as e:
                print(
                    colorize(
                        "ERROR! The database is probably not up to date "
                        "(should be ignored when happen during the upgrade)",
                        RED))
                print(colorize(e, RED))
                if os.environ.get("IGNORE_I18N_ERRORS", "FALSE") != "TRUE":
                    raise
        except NoSuchTableError as e:
            print(
                colorize(
                    "ERROR! The schema didn't seem to exists "
                    "(should be ignored when happen during the deploy)", RED))
            print(colorize(e, RED))
            if os.environ.get("IGNORE_I18N_ERRORS", "FALSE") != "TRUE":
                raise
        except OperationalError as e:
            print(
                colorize(
                    "ERROR! The database didn't seem to exists "
                    "(should be ignored when happen during the deploy)", RED))
            print(colorize(e, RED))
            if os.environ.get("IGNORE_I18N_ERRORS", "FALSE") != "TRUE":
                raise

        return messages
Exemplo n.º 6
0
    def __init__(self, options):
        self.options = options
        self.imported = set()

        settings = get_config("geoportal/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(
                "{}_geoportal-client".format(package),
                os.path.join("geoportal", "{}_geoportal".format(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()
Exemplo n.º 7
0
    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()
Exemplo n.º 8
0
    def _collect_app_config(self, filename):
        settings = get_config(filename)
        # Collect raster layers names
        raster = [
            Message(
                None, raster_layer, None, [], "", "",
                (filename, "raster/{}".format(raster_layer))
            )
            for raster_layer in list(settings.get("raster", {}).keys())
        ]

        # Collect layers enum values (for filters)

        class R:
            settings = None

        class C:
            registry = R()

        config = C()
        config.registry.settings = settings
        from c2cgeoportal_commons import models
        models.init_dbsessions(settings, config)
        from c2cgeoportal_geoportal.views.layers import Layers
        enums = []
        enum_layers = settings.get("layers", {}).get("enum", {})
        for layername in list(enum_layers.keys()):
            layerinfos = enum_layers.get(layername, {})
            attributes = layerinfos.get("attributes", {})
            for fieldname in list(attributes.keys()):
                values = self._enumerate_attributes_values(models.DBSessions, Layers, layerinfos, fieldname)
                for value, in values:
                    if value != "":
                        msgid = value if isinstance(value, str) else value
                        location = "/layers/{}/values/{}/{}".format(
                            layername,
                            fieldname,
                            value.encode("ascii", errors="replace") if isinstance(value, str) else value)
                        enums.append(Message(None, msgid, None, [], "", "", (filename, location)))

        return raster + enums
Exemplo n.º 9
0
    def __call__(self, filename, options):
        messages = []

        self.env = bootstrap(filename)
        with open("project.yaml") as f:
            self.package = yaml.load(f)
        self.config = get_config(".build/config.yaml")

        try:
            from c2cgeoportal.models import Theme, LayerGroup, \
                LayerWMS, LayerWMTS

            self._import(Theme, messages)
            self._import(LayerGroup, messages)
            self._import(LayerWMS, messages, self._import_layer_wms)
            self._import(LayerWMTS, messages, self._import_layer_wmts)
        except ProgrammingError as e:
            print(colorize("ERROR: The database is probably not up to date", RED))
            print(colorize(e, RED))

        return messages
Exemplo n.º 10
0
    def __call__(self, filename, options):
        messages = []

        self.env = bootstrap(filename)
        with open("project.yaml") as f:
            self.package = yaml.load(f)
        self.config = get_config(".build/config.yaml")

        try:
            from c2cgeoportal.models import Theme, LayerGroup, \
                LayerWMS, LayerWMTS

            self._import(Theme, messages)
            self._import(LayerGroup, messages)
            self._import(LayerWMS, messages, self._import_layer_wms)
            self._import(LayerWMTS, messages, self._import_layer_wmts)
        except ProgrammingError as e:
            print(
                colorize(
                    "ERROR: The database is probably not up to date "
                    "(should be ignored when happen during the upgrade)", RED))
            print(colorize(e, RED))

        return messages
Exemplo n.º 11
0
    def __call__(self, filename, options):
        config = get_config("config.yaml")

        class Registry:
            settings = config

        class Request:
            registry = Registry()
            params = {}
            GET = {}
            user_agent = ""

            @staticmethod
            def static_url(*args, **kwargs):
                return ""

            @staticmethod
            def static_path(*args, **kwargs):
                return ""

            @staticmethod
            def route_url(*args, **kwargs):
                return ""

            @staticmethod
            def current_route_url(*args, **kwargs):
                return ""

        init_region({"backend": "dogpile.cache.memory"})

        int_filename = filename
        if re.match(
                "^" + re.escape("./{}/templates".format(config["package"])),
                filename):
            try:
                empty_template = Template("")

                class Lookup(TemplateLookup):
                    @staticmethod
                    def get_template(uri):
                        return empty_template

                class MyTemplate(MakoTemplate):
                    def prepare(self, **options):
                        options.update({"input_encoding": self.encoding})
                        lookup = Lookup(**options)
                        if self.source:
                            self.tpl = Template(self.source,
                                                lookup=lookup,
                                                **options)
                        else:
                            self.tpl = Template(uri=self.name,
                                                filename=self.filename,
                                                lookup=lookup,
                                                **options)

                try:
                    processed = template(filename, {
                        "request": Request(),
                        "lang": "fr",
                        "debug": False,
                        "extra_params": {},
                        "permalink_themes": "",
                        "fulltextsearch_groups": [],
                        "wfs_types": [],
                        "_": lambda x: x,
                    },
                                         template_adapter=MyTemplate)
                    int_filename = os.path.join(
                        os.path.dirname(filename),
                        "_" + os.path.basename(filename))
                    with open(int_filename, "wb") as file_open:
                        file_open.write(processed.encode("utf-8"))
                except:
                    print(
                        colorize(
                            "ERROR! Occurred during the '{}' template generation"
                            .format(filename), RED))
                    print(colorize(traceback.format_exc(), RED))
                    if os.environ.get("IGNORE_I18N_ERRORS", "FALSE") == "TRUE":
                        # Continue with the original one
                        int_filename = filename
                    else:
                        raise
            except:
                print(traceback.format_exc())

        message_str = subprocess.check_output(
            ["node", "tools/extract-messages.js",
             int_filename]).decode("utf-8")
        if int_filename != filename:
            os.unlink(int_filename)
        try:
            messages = []
            for contexts, message in loads(message_str):
                for context in contexts.split(", "):
                    messages.append(
                        Message(None, message, None, [], "", "",
                                context.split(":")))
            return messages
        except:
            print(colorize("An error occurred", RED))
            print(colorize(message_str, RED))
            print("------")
            raise
Exemplo n.º 12
0
    def __call__(self, filename, options):
        config = get_config(".build/config.yaml")

        class Registry:
            settings = config

        class Request:
            registry = Registry()
            params = {}
            GET = {}
            user_agent = ""

            def static_url(*args, **kwargs):
                return ""

            def static_path(*args, **kwargs):
                return ""

            def route_url(*args, **kwargs):
                return ""

            def current_route_url(*args, **kwargs):
                return ""

        init_region({"backend": "dogpile.cache.memory"})

        int_filename = filename
        if re.match("^" + re.escape("./{}/templates".format(config["package"])), filename):
            try:
                empty_template = Template("")

                class Lookup(TemplateLookup):
                    @staticmethod
                    def get_template(uri):
                        return empty_template

                class MyTemplate(MakoTemplate):
                    def prepare(self, **options):
                        options.update({"input_encoding": self.encoding})
                        lookup = Lookup(**options)
                        if self.source:
                            self.tpl = Template(self.source, lookup=lookup, **options)
                        else:
                            self.tpl = Template(
                                uri=self.name,
                                filename=self.filename,
                                lookup=lookup, **options)

                processed = template(
                    filename,
                    {
                        "request": Request(),
                        "lang": "fr",
                        "debug": False,
                        "extra_params": {},
                        "permalink_themes": "",
                        "fulltextsearch_groups": [],
                        "wfs_types": [],
                        "_": lambda x: x,
                    },
                    template_adapter=MyTemplate
                )
                int_filename = os.path.join(os.path.dirname(filename), "_" + os.path.basename(filename))
                with open(int_filename, "wb") as file_open:
                    file_open.write(processed.encode("utf-8"))
            except:
                print(traceback.format_exc())

        message_str = subprocess.check_output(["node", "tools/extract-messages.js", int_filename])
        if int_filename != filename:
            os.unlink(int_filename)
        try:
            messages = []
            for contexts, message in loads(message_str):
                for context in contexts.split(", "):
                    messages.append(Message(
                        None, message, None, [], u"", u"", context.split(":")
                    ))
            return messages
        except:
            print(colorize("An error occurred", RED))
            print(colorize(message_str, RED))
            print("------")
            raise
Exemplo n.º 13
0
 def __init__(self):
     super().__init__()
     self.config = get_config("geoportal/config.yaml") if os.path.exists("geoportal/config.yaml") else None