onvif-python 0.2.6__tar.gz → 0.2.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. {onvif_python-0.2.6/onvif_python.egg-info → onvif_python-0.2.8}/PKG-INFO +4 -4
  2. {onvif_python-0.2.6 → onvif_python-0.2.8}/README.md +3 -3
  3. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/__init__.py +3 -0
  4. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/cli/interactive.py +3 -2
  5. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/cli/main.py +3 -2
  6. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/devicemgmt.py +9 -0
  7. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/service.py +32 -1
  8. onvif_python-0.2.8/onvif/wsdl/schema/common/b-2.xsd +580 -0
  9. onvif_python-0.2.8/onvif/wsdl/schema/common/bf-2.xsd +84 -0
  10. onvif_python-0.2.8/onvif/wsdl/schema/common/bw-2.wsdl +448 -0
  11. onvif_python-0.2.8/onvif/wsdl/schema/common/include +13 -0
  12. onvif_python-0.2.8/onvif/wsdl/schema/common/mpqf.xsd +1109 -0
  13. onvif_python-0.2.8/onvif/wsdl/schema/common/r-2.xsd +50 -0
  14. onvif_python-0.2.8/onvif/wsdl/schema/common/rw-2.wsdl +54 -0
  15. onvif_python-0.2.8/onvif/wsdl/schema/common/soap-envelope +165 -0
  16. onvif_python-0.2.8/onvif/wsdl/schema/common/t-1.xsd +185 -0
  17. onvif_python-0.2.8/onvif/wsdl/schema/common/ws-addr.xsd +144 -0
  18. onvif_python-0.2.8/onvif/wsdl/schema/common/xml.xsd +287 -0
  19. onvif_python-0.2.8/onvif/wsdl/schema/common/xmlmime +49 -0
  20. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/actionengine.wsdl +1 -1
  21. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl +1 -1
  22. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/appmgmt/wsdl/appmgmt.wsdl +1 -1
  23. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/device/wsdl/devicemgmt.wsdl +115 -0
  24. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/display/display.wsdl +1 -1
  25. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/events/wsdl/bw-2-vs-mod.wsdl +2 -2
  26. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/events/wsdl/event-vs.wsdl +4 -4
  27. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/events/wsdl/event.wsdl +5 -5
  28. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/federatedsearch.wsdl +1 -1
  29. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/schema/metadatastream.xsd +1 -1
  30. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/schema/onvif.xsd +25 -4
  31. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/uplink/wsdl/uplink.wsdl +2 -2
  32. {onvif_python-0.2.6 → onvif_python-0.2.8/onvif_python.egg-info}/PKG-INFO +4 -4
  33. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif_python.egg-info/SOURCES.txt +12 -0
  34. {onvif_python-0.2.6 → onvif_python-0.2.8}/pyproject.toml +1 -1
  35. {onvif_python-0.2.6 → onvif_python-0.2.8}/LICENSE.md +0 -0
  36. {onvif_python-0.2.6 → onvif_python-0.2.8}/MANIFEST.in +0 -0
  37. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/cli/__init__.py +0 -0
  38. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/cli/__main__.py +0 -0
  39. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/cli/utils.py +0 -0
  40. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/client.py +0 -0
  41. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/db/companies.db +0 -0
  42. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/db/products.db +0 -0
  43. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/operator.py +0 -0
  44. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/__init__.py +0 -0
  45. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/accesscontrol.py +0 -0
  46. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/accessrules.py +0 -0
  47. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/actionengine.py +0 -0
  48. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/analytics/analytics.py +0 -0
  49. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/analytics/ruleengine.py +0 -0
  50. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/analyticsdevice.py +0 -0
  51. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/appmgmt.py +0 -0
  52. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/authenticationbehavior.py +0 -0
  53. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/credential.py +0 -0
  54. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/deviceio.py +0 -0
  55. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/display.py +0 -0
  56. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/doorcontrol.py +0 -0
  57. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/events/events.py +0 -0
  58. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/events/notification.py +0 -0
  59. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/events/pausable_subscription.py +0 -0
  60. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/events/pullpoint.py +0 -0
  61. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/events/subscription.py +0 -0
  62. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/imaging.py +0 -0
  63. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/media.py +0 -0
  64. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/media2.py +0 -0
  65. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/provisioning.py +0 -0
  66. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/ptz.py +0 -0
  67. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/receiver.py +0 -0
  68. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/recording.py +0 -0
  69. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/replay.py +0 -0
  70. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/schedule.py +0 -0
  71. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/search.py +0 -0
  72. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/security/advancedsecurity.py +0 -0
  73. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/security/authorizationserver.py +0 -0
  74. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/security/dot1x.py +0 -0
  75. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/security/jwt.py +0 -0
  76. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/security/keystore.py +0 -0
  77. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/security/mediasigning.py +0 -0
  78. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/security/tlsserver.py +0 -0
  79. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/thermal.py +0 -0
  80. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/services/uplink.py +0 -0
  81. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/__init__.py +0 -0
  82. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/discovery.py +0 -0
  83. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/error_handlers.py +0 -0
  84. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/exceptions.py +0 -0
  85. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/parser.py +0 -0
  86. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/wsdl.py +0 -0
  87. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/xml_capture.py +0 -0
  88. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/utils/zeep.py +0 -0
  89. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/LICENSE.md +0 -0
  90. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/accesscontrol/wsdl/index.html +0 -0
  91. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/accessrules/wsdl/accessrules.wsdl +0 -0
  92. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/accessrules/wsdl/index.html +0 -0
  93. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/advancedsecurity/wsdl/index.html +0 -0
  94. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/analyticsdevice.wsdl +0 -0
  95. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/appmgmt/wsdl/index.html +0 -0
  96. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl +0 -0
  97. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/authenticationbehavior/wsdl/index.html +0 -0
  98. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/credential/wsdl/credential.wsdl +0 -0
  99. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/credential/wsdl/index.html +0 -0
  100. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/deviceio.wsdl +0 -0
  101. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/display/wsdl/index.htm +0 -0
  102. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/display.wsdl +0 -0
  103. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/doorcontrol/wsdl/index.html +0 -0
  104. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/events/wsdl/index.html +0 -0
  105. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/media/wsdl/media.wsdl +0 -0
  106. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/pacs/accesscontrol.wsdl +0 -0
  107. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/pacs/doorcontrol.wsdl +0 -0
  108. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/pacs/types.xsd +0 -0
  109. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/provisioning/wsdl/provisioning.wsdl +0 -0
  110. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/receiver.wsdl +0 -0
  111. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/recording.wsdl +0 -0
  112. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/replay.wsdl +0 -0
  113. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/schedule/wsdl/index.html +0 -0
  114. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/schedule/wsdl/schedule.wsdl +0 -0
  115. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/schema/common.xsd +0 -0
  116. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/search.wsdl +0 -0
  117. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/thermal/wsdl/index.html +0 -0
  118. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/thermal/wsdl/thermal.wsdl +0 -0
  119. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/topics/topicns.xml +0 -0
  120. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver10/uplink/wsdl/index.html +0 -0
  121. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/analytics/humanbody.xsd +0 -0
  122. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/analytics/humanface.xsd +0 -0
  123. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/analytics/index.html +0 -0
  124. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/analytics/radiometry.xsd +0 -0
  125. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/analytics/rules.xsd +0 -0
  126. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/analytics/wsdl/analytics.wsdl +0 -0
  127. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/analytics/wsdl/index.html +0 -0
  128. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/imaging/wsdl/imaging.wsdl +0 -0
  129. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/media/wsdl/index.html +0 -0
  130. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/media/wsdl/media.wsdl +0 -0
  131. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/ptz/wsdl/ptz.wsdl +0 -0
  132. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/util/federated_search_documentation.html +0 -0
  133. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/util/fedsearch-docu-viewer.xsl +0 -0
  134. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/util/onvif-wsdl-viewer.xsl +0 -0
  135. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif/wsdl/ver20/util/operationIndex.html +0 -0
  136. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif_python.egg-info/dependency_links.txt +0 -0
  137. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif_python.egg-info/entry_points.txt +0 -0
  138. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif_python.egg-info/requires.txt +0 -0
  139. {onvif_python-0.2.6 → onvif_python-0.2.8}/onvif_python.egg-info/top_level.txt +0 -0
  140. {onvif_python-0.2.6 → onvif_python-0.2.8}/setup.cfg +0 -0
  141. {onvif_python-0.2.6 → onvif_python-0.2.8}/setup.py +0 -0
  142. {onvif_python-0.2.6 → onvif_python-0.2.8}/tests/test_client.py +0 -0
  143. {onvif_python-0.2.6 → onvif_python-0.2.8}/tests/test_core.py +0 -0
  144. {onvif_python-0.2.6 → onvif_python-0.2.8}/tests/test_error_handlers.py +0 -0
  145. {onvif_python-0.2.6 → onvif_python-0.2.8}/tests/test_exceptions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onvif-python
