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 @@ - +