uiprotect 1.19.1__tar.gz → 1.19.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 (36) hide show
  1. {uiprotect-1.19.1 → uiprotect-1.19.3}/PKG-INFO +2 -2
  2. {uiprotect-1.19.1 → uiprotect-1.19.3}/pyproject.toml +2 -2
  3. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/api.py +1 -18
  4. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/base.py +0 -5
  5. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/base.py +4 -12
  6. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/bootstrap.py +1 -5
  7. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/devices.py +1 -4
  8. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/nvr.py +2 -9
  9. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/types.py +3 -12
  10. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/user.py +1 -4
  11. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/utils.py +2 -12
  12. {uiprotect-1.19.1 → uiprotect-1.19.3}/LICENSE +0 -0
  13. {uiprotect-1.19.1 → uiprotect-1.19.3}/README.md +0 -0
  14. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/__init__.py +0 -0
  15. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/__main__.py +0 -0
  16. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/__init__.py +0 -0
  17. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/backup.py +0 -0
  18. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/cameras.py +0 -0
  19. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/chimes.py +0 -0
  20. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/doorlocks.py +0 -0
  21. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/events.py +0 -0
  22. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/lights.py +0 -0
  23. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/liveviews.py +0 -0
  24. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/nvr.py +0 -0
  25. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/sensors.py +0 -0
  26. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/cli/viewers.py +0 -0
  27. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/__init__.py +0 -0
  28. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/convert.py +0 -0
  29. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/data/websocket.py +0 -0
  30. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/exceptions.py +0 -0
  31. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/py.typed +0 -0
  32. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/release_cache.json +0 -0
  33. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/stream.py +0 -0
  34. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/test_util/__init__.py +0 -0
  35. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/test_util/anonymize.py +0 -0
  36. {uiprotect-1.19.1 → uiprotect-1.19.3}/src/uiprotect/websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uiprotect
3
- Version: 1.19.1
3
+ Version: 1.19.3
4
4
  Summary: Python API for Unifi Protect (Unofficial)
5
5
  Home-page: https://github.com/uilibs/uiprotect
6
6
  License: MIT
@@ -27,7 +27,7 @@ Requires-Dist: orjson (>=3.9.15)
27
27
  Requires-Dist: packaging (>=23)
28
28
  Requires-Dist: pillow (>=10)
29
29
  Requires-Dist: platformdirs (>=4)
30
- Requires-Dist: pydantic (>=1.10.13)
30
+ Requires-Dist: pydantic (>=1.10.17)
31
31
  Requires-Dist: pyjwt (>=2.6)
32
32
  Requires-Dist: rich (>=10)
33
33
  Requires-Dist: typer (>=0.12.3)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "uiprotect"
3
- version = "1.19.1"
3
+ version = "1.19.3"
4
4
  description = "Python API for Unifi Protect (Unofficial)"
5
5
  authors = ["UI Protect Maintainers <ui@koston.org>"]
6
6
  license = "MIT"
@@ -41,7 +41,7 @@ orjson = ">=3.9.15"
41
41
  packaging = ">=23"
42
42
  pillow = ">=10"
43
43
  platformdirs = ">=4"
44
- pydantic = "!=1.9.1,>=1.10.13"
44
+ pydantic = "!=1.9.1,>=1.10.17"
45
45
  pyjwt = ">=2.6"
46
46
  yarl = ">=1.9"
47
47
  typer = ">=0.12.3"
@@ -53,7 +53,7 @@ from .data import (
53
53
  )
54
54
  from .data.base import ProtectModelWithId
55
55
  from .data.devices import Chime
56
- from .data.types import IteratorCallback, ProgressCallback, RecordingMode
56
+ from .data.types import IteratorCallback, ProgressCallback
57
57
  from .exceptions import BadRequest, NotAuthorized, NvrError
