simo 2.4.2__py3-none-any.whl → 2.5.1__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 simo might be problematic. Click here for more details.

Files changed (66) hide show
  1. simo/backups/tasks.py +11 -1
  2. simo/core/__pycache__/admin.cpython-38.pyc +0 -0
  3. simo/core/__pycache__/api.cpython-38.pyc +0 -0
  4. simo/core/__pycache__/app_widgets.cpython-38.pyc +0 -0
  5. simo/core/__pycache__/controllers.cpython-38.pyc +0 -0
  6. simo/core/__pycache__/events.cpython-38.pyc +0 -0
  7. simo/core/__pycache__/forms.cpython-38.pyc +0 -0
  8. simo/core/__pycache__/middleware.cpython-38.pyc +0 -0
  9. simo/core/__pycache__/models.cpython-38.pyc +0 -0
  10. simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
  11. simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
  12. simo/core/admin.py +4 -4
  13. simo/core/api.py +20 -4
  14. simo/core/app_widgets.py +5 -0
  15. simo/core/controllers.py +2 -2
  16. simo/core/events.py +2 -0
  17. simo/core/forms.py +2 -0
  18. simo/core/management/commands/gateways_manager.py +0 -3
  19. simo/core/middleware.py +7 -1
  20. simo/core/models.py +26 -6
  21. simo/core/serializers.py +17 -17
  22. simo/core/tasks.py +10 -7
  23. simo/fleet/__pycache__/controllers.cpython-38.pyc +0 -0
  24. simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
  25. simo/fleet/__pycache__/models.cpython-38.pyc +0 -0
  26. simo/fleet/controllers.py +86 -22
  27. simo/fleet/forms.py +84 -9
  28. simo/fleet/migrations/0039_auto_20241016_1047.py +28 -0
  29. simo/fleet/migrations/0040_alter_colonel_pwm_frequency.py +18 -0
  30. simo/fleet/migrations/__pycache__/0039_auto_20241016_1047.cpython-38.pyc +0 -0
  31. simo/fleet/migrations/__pycache__/0040_alter_colonel_pwm_frequency.cpython-38.pyc +0 -0
  32. simo/fleet/models.py +2 -2
  33. simo/generic/__pycache__/controllers.cpython-38.pyc +0 -0
  34. simo/generic/__pycache__/forms.cpython-38.pyc +0 -0
  35. simo/generic/__pycache__/gateways.cpython-38.pyc +0 -0
  36. simo/generic/__pycache__/models.cpython-38.pyc +0 -0
  37. simo/generic/controllers.py +41 -2
  38. simo/generic/forms.py +71 -7
  39. simo/generic/models.py +0 -1
  40. simo/generic/scripting/__init__.py +16 -0
  41. simo/generic/scripting/__pycache__/__init__.cpython-38.pyc +0 -0
  42. simo/generic/scripting/__pycache__/serializers.cpython-38.pyc +0 -0
  43. simo/generic/scripting/helpers.py +35 -0
  44. simo/generic/scripting/serializers.py +77 -0
  45. simo/generic/templates/admin/controller_widgets/weather_forecast.html +2 -2
  46. simo/notifications/__pycache__/utils.cpython-38.pyc +0 -0
  47. simo/notifications/utils.py +30 -12
  48. simo/scripting.py +2 -2
  49. simo/users/__pycache__/api.cpython-38.pyc +0 -0
  50. simo/users/__pycache__/managers.cpython-38.pyc +0 -0
  51. simo/users/__pycache__/models.cpython-38.pyc +0 -0
  52. simo/users/__pycache__/serializers.cpython-38.pyc +0 -0
  53. simo/users/__pycache__/utils.cpython-38.pyc +0 -0
  54. simo/users/api.py +36 -7
  55. simo/users/managers.py +5 -1
  56. simo/users/migrations/0034_instanceuser_last_seen_location_and_more.py +24 -0
  57. simo/users/migrations/__pycache__/0034_instanceuser_last_seen_location_and_more.cpython-38.pyc +0 -0
  58. simo/users/models.py +37 -32
  59. simo/users/serializers.py +11 -8
  60. simo/users/utils.py +14 -3
  61. {simo-2.4.2.dist-info → simo-2.5.1.dist-info}/METADATA +1 -1
  62. {simo-2.4.2.dist-info → simo-2.5.1.dist-info}/RECORD +66 -54
  63. {simo-2.4.2.dist-info → simo-2.5.1.dist-info}/WHEEL +1 -1
  64. {simo-2.4.2.dist-info → simo-2.5.1.dist-info}/LICENSE.md +0 -0
  65. {simo-2.4.2.dist-info → simo-2.5.1.dist-info}/entry_points.txt +0 -0
  66. {simo-2.4.2.dist-info → simo-2.5.1.dist-info}/top_level.txt +0 -0
simo/users/models.py CHANGED
@@ -22,6 +22,7 @@ from simo.conf import dynamic_settings
22
22
  from simo.core.utils.mixins import SimoAdminMixin
23
23
  from simo.core.utils.helpers import get_random_string
24
24
  from simo.core.events import OnChangeMixin
25
+ from simo.core.middleware import get_current_instance
25
26
  from .middleware import get_current_user
26
27
  from .utils import rebuild_authorized_keys
27
28
  from .managers import ActiveInstanceManager
@@ -98,6 +99,12 @@ class InstanceUser(DirtyFieldsMixin, models.Model, OnChangeMixin):
98
99
  role = models.ForeignKey(PermissionsRole, on_delete=models.CASCADE)
99
100
  at_home = models.BooleanField(default=False, db_index=True)
100
101
  is_active = models.BooleanField(default=True, db_index=True)
102
+ last_seen_location = PlainLocationField(
103
+ zoom=7, null=True, blank=True, help_text="Sent by user mobile app"
104
+ )
105
+ last_seen_location_datetime = models.DateTimeField(
106
+ null=True, blank=True,
107
+ )
101
108
 
102
109
  objects = ActiveInstanceManager()
103
110
 
@@ -123,17 +130,18 @@ def post_instance_user_save(sender, instance, created, **kwargs):
123
130
  return
124
131
  from simo.core.events import ObjectChangeEvent
125
132
  dirty_fields = instance.get_dirty_fields()
126
- if 'at_home' in dirty_fields:
133
+ if 'at_home' in dirty_fields or 'last_seen_location' in dirty_fields:
127
134
  def post_update():
128
- if instance.at_home:
129
- verb = 'came home'
130
- else:
131
- verb = 'left'
132
- action.send(
133
- instance.user, verb=verb,
134
- instance_id=instance.instance.id,
135
- action_type='user_presence', value=instance.at_home
136
- )
135
+ if 'at_home' in dirty_fields:
136
+ if instance.at_home:
137
+ verb = 'came home'
138
+ else:
139
+ verb = 'left'
140
+ action.send(
141
+ instance.user, verb=verb,
142
+ instance_id=instance.instance.id,
143
+ action_type='user_presence', value=instance.at_home
144
+ )
137
145
  ObjectChangeEvent(
138
146
  instance.instance, instance, dirty_fields=dirty_fields
139
147
  ).publish()
@@ -182,8 +190,6 @@ class User(AbstractBaseUser, SimoAdminMixin):
182
190
  USERNAME_FIELD = 'email'
183
191
  REQUIRED_FIELDS = ['name']
184
192
 
185
- _instance = None
186
-
187
193
  class Meta:
188
194
  verbose_name = _('user')
189
195
  verbose_name_plural = _('users')
@@ -206,12 +212,10 @@ class User(AbstractBaseUser, SimoAdminMixin):
206
212
  obj = super().save(*args, **kwargs)
207
213
 
208
214
  if org:
209
- if org.can_ssh() != self.can_ssh():
215
+ if org.can_ssh() != self.can_ssh() or org.ssh_key != self.ssh_key:
210
216
  rebuild_authorized_keys()
211
217
  elif self.can_ssh():
212
218
  rebuild_authorized_keys()
213
- elif org and org.ssh_key != self.ssh_key:
214
- rebuild_authorized_keys()
215
219
 
216
220
  if not org or (org.secret_key != self.secret_key):
217
221
  self.update_mqtt_secret()
@@ -230,7 +234,7 @@ class User(AbstractBaseUser, SimoAdminMixin):
230
234
  )
231
235
 
232
236
  def can_ssh(self):
233
- return self.is_active and self.ssh_key and self.is_master
237
+ return self.is_active and self.is_master
234
238
 
235
239
  def get_role(self, instance):
236
240
  cache_key = f'user-{self.id}_instance-{instance.id}_role'
@@ -244,19 +248,17 @@ class User(AbstractBaseUser, SimoAdminMixin):
244
248
  cache.set(cache_key, role, 20)
245
249
  return role
246
250
 
247
- def set_instance(self, instance):
248
- self._instance = instance
249
-
250
251
  @property
251
252
  def role_id(self):
252
253
  '''Used by API serializer to get users role on a given instance.'''
253
- if not self._instance:
254
+ instance = get_current_instance()
255
+ if not instance:
254
256
  return None
255
- cache_key = f'user-{self.id}_instance-{self._instance.id}-role-id'
257
+ cache_key = f'user-{self.id}_instance-{instance.id}-role-id'
256
258
  cached_val = cache.get(cache_key, 'expired')
257
259
  if cached_val == 'expired':
258
260
  for role in self.roles.all().select_related('instance'):
259
- if role.instance == self._instance:
261
+ if role.instance == instance:
260
262
  cached_val = role.id
261
263
  cache.set(cache_key, role.id, 20)
262
264
  return cached_val
@@ -264,16 +266,17 @@ class User(AbstractBaseUser, SimoAdminMixin):
264
266
 
265
267
  @role_id.setter
266
268
  def role_id(self, id):
267
- if not self._instance:
269
+ instance = get_current_instance()
270
+ if not instance:
268
271
  return
269
272
  role = PermissionsRole.objects.filter(
270
- id=id, instance=self._instance
273
+ id=id, instance=instance
271
274
  ).first()
272
275
  if not role:
273
276
  raise ValueError("There is no such a role on this instance")
274
277
 