3
- Version: 0.2.6
3
+ Version: 0.2.8
4
4
  Summary: A modern Python library for ONVIF-compliant devices
5
5
  Author-email: Nirsimetri Technologies® <open@nirsimetri.com>
6
6
  Maintainer: Kaburagi
@@ -46,7 +46,7 @@ Dynamic: license-file
46
46
  <div align="center">
47
47
  <a href="https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade"><img src="https://app.codacy.com/project/badge/Grade/bff08a94e4d447b690cea49c6594826d"/></a>
48
48
  <a href="https://deepwiki.com/nirsimetri/onvif-python"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg"></a>
49
- <a href="https://pypi.org/project/onvif-python/"><img alt="PyPI Version" src="https://img.shields.io/badge/PyPI-0.2.6-orange?logo=archive&color=yellow"></a>
49
+ <a href="https://pypi.org/project/onvif-python/"><img alt="PyPI Version" src="https://img.shields.io/badge/PyPI-0.2.8-orange?logo=archive&color=yellow"></a>
50
50
  <a href="https://pepy.tech/projects/onvif-python"><img alt="Pepy Total Downloads" src="https://img.shields.io/pepy/dt/onvif-python?label=Downloads&color=red"></a>
51
51
  <br>
52
52
  <a href="https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml"><img alt="Build" src="https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main"></a>
