simo 2.10.5__py3-none-any.whl → 2.10.7__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 (34) hide show
  1. simo/automation/__pycache__/gateways.cpython-312.pyc +0 -0
  2. simo/automation/gateways.py +2 -1
  3. simo/automation/templates/automations/auto_away.py +1 -1
  4. simo/automation/templates/automations/phones_sleep_script.py +1 -1
  5. simo/fleet/__pycache__/api.cpython-312.pyc +0 -0
  6. simo/fleet/__pycache__/forms.cpython-312.pyc +0 -0
  7. simo/fleet/__pycache__/models.cpython-312.pyc +0 -0
  8. simo/fleet/__pycache__/serializers.cpython-312.pyc +0 -0
  9. simo/fleet/api.py +12 -9
  10. simo/fleet/forms.py +3 -3
  11. simo/fleet/migrations/0049_alter_customdalidevice_interface.py +19 -0
  12. simo/fleet/migrations/0050_customdalidevice_uid.py +19 -0
  13. simo/fleet/migrations/0051_customdalidevice_components.py +19 -0
  14. simo/fleet/migrations/__pycache__/0049_alter_customdalidevice_interface.cpython-312.pyc +0 -0
  15. simo/fleet/migrations/__pycache__/0050_customdalidevice_uid.cpython-312.pyc +0 -0
  16. simo/fleet/migrations/__pycache__/0051_customdalidevice_components.cpython-312.pyc +0 -0
  17. simo/fleet/models.py +28 -0
  18. simo/fleet/serializers.py +39 -3
  19. simo/generic/__pycache__/controllers.cpython-312.pyc +0 -0
  20. simo/generic/__pycache__/forms.cpython-312.pyc +0 -0
  21. simo/generic/controllers.py +14 -8
  22. simo/generic/forms.py +2 -6
  23. simo/users/__pycache__/admin.cpython-312.pyc +0 -0
  24. simo/users/__pycache__/models.cpython-312.pyc +0 -0
  25. simo/users/admin.py +8 -2
  26. simo/users/migrations/0044_permissionsrole_is_person.py +18 -0
  27. simo/users/migrations/__pycache__/0044_permissionsrole_is_person.cpython-312.pyc +0 -0
  28. simo/users/models.py +4 -0
  29. {simo-2.10.5.dist-info → simo-2.10.7.dist-info}/METADATA +1 -1
  30. {simo-2.10.5.dist-info → simo-2.10.7.dist-info}/RECORD +34 -26
  31. {simo-2.10.5.dist-info → simo-2.10.7.dist-info}/WHEEL +0 -0
  32. {simo-2.10.5.dist-info → simo-2.10.7.dist-info}/entry_points.txt +0 -0
  33. {simo-2.10.5.dist-info → simo-2.10.7.dist-info}/licenses/LICENSE.md +0 -0
  34. {simo-2.10.5.dist-info → simo-2.10.7.dist-info}/top_level.txt +0 -0
@@ -195,7 +195,8 @@ class GatesHandler:
195
195
  continue
196
196
  # Track new users as they appear in the system
197
197
  for iuser in InstanceUser.objects.filter(
198
- is_active=True, instance=gate.zone.instance
198
+ is_active=True, instance=gate.zone.instance,
199
+ role__is_person=True
199
200
  ):
200
201
  if gate.config.get('auto_open_for'):
201
202
  if iuser.role.id not in gate.config['auto_open_for']:
@@ -25,7 +25,7 @@ class Automation:
25
25
 
26
26
  def check_away(self):
27
27
  if InstanceUser.objects.filter(
28
- is_active=True, at_home=True
28
+ is_active=True, at_home=True, role__is_person=True
29
29
  ).count():
30
30
  return False
31
31
 
@@ -65,7 +65,7 @@ class Automation:
65
65
  def run(self):
66
66
  while True:
67
67
  instance_users = InstanceUser.objects.filter(
68
- is_active=True, role__is_owner=True
68
+ is_active=True, role__is_owner=True, role__is_person=True
69
69
  ).prefetch_related('role')
70
70
  self.state.refresh_from_db()
