Skip to content

Commit 4138697

Browse files
committed
[MIG] fieldservice_geoengine: Migration to 16.0
1 parent 5dee8cc commit 4138697

File tree

11 files changed

+224
-24
lines changed

11 files changed

+224
-24
lines changed

.github/workflows/test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
makepot: "true"
4343
services:
4444
postgres:
45-
image: postgres:12.0
45+
image: postgis/postgis:13-3.4
4646
env:
4747
POSTGRES_USER: odoo
4848
POSTGRES_PASSWORD: odoo

fieldservice_geoengine/README.rst

+8-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Field Service Geoengine
77
!! This file is generated by oca-gen-addon-readme !!
88
!! changes will be overwritten. !!
99
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10-
!! source digest: sha256:00cbfc11e03373e90815257e248560b520030ac74c71a26281dc3f5a96930b40
10+
!! source digest: sha256:74438fc7ba6bb4441445c45d385f8490260b60a5d097618700e52d7b525b1f72
1111
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1212
1313
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -17,13 +17,13 @@ Field Service Geoengine
1717
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
1818
:alt: License: AGPL-3
1919
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffield--service-lightgray.png?logo=github
20-
:target: https://github.com/OCA/field-service/tree/14.0/fieldservice_geoengine
20+
:target: https://github.com/OCA/field-service/tree/16.0/fieldservice_geoengine
2121
:alt: OCA/field-service
2222
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
23-
:target: https://translation.odoo-community.org/projects/field-service-14-0/field-service-14-0-fieldservice_geoengine
23+
:target: https://translation.odoo-community.org/projects/field-service-16-0/field-service-16-0-fieldservice_geoengine
2424
:alt: Translate me on Weblate
2525
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
26-
:target: https://runboat.odoo-community.org/builds?repo=OCA/field-service&target_branch=14.0
26+
:target: https://runboat.odoo-community.org/builds?repo=OCA/field-service&target_branch=16.0
2727
:alt: Try me on Runboat
2828

2929
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -83,7 +83,7 @@ Bug Tracker
8383
Bugs are tracked on `GitHub Issues <https://github.com/OCA/field-service/issues>`_.
8484
In case of trouble, please check there if your issue has already been reported.
8585
If you spotted it first, help us to smash it by providing a detailed and welcomed
86-
`feedback <https://github.com/OCA/field-service/issues/new?body=module:%20fieldservice_geoengine%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
86+
`feedback <https://github.com/OCA/field-service/issues/new?body=module:%20fieldservice_geoengine%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
8787

8888
Do not contact contributors directly about support or help with technical issues.
8989

@@ -109,6 +109,8 @@ Contributors
109109
* Jevin Dement <jdement@opensourceintegrators.com>
110110
* Murtuza Saleh <murtuza.saleh@serpentcs.com>
111111
* Sebastiano Picchi <sebastiano.picchi@pytech.it>
112+
* [APSL-Nagarro](https://apsl.tech):
113+
* Antoni Marroig <amarroig@apsl.net>
112114

113115
Other credits
114116
~~~~~~~~~~~~~
@@ -141,6 +143,6 @@ Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
141143

142144
|maintainer-wolfhall| |maintainer-max3903|
143145

144-
This module is part of the `OCA/field-service <https://github.com/OCA/field-service/tree/14.0/fieldservice_geoengine>`_ project on GitHub.
146+
This module is part of the `OCA/field-service <https://github.com/OCA/field-service/tree/16.0/fieldservice_geoengine>`_ project on GitHub.
145147

146148
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

fieldservice_geoengine/__manifest__.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"name": "Field Service Geoengine",
77
"summary": "Display Field Service locations on a map with Open Street Map",
88
"license": "AGPL-3",
9-
"version": "14.0.1.2.2",
9+
"version": "16.0.1.0.0",
1010
"category": "Field Service",
1111
"author": "Open Source Integrators, Odoo Community Association (OCA), Pytech SRL",
1212
"website": "https://github.com/OCA/field-service",
@@ -17,6 +17,11 @@
1717
"views/fsm_team.xml",
1818
"views/fsm_order.xml",
1919
],
20+
"assets": {
21+
"web.assets_backend": [
22+
"fieldservice_geoengine/static/src/js/**",
23+
]
24+
},
2025
"development_status": "Beta",
2126
"maintainers": ["wolfhall", "max3903"],
2227
}