@@ -362,7 +362,7 @@ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password
362
362
  [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--output OUTPUT] [--version]
363
363
  [service] [method] [params ...]
364
364
 
365
- ONVIF Terminal Client — v0.2.6
365
+ ONVIF Terminal Client — v0.2.8
366
366
  https://github.com/nirsimetri/onvif-python
367
367
 
368
368
  positional arguments:
@@ -443,7 +443,7 @@ Examples:
443
443
  <summary><b>2. Interactive Shell</b></summary>
444
444
 
445
445
  ```bash
446
- ONVIF Interactive Shell — v0.2.6
446
+ ONVIF Interactive Shell — v0.2.8
447
447
  https://github.com/nirsimetri/onvif-python
448
448
 
449
449
  Basic Commands:
@@ -3,7 +3,7 @@
3
3
  <div align="center">
4
4
  <a href="https://app.codacy.com/gh/nirsimetri/onvif-python/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade"><img src="https://app.codacy.com/project/badge/Grade/bff08a94e4d447b690cea49c6594826d"/></a>
5
5
  <a href="https://deepwiki.com/nirsimetri/onvif-python"><img alt="Ask DeepWiki" src="https://deepwiki.com/badge.svg"></a>
6
- <a href="https://pypi.org/project/onvif-python/"><img alt="PyPI Version" src="https://img.shields.io/badge/PyPI-0.2.6-orange?logo=archive&color=yellow"></a>
6
+ <a href="https://pypi.org/project/onvif-python/"><img alt="PyPI Version" src="https://img.shields.io/badge/PyPI-0.2.8-orange?logo=archive&color=yellow"></a>
7
7
  <a href="https://pepy.tech/projects/onvif-python"><img alt="Pepy Total Downloads" src="https://img.shields.io/pepy/dt/onvif-python?label=Downloads&color=red"></a>
8
8
  <br>
9
9
  <a href="https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml"><img alt="Build" src="https://github.com/nirsimetri/onvif-python/actions/workflows/python-app.yml/badge.svg?branch=main"></a>
@@ -319,7 +319,7 @@ usage: onvif [-h] [--host HOST] [--port PORT] [--username USERNAME] [--password
319
319
  [--cache {all,db,mem,none}] [--health-check-interval HEALTH_CHECK_INTERVAL] [--output OUTPUT] [--version]
320
320
  [service] [method] [params ...]
321
321
 
322
- ONVIF Terminal Client — v0.2.6
322
+ ONVIF Terminal Client — v0.2.8
323
323
  https://github.com/nirsimetri/onvif-python
324
324
 
325
325
  positional arguments:
@@ -400,7 +400,7 @@ Examples:
400
400
  <summary><b>2. Interactive Shell</b></summary>
401
401
 
402
402
  ```bash
