uiprotect 7.0.0__py3-none-any.whl → 7.0.2__py3-none-any.whl

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.

uiprotect/api.py CHANGED
@@ -829,21 +829,21 @@ class ProtectApiClient(BaseApiClient):
829
829
  async with self._update_lock:
830
830
  bootstrap = await self.get_bootstrap()
831
831
  if bootstrap.nvr.version >= NFC_FINGERPRINT_SUPPORT_VERSION:
832
+ try:
833
+ keyrings = await self.api_request_list("keyrings")
834
+ except NotAuthorized as err:
835
+ _LOGGER.debug("No access to keyrings %s, skipping", err)
836
+ keyrings = []
837
+ try:
838
+ ulp_users = await self.api_request_list("ulp-users")
839
+ except NotAuthorized as err:
840
+ _LOGGER.debug("No access to ulp-users %s, skipping", err)
841
+ ulp_users = []
832
842
  bootstrap.keyrings = Keyrings.from_list(
833
- cast(
834
- list[Keyring],
835
- list_from_unifi_list(
836
- self, await self.api_request_list("keyrings")
837
- ),
838
- )
843
+ cast(list[Keyring], list_from_unifi_list(self, keyrings))
839
844
  )
840
845
  bootstrap.ulp_users = UlpUsers.from_list(
841
- cast(
842
- list[UlpUser],
843
- list_from_unifi_list(
844
- self, await self.api_request_list("ulp-users")
845
- ),
846
- )
846
+ cast(list[UlpUser], list_from_unifi_list(self, ulp_users))
847
847
  )
848
848
  self.__dict__.pop("bootstrap", None)
849
849
  self._bootstrap = bootstrap
uiprotect/data/base.py CHANGED
@@ -137,10 +137,12 @@ class ProtectBaseObject(BaseModel):
137
137
  data.pop("api", None)
138
138
  return cls(api=api, **data)
139
139
 
140
- return cls.construct(**data)
140
+ return cls.model_construct(**data)
141
141
 
142
142
  @classmethod
143
- def construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self:
143
+ def model_construct(
144
+ cls, _fields_set: set[str] | None = None, **values: Any
145
+ ) -> Self:
144
146
  api: ProtectApiClient | None = values.pop("api", None)
145
147
  (
146
148
  unifi_objs,
@@ -152,19 +154,21 @@ class ProtectBaseObject(BaseModel):
152
154
  ) = cls._get_protect_model()
153
155
  for key, value in values.items():
154
156
  if has_unifi_objs and key in unifi_objs and isinstance(value, dict):
155
- values[key] = unifi_objs[key].construct(**value)
157
+ values[key] = unifi_objs[key].model_construct(**value)
156
158
  elif has_unifi_lists and key in unifi_lists and isinstance(value, list):
157
159
  values[key] = [
158
- unifi_lists[key].construct(**v) if isinstance(v, dict) else v
160
+ unifi_lists[key].model_construct(**v) if isinstance(v, dict) else v
159
161
  for v in value
160
162
  ]
161
163
  elif has_unifi_dicts and key in unifi_dicts and isinstance(value, dict):
162
164
  values[key] = {
163
- k: unifi_dicts[key].construct(**v) if isinstance(v, dict) else v
165
+ k: unifi_dicts[key].model_construct(**v)
166
+ if isinstance(v, dict)
167
+ else v
164
168
  for k, v in value.items()
165
169
  }
166
170
 
167
- obj = super().construct(_fields_set=_fields_set, **values)
171
+ obj = super().model_construct(_fields_set=_fields_set, **values)
168
172
  if api is not None:
169
173
  obj._api = api
170
174
 
@@ -369,7 +373,7 @@ class ProtectBaseObject(BaseModel):
369
373
  if isinstance(value, ProtectBaseObject):
370
374
  value = value.unifi_dict()
371
375
  elif isinstance(value, dict):
372
- value = klass.construct({}).unifi_dict(data=value) # type: ignore[arg-type]
376
+ value = klass.model_construct({}).unifi_dict(data=value) # type: ignore[arg-type]
373
377
 
374
378
  return value
375
379
 
@@ -390,7 +394,7 @@ class ProtectBaseObject(BaseModel):
390
394
  return [
391
395
  item.unifi_dict()
392
396
  if isinstance(item, ProtectBaseObject)
393
- else klass.construct({}).unifi_dict(data=item) # type: ignore[arg-type]
397
+ else klass.model_construct({}).unifi_dict(data=item) # type: ignore[arg-type]
394
398
  for item in value
395
399
  ]