275
278
  InstanceUser.objects.update_or_create(
276
- user=self, instance=self._instance, defaults={
279
+ user=self, instance=instance, defaults={
277
280
  'role': role
278
281
  }
279
282
  )
@@ -305,20 +308,21 @@ class User(AbstractBaseUser, SimoAdminMixin):
305
308
 
306
309
  @property
307
310
  def is_active(self):
308
- if not self._instance:
311
+ instance = get_current_instance()
312
+ if not instance:
309
313
  cache_key = f'user-{self.id}_is_active'
310
314
  else:
311
- cache_key = f'user-{self.id}_is_active_instance-{self._instance.id}'
315
+ cache_key = f'user-{self.id}_is_active_instance-{instance.id}'
312
316
  cached_value = cache.get(cache_key, 'expired')
313
317
  if cached_value == 'expired':
314
318
  if self.is_master and not self.instance_roles.all():
315
319
  # Master who have no roles on any instance are in GOD mode!
316
320
  # It can not be disabled by anybody, nor it is seen by anybody. :)
317
321
  cached_value = True
318
- elif self._instance:
322
+ elif instance:
319
323
  cached_value = bool(
320
324
  self.instance_roles.filter(
321
- instance=self._instance, is_active=True
325
+ instance=instance, is_active=True
322
326
  ).first()
323
327
  )
324
328
  else:
@@ -331,13 +335,14 @@ class User(AbstractBaseUser, SimoAdminMixin):
331
335
 
332
336
  @is_active.setter
333
337
  def is_active(self, val):
334
- if not self._instance:
338
+ instance = get_current_instance()
339
+ if not instance:
335
340
  return
336
341
 
337
342
  self.instance_roles.filter(
338
- instance=self._instance
343
+ instance=instance
339
344
  ).update(is_active=bool(val))
340
- cache_key = f'user-{self.id}_is_active_instance-{self._instance.id}'
345
+ cache_key = f'user-{self.id}_is_active_instance-{instance.id}'
341
346
  try:
342
347
  cache.delete(cache_key)
343
348
  except:
simo/users/serializers.py CHANGED
@@ -1,9 +1,10 @@
1
1
  from rest_framework import serializers
2
2
  from collections.abc import Iterable
3
- from simo.core.middleware import get_current_request
3
+ from simo.core.middleware import get_current_request, get_current_instance
4
4
  from simo.core.utils.api import ReadWriteSerializerMethodField
5
5
  from .models import (
6
- User, PermissionsRole, InstanceInvitation, InstanceUser, Fingerprint
6
+ User, PermissionsRole, ComponentPermission,
7
+ InstanceInvitation, InstanceUser, Fingerprint
7
8
  )
8
9
 
9
10
 
@@ -15,11 +16,6 @@ class UserSerializer(serializers.ModelSerializer):
15
16
 
16
17
  def __init__(self, *args, **kwargs):
17
18
  super().__init__(*args, **kwargs)
18
- if isinstance(self.instance, Iterable):
19
- for inst in self.instance:
20
- inst.set_instance(self.context['instance'])
21
- elif self.instance:
22
- self.instance.set_instance(self.context['instance'])
23
19
 
24
20
  class Meta:
25
21
  model = User
@@ -53,7 +49,7 @@ class UserSerializer(serializers.ModelSerializer):
53
49
 
54
50
  def get_at_home(self, obj):
55
51
  iu = InstanceUser.objects.filter(
56
- user=obj, instance=obj._instance
52
+ user=obj, instance=get_current_instance()
57
53
  ).first()
58
54
  if iu:
59
55
  return iu.at_home
@@ -68,6 +64,13 @@ class PermissionsRoleSerializer(serializers.ModelSerializer):
68
64
  fields = '__all__'
69
65
 
70
66
 
67
+ class ComponentPermissionSerializer(serializers.ModelSerializer):
68
+
69
+ class Meta:
70
+ model = ComponentPermission
71
+ fields = '__all__'
72
+
73
+
71
74
  class InstanceInvitationSerializer(serializers.ModelSerializer):
72
75
 
73
76
  class Meta:
simo/users/utils.py CHANGED
@@ -29,10 +29,21 @@ def rebuild_authorized_keys():
29
29
  try:
30
30
  with open('/root/.ssh/authorized_keys', 'w') as keys_file:
31
31
  for user in User.objects.filter(
32
- ssh_key__isnull=False
32
+ ssh_key__isnull=False, is_master=True
33
33
  ):
34
- if user.is_active and user.is_master:
35
- keys_file.write(user.ssh_key + '\n')
34
+ has_roles = user.instance_roles.filter(
35
+ instance__is_active=True
36
+ ).first()
37
+ has_active_roles = user.instance_roles.filter(
38
+ instance__is_active=True, is_active=True
39
+ ).first()
40
+ # if master user has active roles on some instances
41
+ # but no longer has a single active role on an instance
42
+ # he is most probably has been disabled by the property owner
43
+ # therefore he should no longer be able to ssh in to this hub!
44
+ if has_roles and not has_active_roles:
45
+ continue
46
+ keys_file.write(user.ssh_key + '\n')
36
47
  except:
37
48
  print(traceback.format_exc(), file=sys.stderr)
38
49
  pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.4.2
3
+ Version: 2.5.1
4
4
  Summary: Smart Home on Steroids!
5
5
  Author-email: Simanas Venčkauskas <simanas@simo.io>
6
6
  Project-URL: Homepage, https://simo.io
@@ -2,7 +2,7 @@ simo/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
2
2
  simo/asgi.py,sha256=L8CUVZLM32IMzWDZ4IShdDN-m69t7oxAUeHods4-xNM,822
3
3
  simo/celeryc.py,sha256=eab7_e9rw0c__DCeoUFUh_tjAGVlulxVrk75BaJf57Q,1512
4
4
  simo/conf.py,sha256=H2BhXAV8MEDVXF8AbkaLSfR4ULd-9_bS4bnhE5sE5fg,112
5
- simo/scripting.py,sha256=PVIkGsiMDWj4CNTbOM3rq7pJ6ruavuns-ZMU7VudLa4,923
5
+ simo/scripting.py,sha256=ixgi6mKzxHJD5d9-TDl4YhG9n8dZWIoCFNzku_I648g,931
6
6
  simo/settings.py,sha256=BcirAAKau1KiJ5qKTD0ni8hTk3jHAASBcUCBNZPGNCk,6962
7
7
  simo/urls.py,sha256=fRmAsNQ_pzFloimLmxNeDcR6hHRJ3rOoZ3kGy8zOQ_A,2402
8
8
  simo/__pycache__/__init__.cpython-38.pyc,sha256=j81de0BqHMr6bs0C7cuYrXl7HwtK_vv8hDEtAdSwDJc,153
@@ -16,7 +16,7 @@ simo/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  simo/backups/admin.py,sha256=cEakxnQlOHvUf8LdBdekXpDAvnqPoVN8y7pnN3WK29A,2487
17
17
  simo/backups/dynamic_settings.py,sha256=Q52RLa3UQsmAhqkwR16cM6pbBnIbXqmVQ2oIUP2ZVD0,416
18
18
  simo/backups/models.py,sha256=-tgILgkqmBEuxBwoymKZN1a0UVQzmJvqWrIGYMMFDaQ,695
19
- simo/backups/tasks.py,sha256=9AvxGiUrSGq43GbPf03K-hU4tVxBxA1xWsGIJTt4EFM,13111
19
+ simo/backups/tasks.py,sha256=Vz6hJGWzlfaHtXRkLMhCg8e3oH80aQtgc3YfDsRLpgg,13372
20
20
  simo/backups/__pycache__/__init__.cpython-38.pyc,sha256=vzOf-JIMeZ6P85FyvTpYev3mscFosUy-SJTshcQbOHU,161
21
21
  simo/backups/__pycache__/admin.cpython-38.pyc,sha256=KnVH67nEpTeoOzSFB-x1i-XMcC9fMgW8Y_C-hANs9jw,3065
22
22
  simo/backups/__pycache__/dynamic_settings.cpython-38.pyc,sha256=51gJFjn_XqQBRoHeubo6ppb9pNuFQKI5hAR0ms9flE8,731
@@ -33,67 +33,67 @@ simo/backups/migrations/__pycache__/0003_alter_backuplog_options_alter_backup_si
33
33
  simo/backups/migrations/__pycache__/0004_alter_backup_options_alter_backuplog_options_and_more.cpython-38.pyc,sha256=f4leTBkOB2kraQYyCkz9B_2pb6aKn7srV2unQA5HV1Q,710
34
34
  simo/backups/migrations/__pycache__/__init__.cpython-38.pyc,sha256=Lz1fs6V05h2AoxTOLNye0do9bEMnyuaXB_hHOjG5-HU,172
35
35
  simo/core/__init__.py,sha256=_s2TjJfQImsMrTIxqLAx9AZie1Ojmm6sCHASdl3WLGU,50
36
- simo/core/admin.py,sha256=hoJ0OhfWL9T0d6JCY6_Gm3GR-nrgtDR2UQM67rMsjiE,18141
37
- simo/core/api.py,sha256=BU-Lkt7m5sj5nzCqCi6uDU__xzBU97MwugL7FghI-es,27775
36
+ simo/core/admin.py,sha256=5mi0Qe9TM-OILCxbcRfGJvq397QCPxjYX30K3CIZrPs,18133
37
+ simo/core/api.py,sha256=A8P47OFFcqw-AXQPF3XqIV3pshEyqQGwLdM8aByddns,28288
38
38
  simo/core/api_auth.py,sha256=vCxvczA8aWNcW0VyKs5WlC_ytlqeGP_H_hkKUNVkCwM,1247
39
39
  simo/core/api_meta.py,sha256=EaiY-dCADP__9MvLpoHvhjytFT92IrxPZDv95xgqasU,4955
40
- simo/core/app_widgets.py,sha256=4Lh9FDzdkfh_mccJMe09dyRTT3Uqf9VXwbkurJ9E9oQ,2115
40
+ simo/core/app_widgets.py,sha256=ReWXLolUX6xW7QgB_qXTrrYyNvzustj9tXCXnUyCvJ8,2224
41
41
  simo/core/apps.py,sha256=CsqpiQerhmrMsH-wGiG-gQgXd9qEkIi-LUaA9cXpKSw,425
42
42
  simo/core/auto_urls.py,sha256=nNXEgLAAAQAhRWQDA9AbDtw-zcPKmu_pufJaSa8g818,1102
43
43
  simo/core/autocomplete_views.py,sha256=JT5LA2_Wtr60XYSAIqaXFKFYPjrmkEf6yunXD9y2zco,4022
44
44
  simo/core/base_types.py,sha256=qVh6MrXZEfN7bFOyFftC7u0yyz0PkvpsjllLBc6SCp4,616
45
45
  simo/core/context.py,sha256=snfPIGcZQTrx8iiZc5PI91A0dRQH6y5kH4uG_lfhU6Q,1486
46
- simo/core/controllers.py,sha256=KB-nzDR60x5EPwtfraIRE_CoXQXpnvjqcLFw6nqcOtQ,29930
46
+ simo/core/controllers.py,sha256=nX6AtkYX6GjRnHuywWesrvRwA8EBHt_fR7yB_8BGA_I,29932
47
47
  simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ,1872
48
- simo/core/events.py,sha256=LvtonJGNyCb6HLozs4EG0WZItnDwNdtnGQ4vTcnKvUs,4438
48
+ simo/core/events.py,sha256=HXapr_aLPM-T42yl4RB3M_HC76Bg_KmGJry5M8AlNK8,4493
49
49
  simo/core/filters.py,sha256=ghtOZcrwNAkIyF5_G9Sn73NkiI71mXv0NhwCk4IyMIM,411
50
50
  simo/core/form_fields.py,sha256=9tIjiEN3IE55GPyB4tOlfkd51JDne3-h8pKhpL3tLFE,2220
51
- simo/core/forms.py,sha256=sFVz8tENhi4QSudORu_e5tlGEC0aXumy6wzJqQNYBPk,21904
51
+ simo/core/forms.py,sha256=nL_trDNs7RLic11zLSen4EobtywGx8igUMYe7Ojuv1k,21988
52
52
  simo/core/gateways.py,sha256=m0eS3XjVe34Dge6xtoCq16kFWCKJcdQrT0JW0REqoq8,3715
53
53
  simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
54
54
  simo/core/managers.py,sha256=n-b3I4uXzfHKTeB1VMjSaMsDUxp8FegFJwnbV1IsWQ4,3019
55
- simo/core/middleware.py,sha256=1xKsaN0Ro5Fb2slB9FnlQdlDEdO4_kUGdnhA8rccBsA,2730
56
- simo/core/models.py,sha256=5UwGbe2UYj15yM-P6QCIO1HErEdzpNF3nHJnInBGdpM,21666
55
+ simo/core/middleware.py,sha256=aEHwnyR9IFGWxmrYuViJiXIWcCpD5GUeCxcTCpfX_Q8,2934
56
+ simo/core/models.py,sha256=fEbRVY128-FdjG2ueQhBlSMRpvKcxY2VKCJUqXsSMPI,22441
57
57
  simo/core/permissions.py,sha256=v0iJM4LOeYoEfMiw3OLPYio272G1aUEAg_z9Wd1q5m0,2993
58
58
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
59
- simo/core/serializers.py,sha256=1hcCnLnItw8T3jLWivKBjSAt7kwqjcOYE0vaepw55Z0,20966
59
+ simo/core/serializers.py,sha256=Pa2lhJ6VgNalbH4awbKdGJCYAPNsu5WQWfo6Tz6LbOQ,20782
60
60
  simo/core/signal_receivers.py,sha256=9-qFCCeSLcMFEMg6QUtKOVgUsoNoqhzGoI98nuNSTEo,6228
61
61
  simo/core/socket_consumers.py,sha256=n7VE2Fvqt4iEAYLTRbTPOcI-7tszMAADu7gimBxB-Fg,9635
62
62
  simo/core/storage.py,sha256=_5igjaoWZAiExGWFEJMElxUw55DzJG1jqFty33xe8BE,342
63
- simo/core/tasks.py,sha256=-swS6mJIJhAbdgKgPkGwYNn03-E9MKM_SO18mI7sml0,14433
63
+ simo/core/tasks.py,sha256=wYCaARytOqnBkoZ1zV59yCtZBqmu3Sd-eNpyZsv4LW0,14572
64
64
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
65
65
  simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
66
66
  simo/core/views.py,sha256=3SRZr00fyLQf8ja3U-9eekKt-ld5TvU1WQqUWprXfQ4,2390
67
67
  simo/core/widgets.py,sha256=J9e06C6I22F6xKic3VMgG7WeX07glAcl-4bF2Mg180A,2827
68
68
  simo/core/__pycache__/__init__.cpython-38.pyc,sha256=ZJFM_XN0RmJMULQulgA_wFiOnEtsMoedcOWnXjH-Y8o,208
69
- simo/core/__pycache__/admin.cpython-38.pyc,sha256=c5Q8YfIiLk25yVCxQvNsH-lwuOwfQa88X6xDYjOBogU,13428
70
- simo/core/__pycache__/api.cpython-38.pyc,sha256=w4uvlv0sZtY-xlVJ4UNLC60EyP8fRFGqUwKNc9XcrrE,21694
69
+ simo/core/__pycache__/admin.cpython-38.pyc,sha256=ksoB8Jz8PxcFQ3FlgPJtShwTnBR0LayaVZv6ezDe9OE,13723
70
+ simo/core/__pycache__/api.cpython-38.pyc,sha256=OFl3_PMd48Is0ohUEXeN-eQv_V2oAlphKyWS4FzKGhY,21862
71
71
  simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=6M9Cl_ha4y_Vf8Rv4GMYL8dcBCmp0KzYi6jn3SQTgys,1712
72
72
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=VYx5ZeDyNBI4B_CBEIhV5B3GnLsMOx9s3rNZTSMODco,3703
73
- simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=vUCEAYqppjgRZYMs6pTuSxWWuZxreLygPuPBGw044dQ,3643
73
+ simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=fmZhynYrx5X5gidhXovhnf8-FdbCLfUB9NS_lpHBF3s,3830
74
74
  simo/core/__pycache__/apps.cpython-38.pyc,sha256=JL0BEqgXcSQvMlcK48PBpPfyDEkPMdO1Y0teqMRGirs,713
75
75
  simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=Tyf8PYHq5YqSwTp25Joy-eura_Fm86fpX9zKLSklhvo,872
76
76
  simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=hJ6JILI1LqrAtpQMvxnLvljGdW1v1gpvBsD79vFkZ58,3972
77
77
  simo/core/__pycache__/base_types.cpython-38.pyc,sha256=hmq22vvGyCmhbYyuV6bFAOOSIupspgW5yq_VzqWd-vY,759
78
78
  simo/core/__pycache__/context.cpython-38.pyc,sha256=ck1FcBljLB4__5F6poS2tEEn8IDDgK7pU3FcXDPc_mI,1329
79
- simo/core/__pycache__/controllers.cpython-38.pyc,sha256=EOs8vHYOjzV9-zrOLr6FS49fywErGkegPteuKt2FqGU,26860
79
+ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=P90-jhkH086_z3Mawo-gYjBWRnZtsxTffqtsSiTTDDU,26864
80
80
  simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=wGpnscX1DxFpRl54MQURhjz2aD3NJohSzw9JCFnzh2Y,2384
81
- simo/core/__pycache__/events.cpython-38.pyc,sha256=A1Axx-qftd1r7st7wkO3DkvTdt9-RkcJe5KJhpzJVk8,5109
81
+ simo/core/__pycache__/events.cpython-38.pyc,sha256=wMN1cxlAKSGVzBU4rAsnbIJwMgbKImBCoSBgdZhkPUg,5131
82
82
  simo/core/__pycache__/filters.cpython-38.pyc,sha256=VIMADCBiYhziIyRmxAyUDJluZvuZmiC4bNYWTRsGSao,721
83
83
  simo/core/__pycache__/form_fields.cpython-38.pyc,sha256=u0voKXkA64xbH6LY_-jMBHQS4mOJZZeuB9WTvtv9JWE,3433
84
- simo/core/__pycache__/forms.cpython-38.pyc,sha256=JDCNYJQrZHUaMb4qZ6A0f1JptoCHQK1yfJwMJlhV7fI,17892
84
+ simo/core/__pycache__/forms.cpython-38.pyc,sha256=O_mCWAQHAJhiqcKLUina7tIFbw5uXwnLOYlJoWxqUDQ,17918
85
85
  simo/core/__pycache__/gateways.cpython-38.pyc,sha256=D1ooHL-iSpQrxnD8uAl4xWFJmm-QWZfbkLiLlFOMtdU,4553
86
86
  simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NMEdPAiHK0cFaIL7I8,1623
87
87
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=6RTIxyjOgpQGtAqcUyE2vFPS09w1V5Wmd_vOV7rHRRI,3370
88
- simo/core/__pycache__/middleware.cpython-38.pyc,sha256=OH2wvHHavuS4YYCgyvJd4GTrTCEV577CQ-ZBrTFuy6Y,2408
89
- simo/core/__pycache__/models.cpython-38.pyc,sha256=Y4TXVfl4pA7WOj6jCkXtvij38BEGxRMKWhdgyCaeke8,18017
88
+ simo/core/__pycache__/middleware.cpython-38.pyc,sha256=Ae2NvZ8sv-AeYoFS-xzuA196ajCuE411Ao-U1SY5HXU,2500
89
+ simo/core/__pycache__/models.cpython-38.pyc,sha256=vq7ysMUjqPdcPl6DfLzAzmJWPC9_WNR5W789w8fZirc,18460
90
90
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=fH4iyqd9DdzRLEu2b621-FeM-napR0M7hzBUTHo9Q3g,2972
91
91
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
92
- simo/core/__pycache__/serializers.cpython-38.pyc,sha256=xsGMcx9ISHmvY_PzWqosUdkWRBNqYKOtVkFDYNEHc1A,19479
92
+ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=qIHxrurPk555mHc9P8Udg9eGv-ODw1FTmBS_jXrPuws,19220
93
93
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=3Bt9S47DR_ZFS3O-crElFgLLXPIYyDgPIc2ibwEkaic,4904
94
94
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=NJUr7nRyHFvmAumxxWpsod5wzVVZM99rCEuJs1utHA4,8432
95
95
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=9R1Xu0FJDflfRXUPsqEgt0SpwiP7FGk7HaR8s8XRyI8,721
96
- simo/core/__pycache__/tasks.cpython-38.pyc,sha256=t2WCeMMfyXe9pdJVU-QP6g8pOP1iXYljjQl20AF2Kew,9968
96
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=HCp_TnVN3_q7WlAXrLbTbux30OG0hyTOqOHYvqcz1hU,9989
97
97
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
98
98
  simo/core/__pycache__/views.cpython-38.pyc,sha256=ySH8l-clhUdpkIVm9aMQOlt1VoZoJgNrqoE_sEiYMR8,2495
99
99
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
@@ -158,7 +158,7 @@ simo/core/management/_hub_template/hub/supervisor.conf,sha256=MOsMo8QjBKUl5EUWG4
158
158
  simo/core/management/_hub_template/hub/urls.py,sha256=Ydm-1BkYAzWeEF-MKSDIFf-7aE4qNLPm48-SA51XgJQ,25
159
159
  simo/core/management/_hub_template/hub/wsgi.py,sha256=Lo-huLHnMDTxSmMBOodVFMWBls9poddrV2KRzXU0xGo,280
160
160
  simo/core/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
- simo/core/management/commands/gateways_manager.py,sha256=a_JmUG1SPJhbhPh5QdViCT5DL0YvKQH-KsO8ptLhB34,6970
161
+ simo/core/management/commands/gateways_manager.py,sha256=oHzgC-eV4w_KHkiz6eCAlt3XMIwtS8_7mHDQ4UsU5y0,6967
162
162
  simo/core/management/commands/on_http_start.py,sha256=A2V40pyGY7AfONhtnxiGATOkqd0i9FUvRRxkwyAJF9k,2252
163
163
  simo/core/management/commands/run_gateway.py,sha256=bp0FQQoBeOSoxjHCCMicDL1fxPZZGyLgnq2QKht3bJo,645
164
164
  simo/core/management/commands/__pycache__/__init__.cpython-38.pyc,sha256=WKpfZZpAB9D7U4X6oWQIrU_H-6rUmq8Gl9fj9XaY2fw,178
@@ -10220,11 +10220,11 @@ simo/fleet/api.py,sha256=Hxn84xI-Q77HxjINgRbjSJQOv9jii4OL20LxK0VSrS8,2499
10220
10220
  simo/fleet/auto_urls.py,sha256=UX66eR2ykMqFgfIllW-RTdjup5-FieCWl_BVm3CcXKg,702
10221
10221
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10222
10222
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10223
- simo/fleet/controllers.py,sha256=A9Bawj9x9JOjd_u8lmNhnWbGlZgqIIS7kbAuO0cNR6c,30506
10224
- simo/fleet/forms.py,sha256=2KxC62R_Byo3Cu6TkcaXOFKrDQ0vxKOF69UkKyDZH8E,56519
10223
+ simo/fleet/controllers.py,sha256=i1GwbT6apIvdyfuVQYNkliBNlKmffCOdpjall3o3NxQ,32735
10224
+ simo/fleet/forms.py,sha256=yyb9KhhqbcfBBXh5PbzKH1uKP2ZH-LW6UZXD9AwT7rw,59079
10225
10225
  simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
10226
10226
  simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10227
- simo/fleet/models.py,sha256=dJYDTHBz1OizzP51G0fdKHSuW98CsqBX-NhgjcVqYHY,16518
10227
+ simo/fleet/models.py,sha256=DiO82bXZTH6e2mcN0TkTyR7n1YUYnMX_SNzR-lYjiY8,16542
10228
10228
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10229
10229
  simo/fleet/serializers.py,sha256=-16BjY_bp9VbDOYuD0V54h7r_RHpuLNkJX0SydWL9aU,2247
10230
10230
  simo/fleet/socket_consumers.py,sha256=aBNTxvYIw5a5l2ns9x0LnjVJvp4NValEJG4MT4hGAT0,17903
@@ -10237,11 +10237,11 @@ simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rL9fb7cCQatyFvXyKmlNOKmxVo8vHYe
10237
10237
  simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=Tc6a6BCXHjijP8U2jE2ghlJwnSNrGm59-hW5t-80wF0,689
10238
10238
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10239
10239
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10240
- simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=7_GWIGJ2cNjrct6Vu3tSTjvxx6kNJDtTdyTTwsQ1k_8,25373
10241
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=-Us2ghO1uSb-D66PgQksHpZjKeIzXYe7049P584j_lI,38764
10240
+ simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=K_UMv4Vnc1JBd7GHIekm_6YBHApWONFBql5Plnm73nw,26901
10241
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=IRHNJ4RXP17cm9jcZdf96YCeV-AMeVDgvFA8isgiC2E,40489
10242
10242
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnRrsQ_W7yeVeBkRLfIk,5058
10243
10243
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10244
- simo/fleet/__pycache__/models.cpython-38.pyc,sha256=pEiMWANjJpKXSR60PosKCUQOKpo6tSvCeWX4VP-0Lns,13796
10244
+ simo/fleet/__pycache__/models.cpython-38.pyc,sha256=fMjWveEDpdGNgffMBPW2IPPz2w_umlSu6UB7BW8z6g4,13802
10245
10245
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10246
10246
  simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=9ljhwoHkolcVrJwOVbYCbGPAUKgALRwor_M3W_K0adE,3173
10247
10247
  simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=oAnUJbrKjhC3-G-o4F-bx3ZztQf7JhmHi-Sh3cm4-4s,13549
@@ -10286,6 +10286,8 @@ simo/fleet/migrations/0035_auto_20240514_0855.py,sha256=qt1r-zC5EiB43255DkZuCBDQ
10286
10286
  simo/fleet/migrations/0036_auto_20240605_0702.py,sha256=BfDypoqXEukcR8-R-fP09BUSmKZ-_jXv_YyhwCklths,2325
10287
10287
  simo/fleet/migrations/0037_alter_colonelpin_options_alter_colonelpin_no_and_more.py,sha256=1YDmFYG4gkhS7AzUWJqage1XYftb5B88W737O0tNWiY,843
10288
10288
  simo/fleet/migrations/0038_alter_colonel_type.py,sha256=3NCAJc5M5BilQynd3lIvub3VJJnVhcONMoGInkd1Los,584
10289
+ simo/fleet/migrations/0039_auto_20241016_1047.py,sha256=c75iDlPH9NPQohkNBt58NPl31tNmctk5rww8wWQJmxA,801
10290
+ simo/fleet/migrations/0040_alter_colonel_pwm_frequency.py,sha256=AiiYeLXEmBAFj1O3WdJB0xQy1KqfiErYR8yPpL8W7e4,498
10289
10291
  simo/fleet/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10290
10292
  simo/fleet/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=9kc1UyMEYkRNVnZ7iwZbiW1t3qWXROvWrI2G1BdzIaA,1250
10291
10293
  simo/fleet/migrations/__pycache__/0002_auto_20220422_0743.cpython-38.pyc,sha256=8oxhGb7rL8QYKlBLU3pOYcd8aHeQWDB9I8awkK04mXg,841
@@ -10325,27 +10327,34 @@ simo/fleet/migrations/__pycache__/0035_auto_20240514_0855.cpython-38.pyc,sha256=
10325
10327
  simo/fleet/migrations/__pycache__/0036_auto_20240605_0702.cpython-38.pyc,sha256=SDGibhEg0SYDF6fCte8l8NLChvHKn1qhLIrNZ_WoZQk,1654
10326
10328
  simo/fleet/migrations/__pycache__/0037_alter_colonelpin_options_alter_colonelpin_no_and_more.cpython-38.pyc,sha256=ZappGrTStz3EIHlQ94y5ieXI-SkM9J1ashPey13ncFA,955
10327
10329
  simo/fleet/migrations/__pycache__/0038_alter_colonel_type.cpython-38.pyc,sha256=8qbVMh7Hy3YngqjKuOEMCV29J5cZtRoF3MF1bWesC54,793
10330
+ simo/fleet/migrations/__pycache__/0039_auto_20241016_1047.cpython-38.pyc,sha256=6QU9LBUexU9GFSwPoBgLznO6xZU0N-HbWITah-W1xWo,1088
10331
+ simo/fleet/migrations/__pycache__/0040_alter_colonel_pwm_frequency.cpython-38.pyc,sha256=o_trHQUyQfYzWO_iWmZpvzc-uVJlBjK-GfyKhPOVSjc,736
10328
10332
  simo/fleet/migrations/__pycache__/__init__.cpython-38.pyc,sha256=5k1KW0jeSDzw6RnVPRq4CaO13Lg7M0F-pxA_gqqZ6Mg,170
10329
10333
  simo/fleet/templates/fleet/controllers_info/Button.md,sha256=GIuxqG617174NEtpPeCGVocxO4YMe7-CacgVSu_L5-E,739
10330
10334
  simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LSTY9YPFuVPIbVsYCAifcotrXJcOXl2k774_vo6nAE,770
10331
10335
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10332
10336
  simo/generic/app_widgets.py,sha256=E_pnpA1hxMIhenRCrHoQ5cik06jm2BAHCkl_eo-OudU,1264
10333
10337
  simo/generic/base_types.py,sha256=djymox_boXTHX1BTTCLXrCH7ED-uAsV_idhaDOc3OLI,409
10334
- simo/generic/controllers.py,sha256=tVI0Gz35dcHt3_5xlkAaXOy3fxlmtZ8L7ODQBtBumV0,58275
10335
- simo/generic/forms.py,sha256=qS7BDI2_w01XsgBKjisGE6XNSMNpmdrdxCEJqorapwA,29481
10338
+ simo/generic/controllers.py,sha256=qqtIj9G3KzPi_IEA2IP1OEYujxCjYbGSKNVUUO8iim0,59825
10339
+ simo/generic/forms.py,sha256=QiVRQ-l2jgiEsnnUYqhCZkKwprMy-D-Wu_EDlBSLz60,32304
10336
10340
  simo/generic/gateways.py,sha256=cc_q_g2HsI2_rWmr8yZ3spnMPwsgoYS5ApWRimc11wU,18831
10337
- simo/generic/models.py,sha256=flpK2jsBFghrvRHzl6IKT-t3WZ-hNOj4ZP2vmBzx0K8,7657
10341
+ simo/generic/models.py,sha256=YEAFfkARsAellfDwmmqGSx7nKkEF5XngciRB4qP1MKk,7596
10338
10342
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10339
10343
  simo/generic/socket_consumers.py,sha256=K2OjphIhKJH48BvfFfoCOyCQZ1NmXb_phs6y1IP-qaQ,1757
10340
10344
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
10341
10345
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=0IoKRG9n1tkNRRkrqAeOQwWBPd_33u98JBcVtMVVCio,2374
10342
10346
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=ptw6axyAqemZA35oa6vzr7EihzvbhW9w7Y-G6kfDedU,555
10343
- simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=I9sGJNnAm9UOnnEoK5KR6IJ9q442El31AiY2hBnx1pI,36480
10344
- simo/generic/__pycache__/forms.cpython-38.pyc,sha256=bbuuS_Q7q7232hYrAPu-pn0WrGpKoMZSiGArOkQfHpc,21103
10345
- simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=8NbsLVDww3Ov5DKF--LKgyrgnrn8yVcKrY21cdvV5aA,13979
10346
- simo/generic/__pycache__/models.cpython-38.pyc,sha256=n3FeTMJYh4B6nCPiPKeXiWsUOOWkLHca7qTvfTK6Iik,5844
10347
+ simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=NFTFX_Hn4XqDdsOw3L02rY8CwWpi9sJ03gxfdPMu_uE,37681
10348
+ simo/generic/__pycache__/forms.cpython-38.pyc,sha256=Gi4adctjk9FOCr55FsNbZyRASUzewgGly0iEepayUJw,23077
10349
+ simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=S7p2HSbXqYcsoOjj998pwpRlA7LfHStrdxS3UhPNsP8,13979
10350
+ simo/generic/__pycache__/models.cpython-38.pyc,sha256=ES8wXkdKn0m-yaJlvhyaIOSppuX9Ckz-bOs9DCpVvaQ,5825
10347
10351
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10348
10352
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=qJO5kvQLWhsQDOr1AtAtsAybuRWioxSkQei3Pc7rdP0,1737
10353
+ simo/generic/scripting/__init__.py,sha256=aZZvNBae7unnux_zGHCIWCV2z47hVJc-DIL72Hqfkeo,600
10354
+ simo/generic/scripting/helpers.py,sha256=cuJ7B79auIw6CmgkcPoQsJekUPIXq00ucneRALdPWwE,919
10355
+ simo/generic/scripting/serializers.py,sha256=PjyFrjdPK1mBsgbNhyqMi9SWzcymqTa742ipy0LhAN4,1996
10356
+ simo/generic/scripting/__pycache__/__init__.cpython-38.pyc,sha256=eHncoNpv5dy35IO1_htWd8CK0sHFBnU_WJ0hl5TKOHQ,794
10357
+ simo/generic/scripting/__pycache__/serializers.cpython-38.pyc,sha256=JD9KCNO27H18mkFaeSMdybTMdTvodqcZSLNbC3pheHU,3412
10349
10358
  simo/generic/static/weather_icons/01d@2x.png,sha256=TZfWi6Rfddb2P-oldWWcjUiuCHiU9Yrc5hyrQAhF26I,948
10350
10359
  simo/generic/static/weather_icons/01n@2x.png,sha256=e9RleTa0T7To9Wi2wJ-9waeTbfHOsUB_xGwkx-89eEg,945
10351
10360
  simo/generic/static/weather_icons/02d@2x.png,sha256=ex522OxNzNNpSRGGzh7EmsBZi_MOFY-1IkQXTOMLL3I,1628
@@ -10369,7 +10378,7 @@ simo/generic/templates/admin/controller_widgets/gate.html,sha256=rqtgEQTmyK8Q66o
10369
10378
  simo/generic/templates/admin/controller_widgets/ip_camera.html,sha256=ZmWm21EswkgT6XR9x1GgzDIkSU2j_GpdOTfbPINg6jY,657
10370
10379
  simo/generic/templates/admin/controller_widgets/script.html,sha256=biUEMo5V35wqSrM97d5WqNDi47GNaDpi53I3YBfDLOs,1484
10371
10380
  simo/generic/templates/admin/controller_widgets/thermostat.html,sha256=iH7j631AY6ahsI7dTMyMYHL_EuX6Q_aRxQgQcPIVxvI,288
10372
- simo/generic/templates/admin/controller_widgets/weather_forecast.html,sha256=UuvXM6XONknAHxn3DF0CP8aGrrfng92n0iTgXkHg7QI,500
10381
+ simo/generic/templates/admin/controller_widgets/weather_forecast.html,sha256=QXR2rIXu-qF6L9bkPKN8CNvT_YVHv-V63ABEnLBwaUY,484
10373
10382
  simo/generic/templates/generic/controllers_info/dummy.md,sha256=DcdkpYXpK7sroINukZZPUQs9uekN9kkE7p5hfnArgFo,147
10374
10383
  simo/generic/templates/generic/controllers_info/stateselect.md,sha256=T0w3vJg02W3RMSsljN1EPRnkVaeRW5acSZaSq9FYvZw,135
10375
10384
  simo/multimedia/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -10406,12 +10415,13 @@ simo/notifications/admin.py,sha256=y_gmHYXbDh98LUUa-lp9DilTIgM6-pIujWPQPLQsJo8,8
10406
10415
  simo/notifications/api.py,sha256=GXQpq68ULBaJpU8w3SJKaCKuxYGWYehKnGeocGB1RVc,1783
10407
10416
  simo/notifications/models.py,sha256=VZcvweii59j89nPKlWeUSJ44Qz3ZLjJ6mXN6uB9F1Sw,2506
10408
10417
  simo/notifications/serializers.py,sha256=altDEAPWwOhxRcEzE9-34jL8EFpyf3vPoEdAPoVLfGc,523
10409
- simo/notifications/utils.py,sha256=VCBKcHrtZrdCalKe2w7umt7-trhG3vw-fKn1ndyr3CA,971
10418
+ simo/notifications/utils.py,sha256=uBl-Y7WGu00iaGM5rrdogcq0OMRVtyVfJF39-mdB3_k,1853
10410
10419
  simo/notifications/__pycache__/__init__.cpython-38.pyc,sha256=YvucUfu98XFvEEg1LYFMlOZJpo_jSGxTVrM-ylAFLOg,167
10411
10420
  simo/notifications/__pycache__/admin.cpython-38.pyc,sha256=Fl4crSZTFQOTYQioV6ff9fBRV4MhNiwQgMS2VnmCI4M,1632
10412
10421
  simo/notifications/__pycache__/api.cpython-38.pyc,sha256=ys6E4AFghX6bq-rQ0gtA9s0Y2Hh-ypsWH8-Yz4edMrc,2073
10413
10422
  simo/notifications/__pycache__/models.cpython-38.pyc,sha256=rrYjYOEzDZ3Eos2O7aof5wuIo0VUgGt6LLzhXwORDuc,2559
10414
10423
  simo/notifications/__pycache__/serializers.cpython-38.pyc,sha256=7-eRGKYuQ4g1SpKOMpz17SIiu1HmaMoYv-cJbaO9QGA,1028
10424
+ simo/notifications/__pycache__/utils.cpython-38.pyc,sha256=yqxzplE-_9khsyMvMpXe8nk4eJAwk_62GUV0sCtfY7k,1460
10415
10425
  simo/notifications/migrations/0001_initial.py,sha256=Zh69AQ-EKlQKfqfnMDVRcxvo1MxRY-TFLCdnNcgqi6g,2003
10416
10426
  simo/notifications/migrations/0002_notification_instance.py,sha256=B3msbMeKvsuq-V7gvRADRjj5PFLayhi3pQvHZjqzO5g,563
10417
10427
  simo/notifications/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -10420,37 +10430,37 @@ simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.
10420
10430
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10421
10431
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10422
10432
  simo/users/admin.py,sha256=oaLFTrjDaruKC_l79BB0etru4p8nP8eJFV3F4TSYGp4,6305
10423
- simo/users/api.py,sha256=kUcdHm-WUn6z_AnFEXHnjYu8YX2MW1Z-NlAysRmSdLI,10333
10433
+ simo/users/api.py,sha256=MoURNgcdGl5eS881SbO5nw-zgwSEnbXzb-FrOyA7Vbc,11599
10424
10434
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10425
10435
  simo/users/auth_backends.py,sha256=bBSNXQJ88TRXaQxyh1aETfmOIfiDr08Jnj8rSY9sHDk,4074
10426
10436
  simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10427
10437
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10428
- simo/users/managers.py,sha256=M_51bk9z4jn8e2Ci3pJfIqbf6cRNqfQNSOAg0vPl6Vo,175
10438
+ simo/users/managers.py,sha256=Fajwpm3wdMES73iPqoa_66J8g13bvUhjUtrexLKIcIU,312
10429
10439
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10430
- simo/users/models.py,sha256=mYZHclBNGLUWqFQpUyplncXQrsPYjmlxZ0Jl6Fn_Dhk,20278
10440
+ simo/users/models.py,sha256=xzkLAspcHL0D3kdukEKOwdr4QuLFbocuxkr0BZaJHS4,20590
10431
10441
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10432
- simo/users/serializers.py,sha256=a4R408ZgWVbF7OFw4bBfN33Wnn8ljqS8iFcsqmllkWU,2552
10442
+ simo/users/serializers.py,sha256=zzw1KONTnaTNBaU0r4rNVxJ827KzD6Z5LuQt27ZsQ98,2516
10433
10443
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
10434
10444
  simo/users/sso_views.py,sha256=-XI67TvQ7SN3goU4OuAHyn84u_1vtusvpn7Pu0K97zo,4648
10435
10445
  simo/users/tasks.py,sha256=HJAqiyWGsaN3wSfquU0UyQ20jL-njXeaaTOdDT3TQ3s,979
10436
- simo/users/utils.py,sha256=7gU_TDnAOsDYqJM0CFo8efPah2bTXfGpXxRqzD5RiSs,1270
10446
+ simo/users/utils.py,sha256=1HGSZyHRqQvdJ4RtAiZDg1juvgG8aOlrGXR7CcvsyQc,1886
10437
10447
  simo/users/views.py,sha256=dOQVvmlHG7ihWKJLFUBcqKOA0UDctlMKR0pTc36JZqg,3487
10438
10448
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=VFoDJE_SKKaPqqYaaBYd1Ndb1hjakkTo_u0EG_XJ1GM,211
10439
10449
  simo/users/__pycache__/admin.cpython-38.pyc,sha256=UgkqzfrSQU8Hyqig03Z5Qq29434wU27ttufxtvGEJYw,7433
10440
- simo/users/__pycache__/api.cpython-38.pyc,sha256=25he7r5DHfcLYveXWhn6gQDV2R6YnpKbUVBNInR1q_s,8714
10450
+ simo/users/__pycache__/api.cpython-38.pyc,sha256=ptN4kOcpA185pPGbU70aVbZQmzr8myOuAndzqXaKZKk,9852
10441
10451
  simo/users/__pycache__/apps.cpython-38.pyc,sha256=dgbWL8CxzzISJQTmq_4IztPJ2UzykNVdqA2Ae1PmeGk,605
10442
10452
  simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=n5nx2QSXNj2idzRcGE6bAagMN-8qxoCs580H1EFZXls,3105
10443
10453
  simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
10444
10454
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10445
- simo/users/__pycache__/managers.cpython-38.pyc,sha256=C5-diljm874RAFMTkZdcfzPhkHzlUGPAhz2gTvqkDy8,604
10455
+ simo/users/__pycache__/managers.cpython-38.pyc,sha256=8NvEXbI795f-BXs6CvE_Kp0PpWfYmEJIZ8Bh8H6S2PQ,705
10446
10456
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10447
- simo/users/__pycache__/models.cpython-38.pyc,sha256=tOiUcbFxH2AKUT8X8lygDYxETjpAUR7C8vD7gqB1Nz8,18523
10457
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=ZPwHo7woKL0Tlj3q8MWHeqFKpvh1AKkAslrjr8860to,18550
10448
10458
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10449
- simo/users/__pycache__/serializers.cpython-38.pyc,sha256=AkMwibZBo52rsWOwhAIc9ig1Ck1-fQAEkboe6wnh7yE,3477
10459
+ simo/users/__pycache__/serializers.cpython-38.pyc,sha256=Dy8RAcwNkNSXoJHvLp8fozURyHCtucqpSPyqZtbnMZc,3732
10450
10460
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
10451
10461
  simo/users/__pycache__/sso_views.cpython-38.pyc,sha256=sHEoxLOac3U3Epmhm197huFnW_J3gGCDZSji57itijU,3969
10452
10462
  simo/users/__pycache__/tasks.cpython-38.pyc,sha256=XLMKt3suT7BlcXrJZoH9ZIhhtBuqyiW4lsOB9IbBkko,1225
10453
- simo/users/__pycache__/utils.cpython-38.pyc,sha256=CGaRBk-y9A-8lWWY4bYkI9faAziO0pVYdr5BJNmqbUg,1600
10463
+ simo/users/__pycache__/utils.cpython-38.pyc,sha256=S-2i_Y11eTcUpmn-RkX1B4_tDvZJdqkZqqoewpkcsUM,1739
10454
10464
  simo/users/__pycache__/views.cpython-38.pyc,sha256=AXuUnVYRD0ai4FSFDp4qJwryukujAoN6LD3oIj-Cv3o,2426
10455
10465
  simo/users/migrations/0001_initial.py,sha256=_SnJemhNOs8Jjj-PjyvTVCBoxfs5V3lR_4ypUHUdLUg,7017
10456
10466
  simo/users/migrations/0002_componentpermission.py,sha256=rH9pC9HERf_5WWn3LCsNiu03BiHqURTF62pSNfswStI,918
@@ -10485,6 +10495,7 @@ simo/users/migrations/0030_userdevice_users.py,sha256=cYY7yChsxOOauHAPIQUzLjLLiO
10485
10495
  simo/users/migrations/0031_auto_20240923_1115.py,sha256=RyhmpsxpSXK9Ejbh3cHm9fTnDOcLFQsTH9-2MpNK5YU,514
10486
10496
  simo/users/migrations/0032_remove_userdevice_user_alter_userdevice_users.py,sha256=pM0B4ghsw6LWDvT_9owUmqIHQiraauTGYm_EePhVBUQ,570
10487
10497
  simo/users/migrations/0033_alter_user_ssh_key.py,sha256=yR7rI2K3FThEp6zEXWx29Zej4HzG5QufKPcj-m8pFuE,519
10498
+ simo/users/migrations/0034_instanceuser_last_seen_location_and_more.py,sha256=_W7qUsVosxBgeQ4oogfJiDryNnGbQTWiusrDVW70JZU,716
10488
10499
  simo/users/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10489
10500
  simo/users/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=e4XOKaYRb7l0P7cBnHHi5FQQJMlwjK0g7iqgM-xKmNI,4215
10490
10501
  simo/users/migrations/__pycache__/0002_componentpermission.cpython-38.pyc,sha256=pknJnpic8p6Vdx9DX41FfODXNnvexDswJtUCmC5w1tg,995
@@ -10521,6 +10532,7 @@ simo/users/migrations/__pycache__/0030_userdevice_users.cpython-38.pyc,sha256=PW
10521
10532
  simo/users/migrations/__pycache__/0031_auto_20240923_1115.cpython-38.pyc,sha256=0nT2ftDPi0yV6j-p9Am-nVsTy2kY0msM_f2k0eP9EoU,866
10522
10533
  simo/users/migrations/__pycache__/0032_remove_userdevice_user_alter_userdevice_users.cpython-38.pyc,sha256=SDKPEIkt9DYEBRm63GAnxG1yRKKm-JP3pizaJdbAUks,772
10523
10534
  simo/users/migrations/__pycache__/0033_alter_user_ssh_key.cpython-38.pyc,sha256=HCdJw3La6yFkA9v8QcTMAKub_BKhqIH6U4lVY8G4JII,733
10535
+ simo/users/migrations/__pycache__/0034_instanceuser_last_seen_location_and_more.cpython-38.pyc,sha256=YHxGkhAaI2Es3OK61kdNWViyM7UlEiuFGOV5oAyaL_E,871
10524
10536
  simo/users/migrations/__pycache__/__init__.cpython-38.pyc,sha256=NKq7WLgktK8WV1oOqCPbAbdkrPV5GRGhYx4VxxI4dcs,170
10525
10537
  simo/users/templates/conf/mosquitto.conf,sha256=1eIGNuRu4Y3hfAU6qiWix648eCRrw0oOT24PnyFI4ys,189
10526
10538
  simo/users/templates/conf/mosquitto_acls.conf,sha256=ga44caTDNQE0CBKw55iM2jOuna6-9fKGwAhjyERZdRE,500
@@ -10530,9 +10542,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10530
10542
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10531
10543
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10532
10544
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10533
- simo-2.4.2.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10534
- simo-2.4.2.dist-info/METADATA,sha256=xj7V-5BQ9o9Zy4d2a6TkilICEC5Nj2l_aOUwd40ynm4,1923
10535
- simo-2.4.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
10536
- simo-2.4.2.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10537
- simo-2.4.2.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10538
- simo-2.4.2.dist-info/RECORD,,
10545
+ simo-2.5.1.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10546
+ simo-2.5.1.dist-info/METADATA,sha256=4wMPIMMJH6YZClBFHahVA57OeiMpv_NjJrqPwhoGAm4,1923
10547
+ simo-2.5.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
10548
+ simo-2.5.1.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10549
+ simo-2.5.1.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10550
+ simo-2.5.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5