summaryrefslogtreecommitdiff
path: root/base_geoengine/geo_view
diff options
context:
space:
mode:
authorRichard Sassine <richardsassine@tutanota.com>2021-05-31 19:22:23 +0300
committerRichard Sassine <richardsassine@tutanota.com>2021-05-31 19:22:23 +0300
commit3a8776ee0342f47a57bcc9365499ebd5d3d7ee1c (patch)
tree9515fcef8e53992a9bbbcdc7950e1dd596983166 /base_geoengine/geo_view
parent9d3eeeb5c7d4055b34bc0768387952850ed78668 (diff)
added geoengine
Diffstat (limited to 'base_geoengine/geo_view')
-rw-r--r--base_geoengine/geo_view/__init__.py24
-rw-r--r--base_geoengine/geo_view/__pycache__/__init__.cpython-36.pycbin0 -> 382 bytes
-rw-r--r--base_geoengine/geo_view/__pycache__/geo_raster_layer.cpython-36.pycbin0 -> 2878 bytes
-rw-r--r--base_geoengine/geo_view/__pycache__/geo_vector_layer.cpython-36.pycbin0 -> 2060 bytes
-rw-r--r--base_geoengine/geo_view/__pycache__/geo_vector_symbol.cpython-36.pycbin0 -> 884 bytes
-rw-r--r--base_geoengine/geo_view/__pycache__/ir_view.cpython-36.pycbin0 -> 1033 bytes
-rw-r--r--base_geoengine/geo_view/geo_raster_layer.py78
-rw-r--r--base_geoengine/geo_view/geo_raster_layer_view.xml71
-rw-r--r--base_geoengine/geo_view/geo_vector_layer.py73
-rw-r--r--base_geoengine/geo_view/geo_vector_layer_view.xml77
-rw-r--r--base_geoengine/geo_view/geo_vector_symbol.py19
-rw-r--r--base_geoengine/geo_view/ir_view.py29
-rw-r--r--base_geoengine/geo_view/ir_view_view.xml43
13 files changed, 414 insertions, 0 deletions
diff --git a/base_geoengine/geo_view/__init__.py b/base_geoengine/geo_view/__init__.py
new file mode 100644
index 0000000..88d8c16
--- /dev/null
+++ b/base_geoengine/geo_view/__init__.py
@@ -0,0 +1,24 @@
+##############################################################################
+#
+# Author: Nicolas Bessi
+# Copyright 2011-2012 Camptocamp SA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+"""Module that manages map view and vector/raster layer"""
+from . import geo_raster_layer
+from . import geo_vector_layer
+from . import geo_vector_symbol
+from . import ir_view
diff --git a/base_geoengine/geo_view/__pycache__/__init__.cpython-36.pyc b/base_geoengine/geo_view/__pycache__/__init__.cpython-36.pyc
new file mode 100644
index 0000000..301550b
--- /dev/null
+++ b/base_geoengine/geo_view/__pycache__/__init__.cpython-36.pyc
Binary files differ
diff --git a/base_geoengine/geo_view/__pycache__/geo_raster_layer.cpython-36.pyc b/base_geoengine/geo_view/__pycache__/geo_raster_layer.cpython-36.pyc
new file mode 100644
index 0000000..9f9f351
--- /dev/null
+++ b/base_geoengine/geo_view/__pycache__/geo_raster_layer.cpython-36.pyc
Binary files differ
diff --git a/base_geoengine/geo_view/__pycache__/geo_vector_layer.cpython-36.pyc b/base_geoengine/geo_view/__pycache__/geo_vector_layer.cpython-36.pyc
new file mode 100644
index 0000000..756b677
--- /dev/null
+++ b/base_geoengine/geo_view/__pycache__/geo_vector_layer.cpython-36.pyc
Binary files differ
diff --git a/base_geoengine/geo_view/__pycache__/geo_vector_symbol.cpython-36.pyc b/base_geoengine/geo_view/__pycache__/geo_vector_symbol.cpython-36.pyc
new file mode 100644
index 0000000..f1a1767
--- /dev/null
+++ b/base_geoengine/geo_view/__pycache__/geo_vector_symbol.cpython-36.pyc
Binary files differ
diff --git a/base_geoengine/geo_view/__pycache__/ir_view.cpython-36.pyc b/base_geoengine/geo_view/__pycache__/ir_view.cpython-36.pyc
new file mode 100644
index 0000000..6a7859a
--- /dev/null
+++ b/base_geoengine/geo_view/__pycache__/ir_view.cpython-36.pyc
Binary files differ
diff --git a/base_geoengine/geo_view/geo_raster_layer.py b/base_geoengine/geo_view/geo_raster_layer.py
new file mode 100644
index 0000000..c990b6a
--- /dev/null
+++ b/base_geoengine/geo_view/geo_raster_layer.py
@@ -0,0 +1,78 @@
+# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA)
+# Copyright 2016 Yannick Vaucher (Camptocamp SA)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from odoo import api, fields, models
+
+
+class GeoRasterLayerType(models.Model):
+ _name = "geoengine.raster.layer.type"
+ _description = "Raster Layer Type"
+
+ name = fields.Char(translate=True, required=True)
+ code = fields.Char(required=True)
+ service = fields.Char(required=True)
+
+
+class GeoRasterLayer(models.Model):
+ _name = "geoengine.raster.layer"
+ _description = "Raster Layer"
+
+ raster_type = fields.Selection(
+ [
+ ("osm", "OpenStreetMap"),
+ ("wmts", "WMTS"),
+ ("d_wms", "Distant WMS"),
+ ("odoo", "Odoo field"),
+ ],
+ string="Raster layer type",
+ default="osm",
+ required=True,
+ )
+ name = fields.Char("Layer Name", size=256, translate=True, required=True)
+ url = fields.Char("Service URL", size=1024)
+
+ # technical field to display or not wmts options
+ is_wmts = fields.Boolean(compute="_compute_is_wmts")
+ # wmts options
+ matrix_set = fields.Char("matrixSet")
+ format_suffix = fields.Char("formatSuffix", help="eg. png")
+ request_encoding = fields.Char("requestEncoding", help="eg. REST")
+ projection = fields.Char("projection", help="eg. EPSG:21781")
+ units = fields.Char(help="eg. m")
+ resolutions = fields.Char("resolutions")
+ max_extent = fields.Char("max_extent")
+ dimensions = fields.Char("dimensions", help="List of dimensions separated by ','")
+ params = fields.Char("params", help="Dictiorary of values for dimensions as JSON")
+
+ # technical field to display or not layer type
+ has_type = fields.Boolean(compute="_compute_has_type")
+ type_id = fields.Many2one(
+ "geoengine.raster.layer.type", "Layer", domain="[('service', '=', raster_type)]"
+ )
+ type = fields.Char(related="type_id.code")
+ sequence = fields.Integer("layer priority lower on top", default=6)
+ overlay = fields.Boolean("Is overlay layer?")
+ field_id = fields.Many2one(
+ "ir.model.fields",
+ "Odoo layer field to use",
+ domain=[("ttype", "ilike", "geo_"), ("model", "=", "view_id.model")],
+ )
+ view_id = fields.Many2one(
+ "ir.ui.view", "Related View", domain=[("type", "=", "geoengine")], required=True
+ )
+ use_to_edit = fields.Boolean("Use to edit")
+
+ @api.depends("raster_type", "is_wmts")
+ def _compute_has_type(self):
+ for rec in self:
+ rec.has_type = rec.raster_type == "is_wmts"
+
+ @api.depends("raster_type")
+ def _compute_is_wmts(self):
+ for rec in self:
+ rec.is_wmts = rec.raster_type == "wmts"
+
+ @api.onchange("raster_type")
+ def onchange_set_wmts_options(self):
+ """ Abstract method for WMTS modules to set default options """
+ pass
diff --git a/base_geoengine/geo_view/geo_raster_layer_view.xml b/base_geoengine/geo_view/geo_raster_layer_view.xml
new file mode 100644
index 0000000..a49fc5e
--- /dev/null
+++ b/base_geoengine/geo_view/geo_raster_layer_view.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <record model="ir.ui.view" id="geo_raster_view_form">
+ <field name="name">geoengine.raster.layer.form</field>
+ <field name="model">geoengine.raster.layer</field>
+ <field name="arch" type="xml">
+ <form string="Raster Layer View">
+ <group string="General" col="4">
+ <field name="name" colspan="4"/>
+ <field name="view_id"/>
+ <field name="raster_type"/>
+ <field name="sequence"/>
+ <field name="overlay"/>
+ <field name="use_to_edit" colspan="4"/>
+ <field name="url" colspan="4" widget="url" attrs="{'required': [('is_wmts', '=', True)]}"/>
+ </group>
+ <field name="is_wmts" invisible="1"/>
+ <group string="WMTS options"
+ attrs="{'invisible': [('is_wmts', '=', False)]}"
+ colspan="4">
+ <field name="matrix_set" attrs="{'required': [('is_wmts', '=', True)]}"/>
+ <field name="format_suffix"/>
+ <field name="request_encoding"/>
+ <field name="projection"/>
+ <field name="units"/>
+ <field name="resolutions"/>
+ <field name="max_extent"/>
+ <field name="dimensions"/>
+ <field name="params"/>
+ </group>
+ <field name="has_type" invisible="1"/>
+ <group string="Layer data"
+ attrs="{'invisible': [('has_type', '=', False)]}"
+ colspan="4">
+ <field name="type_id" widget="selection" attrs="{'required': [('has_type', '=', True)]}"/>
+ </group>
+ <group string="Odoo layer data (Not implemented)"
+ attrs="{'invisible': [('raster_type', '!=', 'odoo')]}"
+ colspan="4">
+ <field name="field_id"/>
+ </group>
+ </form>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="geo_raster_view_tree">
+ <field name="name">geoengine.raster.layer.tree</field>
+ <field name="model">geoengine.raster.layer</field>
+ <field name="arch" type="xml">
+ <tree string="Raster">
+ <field name="name" select="1"/>
+ <field name="raster_type" select="1"/>
+ <field name="sequence"/>
+ <field name="overlay" select="1"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="geo_engine_view_rater_action" model="ir.actions.act_window">
+ <field name="name">Raster Layer</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">geoengine.raster.layer</field>
+ <field name="view_id" ref="geo_raster_view_tree"/>
+ </record>
+
+ <menuitem name="Raster Layer Management" id="geoengine_raster_layer_menu"
+ parent="geoengine_base_view_menu" action="geo_engine_view_rater_action"
+ groups="group_geoengine_admin"/>
+
+</odoo>
diff --git a/base_geoengine/geo_view/geo_vector_layer.py b/base_geoengine/geo_view/geo_vector_layer.py
new file mode 100644
index 0000000..0c23638
--- /dev/null
+++ b/base_geoengine/geo_view/geo_vector_layer.py
@@ -0,0 +1,73 @@
+# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA)
+# Copyright 2016 Yannick Vaucher (Camptocamp SA)
+# Copyright 2021 Shurshilov Artem
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from odoo import fields, models
+
+SUPPORTED_ATT = [
+ "float",
+ "integer",
+ "integer_big",
+ "related",
+ "function",
+ "date",
+ "datetime",
+ "char",
+ "text",
+ "selection",
+]
+
+
+class GeoVectorLayer(models.Model):
+ _name = "geoengine.vector.layer"
+ _description = "Vector Layer"
+
+ geo_repr = fields.Selection(
+ [
+ ("basic", "Basic"),
+ # Actually we have to think if we should separate it for colored
+ ("proportion", "Proportional Symbol"),
+ ("colored", "Colored range/Chroma.js"),
+ ],
+ string="Representation mode",
+ required=True,
+ )
+ classification = fields.Selection(
+ [
+ ("unique", "Unique value"),
+ ("interval", "Interval"),
+ ("quantile", "Quantile"),
+ ("custom", "Custom"),
+ ],
+ string="Classification mode",
+ required=False,
+ )
+ name = fields.Char("Layer Name", translate=True, required=True)
+ symbol_ids = fields.One2many("geoengine.vector.symbol", "vector_layer_id")
+ begin_color = fields.Char(
+ "Begin color class", size=64, required=False, help="hex value"
+ )
+ end_color = fields.Char(
+ "End color class", size=64, required=False, help="hex value", default="#FF680A"
+ )
+ nb_class = fields.Integer("Number of class", default=1)
+ attribute_field_id = fields.Many2one(
+ "ir.model.fields", "attribute field", domain=[("ttype", "in", SUPPORTED_ATT)]
+ )
+ geo_field_id = fields.Many2one(
+ "ir.model.fields",
+ "Geo field",
+ domain=[("ttype", "ilike", "geo_")],
+ required=True,
+ ondelete='cascade'
+ )
+ view_id = fields.Many2one(
+ "ir.ui.view", "Related View", domain=[("type", "=", "geoengine")], required=True
+ )
+ sequence = fields.Integer("layer priority lower on top", default=6)
+ readonly = fields.Boolean("Layer is read only")
+ display_polygon_labels = fields.Boolean("Display Labels on Polygon")
+ active_on_startup = fields.Boolean(
+ help="Layer will be shown on startup if checked."
+ )
+ layer_opacity = fields.Float("Layer Opacity")
diff --git a/base_geoengine/geo_view/geo_vector_layer_view.xml b/base_geoengine/geo_view/geo_vector_layer_view.xml
new file mode 100644
index 0000000..aad55d6
--- /dev/null
+++ b/base_geoengine/geo_view/geo_vector_layer_view.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <record model="ir.ui.view" id="geo_vector_view_form">
+ <field name="name">geoengine.vector.layer.form</field>
+ <field name="model">geoengine.vector.layer</field>
+ <field name="arch" type="xml">
+ <form string="Vector">
+ <group string="General" col="4">
+ <field name="name" colspan="4"/>
+ <field name="view_id"/>
+ <field name="geo_field_id"/>
+ <field name="attribute_field_id" attrs="{'required': [('geo_repr', 'in', ['choropleth', 'proportion', 'colored'])]}"/>
+ <field name="active_on_startup"/>
+ <field name="display_polygon_labels"/>
+ <field name="sequence"/>
+ <field name="readonly"/>
+ <field name="layer_opacity"/>
+ </group>
+ <group string="Representation" col="4" colspan="4">
+ <field name="geo_repr"/>
+ </group>
+ <field name="symbol_ids" attrs="{'invisible': [('geo_repr', '!=', 'basic')]}">
+ <tree editable="bottom">
+ <field name="img" placeholder="module/static/img/icon.png"/>
+ <field name="fieldname"/>
+ <field name="value"/>
+ </tree>
+ </field>
+ <group string="Classification" colspan="4"
+ attrs="{'invisible': [('geo_repr', '=', 'basic')]}">
+ <field name="classification"
+ attrs="{'invisible': [('geo_repr', '=', 'basic')], 'required': [('geo_repr', 'in', ['choropleth', 'proportion', 'colored'])]}"
+ />
+ </group>
+ <group string="Colors" col="4" colspan="4">
+ <field name="begin_color"/>
+ <group colspan="4" attrs="{'invisible': [('geo_repr', 'in', ['basic', 'proportion'])]}">
+ <field name="end_color"
+ attrs="{'invisible': [('classification', 'in', ['unique', False])], 'required': [('classification', 'in', ['interval', 'quantil'])]}"/>
+ <field name="nb_class"
+ attrs="{'invisible': [('classification', 'in', ['unique', False])], 'required': [('classification', 'in', ['interval', 'quantil'])]}"
+ />
+ </group>
+ </group>
+ </form>
+ </field>
+ </record>
+
+ <record model="ir.ui.view" id="geo_vector_view_tree">
+ <field name="name">geoengine.vector.layer.tree</field>
+ <field name="model">geoengine.vector.layer</field>
+ <field name="arch" type="xml">
+ <tree string="Vector">
+ <field name="name" select="1"/>
+ <field name="geo_repr" select="1"/>
+ <field name="classification" select="1"/>
+ <field name="geo_field_id" select="1"/>
+ <field name="attribute_field_id" select="1"/>
+ <field name="active_on_startup"/>
+ <field name="sequence"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="geo_engine_view_raster_action" model="ir.actions.act_window">
+ <field name="name">Vector Layer</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">geoengine.vector.layer</field>
+ <field name="view_id" ref="geo_vector_view_tree"/>
+ </record>
+
+ <menuitem name="Vector Layer Management" id="geoengine_vector_layer_menu"
+ parent="geoengine_base_view_menu" action="geo_engine_view_raster_action"
+ groups="group_geoengine_admin"/>
+
+</odoo>
diff --git a/base_geoengine/geo_view/geo_vector_symbol.py b/base_geoengine/geo_view/geo_vector_symbol.py
new file mode 100644
index 0000000..2cba932
--- /dev/null
+++ b/base_geoengine/geo_view/geo_vector_symbol.py
@@ -0,0 +1,19 @@
+# Copyright 2016 Yannick Vaucher (Camptocamp SA)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from odoo import fields, models
+
+
+class GeoVectorSymbol(models.Model):
+ _name = "geoengine.vector.symbol"
+ _description = "Vector Layer Symbol"
+
+ vector_layer_id = fields.Many2one("geoengine.vector.layer")
+ fieldname = fields.Char(
+ "Category field",
+ help="Name of the char field or selection field used for comparison",
+ )
+ value = fields.Char(help="All object equal to this value will use this symbol")
+ img = fields.Char(
+ help="URL of the image to use. You can put an image in your module "
+ "in static folder e.g. 'base_geoengine/static/img/map-marker.png'"
+ )
diff --git a/base_geoengine/geo_view/ir_view.py b/base_geoengine/geo_view/ir_view.py
new file mode 100644
index 0000000..971945c
--- /dev/null
+++ b/base_geoengine/geo_view/ir_view.py
@@ -0,0 +1,29 @@
+# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA)
+# Copyright 2016 Yannick Vaucher (Camptocamp SA)
+# Copyright 2021 Shurshilov Artem
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from odoo import fields, models
+
+
+class IrUIView(models.Model):
+ _inherit = "ir.ui.view"
+
+ type = fields.Selection(selection_add=[("geoengine", "GeoEngine")], ondelete={'geoengine': 'cascade'})
+
+ raster_layer_ids = fields.One2many(
+ "geoengine.raster.layer", "view_id", "Raster layers", required=False
+ )
+
+ vector_layer_ids = fields.One2many(
+ "geoengine.vector.layer", "view_id", "Vector layers", required=True
+ )
+
+ projection = fields.Char(default="EPSG:3857", required=True)
+ default_extent = fields.Char(
+ "Default map extent",
+ size=128,
+ default="-123164.85222423, 5574694.9538936, 1578017.6490538,"
+ " 6186191.1800898",
+ )
+ default_zoom = fields.Integer("Default map zoom")
+ restricted_extent = fields.Char("Restricted map extent", size=128)
diff --git a/base_geoengine/geo_view/ir_view_view.xml b/base_geoengine/geo_view/ir_view_view.xml
new file mode 100644
index 0000000..1e9615c
--- /dev/null
+++ b/base_geoengine/geo_view/ir_view_view.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <record model="ir.ui.view" id="geoengine_view_form">
+ <field name="name">geoengine.view.form</field>
+ <field name="model">ir.ui.view</field>
+ <field name="inherit_id" ref="base.view_view_form"/>
+ <field name="arch" type="xml">
+ <notebook position="inside">
+ <page string="GeoEngine Data" col="4"
+ attrs="{'invisible': [('type', '!=', 'geoengine')]}">
+ <group>
+ <field name="projection"/>
+ <field name="restricted_extent" colspan="4"/>
+ <field name="default_extent" colspan="4"/>
+ <field name="default_zoom"/>
+ </group>
+ <separator string="Vector (Active layers)" colspan="4"/>
+ <field name="vector_layer_ids" colspan="4" nolabel="1"/>
+ <separator string="Raster (Background layers)" colspan="4"/>
+ <field name="raster_layer_ids" colspan="4" nolabel="1"/>
+ </page>
+ </notebook>
+ </field>
+ </record>
+ <menuitem name="Configuration" id="geoengine_base_view_menu"
+ parent="geoengine_base_menu"
+ groups="group_geoengine_admin" />
+
+ <record id="geo_engine_view_action" model="ir.actions.act_window">
+ <field name="name">Views</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">ir.ui.view</field>
+ <field name="view_id" ref="base.view_view_tree"/>
+ <field name="search_view_id" ref="base.action_view_search"/>
+ <field name="domain">[('type', '=', 'geoengine')]</field>
+ </record>
+
+ <menuitem name="View Management" id="geoengine_view_menu"
+ parent="geoengine_base_view_menu" action="geo_engine_view_action"
+ groups="group_geoengine_admin"/>
+
+</odoo>