Skip to content

Commit b71955e

Browse files
committed
fix: address code review findings from simplify pass
- Escape single quotes in create_from_geojson to prevent SQL injection - Make preview_count/preview_error regular fields instead of computed; spatial queries now only run when the Preview button is clicked - Use elif instead of two independent if statements for target_type - Simplify _import_registrants loop to list comprehension
1 parent 9d970a6 commit b71955e

2 files changed

Lines changed: 14 additions & 21 deletions

File tree

spp_gis/operators.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ def create_from_geojson(self, geojson_dict, srid):
264264
Used for complex geometry types (MultiPolygon, GeometryCollection)
265265
that cannot be easily constructed from coordinates.
266266
"""
267-
geojson_str = json.dumps(geojson_dict)
267+
geojson_str = json.dumps(geojson_dict).replace("'", "''")
268268
return self.st_setsrid(f"ST_GeomFromGeoJSON('{geojson_str}')", srid)
269269

270270
def validate_coordinates_for_point(self, coordinates):

spp_program_geofence/models/eligibility_manager.py

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,27 +52,14 @@ class GeofenceMembershipManager(models.Model):
5252
string="Program Geofences",
5353
)
5454
preview_count = fields.Integer(
55-
compute="_compute_preview",
56-
store=False,
5755
string="Preview Count",
56+
readonly=True,
5857
)
5958
preview_error = fields.Char(
60-
compute="_compute_preview",
61-
store=False,
6259
string="Preview Error",
60+
readonly=True,
6361
)
6462

65-
@api.depends("program_id.geofence_ids")
66-
def _compute_preview(self):
67-
for rec in self:
68-
try:
69-
eligible = rec._find_eligible_registrants()
70-
rec.preview_count = len(eligible)
71-
rec.preview_error = False
72-
except Exception as e:
73-
rec.preview_count = 0
74-
rec.preview_error = str(e)
75-
7663
def _get_combined_geometry(self):
7764
"""Return the union of all geofence geometries for this manager's program.
7865
@@ -113,7 +100,7 @@ def _prepare_eligible_domain(self, membership=None):
113100

114101
if self.program_id.target_type == "group":
115102
domain += [("is_group", "=", True), ("is_registrant", "=", True)]
116-
if self.program_id.target_type == "individual":
103+
elif self.program_id.target_type == "individual":
117104
domain += [("is_group", "=", False), ("is_registrant", "=", True)]
118105

119106
return domain
@@ -225,9 +212,9 @@ def mark_import_as_done(self):
225212

226213
def _import_registrants(self, new_beneficiaries, state="draft", do_count=False):
227214
_logger.info("spp_program_geofence: Importing %s beneficiaries", len(new_beneficiaries))
228-
beneficiaries_val = []
229-
for beneficiary in new_beneficiaries:
230-
beneficiaries_val.append(Command.create({"partner_id": beneficiary.id, "state": state}))
215+
beneficiaries_val = [
216+
Command.create({"partner_id": b.id, "state": state}) for b in new_beneficiaries
217+
]
231218
self.program_id.update({"program_membership_ids": beneficiaries_val})
232219

233220
if do_count:
@@ -236,7 +223,13 @@ def _import_registrants(self, new_beneficiaries, state="draft", do_count=False):
236223

237224
def action_preview_eligible(self):
238225
self.ensure_one()
239-
self._compute_preview()
226+
try:
227+
eligible = self._find_eligible_registrants()
228+
self.preview_count = len(eligible)
229+
self.preview_error = False
230+
except Exception as e:
231+
self.preview_count = 0
232+
self.preview_error = str(e)
240233
return {
241234
"type": "ir.actions.client",
242235
"tag": "display_notification",

0 commit comments

Comments
 (0)