diff --git a/child_compassion/__manifest__.py b/child_compassion/__manifest__.py
index 0dbc7f16d..7f3aefd60 100644
--- a/child_compassion/__manifest__.py
+++ b/child_compassion/__manifest__.py
@@ -29,7 +29,7 @@
# pylint: disable=C8101
{
"name": "Compassion Children",
- "version": "14.0.1.4.0",
+ "version": "14.0.1.5.0",
"category": "Compassion",
"author": "Compassion CH",
"license": "AGPL-3",
diff --git a/child_compassion/migrations/14.0.1.5.0/pre-migration.py b/child_compassion/migrations/14.0.1.5.0/pre-migration.py
new file mode 100644
index 000000000..cb6a83a99
--- /dev/null
+++ b/child_compassion/migrations/14.0.1.5.0/pre-migration.py
@@ -0,0 +1,23 @@
+from openupgradelib import openupgrade
+
+
+def migrate(cr, version):
+ if not openupgrade.column_exists(
+ cr, "compassion_project", "gps_latitude_obfuscated"
+ ):
+ openupgrade.logged_query(
+ cr,
+ """
+ ALTER TABLE compassion_project
+ ADD COLUMN gps_latitude_obfuscated float,
+ ADD COLUMN gps_longitude_obfuscated float;
+ """,
+ )
+ openupgrade.logged_query(
+ cr,
+ """
+ UPDATE compassion_project
+ SET gps_longitude_obfuscated = TRUNC(CAST(gps_longitude AS numeric), 0),
+ gps_latitude_obfuscated = TRUNC(CAST(gps_latitude AS numeric), 0);
+""",
+ )
diff --git a/child_compassion/models/project_compassion.py b/child_compassion/models/project_compassion.py
index d4c2f7f5d..38c226ca2 100644
--- a/child_compassion/models/project_compassion.py
+++ b/child_compassion/models/project_compassion.py
@@ -11,6 +11,7 @@
import logging
import re
from datetime import datetime, timedelta
+from random import random
import requests
@@ -85,6 +86,12 @@ class CompassionProject(models.Model):
zip_code = fields.Char(readonly=True)
gps_latitude = fields.Float(readonly=True)
gps_longitude = fields.Float(readonly=True)
+ gps_latitude_obfuscated = fields.Float(
+ compute="_compute_gps_obfuscated", store=True
+ )
+ gps_longitude_obfuscated = fields.Float(
+ compute="_compute_gps_obfuscated", store=True
+ )
google_link = fields.Char(readonly=True, compute="_compute_google_link")
timezone = fields.Char(readonly=True, compute="_compute_timezone", store=True)
cluster = fields.Char(readonly=True)
@@ -510,6 +517,45 @@ def _get_materials(self):
("Plastic", _("Plastic")),
]
+ @api.depends("gps_latitude", "gps_longitude", "closest_city")
+ def _compute_gps_obfuscated(self):
+ """
+ This method calculates and stores the obfuscated coordinates
+ (latitude and longitude).
+ """
+ api_key = (
+ self.env["ir.config_parameter"].sudo().get_param("google_maps_api_key")
+ )
+ base_url = "https://maps.googleapis.com/maps/api/geocode/json"
+ for project in self:
+ try:
+ parts = [
+ project.closest_city,
+ project.state_province,
+ project.country_id.name,
+ ]
+ address_string = ", ".join(filter(None, parts))
+ params = {"address": address_string, "key": api_key}
+ response = requests.get(base_url, params=params, timeout=3)
+ data = response.json()
+ if data["status"] == "OK":
+ location = data["results"][0]["geometry"]["location"]
+ project.gps_latitude_obfuscated = location["lat"]
+ project.gps_longitude_obfuscated = location["lng"]
+ except Exception:
+ # Fallback to randomized gps coords
+ logging.warning("Request failed", exc_info=True)
+ project.gps_latitude_obfuscated = (
+ (int(project.gps_latitude) + random())
+ if project.gps_latitude
+ else 0
+ )
+ project.gps_longitude_obfuscated = (
+ (int(project.gps_longitude) + random())
+ if project.gps_longitude
+ else 0
+ )
+
@api.depends("gps_longitude", "gps_latitude")
def _compute_timezone(self):
tf = TimezoneFinder()
diff --git a/intervention_compassion/views/compassion_intervention_view.xml b/intervention_compassion/views/compassion_intervention_view.xml
index 0fd0644f5..07b8baa01 100644
--- a/intervention_compassion/views/compassion_intervention_view.xml
+++ b/intervention_compassion/views/compassion_intervention_view.xml
@@ -98,7 +98,10 @@
-
+