403
- ONVIF Interactive Shell — v0.2.6
403
+ ONVIF Interactive Shell — v0.2.8
404
404
  https://github.com/nirsimetri/onvif-python
405
405
 
406
406
  Basic Commands:
@@ -1,5 +1,7 @@
1
1
  # onvif/__init__.py
2
2
 
3
+ __version__ = "0.2.8"
4
+
3
5
  from .client import ONVIFClient
4
6
  from .operator import CacheMode
5
7
  from .utils import (
@@ -22,4 +24,5 @@ __all__ = [
22
24
  "ONVIFCLI",
23
25
  "ONVIFDiscovery",
24
26
  "ONVIFParser",
27
+ "__version__",
25
28
  ]
@@ -13,6 +13,7 @@ from typing import List
13
13
  from zeep.exceptions import TransportError, Fault
14
14
  from requests.exceptions import RequestException
15
15
 
16
+ from .. import __version__
16
17
  from ..client import ONVIFClient
17
18
  from ..utils.exceptions import ONVIFOperationException
18
19
  from .utils import (
@@ -194,7 +195,7 @@ class InteractiveShell(cmd.Cmd):
194
195
  " / __ \\/ | / / | / / _/ ____/",
195
196
  " / / / / |/ /| | / // // /_ ",
196
197
  "/ /_/ / /| / | |/ // // __/ ",
197
- "\\____/_/ |_/ |___/___/_/ v0.2.6",
198
+ f"\\____/_/ |_/ |___/___/_/ v{__version__}",
198
199
  " ",
199
200
  ]
200
201
 
@@ -1400,7 +1401,7 @@ class InteractiveShell(cmd.Cmd):
1400
1401
  super().do_help(line)
1401
1402
  else:
1402
1403
  help_text = f"""
1403
- {colorize('ONVIF Interactive Shell — v0.2.6', 'cyan')}\n{colorize('https://github.com/nirsimetri/onvif-python', 'white')}
1404
+ {colorize(f'ONVIF Interactive Shell — v{__version__}', 'cyan')}\n{colorize('https://github.com/nirsimetri/onvif-python', 'white')}
1404
1405
 
1405
1406
  {colorize('Basic Commands:', 'yellow')}
1406
1407
  capabilities, caps - Show device capabilities
@@ -11,6 +11,7 @@ import json
11
11
  from datetime import datetime
12
12
  from typing import Any, Optional, Tuple
13
13
 
14
+ from .. import __version__
14
15
  from ..client import ONVIFClient
15
16
  from ..operator import CacheMode
16
17
  from ..utils.discovery import ONVIFDiscovery
@@ -22,7 +23,7 @@ def create_parser():
22
23
  """Create argument parser for ONVIF CLI"""
23
24
  parser = argparse.ArgumentParser(
24
25
  prog="onvif",
25
- description=f"{colorize('ONVIF Terminal Client', 'yellow')} — v0.2.6\nhttps://github.com/nirsimetri/onvif-python",
26
+ description=f"{colorize('ONVIF Terminal Client', 'yellow')} — v{__version__}\nhttps://github.com/nirsimetri/onvif-python",
26
27
  formatter_class=argparse.RawDescriptionHelpFormatter,
27
28
  epilog=f"""
28
29
  Examples:
@@ -188,7 +189,7 @@ def main():
188
189
 
189
190
  # Show ONVIF CLI version
190
191
  if args.version:
191
- print(colorize("0.2.6", "yellow"))
192
+ print(colorize(__version__, "yellow"))
192
193
  sys.exit(0)
193
194
 
194
195
  # Handle product search
@@ -104,6 +104,15 @@ class Device(ONVIFService):
104
104
  def SetRemoteUser(self, RemoteUser=None):
105
105
  return self.operator.call("SetRemoteUser", RemoteUser=RemoteUser)
106
106
 
107
+ def GetUserRoles(self, UserRole=None):
108
+ return self.operator.call("GetUserRoles", UserRole=UserRole)
109
+
110
+ def SetUserRole(self, UserRole):
111
+ return self.operator.call("SetUserRole", UserRole=UserRole)
112
+
113
+ def DeleteUserRole(self, UserRole):
114
+ return self.operator.call("DeleteUserRole", UserRole=UserRole)
115
+
107
116
  def GetUsers(self):
108
117
  return self.operator.call("GetUsers")
109
118
 
@@ -1,12 +1,43 @@
1
1
  # onvif/utils/service.py
2
2
 
3
3
  import logging
4
+ import zeep.helpers
4
5
  from .exceptions import ONVIFOperationException
5
6
 
6
7
  logger = logging.getLogger(__name__)
7
8
  logger.addHandler(logging.NullHandler())
8
9
 
9
10
 
11
+ class ONVIFResponse:
12
+ """Transparent wrapper that adds to_dict() to zeep objects."""
13
+
14
+ def __init__(self, wrapped_object):
15
+ object.__setattr__(self, "_wrapped", wrapped_object)
16
+
17
+ def __getattr__(self, name):
18
+ return getattr(self._wrapped, name)
19
+
20
+ def __setattr__(self, name, value):
21
+ if name == "_wrapped":
22
+ object.__setattr__(self, name, value)
23
+ else:
24
+ setattr(self._wrapped, name, value)
25
+
26
+ def __repr__(self):
27
+ return repr(self._wrapped)
28
+
29
+ def __str__(self):
30
+ return str(self._wrapped)
31
+
32
+ def to_dict(self):
33
+ """Convert zeep object to Python dictionary."""
34
+ return (
35
+ {}
36
+ if self._wrapped is None
37
+ else zeep.helpers.serialize_object(self._wrapped)
38
+ )
39
+
40
+
10
41
  def _is_zeep_object(obj):
11
42
  """Check if an object is a Zeep-generated object.
12
43
 
@@ -104,7 +135,7 @@ class ONVIFService:
104
135
  logger.debug(f"Calling wrapped ONVIF method: {name}")
105
136
  result = attr(*args, **kwargs)
106
137
  logger.debug(f"ONVIF method {name} completed successfully")
107
- return result
138
+ return ONVIFResponse(result) if result is not None else result
108
139
  except ONVIFOperationException as oe:
109
140
  # Re-raise ONVIF exceptions as-is
110
141
  service_name = getattr(self.operator, "service_name", "Unknown")