396
400
 
@@ -587,9 +591,11 @@ class ProtectModelWithId(ProtectModel):
587
591
  self._update_sync = update_sync or UpdateSynchronization()
588
592
 
589
593
  @classmethod
590
- def construct(cls, _fields_set: set[str] | None = None, **values: Any) -> Self:
594
+ def model_construct(
595
+ cls, _fields_set: set[str] | None = None, **values: Any
596
+ ) -> Self:
591
597
  update_sync = values.pop("update_sync", None)
592
- obj = super().construct(_fields_set=_fields_set, **values)
598
+ obj = super().model_construct(_fields_set=_fields_set, **values)
593
599
  obj._update_sync = update_sync or UpdateSynchronization()
594
600
  return obj
595
601
 
@@ -426,7 +426,7 @@ class Bootstrap(ProtectBaseObject):
426
426
  if updated_obj is None:
427
427
  return None
428
428
 
429
- old_obj = updated_obj.copy()
429
+ old_obj = updated_obj.model_copy()
430
430
  updated_data = {to_snake_case(k): v for k, v in data.items()}
431
431
  updated_obj.update_from_dict(updated_data)
432
432
 
@@ -461,7 +461,7 @@ class Bootstrap(ProtectBaseObject):
461
461
  if not (data := self.nvr.unifi_dict_to_dict(data)):
462
462
  return None
463
463
 
464
- old_nvr = self.nvr.copy()
464
+ old_nvr = self.nvr.model_copy()
465
465
  self.nvr = self.nvr.update_from_dict(data)
466
466
 
