diff options
| author | Richard Sassine <richardsassine@tutanota.com> | 2021-05-31 19:22:23 +0300 |
|---|---|---|
| committer | Richard Sassine <richardsassine@tutanota.com> | 2021-05-31 19:22:23 +0300 |
| commit | 3a8776ee0342f47a57bcc9365499ebd5d3d7ee1c (patch) | |
| tree | 9515fcef8e53992a9bbbcdc7950e1dd596983166 /base_geoengine/geo_view | |
| parent | 9d3eeeb5c7d4055b34bc0768387952850ed78668 (diff) | |
added geoengine
Diffstat (limited to 'base_geoengine/geo_view')
| -rw-r--r-- | base_geoengine/geo_view/__init__.py | 24 | ||||
| -rw-r--r-- | base_geoengine/geo_view/__pycache__/__init__.cpython-36.pyc | bin | 0 -> 382 bytes | |||
| -rw-r--r-- | base_geoengine/geo_view/__pycache__/geo_raster_layer.cpython-36.pyc | bin | 0 -> 2878 bytes | |||
| -rw-r--r-- | base_geoengine/geo_view/__pycache__/geo_vector_layer.cpython-36.pyc | bin | 0 -> 2060 bytes | |||
| -rw-r--r-- | base_geoengine/geo_view/__pycache__/geo_vector_symbol.cpython-36.pyc | bin | 0 -> 884 bytes | |||
| -rw-r--r-- | base_geoengine/geo_view/__pycache__/ir_view.cpython-36.pyc | bin | 0 -> 1033 bytes | |||
| -rw-r--r-- | base_geoengine/geo_view/geo_raster_layer.py | 78 | ||||
| -rw-r--r-- | base_geoengine/geo_view/geo_raster_layer_view.xml | 71 | ||||
| -rw-r--r-- | base_geoengine/geo_view/geo_vector_layer.py | 73 | ||||
| -rw-r--r-- | base_geoengine/geo_view/geo_vector_layer_view.xml | 77 | ||||
| -rw-r--r-- | base_geoengine/geo_view/geo_vector_symbol.py | 19 | ||||
| -rw-r--r-- | base_geoengine/geo_view/ir_view.py | 29 | ||||
| -rw-r--r-- | base_geoengine/geo_view/ir_view_view.xml | 43 |
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 Binary files differnew file mode 100644 index 0000000..301550b --- /dev/null +++ b/base_geoengine/geo_view/__pycache__/__init__.cpython-36.pyc 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 Binary files differnew file mode 100644 index 0000000..9f9f351 --- /dev/null +++ b/base_geoengine/geo_view/__pycache__/geo_raster_layer.cpython-36.pyc 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 Binary files differnew file mode 100644 index 0000000..756b677 --- /dev/null +++ b/base_geoengine/geo_view/__pycache__/geo_vector_layer.cpython-36.pyc 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 Binary files differnew file mode 100644 index 0000000..f1a1767 --- /dev/null +++ b/base_geoengine/geo_view/__pycache__/geo_vector_symbol.cpython-36.pyc diff --git a/base_geoengine/geo_view/__pycache__/ir_view.cpython-36.pyc b/base_geoengine/geo_view/__pycache__/ir_view.cpython-36.pyc Binary files differnew file mode 100644 index 0000000..6a7859a --- /dev/null +++ b/base_geoengine/geo_view/__pycache__/ir_view.cpython-36.pyc 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> |