58
58
  from .utils import (
59
59
  decode_token_cookie,
@@ -1123,23 +1123,6 @@ class ProtectApiClient(BaseApiClient):
1123
1123
  This is a great alternative if you need metadata about the NVR without connecting to the Websocket
1124
1124
  """
1125
1125
  data = await self.api_request_obj("bootstrap")
1126
- # fix for UniFi Protect bug, some cameras may come back with and old recording mode
1127
- # "motion" and "smartDetect" recording modes was combined into "detections" in Protect 1.20.0
1128
- call_again = False
1129
- for camera_dict in data["cameras"]:
1130
- if camera_dict.get("recordingSettings", {}).get("mode", "detections") in {
1131
- "motion",
1132
- "smartDetect",
1133
- }:
1134
- await self.update_device(
1135
- ModelType.CAMERA,
1136
- camera_dict["id"],
1137
- {"recordingSettings": {"mode": RecordingMode.DETECTIONS.value}},
1138
- )
1139
- call_again = True
1140
-
1141
- if call_again:
1142
- data = await self.api_request_obj("bootstrap")
1143
1126
  return Bootstrap.from_unifi_dict(**data, api=self)
1144
1127
 
1145
1128
  async def get_devices_raw(self, model_type: ModelType) -> list[dict[str, Any]]:
@@ -14,11 +14,6 @@ from ..data import NVR, ProtectAdoptableDeviceModel, ProtectBaseObject
14
14
  from ..exceptions import BadRequest, NvrError, StreamError
15
15
  from ..utils import run_async
16
16
 
17
- try:
18
- from pydantic.v1 import ValidationError
19
- except ImportError:
20
- from pydantic import ValidationError # type: ignore[assignment]
21
-
22
17
  T = TypeVar("T")
23
18
 
24
19
  OPTION_FORCE = typer.Option(False, "-f", "--force", help="Skip confirmation prompt")
@@ -11,6 +11,9 @@ from ipaddress import IPv4Address
11
11
  from typing import TYPE_CHECKING, Any, ClassVar, TypeVar
12
12
  from uuid import UUID
13
13
 
14
+ from pydantic.v1 import BaseModel
15
+ from pydantic.v1.fields import SHAPE_DICT, SHAPE_LIST, PrivateAttr
16
+
14
17
  from ..exceptions import BadRequest, ClientError, NotAuthorized
15
18
  from ..utils import (
16
19
  asyncio_timeout,
@@ -34,17 +37,6 @@ from .websocket import (
34
37
  WSPacketFrameHeader,
35
38
  )
36
39
 
37
- try:
38
- from pydantic.v1 import BaseModel
39
- from pydantic.v1.fields import SHAPE_DICT, SHAPE_LIST, PrivateAttr
40
- except ImportError:
41
- from pydantic import BaseModel # type: ignore[assignment, no-redef]
42
- from pydantic.fields import ( # type: ignore[attr-defined, assignment, no-redef]
43
- SHAPE_DICT,
44
- SHAPE_LIST,
45
- PrivateAttr,
46
- )
47
-
48
40
  if TYPE_CHECKING:
49
41
  from asyncio.events import TimerHandle
50
42
 
@@ -483,7 +475,7 @@ class ProtectBaseObject(BaseModel):
483
475
  if (unifi_obj := getattr(cls, key)) is not None:
484
476
  value = unifi_obj.update_from_dict(item)
485
477
  else:
486
- value = None
478
+ value = unifi_objs[key](**item, api=api)
487
479
  elif has_unifi_lists and key in unifi_lists and isinstance(item, list):
488
480
  klass = unifi_lists[key]
489
481
  value = [
@@ -10,11 +10,7 @@ from datetime import datetime
10
10
  from typing import TYPE_CHECKING, Any
11
11
 
12
12
  from aiohttp.client_exceptions import ServerDisconnectedError
13
-
14
- try:
15
- from pydantic.v1 import PrivateAttr, ValidationError
16
- except ImportError:
17
- from pydantic import PrivateAttr, ValidationError # type: ignore[assignment]
13
+ from pydantic.v1 import PrivateAttr, ValidationError
18
14
 
19
15
  from ..exceptions import ClientError
20
16
  from ..utils import normalize_mac, utc_now
@@ -12,10 +12,7 @@ from ipaddress import IPv4Address
12
12
  from pathlib import Path
13
13
  from typing import TYPE_CHECKING, Any, Literal, cast
14
14
 
15
- try:
16
- from pydantic.v1.fields import PrivateAttr
17
- except ImportError:
18
- from pydantic.fields import PrivateAttr
15
+ from pydantic.v1.fields import PrivateAttr
19
16
 
20
17
  from ..exceptions import BadRequest, NotAuthorized, StreamError
21
18
  from ..stream import TalkbackStream
@@ -16,6 +16,7 @@ from uuid import UUID
16
16
  import aiofiles
17
17
  import orjson
18
18
  from aiofiles import os as aos
19
+ from pydantic.v1.fields import PrivateAttr
19
20
 
20
21
  from ..exceptions import BadRequest, NotAuthorized
21
22
  from ..utils import RELEASE_CACHE, convert_to_datetime
@@ -58,16 +59,8 @@ from .types import (
58
59
  )
59
60
  from .user import User, UserLocation
60
61
 
61
- try:
62
- from pydantic.v1.fields import PrivateAttr
63
- except ImportError:
64
- from pydantic.fields import PrivateAttr
65
-
66
62
  if TYPE_CHECKING:
67
- try:
68
- from pydantic.v1.typing import SetStr
69
- except ImportError:
70
- from pydantic.typing import SetStr # type: ignore[assignment, no-redef]
63
+ from pydantic.v1.typing import SetStr
71
64
 
72
65
 
73
66
  _LOGGER = logging.getLogger(__name__)
@@ -6,18 +6,9 @@ from functools import cache, cached_property
6
6
  from typing import Any, Literal, Optional, TypeVar, Union
7
7
 
8
8
  from packaging.version import Version as BaseVersion
9
-
10
- try:
11
- from pydantic.v1 import BaseModel, ConstrainedInt
12
- from pydantic.v1.color import Color as BaseColor
13
- from pydantic.v1.types import ConstrainedFloat, ConstrainedStr
14
- except ImportError:
15
- from pydantic import BaseModel, ConstrainedInt # type: ignore[assignment, no-redef]
16
- from pydantic.color import Color as BaseColor # type: ignore[assignment, no-redef]
17
- from pydantic.types import ( # type: ignore[assignment, no-redef]
18
- ConstrainedFloat,
19
- ConstrainedStr,
20
- )
9
+ from pydantic.v1 import BaseModel, ConstrainedInt
10
+ from pydantic.v1.color import Color as BaseColor
11
+ from pydantic.v1.types import ConstrainedFloat, ConstrainedStr
21
12
 
22
13
  KT = TypeVar("KT")
23
14
  VT = TypeVar("VT")
@@ -6,10 +6,7 @@ from datetime import datetime
6
6
  from functools import cache
7
7
  from typing import Any
8
8
 
9
- try:
10
- from pydantic.v1.fields import PrivateAttr
11
- except ImportError:
12
- from pydantic.fields import PrivateAttr
9
+ from pydantic.v1.fields import PrivateAttr
13
10
 
14
11
  from .base import ProtectBaseObject, ProtectModel, ProtectModelWithId
15
12
  from .types import ModelType, PermissionNode
@@ -28,6 +28,8 @@ from uuid import UUID
28
28
 
29
29
  import jwt
30
30
  from aiohttp import ClientResponse
31
+ from pydantic.v1.fields import SHAPE_DICT, SHAPE_LIST, SHAPE_SET, ModelField
32
+ from pydantic.v1.utils import to_camel
31
33
 
32
34
  from .data.types import (
33
35
  Color,
@@ -38,18 +40,6 @@ from .data.types import (
38
40
  )
39
41
  from .exceptions import NvrError
40
42
 
41
- try:
42
- from pydantic.v1.fields import SHAPE_DICT, SHAPE_LIST, SHAPE_SET, ModelField
43
- from pydantic.v1.utils import to_camel
44
- except ImportError:
45
- from pydantic.fields import ( # type: ignore[assignment, no-redef, attr-defined]
46
- SHAPE_DICT,
47
- SHAPE_LIST,
48
- SHAPE_SET,
49
- ModelField,
50
- )
51
- from pydantic.utils import to_camel # type: ignore[assignment, no-redef]
52
-
53
43
  if TYPE_CHECKING:
54
44
  from uiprotect.api import ProtectApiClient
55
45
  from uiprotect.data import CoordType, Event
File without changes
File without changes