fieldservice_geoengine/models/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33

44
from . import fsm_location
55
from . import fsm_order
6+
from . import vector_layer

fieldservice_geoengine/models/fsm_location.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class FSMLocation(models.Model):
1717
def create(self, vals):
1818
res = super(FSMLocation, self).create(vals)
1919
if not res.partner_latitude or not res.partner_longitude:
20-
res.geo_localize()
20+
res.with_context(force_geo_localize=True).geo_localize()
2121
return res
2222

2323
def geo_localize(self):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Copyright 2011-2012 Nicolas Bessi (Camptocamp SA)
2+
# Copyright 2016 Yannick Payot (Camptocamp SA)
3+
# Copyright 2023 ACSONE SA/NV
4+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
5+
6+
from odoo import _, api, models
7+
from odoo.exceptions import ValidationError
8+
9+
NUMBER_ATT = ["float", "integer", "integer_big"]
10+
11+
12+
class GeoVectorLayer(models.Model):
13+
_inherit = "geoengine.vector.layer"
14+
15+
@api.constrains("geo_repr", "attribute_field_id")
16+
def _check_geo_repr(self):
17+
for rec in self:
18+
if (
19+
rec.attribute_field_id
20+
and rec.attribute_field_id.ttype not in NUMBER_ATT
21+
and rec.model_id.name not in ["fsm.order", "fsm.location"]
22+
and rec.geo_field_id.model not in ["fsm.order", "fsm.location"]
23+
):
24+
if (
25+
rec.geo_repr == "colored"
26+
and rec.classification != "unique"
27+
or rec.geo_repr == "proportion"
28+
):
29+
raise ValidationError(
30+
_(
31+
"You need to select a numeric field",
32+
)
33+
)

fieldservice_geoengine/readme/CONTRIBUTORS.rst