467
467
  return WSSubscriptionMessage(
@@ -517,7 +517,7 @@ class Bootstrap(ProtectBaseObject):
517
517
  # nothing left to process
518
518
  return None
519
519
 
520
- old_obj = obj.copy()
520
+ old_obj = obj.model_copy()
521
521
  obj = obj.update_from_dict(data)
522
522
 
523
523
  if model_type is ModelType.EVENT:
uiprotect/data/user.py CHANGED
@@ -252,6 +252,9 @@ class UlpUserKeyringBase(Generic[T]):
252
252
  def __init__(self) -> None:
253
253
  self._id_to_item: dict[str, T] = {}
254
254
 
255
+ def __len__(self) -> int:
256
+ return len(self._id_to_item)
257
+
255
258
  @classmethod
256
259
  def from_list(cls, items: list[T]) -> Self:
257
260
  instance = cls()
uiprotect/utils.py CHANGED
@@ -572,7 +572,7 @@ def local_datetime(dt: datetime | None = None) -> datetime:
572
572
  def log_event(event: Event) -> None:
573
573
  from uiprotect.data import EventType
574
574
 
575
- _LOGGER.debug("event WS msg: %s", event.dict())
575
+ _LOGGER.debug("event WS msg: %s", event.model_dump())
576
576
  if "smart" not in event.type.value:
577
577
  return
578
578
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uiprotect
3
- Version: 7.0.0
3
+ Version: 7.0.2
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,7 +1,7 @@
1
1
  uiprotect/__init__.py,sha256=Oz6i1tonIz4QWVnEPkbielJDJ3WQdwZVgYtjY4IwGAQ,636
2
2
  uiprotect/__main__.py,sha256=C_bHCOkv5qj6WMy-6ELoY3Y6HDhLxOa1a30CzmbZhsg,462
3
3
  uiprotect/_compat.py,sha256=HThmb1zQZCEssCxYYbQzFhJq8zYYlVaSnIEZabKc-6U,302
4
- uiprotect/api.py,sha256=pSQ_C2cjtttnFnrVzjmHlqS7zOfMH-bwk4NxbraUCKI,68850
4
+ uiprotect/api.py,sha256=qj6qEKLY3j25kNTL7Jlo-wwreOdmFzcV_MZxkNo7Oeg,69038
5
5
  uiprotect/cli/__init__.py,sha256=1MO8rJmjjAsfVx2x01gn5DJo8B64xdPGo6gRVJbWd18,8868
6
6
  uiprotect/cli/backup.py,sha256=ZiS7RZnJGKI8TJKLW2cOUzkRM8nyTvE5Ov_jZZGtvSM,36708
7
7
  uiprotect/cli/base.py,sha256=GVHQMrI3thQ-4ixJlunTCfEMF90xCnt-bvRPMDupDss,7588
@@ -15,13 +15,13 @@ uiprotect/cli/nvr.py,sha256=TwxEg2XT8jXAbOqv6gc7KFXELKadeItEDYweSL4_-e8,4260
15
15
  uiprotect/cli/sensors.py,sha256=fQtcDJCVxs4VbAqcavgBy2ABiVxAW3GXtna6_XFBp2k,8153
16
16
  uiprotect/cli/viewers.py,sha256=2cyrp104ffIvgT0wYGIO0G35QMkEbFe7fSVqLwDXQYQ,2171
17
17
  uiprotect/data/__init__.py,sha256=OcfuJl2qXfHcj_mdnrHhzZ5tEIZrw8auziX5IE7dn-I,2938
18
- uiprotect/data/base.py,sha256=ggW3Jdzld6Je0827RIqtFQDzVIFXCWxqTPvzSchCcA0,35353
19
- uiprotect/data/bootstrap.py,sha256=66D4ssZiXIehn3nDRqzDbMO1LE_eJwxy0Ch8ZuhBvio,23233
18
+ uiprotect/data/base.py,sha256=LRqmK60PKeDFgP2k5qpVj93AxEvdfC6kLk0Cqvt1W5k,35481
19
+ uiprotect/data/bootstrap.py,sha256=oWjjWsLg8f_OERG_9h__5exB3qCmwI6KX4khBGZEzoc,23251
20
20
  uiprotect/data/convert.py,sha256=CDPkSMxSEhvDigmzmLFKpjrz0oa5FOvOdkNIHZrOZ4Q,2586
21
21
  uiprotect/data/devices.py,sha256=Brj9bT9oJPb5jqAY5vc2JhFG6m7DJt8u58qVe-oTw6M,113803
22
22
  uiprotect/data/nvr.py,sha256=E18DgE0nXl9VZ_ULotTPcXSi3M1u3mWQsuZbY1gIajs,47490
23
23
  uiprotect/data/types.py,sha256=YCRqY5aMSFNX-X-3eqsHnUO5s1ZbPjKc5o2-eH12E34,19086
24
- uiprotect/data/user.py,sha256=wd0MZPrDftRm2ZuTZHZvSYTmPdzyGMPszwjkbVD2iOA,10458
24
+ uiprotect/data/user.py,sha256=Del5LUmt5uCfAQMI9-kl_GaKm085oTLjxmcCrlEKXxc,10526
25
25
  uiprotect/data/websocket.py,sha256=m4EV1Qfh08eKOihy70ycViYgEQpeNSGZQJWdtGIYJDA,6791
26
26
  uiprotect/exceptions.py,sha256=kgn0cRM6lTtgLza09SDa3ZiX6ue1QqHCOogQ4qu6KTQ,965
27
27
  uiprotect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -29,10 +29,10 @@ uiprotect/release_cache.json,sha256=NamnSFy78hOWY0DPO87J9ELFCAN6NnVquv8gQO75ZG4,
29
29
  uiprotect/stream.py,sha256=MWiTRFIhUfFLPA_csSrKl5-SkUbPZ2VhDu0XW2oVr-U,4800
30
30
  uiprotect/test_util/__init__.py,sha256=Ky8mTL61nhp5II2mxTKBAsSGvNqK8U_CfKC5AGwToAI,18704
31
31
  uiprotect/test_util/anonymize.py,sha256=f-8ijU-_y9r-uAbhIPn0f0I6hzJpAkvJzc8UpWihObI,8478
32
- uiprotect/utils.py,sha256=0q5Y0E_hxMjXqRjdo_TEheMhfLzH3_4okvHJfg6Tj-A,20475
32
+ uiprotect/utils.py,sha256=q2YYQfxr0b3QEWMSP7SdpcJZbB4huEhpo8PbtnTbEFI,20481
33
33
  uiprotect/websocket.py,sha256=tEyenqblNXHcjWYuf4oRP1E7buNwx6zoECMwpBr-jig,8191
34
- uiprotect-7.0.0.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
35
- uiprotect-7.0.0.dist-info/METADATA,sha256=qjmkFG7U_AqAvBZ-8uYAJfBAe4TPWk0eMpo-iyp2YEc,11142
36
- uiprotect-7.0.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
37
- uiprotect-7.0.0.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
38
- uiprotect-7.0.0.dist-info/RECORD,,
34
+ uiprotect-7.0.2.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
35
+ uiprotect-7.0.2.dist-info/METADATA,sha256=rtp7lvceFYj6ZjMcu6s0RtFwTCZQ4KJrRgbfRr9aUNE,11142
36
+ uiprotect-7.0.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
37
+ uiprotect-7.0.2.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
38
+ uiprotect-7.0.2.dist-info/RECORD,,