Skip to content

Commit 16e6e42

Browse files
authored
Merge pull request #129 from OpenSPP/fix/serialize-detail-skip-before-getattr
fix: skip field types before getattr and isolate detail prefetch
2 parents 45d9e69 + 08d792e commit 16e6e42

File tree

4 files changed

+16
-13
lines changed

4 files changed

+16
-13
lines changed

spp_api_v2_change_request/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{ # pylint: disable=pointless-statement
22
"name": "OpenSPP API V2 - Change Request",
33
"category": "OpenSPP/Integration",
4-
"version": "19.0.2.0.0",
4+
"version": "19.0.2.0.1",
55
"sequence": 1,
66
"author": "OpenSPP.org",
77
"website": "https://github.com/OpenSPP/OpenSPP2",

spp_api_v2_change_request/services/change_request_service.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,17 @@ def _serialize_detail(self, detail) -> dict[str, Any]:
204204
# Get fields from the model
205205
model_fields = detail._fields
206206

207+
# Field types that are skipped entirely — check BEFORE reading the
208+
# value so that computed fields of these types are never triggered.
209+
_SKIP_FIELD_TYPES = {"many2many", "one2many", "binary"}
210+
207211
for field_name, field in model_fields.items():
208212
if field_name.startswith("_") or field_name in DETAIL_SKIP_FIELDS:
209213
continue
210214

215+
if field.type in _SKIP_FIELD_TYPES:
216+
continue
217+
211218
value = getattr(detail, field_name)
212219

213220
if field.type == "many2one":
@@ -230,19 +237,10 @@ def _serialize_detail(self, detail) -> dict[str, Any]:
230237
}
231238
else:
232239
result[field_name] = value.name if hasattr(value, "name") else str(value.id)
233-
elif field.type == "many2many":
234-
# Skip many2many for now
235-
continue
236-
elif field.type == "one2many":
237-
# Skip one2many for now
238-
continue
239240
elif field.type == "date":
240241
result[field_name] = value.isoformat() if value else None
241242
elif field.type == "datetime":
242243
result[field_name] = value.isoformat() if value else None
243-
elif field.type == "binary":
244-
# Skip binary fields in API
245-
continue
246244
else:
247245
result[field_name] = value
248246

spp_change_request_v2/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "OpenSPP Change Request V2",
3-
"version": "19.0.2.0.0",
3+
"version": "19.0.2.0.1",
44
"sequence": 50,
55
"category": "OpenSPP",
66
"summary": "Configuration-driven change request system with UX improvements, conflict detection and duplicate prevention",

spp_change_request_v2/models/change_request.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -713,10 +713,15 @@ def _create_dms_directory(self):
713713
# ══════════════════════════════════════════════════════════════════════════
714714

715715
def get_detail(self):
716-
"""Get the detail record for this CR."""
716+
"""Get the detail record for this CR.
717+
718+
Uses with_prefetch() to isolate from _ensure_detail's sudo()
719+
prefetch set — without this, non-stored computed fields can
720+
trigger record-rule checks against the wrong user.
721+
"""
717722
self.ensure_one()
718723
if self.detail_res_model and self.detail_res_id:
719-
return self.env[self.detail_res_model].browse(self.detail_res_id)
724+
return self.env[self.detail_res_model].browse(self.detail_res_id).with_prefetch()
720725
return None
721726

722727
def _ensure_detail(self):

0 commit comments

Comments
 (0)