71
71
  new_state = self.check_owner_phones(
Binary file
simo/fleet/api.py CHANGED
@@ -69,7 +69,7 @@ class ColonelsViewSet(InstanceMixin, viewsets.ModelViewSet):
69
69
  target = Colonel.objects.annotate(
70
70
  components_count=Count('components')
71
71
  ).filter(
72
- pk=request.POST.get('target'),
72
+ pk=request.POST.get('target'), instance=self.instance,
73
73
  components_count=0, type=colonel.type
74
74
  )
75
75
  if not target:
@@ -104,17 +104,12 @@ class InterfaceViewSet(
104
104
  return Interface.objects.filter(colonel__instance=self.instance)
105
105
 
106
106
 
107
- class CustomDaliDeviceViewSet(
108
- InstanceMixin,
109
- viewsets.mixins.RetrieveModelMixin, viewsets.mixins.UpdateModelMixin,
110
- viewsets.mixins.ListModelMixin, viewsets.mixins.CreateModelMixin,
111
- viewsets.GenericViewSet
112
- ):
107
+ class CustomDaliDeviceViewSet(InstanceMixin, viewsets.ModelViewSet):
113
108
  url = 'fleet/custom-dali-devices'
114
109
  basename = 'custom-dali-devices'
115
110
  serializer_class = CustomDaliDeviceSerializer
116
111
  filter_backends = [DjangoFilterBackend]
117
- filterset_fields = ['random_address', 'name']
112
+ filterset_fields = ['uid', 'random_address', 'name']
118
113
 
119
114
  def get_permissions(self):
120
115
  permissions = super().get_permissions()
@@ -122,4 +117,12 @@ class CustomDaliDeviceViewSet(
122
117
  return permissions
123
118
 
124
119
  def get_queryset(self):
125
- return CustomDaliDevice.objects.filter(instance=self.instance)
120
+ return CustomDaliDevice.objects.filter(instance=self.instance)
121
+
122
+ def perform_destroy(self, instance):
123
+ if instance.components.all().count():
124
+ raise APIValidationError(
125
+ _('Deleting colonel which has components is not allowed!'),
126
+ code=400
127
+ )
128
+ instance.delete()
simo/fleet/forms.py CHANGED
@@ -1829,14 +1829,14 @@ class CustomDaliDeviceForm(BaseComponentForm):
1829
1829
  choices = []
1830
1830
  instance = get_current_instance()
1831
1831
  for colonel in Colonel.objects.filter(
1832
- type='room-sensor', instance=instance
1832
+ type='room-sensor', instance=instance
1833
1833
  ):
1834
1834
  if not colonel.is_connected:
1835
1835
  continue
1836
1836
  choices.append((f"wifi-{colonel.id}", colonel.name))
1837
1837
  for device in CustomDaliDevice.objects.filter(
1838
- instance=instance,
1839
- last_seen__gt=timezone.now() - datetime.timedelta(minutes=10)
1838
+ instance=instance,
1839
+ last_seen__gt=timezone.now() - datetime.timedelta(minutes=10)
1840
1840
  ):
1841
1841
  choices.append((f"dali-{device.id}", device.name))
1842
1842
  self.fields['device'].choices = choices
@@ -0,0 +1,19 @@
1
+ # Generated by Django 4.2.10 on 2025-04-10 10:35
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('fleet', '0048_remove_customdalidevice_colonel_and_more'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='customdalidevice',
16
+ name='interface',
17
+ field=models.ForeignKey(blank=True, editable=False, help_text='Colonel interface on which it operates.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='custom_devices', to='fleet.interface'),
18
+ ),
19
+ ]
@@ -0,0 +1,19 @@
1
+ # Generated by Django 4.2.10 on 2025-04-11 06:17
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('fleet', '0049_alter_customdalidevice_interface'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='customdalidevice',
15
+ name='uid',
16
+ field=models.CharField(db_index=True, default='', max_length=100),
17
+ preserve_default=False,
18
+ ),
19
+ ]
@@ -0,0 +1,19 @@
1
+ # Generated by Django 4.2.10 on 2025-04-11 07:07
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('core', '0049_alter_gateway_type'),
10
+ ('fleet', '0050_customdalidevice_uid'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='customdalidevice',
16
+ name='components',
17
+ field=models.ManyToManyField(to='core.component'),
18
+ ),
19
+ ]
simo/fleet/models.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import requests
2
2
  import time
3
3
  import random
4
+ import datetime
4
5
  from actstream import action
5
6
  from django.core.exceptions import ValidationError
6
7
  from django.db import transaction
@@ -9,6 +10,7 @@ from django.db.models.signals import post_save, pre_delete, post_delete
9
10
  from django.dispatch import receiver
10
11
  from django.contrib.contenttypes.models import ContentType
11
12
  from django.contrib.contenttypes.fields import GenericForeignKey
13
+ from django.utils import timezone
12
14
  from dirtyfields import DirtyFieldsMixin
13
15
  from simo.core.models import Instance, Gateway, Component
14
16
  from simo.core.utils.helpers import get_random_string
@@ -502,6 +504,7 @@ class CustomDaliDevice(models.Model):
502
504
  not compatible with anything else of DALI!
503
505
  '''
504
506
  instance = models.ForeignKey(Instance, on_delete=models.CASCADE)
507
+ uid = models.CharField(max_length=100, db_index=True)
505
508
  random_address = models.PositiveIntegerField(db_index=True, editable=False)
506
509
  name = models.CharField(
507
510
  max_length=200, help_text="User given name on initial pairing"
@@ -512,6 +515,7 @@ class CustomDaliDevice(models.Model):
512
515
  help_text="Colonel interface on which it operates."
513
516
  )
514
517
  last_seen = models.DateTimeField(null=True, editable=False)
518
+ components = models.ManyToManyField(Component)
515
519
 
516
520
  class Meta:
517
521
  unique_together = 'instance', 'random_address'
@@ -538,3 +542,27 @@ class CustomDaliDevice(models.Model):
538
542
  msg=frame.pack.hex()
539
543
  ).publish()
540
544
 
545
+ @property
546
+ def is_alive(self):
547
+ if not self.last_seen:
548
+ return False
549
+ return self.last_seen + datetime.timedelta(seconds=60) > timezone.now()
550
+
551
+
552
+ @receiver(post_save, sender=Component)
553
+ def attatch_components_to_dali_device(sender, instance, created, *args, **kwargs):
554
+ if not instance.controller_uid.startswith('simo.fleet'):
555
+ return
556
+ if 'config' not in instance.get_dirty_fields():
557
+ return
558
+ dali_device = CustomDaliDevice.objects.filter(
559
+ id=instance.config.get('dali_device', 0)
560
+ ).first()
561
+ if not dali_device:
562
+ return
563
+ dali_device.components.add(instance)
564
+
565
+
566
+ @receiver(pre_delete, sender=CustomDaliDevice)
567
+ def delete_dali_device_components(sender, instance, *args, **kwargs):
568
+ instance.components.all().delete()
simo/fleet/serializers.py CHANGED
@@ -89,12 +89,48 @@ class ColonelSerializer(serializers.ModelSerializer):
89
89
 
90
90
 
91
91
  class CustomDaliDeviceSerializer(serializers.ModelSerializer):
92
+ is_empty = serializers.SerializerMethodField()
93
+ is_alive = serializers.SerializerMethodField()
94
+ last_seen = TimestampField()
92
95
 
93
96
  class Meta:
94
97
  model = CustomDaliDevice
95
- fields = 'id', 'random_address', 'name'
96
- read_only_fields = 'random_address',
98
+ fields = (
99
+ 'id', 'uid', 'random_address', 'name', 'is_empty',
100
+ 'is_alive', 'last_seen'
101
+ )
102
+ read_only_fields = (
103
+ 'random_address', 'is_empty', 'is_alive', 'last_seen'
104
+ )
105
+
106
+ def validate(self, data):
107
+ instance = self.context.get('instance')
108
+ uid = data.get('uid')
109
+ if instance and uid:
110
+ if CustomDaliDevice.objects.filter(
111
+ uid=uid, instance=instance
112
+ ).exists():
113
+ raise serializers.ValidationError(
114
+ f"A device with uid '{uid}' already exists for this instance."
115
+ )
116
+ return data
117
+
118
+ def validate_uid(self, value):
119
+ """
120
+ Prevent changing the uid on update.
121
+ """
122
+ # self.instance will be None for creation, but set for updates.
123
+ if self.instance and self.instance.uid != value:
124
+ raise serializers.ValidationError("Changing uid is not allowed.")
125
+ return value
97
126
 
98
127
  def create(self, validated_data):
99
128
  validated_data['instance'] = self.context['instance']
100
- return super().create(validated_data)
129
+ return super().create(validated_data)
130
+
131
+ def get_is_empty(self, obj):
132
+ return not bool(obj.components.all().count())
133
+
134
+ def get_is_alive(self, obj):
135
+ return obj.is_alive
136
+
@@ -77,7 +77,7 @@ class Thermostat(ControllerBase):
77
77
  max = 95
78
78
  return {
79
79
  'temperature_sensor': 0, 'heaters': [], 'coolers': [],
80
- 'engagement': 'dynamic','reaction_difference': 2,
80
+ 'engagement': 'dynamic',
81
81
  'min': min, 'max': max,
82
82
  'has_real_feel': False,
83
83
  'user_config': config_to_dict(self._get_default_user_config())
@@ -223,13 +223,12 @@ class Thermostat(ControllerBase):
223
223
  except:
224
224
  pass
225
225
 
226
- low = target_temp - self.component.config['reaction_difference']
227
- high = target_temp + self.component.config['reaction_difference']
228
-
229
226
  heating = False
230
227
  cooling = False
231
228
 
232
229
  if self.component.config.get('engagement', 'static') == 'static':
230
+ low = target_temp - 0.25
231
+ high = target_temp + 0.25
233
232
  if prefer_heating and heaters:
234
233
  heating = self._engage_heating(
235
234
  heaters, current_temp, low, high
@@ -248,14 +247,19 @@ class Thermostat(ControllerBase):
248
247
  )
249
248
 
250
249
  else:
251
- window = high - low
252
250
  if prefer_heating and heaters:
251
+ low = target_temp - 2.5
252
+ high = target_temp + 0.5
253
+ window = high - low
253
254
  reach = high - current_temp
254
255
  reaction_force = self._get_reaction_force(window, reach)
255
256
  if reaction_force:
256
257
  heating = True
257
258
  self._engage_devices(heaters, reaction_force)
258
- elif coolers:
259
+ elif coolers and not heating:
260
+ low = target_temp - 1
261
+ high = target_temp + 2
262
+ window = high - low
259
263
  reach = current_temp - low
260
264
  reaction_force = self._get_reaction_force(window, reach)
261
265
  if reaction_force:
@@ -1259,7 +1263,8 @@ class MainState(StateSelect):
1259
1263
  return False
1260
1264
  from simo.users.models import InstanceUser
1261
1265
  if InstanceUser.objects.filter(
1262
- is_active=True, at_home=True, instance=self.component.zone.instance
1266
+ is_active=True, at_home=True, instance=self.component.zone.instance,
1267
+ role__is_person=True
1263
1268
  ).count():
1264
1269
  return False
1265
1270
 
@@ -1294,7 +1299,8 @@ class MainState(StateSelect):
1294
1299
  phones_on_charge = []
1295
1300
  for iuser in InstanceUser.objects.filter(
1296
1301
  is_active=True, role__is_owner=True,
1297
- instance=self.component.zone.instance
1302
+ instance=self.component.zone.instance,
1303
+ role__is_person=True
1298
1304
  ):
1299
1305
  # skipping users that are not at home
1300
1306
  if not iuser.at_home:
simo/generic/forms.py CHANGED
@@ -115,12 +115,8 @@ class ThermostatConfigForm(BaseComponentForm):
115
115
  engagement = forms.ChoiceField(
116
116
  choices=(('dynamic', "Dynamic"), ('static', "Static")),
117
117
  initial='dynamic',
118
- help_text="Dynamic - scales engagement intensity within reaction window <br>"
119
- "Static - engages/disengages fully within reaction window <br>"
120
- )
121
- reaction_difference = forms.FloatField(
122
- initial=2, min_value=0, max_value=50,
123
- help_text="Reaction window = target temp +- reaction difference."
118
+ help_text="Dynamic - scales engagement intensity <br>"
119
+ "Static - engages/disengages fully <br>"
124
120
  )
125
121
  min = forms.IntegerField(initial=3)
126
122
  max = forms.IntegerField(initial=36)
simo/users/admin.py CHANGED
@@ -27,10 +27,16 @@ class ComponentPermissionInline(admin.TabularInline):
27
27
 
28
28
  @admin.register(PermissionsRole)
29
29
  class PermissionsRoleAdmin(admin.ModelAdmin):
30
- list_display = 'name', 'is_superuser', 'is_owner', 'can_manage_users', 'is_default'
30
+ list_display = (
31
+ 'name', 'is_superuser', 'is_owner', 'can_manage_users',
32
+ 'is_person', 'is_default'
33
+ )
31
34
  search_fields = 'name',
32
35
  inlines = ComponentPermissionInline,
33
- list_filter = 'is_superuser', 'is_owner', 'can_manage_users', 'is_default'
36
+ list_filter = (
37
+ 'is_superuser', 'is_owner', 'can_manage_users',
38
+ 'is_person', 'is_default'
39
+ )
34
40
 
35
41
 
36
42
  def get_queryset(self, request):
@@ -0,0 +1,18 @@
1
+ # Generated by Django 4.2.10 on 2025-04-10 10:35
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('users', '0043_userdevicereportlog_avg_speed_kmh'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='permissionsrole',
15
+ name='is_person',
16
+ field=models.BooleanField(db_index=True, default=True, help_text='Is this a real person or a device like wall tablet?'),
17
+ ),
18
+ ]
simo/users/models.py CHANGED
@@ -45,6 +45,10 @@ class PermissionsRole(models.Model):
45
45
  default=False,
46
46
  help_text="Has 100% management control of an instance via mobile app."
47
47
  )
48
+ is_person = models.BooleanField(
49
+ default=True, db_index=True,
50
+ help_text="Is this a real person or a device like wall tablet?"
51
+ )
48
52
  is_default = models.BooleanField(
49
53
  default=False, help_text="Default new user role."
50
54
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simo
3
- Version: 2.10.5
3
+ Version: 2.10.7
4
4
  Summary: Smart Home Supremacy
5
5
  Author-email: Simanas Venčkauskas <simanas@simo.io>
6
6
  Project-URL: Homepage, https://simo.io
@@ -21,7 +21,7 @@ simo/automation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  simo/automation/app_widgets.py,sha256=gaqImMZjuMHm7nIb9a4D-Y3qipz_WhSPAHXcwGx4Uzs,199
22
22
  simo/automation/controllers.py,sha256=66aGjlfgigcePXiLmDkbVrxbm-Z26klMKIiOvaMH71k,11545
23
23
  simo/automation/forms.py,sha256=jcmiq7A-S5WwoIY3YD7GmWomHXXJAipTawWcgOavuRM,10239
24
- simo/automation/gateways.py,sha256=GH8StZslRvZvWGz6_q8IjQzQg5zSmIZ7_mALbbKm5OY,16539
24
+ simo/automation/gateways.py,sha256=L97hTJJgKneBw38pQQ4UwSk26FgxVzQ5tK2eQPAK4m8,16577
25
25
  simo/automation/helpers.py,sha256=iP-fxxB8HsFQy3k2CjFubu86aMqvWgmh-p24DiyOrek,4330
26
26
  simo/automation/models.py,sha256=zt-jkzyq5ddqGT864OkJzCsvov2vZ0nO4ez3hAeZkXg,934
27
27
  simo/automation/serializers.py,sha256=Pg-hMaASQPB5_BTAMkfqM6z4jdHWH8xMYWOvDxIvmx8,2126
@@ -34,7 +34,7 @@ simo/automation/__pycache__/controllers.cpython-312.pyc,sha256=QV63g3UlpMAA-yCaZ
34
34
  simo/automation/__pycache__/controllers.cpython-38.pyc,sha256=CL-0Tq9B4-E36fYfWT1XEBTq1dkq1W8003f6MrBnQU0,8391
35
35
  simo/automation/__pycache__/forms.cpython-312.pyc,sha256=kmw04yujs7dVHNHvzr9Q8gXc0e6BAZHg_URPXjLbrfU,12419
36
36
  simo/automation/__pycache__/forms.cpython-38.pyc,sha256=cpA5hA2Iz3JsPC0Dq01ki1I7S9c5DKRcXveHApI1dJo,7772
37
- simo/automation/__pycache__/gateways.cpython-312.pyc,sha256=SvCnrrJGw727sredFOl3JEeljBcNrno3e5Yqdai6xI8,22686
37
+ simo/automation/__pycache__/gateways.cpython-312.pyc,sha256=-KkZ9SVQefGgnBRDHNjPQ-vyjEUTN4ICyy_fgCaoWCw,22708
38
38
  simo/automation/__pycache__/gateways.cpython-38.pyc,sha256=nHujqChMCqqxHbZezP3MisavjKDhczqzFGurO10h-lc,11113
39
39
  simo/automation/__pycache__/helpers.cpython-312.pyc,sha256=v6abo_h8qfWD3isbJvTO3X9sfUREJxTlc_P1ZhN8ZCs,5853
40
40
  simo/automation/__pycache__/helpers.cpython-38.pyc,sha256=fNjSyn4Mfq7-JQx-bdsnj-rSxgu20dVJ9-5ZEMT6yiM,3627
@@ -54,9 +54,9 @@ simo/automation/migrations/__pycache__/0002_update_helpers_in_scripts.cpython-38
54
54
  simo/automation/migrations/__pycache__/__init__.cpython-312.pyc,sha256=B-rIEJEzvMiSrEzduijhY0DzTu3BixyhrQLgE6XgtyA,181
55
55
  simo/automation/migrations/__pycache__/__init__.cpython-38.pyc,sha256=L2WU6Wk1EXhqcOKUNA9o--Z4G0aTQqwvRhKYxuUooAM,175
56
56
  simo/automation/templates/admin/controller_widgets/script.html,sha256=biUEMo5V35wqSrM97d5WqNDi47GNaDpi53I3YBfDLOs,1484
57
- simo/automation/templates/automations/auto_away.py,sha256=asz9AJ8eLHkxkpvm5phZhUqCNpghd54TKgllmvYkBoM,1911
57
+ simo/automation/templates/automations/auto_away.py,sha256=Wx4AHTXxBZ1Hw8GJpv84K83thMvFGbHKU647Zd0BcgU,1933
58
58
  simo/automation/templates/automations/auto_state_script.py,sha256=pEaeKNss7L-PnhlMUpEfNRqCjquq6FAGrjTZ92CMxUY,1001
59
- simo/automation/templates/automations/phones_sleep_script.py,sha256=b6JZkfXdhDd3FwDJWq93kxBsm80kNzMGPWAF5jcWTHo,2894
59
+ simo/automation/templates/automations/phones_sleep_script.py,sha256=wN7JN-2mqnT4ilIko3gzNixbEzydShrO7JJe1jvX9q0,2916
60
60
  simo/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  simo/backups/admin.py,sha256=cEakxnQlOHvUf8LdBdekXpDAvnqPoVN8y7pnN3WK29A,2487
62
62
  simo/backups/dynamic_settings.py,sha256=Q52RLa3UQsmAhqkwR16cM6pbBnIbXqmVQ2oIUP2ZVD0,416
@@ -10405,19 +10405,19 @@ simo/core/utils/__pycache__/validators.cpython-312.pyc,sha256=w8-XwptooefG-7gIIn
10405
10405
  simo/core/utils/__pycache__/validators.cpython-38.pyc,sha256=gjeBOjL_keMoRDjdn8v-3F3wcjPIT3Xx5KpTalo0e-Y,1247
10406
10406
  simo/fleet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10407
10407
  simo/fleet/admin.py,sha256=J_kiwYIGMTxnRuytl_YoM7Pxrj5LzlN9xC8E7Ag5yvQ,7006
10408
- simo/fleet/api.py,sha256=ideY_Mh31SPtRnmsYk895-Dl1_VQ48yVTtJKpNpI1Ps,4506
10408
+ simo/fleet/api.py,sha256=Yst2NB__BgAzF9AX7APyhZz36lA6FZtKCy_iiasaNxk,4648
10409
10409
  simo/fleet/apps.py,sha256=je8mRXMcRq4lABQZlyF2G2hOCkBUicR9I2jvrLDA8eI,238
10410
10410
  simo/fleet/auto_urls.py,sha256=vrfrooPyY4pDuQjya-eLxCgZldfhwbEeEiXa7diO_CY,847
10411
10411
  simo/fleet/base_types.py,sha256=0F8r7eNpi0qdm7DtVHyQN3fst8sFOFjq61twFO2WeZQ,139
10412
10412
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10413
10413
  simo/fleet/controllers.py,sha256=eBY9cHxcmhhBRrSIsnfaklpD0ZBw637ndCQ3KH0JMvQ,36692
10414
10414
  simo/fleet/custom_dali_operations.py,sha256=LASObOxRymL-f0AEm9wdt4YFnNsz5z385wQE9qJhOZY,9948
10415
- simo/fleet/forms.py,sha256=jYL-azmCXmgVq_bZnIIdEpBy0kcAaXy7KyHSlVLqZRM,71275
10415
+ simo/fleet/forms.py,sha256=Yy9ana-39f9zOynD4pPCkPsJyYrcZqzWFmZitFEoEmY,71263
10416
10416
  simo/fleet/gateways.py,sha256=C7dyapWDlJ5erYPNLkSoH50I8kj0lIXicSno0_CrdXc,5783
10417
10417
  simo/fleet/managers.py,sha256=DKU9kv5S6dAqAHWq4OgfEOeK5IJaQW7qdCednA0NpUA,858
10418
- simo/fleet/models.py,sha256=lENjhXhgkqNSs3O3Il58nCOLsoWRAyRhyuNwcFDzddo,19593
10418
+ simo/fleet/models.py,sha256=e9BTcpCdNLL2Lh4NFlAH9qumY8_RKD6isPLeWQznIBY,20544
10419
10419
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10420
- simo/fleet/serializers.py,sha256=iZVVHhLIHVDcTV56PDpzDk0W4Jn6pamW7K-wusW5lZU,3059
10420
+ simo/fleet/serializers.py,sha256=29LA_tBoWlHS6qWLJNUA2N0htiW-WBV8k7tTCijGrDY,4243
10421
10421
  simo/fleet/socket_consumers.py,sha256=SPrhbcMY50QD1QKXBPUwBZi_Jmw7FwRZdHGUybkAQlU,19460
10422
10422
  simo/fleet/tasks.py,sha256=JeVQP4vUGzQxyDGEv8gks7Ro4GNLqkTWafxpgb1B8YY,2180
10423
10423
  simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
@@ -10426,7 +10426,7 @@ simo/fleet/__pycache__/__init__.cpython-312.pyc,sha256=-BZyG4uq87W18Ra1pKTjSzDgi
10426
10426
  simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
10427
10427
  simo/fleet/__pycache__/admin.cpython-312.pyc,sha256=8TOuku1Atv-LyaVi4OICTc43iBFPgxCjrgjA9q6CN1s,9890
10428
10428
  simo/fleet/__pycache__/admin.cpython-38.pyc,sha256=iweeu5AkaggBhQntP6-VF_eEodkNc6E7zKy0VjfwC2o,6652
10429
- simo/fleet/__pycache__/api.cpython-312.pyc,sha256=mcuXlEDeoJgLH-XgJdIK1AjvGF7hmd8l6jmABnklHz4,7617
10429
+ simo/fleet/__pycache__/api.cpython-312.pyc,sha256=g_dGu_LC-V35x55uygshq8fq0yXS9yGUhc0mDJM83bc,7704
10430
10430
  simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rZ1mkfkaMBEXhi9sw_jTKdk2CPJhBNxoImtjQ3Rf1VY,4016
10431
10431
  simo/fleet/__pycache__/apps.cpython-312.pyc,sha256=S8OK4R0W9VbNfD4Nos_CybjZ3AXS8CxvRaRUJO57xQA,707
10432
10432
  simo/fleet/__pycache__/auto_urls.cpython-312.pyc,sha256=32yXKNoqMxNgYvsspUgx1A84LVQqr8LP4BRvURNCgeY,1026
@@ -10436,17 +10436,17 @@ simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-
10436
10436
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10437
10437
  simo/fleet/__pycache__/controllers.cpython-312.pyc,sha256=2oCTeifcjwfGElIDktcDonaMkT0jY4PNKNQgWqWAmBI,50317
10438
10438
  simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=vH7mK1K4JBcLU9eKtqTJwbgB0SFMJ-s7WvO0qOsWjrg,24739
10439
- simo/fleet/__pycache__/forms.cpython-312.pyc,sha256=oRzNq_vZzHP9pZynagwvDOd6qw01UQiO5zAmiLLyttA,87426
10439
+ simo/fleet/__pycache__/forms.cpython-312.pyc,sha256=SDNq1pqSi5jciWFhV9wDC8OTKxTn918puJAgRW3SiSA,87426
10440
10440
  simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=hrNfyGm2NfoNG1II-OqeHzR2TkkAWp3igvHGs6X0iIM,45252
10441
10441
  simo/fleet/__pycache__/gateways.cpython-312.pyc,sha256=ZZGBAH2w9YmFvSrajZY8fUXd_WVpkRH81cYT6mhs858,8828
10442
10442
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=MIpXuGWitGNdsxJ99fWvMXJ6sVE96ac7iR4K4aM4Sds,5148
10443
10443
  simo/fleet/__pycache__/managers.cpython-312.pyc,sha256=uBckoFiAHHRi4KT2sNgJoOZfGMF4DBwKMDNeOTAUiC0,1754
10444
10444
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=Vmm23zoQnS3-uS5_WJt2n3wtjhLiEhLWaYxXJCU6Gts,1339
10445
- simo/fleet/__pycache__/models.cpython-312.pyc,sha256=0FMf4lsi5nJmByir04vSWbTYK64AApx7jfoC75JPEGE,27842
10445
+ simo/fleet/__pycache__/models.cpython-312.pyc,sha256=cKXqErITf5pBGvISczAGYWdWKzm09oeOS-DSXeJXmP8,29458
10446
10446
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=AXk1Q_nnHDXirHYgM3EW5pLsrR2CaPWk4EuvGCuDUpI,14131
10447
10447
  simo/fleet/__pycache__/routing.cpython-312.pyc,sha256=vafYpGAtYc2NYxBQObMX6eIZfVZflOYgzjYv0SL1jAQ,385
10448
10448
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10449
- simo/fleet/__pycache__/serializers.cpython-312.pyc,sha256=Oi17Hp73VD8eNrxPlPRIhTqFWH7k1nXdmSh3WL1ZClg,5684
10449
+ simo/fleet/__pycache__/serializers.cpython-312.pyc,sha256=2N_kjyIzqsocqvlKnk4Lydm9ZL3niCjBunKKjXC9hS4,7358
10450
10450
  simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=l_FzORWCM1hcSZV0AaGRO-p0CMTcEfqnLGgbn2IVvI0,3648
10451
10451
  simo/fleet/__pycache__/socket_consumers.cpython-312.pyc,sha256=i0lKhUOK6XwSS-B-MM-x2t3zllm7jU1Dz36OaHwmZuE,28058
10452
10452
  simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=lEC1SkY_KgRY0QoBUMPjnbFwSa7qmCf-4eNQ45hAy68,14141
@@ -10504,6 +10504,9 @@ simo/fleet/migrations/0045_alter_colonel_type_customdalidevice.py,sha256=XILnVpZ
10504
10504
  simo/fleet/migrations/0046_delete_customdalidevice.py,sha256=KR-pqDctBHB1SgbC01FeR_mAjJ54Wl4ZWFYn6zks1c4,321
10505
10505
  simo/fleet/migrations/0047_customdalidevice.py,sha256=GQBIV0K2p2OUVYP67ggbG8VxNdV6ziHJ432a4JoMrM0,1178
10506
10506
  simo/fleet/migrations/0048_remove_customdalidevice_colonel_and_more.py,sha256=_HXvxy_0hO9PaKHXSwYoznacHe1TDz1dDaEZo8SVkKA,867
10507
+ simo/fleet/migrations/0049_alter_customdalidevice_interface.py,sha256=eEtMTt04XbfsjHeFujeCcTe4KNQoPAe_d7lFvcj5n2A,630
10508
+ simo/fleet/migrations/0050_customdalidevice_uid.py,sha256=iO_vpbNnEDLWo8p0S81MouuIMN75BCjLsUg0hZUZ9rU,468
10509
+ simo/fleet/migrations/0051_customdalidevice_components.py,sha256=-tTMCuBQnAFf3W5aHCn1qWa447e1XdghVK8nNA7J7bo,456
10507
10510
  simo/fleet/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10508
10511
  simo/fleet/migrations/__pycache__/0001_initial.cpython-312.pyc,sha256=AKcdg2v5A7vfVyRT-jwK54BVyg1V1gO6-tyXtk4afSA,1991
10509
10512
  simo/fleet/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=9kc1UyMEYkRNVnZ7iwZbiW1t3qWXROvWrI2G1BdzIaA,1250
@@ -10597,6 +10600,9 @@ simo/fleet/migrations/__pycache__/0045_alter_colonel_type_customdalidevice.cpyth
10597
10600
  simo/fleet/migrations/__pycache__/0046_delete_customdalidevice.cpython-312.pyc,sha256=B3J3WjCjjA__bjqIwkpX4i2u18KWEKzlZ-lG0__Hh5E,653
10598
10601
  simo/fleet/migrations/__pycache__/0047_customdalidevice.cpython-312.pyc,sha256=qIZEMpkj28cOAazGsiH2ZiH1m5Sot_FK-78yzxA4tfU,1848
10599
10602
  simo/fleet/migrations/__pycache__/0048_remove_customdalidevice_colonel_and_more.cpython-312.pyc,sha256=D21BzJX40P1Hanj8D1haBvoEqljQL2IQJwCTIzF9GFo,1378
10603
+ simo/fleet/migrations/__pycache__/0049_alter_customdalidevice_interface.cpython-312.pyc,sha256=WfNMmdpnS6x3I9gDEOrtqztjbWYcQXDB4THYb3ysK9s,1184
10604
+ simo/fleet/migrations/__pycache__/0050_customdalidevice_uid.cpython-312.pyc,sha256=tguBnxPVAUrgU120EVDHZa-gChovZNklAAac6RRLd7Y,831
10605
+ simo/fleet/migrations/__pycache__/0051_customdalidevice_components.cpython-312.pyc,sha256=YB5d40wwc6FqZJJILNC5T7bnu254Ml-Cah96v3N8gbE,827
10600
10606
  simo/fleet/migrations/__pycache__/__init__.cpython-312.pyc,sha256=1rujN3qD3L0Q2MRB-gxwRKyShgUTX9NBpDGaIl42ozU,176
10601
10607
  simo/fleet/migrations/__pycache__/__init__.cpython-38.pyc,sha256=5k1KW0jeSDzw6RnVPRq4CaO13Lg7M0F-pxA_gqqZ6Mg,170
10602
10608
  simo/fleet/templates/admin/colonel_history.html,sha256=YfA6LDVExk1sAWhBuiCLA6vb3XcBNN7_fpJNZzGFtB0,169
@@ -10606,8 +10612,8 @@ simo/fleet/templates/fleet/controllers_info/RoomZonePresenceSensor.md,sha256=Nun
10606
10612
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10607
10613
  simo/generic/app_widgets.py,sha256=y8W3jR76Hh26O9pPQyg2SophMbYIOtAWD33MPKbB8Mg,856
10608
10614
  simo/generic/base_types.py,sha256=u3SlfpNYaCwkVBwomWgso4ODzL71ay9MhiAW-bxgnDU,341
10609
- simo/generic/controllers.py,sha256=SkXedPGmW17sErob2pyTj2xSq7FwVZXHAxBhZX8CKbc,49699
10610
- simo/generic/forms.py,sha256=62l1tKTd90N91EQ9gy6eQInab5fl76VudgO2foYrVQ0,26488
10615
+ simo/generic/controllers.py,sha256=32Ze1bD-JiIRJBjR_aSmbhCh3-M-6YBdyH7bFY8VKa4,49883
10616
+ simo/generic/forms.py,sha256=0RIDtLLzCkiSb9OxlioicOQW9yp1OjLKekpjbxzGVfM,26272
10611
10617
  simo/generic/gateways.py,sha256=oJ4VLaL0nMB6hnTMEpZasc4OTf8m1HWRWJMhUjHbeIU,19447
10612
10618
  simo/generic/models.py,sha256=59fkYowOX0imviIhA6uwupvuharrpBykmBm674rJNoI,7279
10613
10619
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
@@ -10619,9 +10625,9 @@ simo/generic/__pycache__/app_widgets.cpython-312.pyc,sha256=ywoKk91YSEZxpyt9haG5
10619
10625
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=D9b13pbMlirgHmjDnQhfLIDGSVINoSouHb4SWOeCRrs,1642
10620
10626
  simo/generic/__pycache__/base_types.cpython-312.pyc,sha256=h8Mwu49i-zmwTbL33JaLJfRDGOgkQh2_VqrfzEc4UQ4,616
10621
10627
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
10622
- simo/generic/__pycache__/controllers.cpython-312.pyc,sha256=PJtqjFFJBh1UuKy7tVuAmnlhOKw4sv64akb-9zrBbU4,55883
10628
+ simo/generic/__pycache__/controllers.cpython-312.pyc,sha256=vElV3V6zJDo93KdQP3t_f7jrvLIAC3c03tGEre48x44,55873
10623
10629
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=jJjwKVaDYyazrRGNjUFoY74nr_jX_DEnsC9KjyxZCgc,30427
10624
- simo/generic/__pycache__/forms.cpython-312.pyc,sha256=7BWN3cBh1eftr_ysxsBUG5R_ddiNgVEUWFQnVghx0OM,34923
10630
+ simo/generic/__pycache__/forms.cpython-312.pyc,sha256=5Vo10Zjyum-SYqieE3e7UInX6B90NQu1ex-ne7kVG70,34676
10625
10631
  simo/generic/__pycache__/forms.cpython-38.pyc,sha256=k8lz3taXdWAg5P9jcnw66mWH51pCc4SOsg32kVEtBCg,19416
10626
10632
  simo/generic/__pycache__/gateways.cpython-312.pyc,sha256=lg1j7spkhmGa5f4C49EKRXHHM2BrOJralhrsKXIsdYA,23196
10627
10633
  simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=GIeMT51oZU2OCFD4eUDFdSRRYE0Qf14AcOr_gdUqG94,12705
@@ -10753,7 +10759,7 @@ simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpyth
10753
10759
  simo/notifications/migrations/__pycache__/__init__.cpython-312.pyc,sha256=YMFc4QmWMnjT1vpATl4nnj80m2oJehTlDRl0SvYeR3A,184
10754
10760
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10755
10761
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10756
- simo/users/admin.py,sha256=2J_ZwrwAPw03Stb6msx5GvRpGCsDSC39RPpYBLGf8UY,7441
10762
+ simo/users/admin.py,sha256=DVXDfq8ssauNA7-H6sj89UlsfbOvJldpveNSAaYIVPY,7515
10757
10763
  simo/users/api.py,sha256=7LXVAsCuheS4k8JtkORNXFGh6bb1jR4QPZknuS12nzw,15136
10758
10764
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10759
10765
  simo/users/auth_backends.py,sha256=HxRp9iFvU1KqUhE7pA9YKEjqtBCJDbDqk_UMCD2Dwww,4361
@@ -10761,7 +10767,7 @@ simo/users/auto_urls.py,sha256=RSUW3ai5LbMTknS8M7M5aOnG_YlFOVQrnNVNH-fkwlg,357
10761
10767
  simo/users/dynamic_settings.py,sha256=yDtjpcEKA5uS2fcma6e-Zznh2iyMT3x8N7aRqNCtzSM,569
10762
10768
  simo/users/managers.py,sha256=OHgEP85MBtdkdYxdstBd8RavTBT8F_2WyDxUJ9aCqqM,246
10763
10769
  simo/users/middleware.py,sha256=tNPmnzo0eTrJ25SLHP7NotqYKI2cKnmv8hf6v5DLOWo,427
10764
- simo/users/models.py,sha256=TKHs7mVjVC84WK-qXDz--4YfaD_TsUDrxxZ-oEXF-Pc,20527
10770
+ simo/users/models.py,sha256=2bnUEFM1UqwWntBOTnoYwzWRMr0KsQEv6HTHGo9VdxE,20679
10765
10771
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10766
10772
  simo/users/serializers.py,sha256=Uy5JsZp6nEGNMuK9HgLbA0KJdsbjG8GDIyF7z7Ue_so,2610
10767
10773
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
@@ -10771,7 +10777,7 @@ simo/users/utils.py,sha256=vR5SlWdMKkMgNZdJXUI14pASVue8WMqJSQpVKruX25I,2305
10771
10777
  simo/users/views.py,sha256=iIfv8DqNztzBB3fiZcnHOyzp4eFtjrC-gCv5rBX3XsQ,4136
10772
10778
  simo/users/__pycache__/__init__.cpython-312.pyc,sha256=n0GE5zxjujBUkv1t1CswZ9GbybW478_oY8d_wQJ44N8,223
10773
10779
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=VFoDJE_SKKaPqqYaaBYd1Ndb1hjakkTo_u0EG_XJ1GM,211
10774
- simo/users/__pycache__/admin.cpython-312.pyc,sha256=lTVuZQwkuw1bzSn0A0kt-8H6ruKas_YPb_61AxSYSoo,11465
10780
+ simo/users/__pycache__/admin.cpython-312.pyc,sha256=AAGwpZ603YYkCXM-Z-LrUykyexy0xJg3iOZE1BSI1G8,11488
10775
10781
  simo/users/__pycache__/admin.cpython-38.pyc,sha256=uL8TwAipkatZxanvQtBKKcOv8Fm3UvinBxsP0okrOZg,8443
10776
10782
  simo/users/__pycache__/api.cpython-312.pyc,sha256=O7mRDdbpqakFJf37mROWy2xv-4bUzLW8FOUmzzE3Hcg,19469
10777
10783
  simo/users/__pycache__/api.cpython-38.pyc,sha256=zZ4DfNktgeVvLAtMpaPUv7AoAgbKr7SCt-4ghJk1zp4,10386
@@ -10787,7 +10793,7 @@ simo/users/__pycache__/managers.cpython-312.pyc,sha256=A9-yF1dilDc1H_-BtrIw9USpH
10787
10793
  simo/users/__pycache__/managers.cpython-38.pyc,sha256=O0Y8ABp42RAosrbODmYsPMaj9AyOPyJ-aqzuO0Qpi2s,679
10788
10794
  simo/users/__pycache__/middleware.cpython-312.pyc,sha256=9pkiIkMriu0ExLK479hyPfaN-DOfp6WErqQlrZY1Mvk,927
10789
10795
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10790
- simo/users/__pycache__/models.cpython-312.pyc,sha256=52wjquH0mXIIWZ0oGaJiM6fXnyg7zTi4zeBVRQ2dIMo,29546
10796
+ simo/users/__pycache__/models.cpython-312.pyc,sha256=fsFyN_a9-dIPd-7kiH-Ncb5sLzdXyCmRme67aMZcabo,29697
10791
10797
  simo/users/__pycache__/models.cpython-38.pyc,sha256=qNtAn_eWVmRTWhTxN8GtCc549dcJsTdaF7Uk19yNMgg,18330
10792
10798
  simo/users/__pycache__/permissions.cpython-312.pyc,sha256=NCaxeIz4qmG_mF18lKTYXqOSUvJkFLnUZjfYIQFUCkU,718
10793
10799
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
@@ -10846,6 +10852,7 @@ simo/users/migrations/0040_userdevicereportlog_location_smoothed_and_more.py,sha
10846
10852
  simo/users/migrations/0041_userdevicereportlog_speed_kmh_received.py,sha256=WoJ-ImX1lNIl7CKO_HMt3jbFjoenFGBUm9HZWidb-eA,433
10847
10853
  simo/users/migrations/0042_remove_userdevicereportlog_location_smoothed_and_more.py,sha256=p-GFu6qjkxqeA0TI8aaIum0k6fQfc39RIKbfGPSf0Yk,499
10848
10854
  simo/users/migrations/0043_userdevicereportlog_avg_speed_kmh.py,sha256=DheQR-GsGMwNkya3rWHp6pOrNz7-ljnsbcU4e_7AVuE,435
10855
+ simo/users/migrations/0044_permissionsrole_is_person.py,sha256=PRNplM8TZRkOsnE1tESeotQrBC64VvPAI77HeVhpNOc,492
10849
10856
  simo/users/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10850
10857
  simo/users/migrations/__pycache__/0001_initial.cpython-312.pyc,sha256=6ezqZjScZKR1CrY0_nwL2RDsrTr1dydlQ963BuaOptI,8299
10851
10858
  simo/users/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=e4XOKaYRb7l0P7cBnHHi5FQQJMlwjK0g7iqgM-xKmNI,4215
@@ -10935,6 +10942,7 @@ simo/users/migrations/__pycache__/0042_remove_userdevicereportlog_location_smoot
10935
10942
  simo/users/migrations/__pycache__/0042_remove_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc,sha256=sSnWjU7rg5LXlRCxUFb_m2lUIcB4EHgtAnl-C9MMJvE,656
10936
10943
  simo/users/migrations/__pycache__/0043_userdevicereportlog_avg_speed_kmh.cpython-312.pyc,sha256=EStpvcDPAu_hZlFk3mc7bIVXDUGzA9Ccd4kGQmWcQ1c,823
10937
10944
  simo/users/migrations/__pycache__/0043_userdevicereportlog_avg_speed_kmh.cpython-38.pyc,sha256=ZkXpVQtjfMoX4WF5N8rioCVv77mNNGhu9g50EQEf03w,673
10945
+ simo/users/migrations/__pycache__/0044_permissionsrole_is_person.cpython-312.pyc,sha256=WZxQyUyiXp7yKvWm90S7A7Zr3-oBk6_IDQsTazgBxAs,874
10938
10946
  simo/users/migrations/__pycache__/__init__.cpython-312.pyc,sha256=B_XwMs2L0W7Bdjl6bs-Rl8iTxqzeRwrf3qcNBlMjIm8,176
10939
10947
  simo/users/migrations/__pycache__/__init__.cpython-38.pyc,sha256=NKq7WLgktK8WV1oOqCPbAbdkrPV5GRGhYx4VxxI4dcs,170
10940
10948
  simo/users/templates/conf/mosquitto.conf,sha256=1eIGNuRu4Y3hfAU6qiWix648eCRrw0oOT24PnyFI4ys,189
@@ -10945,9 +10953,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10945
10953
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10946
10954
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10947
10955
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10948
- simo-2.10.5.dist-info/licenses/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10949
- simo-2.10.5.dist-info/METADATA,sha256=eGpKTCxJeMVMZ-QvSJeJTqOhZTXJiUDfqse4Tvv4kFY,2028
10950
- simo-2.10.5.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
10951
- simo-2.10.5.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10952
- simo-2.10.5.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10953
- simo-2.10.5.dist-info/RECORD,,
10956
+ simo-2.10.7.dist-info/licenses/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10957
+ simo-2.10.7.dist-info/METADATA,sha256=qzJYhEXss-jHwmug0L1jRXuDn0WrAE1P1Sz6E1ZWFUc,2028
10958
+ simo-2.10.7.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
10959
+ simo-2.10.7.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10960
+ simo-2.10.7.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10961
+ simo-2.10.7.dist-info/RECORD,,
File without changes