from rest_framework.response import Response from rest_framework.views import APIView from apps.core.settings_registry import SCHEMA_BY_KEY from apps.core.settings_service import SettingsService from apps.rbac.permissions import HasPermission class SettingsView(APIView): """Read/write runtime integration settings. GET returns the schema (drives the panel) and current values (secrets masked). PUT accepts ``{"values": {"key": value, ...}}`` and persists them. """ permission_classes = [HasPermission] perm_code = "settings.manage" def get(self, request): service = SettingsService() return Response({"schema": service.schema(), "values": service.all_values()}) def put(self, request): service = SettingsService() values = request.data.get("values") or {} for key, value in values.items(): entry = SCHEMA_BY_KEY.get(key) if entry is None: continue # Never overwrite a secret with an empty value (means "unchanged"). if entry.get("type") == "secret" and value in ("", None): continue service.set(key, value) return Response({"values": service.all_values()}) class TestOdooView(APIView): """Attempt an XML-RPC connection using the currently saved Odoo settings.""" permission_classes = [HasPermission] perm_code = "settings.manage" def post(self, request): from apps.integrations.odoo.client import OdooXmlRpcClient service = SettingsService() url = service.get("odoo.url", "") if not url: return Response({"ok": False, "error": "Odoo URL is not configured."}) client = OdooXmlRpcClient( url=url, db=service.get("odoo.database", ""), username=service.get("odoo.username", ""), password=service.get("odoo.password", ""), api_key=service.get("odoo.api_key", ""), auth_method=service.get("odoo.auth_method", "password"), ) try: result = client.test_connection() return Response({"ok": True, "version": result["version"], "uid": str(result["uid"])}) except Exception as exc: return Response({"ok": False, "error": str(exc)})