uiprotect 1.7.2__py3-none-any.whl → 1.9.0__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/data/base.py CHANGED
@@ -55,13 +55,6 @@ if TYPE_CHECKING:
55
55
  from ..data.nvr import Event
56
56
  from ..data.user import User
57
57
 
58
- try:
59
- from pydantic.v1.typing import DictStrAny
60
- except ImportError:
61
- from pydantic.typing import ( # type: ignore[assignment, no-redef]
62
- DictStrAny,
63
- )
64
-
65
58
 
66
59
  ProtectObject = TypeVar("ProtectObject", bound="ProtectBaseObject")
67
60
  RECENT_EVENT_MAX = timedelta(seconds=30)
@@ -91,7 +84,6 @@ class ProtectBaseObject(BaseModel):
91
84
  _protect_objs: ClassVar[dict[str, type[ProtectBaseObject]] | None] = None
92
85
  _protect_lists: ClassVar[dict[str, type[ProtectBaseObject]] | None] = None
93
86
  _protect_dicts: ClassVar[dict[str, type[ProtectBaseObject]] | None] = None
94
- _to_unifi_remaps: ClassVar[DictStrAny | None] = None
95
87
 
96
88
  class Config:
97
89
  arbitrary_types_allowed = True
@@ -197,6 +189,7 @@ class ProtectBaseObject(BaseModel):
197
189
  return set(self._get_unifi_remaps())
198
190
 
199
191
  @classmethod
192
+ @cache
200
193
  def _get_to_unifi_remaps(cls) -> dict[str, str]:
201
194
  """
202
195
  Helper method for overriding in child classes for reversing remap UFP
@@ -208,12 +201,9 @@ class ProtectBaseObject(BaseModel):
208
201
  "python_name": "ufpJsonName"
209
202
  }
210
203
  """
211
- if cls._to_unifi_remaps is None:
212
- cls._to_unifi_remaps = {
213
- to_key: from_key for from_key, to_key in cls._get_unifi_remaps().items()
214
- }
215
-
216
- return cls._to_unifi_remaps
204
+ return {
205
+ to_key: from_key for from_key, to_key in cls._get_unifi_remaps().items()
206
+ }
217
207
 
218
208
  @classmethod
219
209
  def _set_protect_subtypes(cls) -> None:
@@ -630,6 +620,7 @@ class ProtectModelWithId(ProtectModel):
630
620
  return obj
631
621
 
632
622
  @classmethod
623
+ @cache
633
624
  def _get_read_only_fields(cls) -> set[str]:
634
625
  return set()
635
626
 
@@ -154,10 +154,6 @@ class ProtectDeviceRef(ProtectBaseObject):
154
154
  id: str
155
155
 
156
156
 
157
- _ModelType_NVR_value = ModelType.NVR.value
158
- _ModelType_Event_value = ModelType.EVENT.value
159
-
160
-
161
157
  class Bootstrap(ProtectBaseObject):
162
158
  auth_user_id: str
163
159
  access_key: str
@@ -197,8 +193,8 @@ class Bootstrap(ProtectBaseObject):
197
193
  )
198
194
  data["macLookup"] = {}
199
195
  data["idLookup"] = {}
200
- for model_type in ModelType.bootstrap_models_types_set():
201
- key = model_type.devices_key
196
+ for model_type in ModelType.bootstrap_models_types_set:
197
+ key = model_type.devices_key # type: ignore[attr-defined]
202
198
  items: dict[str, ProtectModel] = {}
203
199
  for item in data[key]:
