uiprotect 6.6.1__tar.gz → 6.6.3__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.

Potentially problematic release.


This version of uiprotect might be problematic. Click here for more details.

Files changed (37) hide show
  1. {uiprotect-6.6.1 → uiprotect-6.6.3}/PKG-INFO +1 -1
  2. {uiprotect-6.6.1 → uiprotect-6.6.3}/pyproject.toml +2 -2
  3. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/api.py +2 -4
  4. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/devices.py +14 -4
  5. {uiprotect-6.6.1 → uiprotect-6.6.3}/LICENSE +0 -0
  6. {uiprotect-6.6.1 → uiprotect-6.6.3}/README.md +0 -0
  7. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/__init__.py +1 -1
  8. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/__main__.py +0 -0
  9. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/_compat.py +0 -0
  10. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/__init__.py +0 -0
  11. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/backup.py +0 -0
  12. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/base.py +0 -0
  13. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/cameras.py +0 -0
  14. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/chimes.py +0 -0
  15. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/doorlocks.py +0 -0
  16. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/events.py +0 -0
  17. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/lights.py +0 -0
  18. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/liveviews.py +0 -0
  19. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/nvr.py +0 -0
  20. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/sensors.py +0 -0
  21. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/cli/viewers.py +0 -0
  22. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/__init__.py +0 -0
  23. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/base.py +0 -0
  24. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/bootstrap.py +0 -0
  25. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/convert.py +0 -0
  26. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/nvr.py +0 -0
  27. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/types.py +0 -0
  28. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/user.py +0 -0
  29. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/data/websocket.py +0 -0
  30. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/exceptions.py +0 -0
  31. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/py.typed +0 -0
  32. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/release_cache.json +0 -0
  33. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/stream.py +0 -0
  34. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/test_util/__init__.py +0 -0
  35. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/test_util/anonymize.py +0 -0
  36. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/utils.py +0 -0
  37. {uiprotect-6.6.1 → uiprotect-6.6.3}/src/uiprotect/websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uiprotect
3
- Version: 6.6.1
3
+ Version: 6.6.3
4
4
  Summary: Python API for Unifi Protect (Unofficial)
5
5
  Home-page: https://github.com/uilibs/uiprotect
6
6
  Author: UI Protect Maintainers
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "uiprotect"
3
- version = "6.6.1"
3
+ version = "6.6.3"
4
4
  description = "Python API for Unifi Protect (Unofficial)"
5
5
  authors = ["UI Protect Maintainers <ui@koston.org>"]
6
6
  readme = "README.md"
@@ -75,7 +75,7 @@ mkdocs-material = "^9.5.26"
75
75
  mkdocs-material-extensions = "^1.3.1"
76
76
  pymdown-extensions = "^10.8.1"
77
77
  mkdocs-git-revision-date-localized-plugin = "^1.2.6"
78
- mkdocs-include-markdown-plugin = "^6.1.1"
78
+ mkdocs-include-markdown-plugin = ">=6.1.1,<8.0.0"
79
79
  mkdocstrings = ">=0.25.1,<0.28.0"
80
80
  mkdocstrings-python = "^1.10.3"
81
81
 
@@ -12,7 +12,7 @@ import time
12
12
  from collections.abc import Callable
13
13
  from datetime import datetime, timedelta
14
14
  from functools import partial
15
- from http import HTTPStatus
15
+ from http import HTTPStatus, cookies
16
16
  from http.cookies import Morsel, SimpleCookie
17
17
  from ipaddress import IPv4Address, IPv6Address
18
18
  from pathlib import Path
@@ -67,9 +67,7 @@ from .utils import (
67
67
  )
68
68
  from .websocket import Websocket, WebsocketState
69
69
 
70
- if sys.version_info[:2] < (3, 13):
71
- from http import cookies
72
-
70
+ if "partitioned" not in cookies.Morsel._reserved: # type: ignore[attr-defined]
73
71
  # See: https://github.com/python/cpython/issues/112713
74
72
  cookies.Morsel._reserved["partitioned"] = "partitioned" # type: ignore[attr-defined]
75
73
  cookies.Morsel._flags.add("partitioned") # type: ignore[attr-defined]
@@ -2013,13 +2013,18 @@ class Camera(ProtectMotionDeviceModel):
2013
2013
 
2014
2014
  Datetime of screenshot is approximate. It may be +/- a few seconds.
2015
2015
  """
2016
+ # Use READ_LIVE if dt is None, otherwise READ_MEDIA
2017
+ permission = (
2018
+ PermissionNode.READ_LIVE if dt is None else PermissionNode.READ_MEDIA
2019
+ )
2016
2020
  if not self._api.bootstrap.auth_user.can(
2017
2021
  ModelType.CAMERA,
2018
- PermissionNode.READ_MEDIA,
2022
+ permission,
2019
2023
  self,
2020
2024
  ):
2025
+ action = "read live" if dt is None else "read media"
2021
2026
  raise NotAuthorized(
2022
- f"Do not have permission to read media for camera: {self.id}",
2027
+ f"Do not have permission to {action} for camera: {self.id}"
2023
2028
  )
2024
2029
 
2025
2030
  if height is None and width is None and self.high_camera_channel is not None:
@@ -2041,13 +2046,18 @@ class Camera(ProtectMotionDeviceModel):
2041
2046
  if not self.feature_flags.has_package_camera:
2042
2047
  raise BadRequest("Device does not have package camera")
2043
2048
 
2049
+ # Use READ_LIVE if dt is None, otherwise READ_MEDIA
2050
+ permission = (
2051
+ PermissionNode.READ_LIVE if dt is None else PermissionNode.READ_MEDIA
2052
+ )
2044
2053
  if not self._api.bootstrap.auth_user.can(
2045
2054
  ModelType.CAMERA,
2046
- PermissionNode.READ_MEDIA,
2055
+ permission,
2047
2056
  self,
2048
2057
  ):
2058
+ action = "read live" if dt is None else "read media"
2049
2059
  raise NotAuthorized(
2050
- f"Do not have permission to read media for camera: {self.id}",
2060
+ f"Do not have permission to {action} for camera: {self.id}"
2051
2061
  )
2052
2062
 
2053
2063
  if height is None and width is None and self.package_camera_channel is not None:
File without changes
File without changes
@@ -21,7 +21,7 @@ __all__ = [
21
21
  "get_nested_attr",
22
22
  "get_nested_attr_as_bool",
23
23
  "get_top_level_attr_as_bool",
24
- "make_value_getter",
25
24
  "make_enabled_getter",
26
25
  "make_required_getter",
26
+ "make_value_getter",
27
27
  ]