simo 2.10.6__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.

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-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
+
@@ -248,8 +248,8 @@ class Thermostat(ControllerBase):
248
248
 
249
249
  else:
250
250
  if prefer_heating and heaters:
251
- low = target_temp - 2
252
- high = target_temp + 1
251
+ low = target_temp - 2.5
252
+ high = target_temp + 0.5
253
253
  window = high - low
254
254
  reach = high - current_temp
255
255
  reaction_force = self._get_reaction_force(window, reach)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simo
3
- Version: 2.10.6
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
@@ -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
@@ -10505,6 +10505,8 @@ simo/fleet/migrations/0046_delete_customdalidevice.py,sha256=KR-pqDctBHB1SgbC01F
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
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
10508
10510
  simo/fleet/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10509
10511
  simo/fleet/migrations/__pycache__/0001_initial.cpython-312.pyc,sha256=AKcdg2v5A7vfVyRT-jwK54BVyg1V1gO6-tyXtk4afSA,1991
10510
10512
  simo/fleet/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=9kc1UyMEYkRNVnZ7iwZbiW1t3qWXROvWrI2G1BdzIaA,1250
@@ -10599,6 +10601,8 @@ simo/fleet/migrations/__pycache__/0046_delete_customdalidevice.cpython-312.pyc,s
10599
10601
  simo/fleet/migrations/__pycache__/0047_customdalidevice.cpython-312.pyc,sha256=qIZEMpkj28cOAazGsiH2ZiH1m5Sot_FK-78yzxA4tfU,1848
10600
10602
  simo/fleet/migrations/__pycache__/0048_remove_customdalidevice_colonel_and_more.cpython-312.pyc,sha256=D21BzJX40P1Hanj8D1haBvoEqljQL2IQJwCTIzF9GFo,1378
10601
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
10602
10606
  simo/fleet/migrations/__pycache__/__init__.cpython-312.pyc,sha256=1rujN3qD3L0Q2MRB-gxwRKyShgUTX9NBpDGaIl42ozU,176
10603
10607
  simo/fleet/migrations/__pycache__/__init__.cpython-38.pyc,sha256=5k1KW0jeSDzw6RnVPRq4CaO13Lg7M0F-pxA_gqqZ6Mg,170
10604
10608
  simo/fleet/templates/admin/colonel_history.html,sha256=YfA6LDVExk1sAWhBuiCLA6vb3XcBNN7_fpJNZzGFtB0,169
@@ -10608,7 +10612,7 @@ simo/fleet/templates/fleet/controllers_info/RoomZonePresenceSensor.md,sha256=Nun
10608
10612
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10609
10613
  simo/generic/app_widgets.py,sha256=y8W3jR76Hh26O9pPQyg2SophMbYIOtAWD33MPKbB8Mg,856
10610
10614
  simo/generic/base_types.py,sha256=u3SlfpNYaCwkVBwomWgso4ODzL71ay9MhiAW-bxgnDU,341
10611
- simo/generic/controllers.py,sha256=2RyjQvXjy87uzJQBC8gcqK5FSjuhQBvg9v6MZgH8ajQ,49879
10615
+ simo/generic/controllers.py,sha256=32Ze1bD-JiIRJBjR_aSmbhCh3-M-6YBdyH7bFY8VKa4,49883
10612
10616
  simo/generic/forms.py,sha256=0RIDtLLzCkiSb9OxlioicOQW9yp1OjLKekpjbxzGVfM,26272
10613
10617
  simo/generic/gateways.py,sha256=oJ4VLaL0nMB6hnTMEpZasc4OTf8m1HWRWJMhUjHbeIU,19447
10614
10618
  simo/generic/models.py,sha256=59fkYowOX0imviIhA6uwupvuharrpBykmBm674rJNoI,7279
@@ -10621,9 +10625,9 @@ simo/generic/__pycache__/app_widgets.cpython-312.pyc,sha256=ywoKk91YSEZxpyt9haG5
10621
10625
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=D9b13pbMlirgHmjDnQhfLIDGSVINoSouHb4SWOeCRrs,1642
10622
10626
  simo/generic/__pycache__/base_types.cpython-312.pyc,sha256=h8Mwu49i-zmwTbL33JaLJfRDGOgkQh2_VqrfzEc4UQ4,616
10623
10627
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
10624
- simo/generic/__pycache__/controllers.cpython-312.pyc,sha256=C6P4bm3XsjyPKU5CPIT8TuPc3Q6p4fhB2ZryxSlhpnA,55917
10628
+ simo/generic/__pycache__/controllers.cpython-312.pyc,sha256=vElV3V6zJDo93KdQP3t_f7jrvLIAC3c03tGEre48x44,55873
10625
10629
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=jJjwKVaDYyazrRGNjUFoY74nr_jX_DEnsC9KjyxZCgc,30427
10626
- 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
10627
10631
  simo/generic/__pycache__/forms.cpython-38.pyc,sha256=k8lz3taXdWAg5P9jcnw66mWH51pCc4SOsg32kVEtBCg,19416
10628
10632
  simo/generic/__pycache__/gateways.cpython-312.pyc,sha256=lg1j7spkhmGa5f4C49EKRXHHM2BrOJralhrsKXIsdYA,23196
10629
10633
  simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=GIeMT51oZU2OCFD4eUDFdSRRYE0Qf14AcOr_gdUqG94,12705
@@ -10949,9 +10953,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10949
10953
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10950
10954
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10951
10955
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10952
- simo-2.10.6.dist-info/licenses/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10953
- simo-2.10.6.dist-info/METADATA,sha256=WCPnUSuq85p8GvATcqBj7suoJod2rahQdkiY7lCZ1J4,2028
10954
- simo-2.10.6.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
10955
- simo-2.10.6.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10956
- simo-2.10.6.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10957
- simo-2.10.6.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