204
200
  if (
@@ -234,8 +230,8 @@ class Bootstrap(ProtectBaseObject):
234
230
  if "idLookup" in data:
235
231
  del data["idLookup"]
236
232
 
237
- for model_type in ModelType.bootstrap_models_types_set():
238
- attr = model_type.devices_key
233
+ for model_type in ModelType.bootstrap_models_types_set:
234
+ attr = model_type.devices_key # type: ignore[attr-defined]
239
235
  if attr in data and isinstance(data[attr], dict):
240
236
  data[attr] = list(data[attr].values())
241
237
 
@@ -357,17 +353,16 @@ class Bootstrap(ProtectBaseObject):
357
353
  if TYPE_CHECKING:
358
354
  assert isinstance(obj, NVR)
359
355
  self.nvr = obj
360
- elif model_type in ModelType.bootstrap_models_types_set():
356
+ elif model_type in ModelType.bootstrap_models_types_set:
361
357
  if TYPE_CHECKING:
362
358
  assert isinstance(obj, ProtectAdoptableDeviceModel)
363
- assert isinstance(obj.model, ModelType)
364
- key = obj.model.devices_key
365
359
  if not self._api.ignore_unadopted or (
366
360
  obj.is_adopted and not obj.is_adopted_by_other
367
361
  ):
368
- getattr(self, key)[obj.id] = obj
369
- ref = ProtectDeviceRef(model=obj.model, id=obj.id)
370
- self.id_lookup[obj.id] = ref
362
+ id_ = obj.id
363
+ getattr(self, model_type.devices_key)[id_] = obj
364
+ ref = ProtectDeviceRef(model=model_type, id=id_)
365
+ self.id_lookup[id_] = ref
371
366
  self.mac_lookup[normalize_mac(obj.mac)] = ref
372
367
  else:
373
368
  _LOGGER.debug("Unexpected bootstrap model type for add: %s", model_type)
@@ -555,7 +550,7 @@ class Bootstrap(ProtectBaseObject):
555
550
  if action_action == "update":
556
551
  if model_type is ModelType.NVR:
557
552
  return self._process_nvr_update(packet, data, ignore_stats)
558
- if model_type in ModelType.bootstrap_models_types_and_event_set():
553
+ if model_type in ModelType.bootstrap_models_types_and_event_set:
559
554
  return self._process_device_update(
560
555
  model_type,
561
556
  packet,
uiprotect/data/types.py CHANGED
@@ -109,6 +109,12 @@ class ModelType(str, UnknownValuesEnumMixin, enum.Enum):
109
109
  RECORDING_SCHEDULE = "recordingSchedule"
110
110
  UNKNOWN = "unknown"
111
111
 
112
+ bootstrap_model_types: tuple[ModelType, ...]
113
+ bootstrap_models: tuple[str, ...]
114
+ bootstrap_models_set: set[str]
115
+ bootstrap_models_types_set: set[ModelType]
116
+ bootstrap_models_types_and_event_set: set[ModelType]
117
+
112
118
  @cached_property
113
119
  def devices_key(self) -> str:
114
120
  """Return the devices key."""
@@ -119,9 +125,8 @@ class ModelType(str, UnknownValuesEnumMixin, enum.Enum):
119
125
  def from_string(cls, value: str) -> ModelType:
120
126
  return cls(value)
121
127
 
122
- @staticmethod
123
- @cache
124
- def bootstrap_model_types() -> tuple[ModelType, ...]:
128
+ @classmethod
129
+ def _bootstrap_model_types(cls) -> tuple[ModelType, ...]:
125
130
  """Return the bootstrap models as a tuple."""
126
131
  # TODO:
127
132
  # legacyUFV
@@ -139,31 +144,40 @@ class ModelType(str, UnknownValuesEnumMixin, enum.Enum):
139
144
  ModelType.CHIME,
140
145
  )
141
146
 
142
- @staticmethod
143
- @cache
144
- def bootstrap_models() -> tuple[str, ...]:
147
+ @classmethod
148
+ def _bootstrap_models(cls) -> tuple[str, ...]:
145
149
  """Return the bootstrap models strings as a tuple."""
146
150
  return tuple(
147
- model_type.value for model_type in ModelType.bootstrap_model_types()
151
+ model_type.value for model_type in ModelType._bootstrap_model_types()
148
152
  )
149
153
 
150
- @staticmethod
151
- @cache
152
- def bootstrap_models_set() -> set[str]:
154
+ @classmethod
155
+ def _bootstrap_models_set(cls) -> set[str]:
153
156
  """Return the set of bootstrap models strings as a set."""
154
- return set(ModelType.bootstrap_models())
157
+ return set(ModelType._bootstrap_models())
155
158
 
156
- @staticmethod
157
- @cache
158
- def bootstrap_models_types_set() -> set[ModelType]:
159
+ @classmethod
160
+ def _bootstrap_models_types_set(cls) -> set[ModelType]:
159
161
  """Return the set of bootstrap models as a set."""
160
- return set(ModelType.bootstrap_model_types())
162
+ return set(ModelType._bootstrap_model_types())
161
163
 
162
- @staticmethod
163
- @cache
164
- def bootstrap_models_types_and_event_set() -> set[ModelType]:
164
+ @classmethod
165
+ def _bootstrap_models_types_and_event_set(cls) -> set[ModelType]:
165
166
  """Return the set of bootstrap models and the event model as a set."""
166
- return ModelType.bootstrap_models_types_set() | {ModelType.EVENT}
167
+ return ModelType._bootstrap_models_types_set() | {ModelType.EVENT}
168
+
169
+ def _immutable(self, name: str, value: Any) -> None:
170
+ raise AttributeError("Cannot modify ModelType")
171
+
172
+
173
+ ModelType.bootstrap_model_types = ModelType._bootstrap_model_types()
174
+ ModelType.bootstrap_models = ModelType._bootstrap_models()
175
+ ModelType.bootstrap_models_set = ModelType._bootstrap_models_set()
176
+ ModelType.bootstrap_models_types_set = ModelType._bootstrap_models_types_set()
177
+ ModelType.bootstrap_models_types_and_event_set = (
178
+ ModelType._bootstrap_models_types_and_event_set()
179
+ )
180
+ ModelType.__setattr__ = ModelType._immutable # type: ignore[method-assign, assignment]
167
181
 
168
182
 
169
183
  @enum.unique
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uiprotect
3
- Version: 1.7.2
3
+ Version: 1.9.0
4
4
  Summary: Python API for Unifi Protect (Unofficial)
5
5
  Home-page: https://github.com/uilibs/uiprotect
6
6
  License: MIT
@@ -14,12 +14,12 @@ uiprotect/cli/nvr.py,sha256=TwxEg2XT8jXAbOqv6gc7KFXELKadeItEDYweSL4_-e8,4260
14
14
  uiprotect/cli/sensors.py,sha256=fQtcDJCVxs4VbAqcavgBy2ABiVxAW3GXtna6_XFBp2k,8153
15
15
  uiprotect/cli/viewers.py,sha256=2cyrp104ffIvgT0wYGIO0G35QMkEbFe7fSVqLwDXQYQ,2171
16
16
  uiprotect/data/__init__.py,sha256=OcfuJl2qXfHcj_mdnrHhzZ5tEIZrw8auziX5IE7dn-I,2938
17
- uiprotect/data/base.py,sha256=mC-Nsr9xWSy7oshIOxgo5qQCjfYZutFQWIjTY39w2sQ,37909
18
- uiprotect/data/bootstrap.py,sha256=UxDAo8hz-Rh8XvgfYvUslrWelGFZ5JQ6bnixT4wKJR0,21468
17
+ uiprotect/data/base.py,sha256=apIXKZHL6dbyXTT4C4lkyo4M-Nf_DwsVXoXBL5jcXVo,37574
18
+ uiprotect/data/bootstrap.py,sha256=864mLxum0BmC3lIeKqHTs_Z5ikeJIDaRs4ukaVOilWw,21372
19
19
  uiprotect/data/convert.py,sha256=8h6Il_DhMkPRDPj9F_rA2UZIlTuchS3BQD24peKpk2A,2185
20
20
  uiprotect/data/devices.py,sha256=Nq3bOko5PFf5LvEBoD4JV8kmbq50laRdh3VHMWX7t-0,111809
21
21
  uiprotect/data/nvr.py,sha256=XC4NO1c_Mom-hIpzj9ksKFcgKbHd6ToqWjkgzxJ1PJY,47636
22
- uiprotect/data/types.py,sha256=-hhrnPZheC81eKIJOIZIGCb-A7jOBqa0zLWsmh9_vFQ,17220
22
+ uiprotect/data/types.py,sha256=8z8jIoMlfDre7Op1JAN45PLZdAE-4i3gDPSo2uymqu4,17996
23
23
  uiprotect/data/user.py,sha256=Wb-ZWSwIJbyUbfVuENtUYbuW-uftHNDcoMH85dvEjkw,7071
24
24
  uiprotect/data/websocket.py,sha256=WZJVA7EfYuKYMv-9jmvGgMWXKzE9ES25SKv1NQ2eHjc,6281
25
25
  uiprotect/exceptions.py,sha256=kgn0cRM6lTtgLza09SDa3ZiX6ue1QqHCOogQ4qu6KTQ,965
@@ -30,8 +30,8 @@ uiprotect/test_util/__init__.py,sha256=d2g7afa0LSdixQ0kjEDYwafDFME_UlW2LzxpamZ2B
30
30
  uiprotect/test_util/anonymize.py,sha256=f-8ijU-_y9r-uAbhIPn0f0I6hzJpAkvJzc8UpWihObI,8478
31
31
  uiprotect/utils.py,sha256=6OLY8hNiCzk418PjJJIlFW7jjPzVt1vxBKEzBSqMeTk,18418
32
32
  uiprotect/websocket.py,sha256=IzDPyqbzrkOMREvahN-e2zdvVD0VABSCWy6jSoCwOT0,7299
33
- uiprotect-1.7.2.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
34
- uiprotect-1.7.2.dist-info/METADATA,sha256=yw8NXd8D4F6yKONwFd-HxZaDrAxZ38Q7Nw_kXHn2-6Y,10984
35
- uiprotect-1.7.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
36
- uiprotect-1.7.2.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
37
- uiprotect-1.7.2.dist-info/RECORD,,
33
+ uiprotect-1.9.0.dist-info/LICENSE,sha256=INx18jhdbVXMEiiBANeKEbrbz57ckgzxk5uutmmcxGk,1111
34
+ uiprotect-1.9.0.dist-info/METADATA,sha256=XaM24hta0s3qHiy9AdwqBBSqN9civ3yV8yLZcRynksQ,10984
35
+ uiprotect-1.9.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
36
+ uiprotect-1.9.0.dist-info/entry_points.txt,sha256=J78AUTPrTTxgI3s7SVgrmGqDP7piX2wuuEORzhDdVRA,47
37
+ uiprotect-1.9.0.dist-info/RECORD,,