+2
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@
88
* Jevin Dement <jdement@opensourceintegrators.com>
99
* Murtuza Saleh <murtuza.saleh@serpentcs.com>
1010
* Sebastiano Picchi <sebastiano.picchi@pytech.it>
11+
* [APSL-Nagarro](https://apsl.tech):
12+
* Antoni Marroig <amarroig@apsl.net>

fieldservice_geoengine/static/description/index.html

+6-4
Original file line numberDiff line numberDiff line change
@@ -367,9 +367,9 @@ <h1 class="title">Field Service Geoengine</h1>
367367
!! This file is generated by oca-gen-addon-readme !!
368368
!! changes will be overwritten. !!
369369
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
370-
!! source digest: sha256:00cbfc11e03373e90815257e248560b520030ac74c71a26281dc3f5a96930b40
370+
!! source digest: sha256:74438fc7ba6bb4441445c45d385f8490260b60a5d097618700e52d7b525b1f72
371371
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
372-
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/field-service/tree/14.0/fieldservice_geoengine"><img alt="OCA/field-service" src="https://img.shields.io/badge/github-OCA%2Ffield--service-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/field-service-14-0/field-service-14-0-fieldservice_geoengine"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/field-service&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
372+
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/field-service/tree/16.0/fieldservice_geoengine"><img alt="OCA/field-service" src="https://img.shields.io/badge/github-OCA%2Ffield--service-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/field-service-16-0/field-service-16-0-fieldservice_geoengine"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/field-service&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
373373
<p>This module displays map views on the order and location using the GeoEngine module and PostGIS.</p>
374374
<p><strong>Table of contents</strong></p>
375375
<div class="contents local topic" id="contents">
@@ -432,7 +432,7 @@ <h1><a class="toc-backref" href="#toc-entry-5">Bug Tracker</a></h1>
432432
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/field-service/issues">GitHub Issues</a>.
433433
In case of trouble, please check there if your issue has already been reported.
434434
If you spotted it first, help us to smash it by providing a detailed and welcomed
435-
<a class="reference external" href="https://github.com/OCA/field-service/issues/new?body=module:%20fieldservice_geoengine%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
435+
<a class="reference external" href="https://github.com/OCA/field-service/issues/new?body=module:%20fieldservice_geoengine%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
436436
<p>Do not contact contributors directly about support or help with technical issues.</p>
437437
</div>
438438
<div class="section" id="credits">
@@ -463,6 +463,8 @@ <h2><a class="toc-backref" href="#toc-entry-8">Contributors</a></h2>
463463
</li>
464464
<li>Murtuza Saleh &lt;<a class="reference external" href="mailto:murtuza.saleh&#64;serpentcs.com">murtuza.saleh&#64;serpentcs.com</a>&gt;</li>
465465
<li>Sebastiano Picchi &lt;<a class="reference external" href="mailto:sebastiano.picchi&#64;pytech.it">sebastiano.picchi&#64;pytech.it</a>&gt;</li>
466+
<li>[APSL-Nagarro](<a class="reference external" href="https://apsl.tech">https://apsl.tech</a>):
467+
* Antoni Marroig &lt;<a class="reference external" href="mailto:amarroig&#64;apsl.net">amarroig&#64;apsl.net</a>&gt;</li>
466468
</ul>
467469
</div>
468470
<div class="section" id="other-credits">
@@ -481,7 +483,7 @@ <h2><a class="toc-backref" href="#toc-entry-10">Maintainers</a></h2>
481483
promote its widespread use.</p>
482484
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
483485
<p><a class="reference external image-reference" href="https://github.com/wolfhall"><img alt="wolfhall" src="https://github.com/wolfhall.png?size=40px" /></a> <a class="reference external image-reference" href="https://github.com/max3903"><img alt="max3903" src="https://github.com/max3903.png?size=40px" /></a></p>
484-
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/field-service/tree/14.0/fieldservice_geoengine">OCA/field-service</a> project on GitHub.</p>
486+
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/field-service/tree/16.0/fieldservice_geoengine">OCA/field-service</a> project on GitHub.</p>
485487
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
486488
</div>
487489
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/** @odoo-module */
2+
3+
/**
4+
* Copyright 2024 APSL-Nagarro
5+
*/
6+
7+
/* global chroma, geostats */
8+
9+
import {GeoengineRenderer} from "@base_geoengine/js/views/geoengine/geoengine_renderer/geoengine_renderer.esm";
10+
import {patch} from "@web/core/utils/patch";
11+
12+
/* CONSTANTS */
13+
const DEFAULT_BEGIN_COLOR = "#FFFFFF";
14+
const DEFAULT_END_COLOR = "#000000";
15+
const LEGEND_MAX_ITEMS = 10;
16+
const DEFAULT_NUM_CLASSES = 5;
17+
18+
patch(GeoengineRenderer.prototype, "geoengine_renderer_view_patch", {
19+
styleVectorLayerColored(cfg, data) {
20+
var indicator = cfg.attribute_field_id[1];
21+
var values = this.extractLayerValues(cfg, data);
22+
var nb_class = cfg.nb_class || DEFAULT_NUM_CLASSES;
23+
var opacity = cfg.layer_opacity;
24+
var begin_color_hex = cfg.begin_color || DEFAULT_BEGIN_COLOR;
25+
var end_color_hex = cfg.end_color || DEFAULT_END_COLOR;
26+
var begin_color = chroma(begin_color_hex).alpha(opacity).css();
27+
var end_color = chroma(end_color_hex).alpha(opacity).css();
28+
// Function that maps numeric values to a color palette.
29+
// This scale function is only used when geo_repr is basic
30+
var scale = chroma.scale([begin_color, end_color]);
31+
var serie = new geostats(values);
32+
var vals = null;
33+
switch (cfg.classification) {
34+
case "unique":
35+
case "custom":
36+
vals = serie.getClassUniqueValues();
37+
// "RdYlBu" is a set of colors
38+
scale = chroma.scale("RdYlBu").domain([0, vals.length], vals.length);
39+
break;
40+
case "quantile":
41+
serie.getClassQuantile(nb_class);
42+
vals = serie.getRanges();
43+
scale = scale.domain([0, vals.length], vals.length);
44+
break;
45+
case "interval":
46+
serie.getClassEqInterval(nb_class);
47+
vals = serie.getRanges();
48+
scale = scale.domain([0, vals.length], vals.length);
49+
break;
50+
}
51+
let colors = [];
52+
if (cfg.classification === "custom") {
53+
colors = vals
54+
.filter((val) => val)
55+
.map((val) => chroma(val).alpha(opacity).css());
56+
} else {
57+
colors = scale
58+
.colors(vals.length)
59+
.map((color) => chroma(color).alpha(opacity).css());
60+
}
61+
const styles_map = this.createStylesWithColors(colors);
62+
let legend = null;
63+
if (vals.length <= LEGEND_MAX_ITEMS) {
64+
legend = serie.getHtmlLegend(colors, cfg.name, 1);
65+
for (let i = 0; i < data.length; i++) {
66+
legend = legend.replace(
67+
data[i]._values[cfg.attribute_field_id[1]],
68+
data[i]._values.stage_name
69+
);
70+
}
71+
}
72+
return {
73+
style: (feature) => {
74+
const value = feature.get("attributes")[indicator];
75+
const color_idx = this.getClass(value, vals);
76+
var label_text = feature.values_.attributes.label;
77+
if (label_text === false) {
78+
label_text = "";
79+
} else if (label_text !== "") {
80+
label_text = feature.values_.attributes.stage_name;
81+
}
82+
styles_map[colors[color_idx]][0].text_.text_ = label_text.toString();
83+
return styles_map[colors[color_idx]];
84+
},
85+
legend,
86+
};
87+
},
88+
async onLayerChanged(vector, layer) {
89+
layer.setSource(null);
90+
const element = document.getElementById(`legend-${vector.resId}`);
91+
if (element !== null) {
92+
element.remove();
93+
}
94+
if (vector.model) {
95+
this.cfg_models.push(vector.model);
96+
const fields_to_read = [vector.geo_field_id[1]];
97+
if (vector.attribute_field_id) {
98+
fields_to_read.push(vector.attribute_field_id[1]);
99+
}
100+
const data = await this.getModelData(vector, fields_to_read);
101+
this.styleVectorLayerAndLegend(vector, data, layer);
102+
this.useRelatedModel(vector, layer, data);
103+
} else {
104+
const data = [];
105+
for (const record of this.props.data.records) {
106+
if (
107+
vector.attribute_field_id[1] === "custom_color" &&
108+
typeof record.data[vector.attribute_field_id[1]] === "string"
109+
) {
110+
record.data[vector.attribute_field_id[1]] = parseInt(
111+
record.data[vector.attribute_field_id[1]].split("#")[1],
112+
16
113+
);
114+
}
115+
data.push(record);
116+
}
117+
this.styleVectorLayerAndLegend(vector, data, layer);
118+
this.addSourceToLayer(data, vector, layer);
119+
}
120+
},
121+
styleVectorLayerAndLegend(cfg, data, lv) {
122+
const aux = [];
123+
for (var i = 0; i < data.length; i++) {
124+
if (
125+
cfg.attribute_field_id[1] === "custom_color" &&
126+
typeof data[i]._values[cfg.attribute_field_id[1]] === "string"
127+
) {
128+
data[i]._values[cfg.attribute_field_id[1]] = parseInt(
129+
data[i]._values[cfg.attribute_field_id[1]].split("#")[1],
130+
16
131+
);
132+
}
133+
aux.push(data[i]);
134+
}
135+
const styleInfo = this.styleVectorLayer(cfg, aux);
136+
this.initLegend(styleInfo, cfg);
137+
lv.setStyle(styleInfo.style);
138+
},
139+
});

fieldservice_geoengine/tests/test_fsm_location.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
44

55
from odoo import fields
6-
from odoo.tests.common import SavepointCase
6+
from odoo.tests.common import TransactionCase
77

88

9-
class TestFsmLocation(SavepointCase):
9+
class TestFsmLocation(TransactionCase):
1010
@classmethod
1111
def setUpClass(cls):
1212
super().setUpClass()
@@ -60,10 +60,10 @@ def test_fsm_location_creation(self):
6060
self.assertTrue(test_location_1.partner_latitude)
6161
self.assertTrue(test_location_1.partner_longitude)
6262
self.assertAlmostEqual(
63-
test_location_1.partner_latitude, 50.629980, delta=self.delta
63+
test_location_1.partner_latitude, 50.629980, delta=0.0002
6464
)
6565
self.assertAlmostEqual(
66-
test_location_1.partner_longitude, 4.863370, delta=self.delta
66+
test_location_1.partner_longitude, 4.863370, delta=0.00012
6767
)
6868
# direct creation and same exit data
6969
partner_latitude = 1.0

0 commit comments

Comments
 (0)