Skip to content

Commit 29e0f1a

Browse files
committed
fix: Remove individual permissions from list_models in YOLO mode
1 parent 18708a2 commit 29e0f1a

File tree

2 files changed

+9
-64
lines changed

2 files changed

+9
-64
lines changed

mcp_server_odoo/tools.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -819,22 +819,11 @@ async def _handle_list_models_tool(self) -> Dict[str, List[Dict[str, Any]]]:
819819
}
820820
enriched_models.append(warning_model)
821821

822-
# Process actual models
822+
# Process actual models (no need to repeat permissions in YOLO mode)
823823
for record in model_records:
824-
# Get permissions based on YOLO mode level
825-
permissions = self.access_controller.get_model_permissions(
826-
record["model"]
827-
)
828-
829824
enriched_model = {
830825
"model": record["model"],
831826
"name": record["name"] or record["model"],
832-
"operations": {
833-
"read": permissions.can_read,
834-
"write": permissions.can_write,
835-
"create": permissions.can_create,
836-
"unlink": permissions.can_unlink,
837-
},
838827
}
839828
enriched_models.append(enriched_model)
840829

tests/test_tools_yolo.py

Lines changed: 8 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,6 @@ async def test_list_models_yolo_read_mode(
8181
{"model": "sale.order", "name": "Sales Order"},
8282
]
8383

84-
# Mock permissions for read-only mode
85-
def mock_get_permissions(model):
86-
mock_perm = MagicMock()
87-
mock_perm.can_read = True
88-
mock_perm.can_write = False
89-
mock_perm.can_create = False
90-
mock_perm.can_unlink = False
91-
return mock_perm
92-
93-
mock_access_controller.get_model_permissions.side_effect = mock_get_permissions
94-
9584
# Create handler
9685
handler = OdooToolHandler(
9786
mock_app, mock_connection, mock_access_controller, config_yolo_read
@@ -120,12 +109,11 @@ def mock_get_permissions(model):
120109
assert warning_model["operations"]["create"] is False
121110
assert warning_model["operations"]["unlink"] is False
122111

123-
# Check actual models have read-only permissions
112+
# Check actual models don't have operations field (only in warning model)
124113
for model in models[1:]:
125-
assert model["operations"]["read"] is True
126-
assert model["operations"]["write"] is False
127-
assert model["operations"]["create"] is False
128-
assert model["operations"]["unlink"] is False
114+
assert "operations" not in model
115+
assert "model" in model
116+
assert "name" in model
129117

130118
@pytest.mark.asyncio
131119
async def test_list_models_yolo_full_mode(
@@ -138,17 +126,6 @@ async def test_list_models_yolo_full_mode(
138126
{"model": "account.move", "name": "Journal Entry"},
139127
]
140128

141-
# Mock permissions for full access mode
142-
def mock_get_permissions(model):
143-
mock_perm = MagicMock()
144-
mock_perm.can_read = True
145-
mock_perm.can_write = True
146-
mock_perm.can_create = True
147-
mock_perm.can_unlink = True
148-
return mock_perm
149-
150-
mock_access_controller.get_model_permissions.side_effect = mock_get_permissions
151-
152129
# Create handler
153130
handler = OdooToolHandler(
154131
mock_app, mock_connection, mock_access_controller, config_yolo_full
@@ -170,12 +147,11 @@ def mock_get_permissions(model):
170147
assert warning_model["operations"]["create"] is True
171148
assert warning_model["operations"]["unlink"] is True
172149

173-
# Check actual models have full permissions
150+
# Check actual models don't have operations field (only in warning model)
174151
for model in models[1:]:
175-
assert model["operations"]["read"] is True
176-
assert model["operations"]["write"] is True
177-
assert model["operations"]["create"] is True
178-
assert model["operations"]["unlink"] is True
152+
assert "operations" not in model
153+
assert "model" in model
154+
assert "name" in model
179155

180156
@pytest.mark.asyncio
181157
async def test_list_models_standard_mode(
@@ -286,16 +262,6 @@ async def test_list_models_yolo_includes_common_system_models(
286262
{"model": "ir.model", "name": "Models"},
287263
]
288264

289-
def mock_get_permissions(model):
290-
mock_perm = MagicMock()
291-
mock_perm.can_read = True
292-
mock_perm.can_write = True
293-
mock_perm.can_create = True
294-
mock_perm.can_unlink = True
295-
return mock_perm
296-
297-
mock_access_controller.get_model_permissions.side_effect = mock_get_permissions
298-
299265
# Create handler
300266
handler = OdooToolHandler(
301267
mock_app, mock_connection, mock_access_controller, config_yolo_full
@@ -324,16 +290,6 @@ async def test_yolo_mode_logging(
324290
{"model": "res.partner", "name": "Contact"},
325291
]
326292

327-
def mock_get_permissions(model):
328-
mock_perm = MagicMock()
329-
mock_perm.can_read = True
330-
mock_perm.can_write = False
331-
mock_perm.can_create = False
332-
mock_perm.can_unlink = False
333-
return mock_perm
334-
335-
mock_access_controller.get_model_permissions.side_effect = mock_get_permissions
336-
337293
# Create handler
338294
handler = OdooToolHandler(
339295
mock_app, mock_connection, mock_access_controller, config_yolo_read

0 commit comments

Comments
 (0)