From a20660ed515b4ed546d5f6864381522b37a4d93c Mon Sep 17 00:00:00 2001 From: Kaburagi Date: Tue, 23 Dec 2025 13:27:50 +0700 Subject: [PATCH] feat(service): Add ONVIFResponse wrapper for zeep objects with serialization support --- onvif/utils/service.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/onvif/utils/service.py b/onvif/utils/service.py index ef7fe26..add7632 100644 --- a/onvif/utils/service.py +++ b/onvif/utils/service.py @@ -1,12 +1,43 @@ # onvif/utils/service.py import logging +import zeep.helpers from .exceptions import ONVIFOperationException logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) +class ONVIFResponse: + """Transparent wrapper that adds to_dict() to zeep objects.""" + + def __init__(self, wrapped_object): + object.__setattr__(self, "_wrapped", wrapped_object) + + def __getattr__(self, name): + return getattr(self._wrapped, name) + + def __setattr__(self, name, value): + if name == "_wrapped": + object.__setattr__(self, name, value) + else: + setattr(self._wrapped, name, value) + + def __repr__(self): + return repr(self._wrapped) + + def __str__(self): + return str(self._wrapped) + + def to_dict(self): + """Convert zeep object to Python dictionary.""" + return ( + {} + if self._wrapped is None + else zeep.helpers.serialize_object(self._wrapped) + ) + + def _is_zeep_object(obj): """Check if an object is a Zeep-generated object. @@ -104,7 +135,7 @@ def wrapped_method(*args, **kwargs): logger.debug(f"Calling wrapped ONVIF method: {name}") result = attr(*args, **kwargs) logger.debug(f"ONVIF method {name} completed successfully") - return result + return ONVIFResponse(result) if result is not None else result except ONVIFOperationException as oe: # Re-raise ONVIF exceptions as-is service_name = getattr(self.operator, "service_name", "Unknown")