simo 2.0.33__py3-none-any.whl → 2.0.34__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
Binary file
Binary file
simo/core/api.py CHANGED
@@ -580,10 +580,20 @@ class StatesViewSet(InstanceMixin, viewsets.GenericViewSet):
580
580
  vals['last_modified']
581
581
  )
582
582
 
583
+ categories = Category.objects.filter(instance=self.instance).values(
584
+ 'id', 'last_modified'
585
+ )
586
+ for cat in categories:
587
+ cat['last_modified'] = datetime.datetime.timestamp(
588
+ cat['last_modified']
589
+ )
590
+
591
+
583
592
  return RESTResponse({
584
593
  'zones': Zone.objects.filter(instance=self.instance).values(
585
594
  'id', 'name'
586
595
  ),
596
+ 'categories': categories,
587
597
  'component_values': component_values,
588
598
  'users': UserSerializer(
589
599
  users_qs, many=True, context={
@@ -614,7 +624,8 @@ class ControllerTypes(InstanceMixin, viewsets.GenericViewSet):
614
624
  'uid': uid,
615
625
  'name': cls.name,
616
626
  'is_discoverable': cls.is_discoverable,
617
- 'manual_add': cls.manual_add
627
+ 'manual_add': cls.manual_add,
628
+ 'discovery_msg': cls.discovery_msg
618
629
  })
619
630
 
620
631
  return RESTResponse(data)
@@ -657,10 +668,18 @@ class RunningDiscoveries(InstanceMixin, viewsets.GenericViewSet):
657
668
  def list(self, request, *args, **kwargs):
658
669
  return RESTResponse(self.get_data(self.get_gateways(request)))
659
670
 
660
- @action(detail=False, methods=['get'])
671
+ @action(detail=False, methods=['get', 'post'])
661
672
  def retry(self, request, *args, **kwargs):
662
673
  gateways = self.get_gateways(request)
663
674
  if 'controller_uid' in request.GET:
664
675
  for gateway in gateways:
665
676
  gateway.retry_discovery()
677
+ return RESTResponse(self.get_data(gateways))
678
+
679
+ @action(detail=False, methods=['get', 'post'])
680
+ def finish(self, request, *args, **kwargs):
681
+ gateways = self.get_gateways(request)
682
+ if 'controller_uid' in request.GET:
683
+ for gateway in gateways:
684
+ gateway.finish_discovery()
666
685
  return RESTResponse(self.get_data(gateways))
simo/core/controllers.py CHANGED
@@ -33,6 +33,7 @@ class ControllerBase(ABC):
33
33
  admin_widget_template = 'admin/controller_widgets/generic.html'
34
34
  default_config = {}
35
35
  default_meta = {}
36
+ default_value_units = None
36
37
  discovery_msg = None
37
38
  manual_add = True # Can be added manually
38
39
  family = None
@@ -468,6 +469,7 @@ class Dimmer(ControllerBase, TimerMixin, OnOffPokerMixin):
468
469
  admin_widget_template = 'admin/controller_widgets/knob.html'
469
470
  default_config = {'min': 0.0, 'max': 100.0, 'inverse': False}
470
471
  default_value = 0
472
+ default_value_units = '%'
471
473
 
472
474
  def _prepare_for_send(self, value):
473
475
  if isinstance(value, bool):
@@ -761,6 +763,7 @@ class Lock(Switch):
761
763
  base_type = 'lock'
762
764
  app_widget = LockWidget
763
765
  admin_widget_template = 'admin/controller_widgets/lock.html'
766
+ default_value = 'unlocked'
764
767
 
765
768
  UNLOCKED = 0
766
769
  LOCKED = 1
simo/core/forms.py CHANGED
@@ -323,6 +323,7 @@ class ComponentAdminForm(forms.ModelForm):
323
323
  self.instance.controller_uid = ControllerClass.uid
324
324
  self.instance.base_type = self.controller.base_type
325
325
  self.instance.value = self.controller.default_value
326
+ self.instance.value_units = self.controller.default_value_units
326
327
  self.instance.value_previous = self.controller.default_value
327
328
  self.instance.config = self.controller.default_config
328
329
  self.instance.meta = self.controller.default_meta
@@ -0,0 +1,22 @@
1
+ # Generated by Django 3.2.9 on 2024-05-21 08:23
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('core', '0035_remove_instance_share_location'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name='category',
15
+ name='header_image_last_change',
16
+ ),
17
+ migrations.AddField(
18
+ model_name='category',
19
+ name='last_modified',
20
+ field=models.DateTimeField(auto_now=True),
21
+ ),
22
+ ]
simo/core/models.py CHANGED
@@ -141,13 +141,11 @@ class Category(DirtyFieldsMixin, models.Model, SimoAdminMixin):
141
141
  upload_to='categories', null=True, blank=True,
142
142
  help_text="Will be cropped down to: 830x430"
143
143
  )
144
- header_image_last_change = models.DateTimeField(
145
- auto_now_add=True, editable=False
146
- )
147
144
  all = models.BooleanField(
148
145
  default=False,
149
146
  help_text=_("All components automatically belongs to this category")
150
147
  )
148
+ last_modified = models.DateTimeField(auto_now=True, editable=False)
151
149
  order = models.PositiveIntegerField(
152
150
  blank=False, null=False, db_index=True
153
151
  )
simo/core/serializers.py CHANGED
@@ -34,7 +34,7 @@ class TimestampField(serializers.Field):
34
34
 
35
35
 
36
36
  class IconSerializer(serializers.ModelSerializer):
37
- last_modified = TimestampField()
37
+ last_modified = TimestampField(read_only=True)
38
38
 
39
39
  class Meta:
40
40
  model = Icon
@@ -43,13 +43,17 @@ class IconSerializer(serializers.ModelSerializer):
43
43
 
44
44
  class CategorySerializer(serializers.ModelSerializer):
45
45
  header_image_thumb = serializers.SerializerMethodField()
46
+ last_modified = TimestampField(read_only=True)
46
47
 
47
48
  class Meta:
48
49
  model = Category
49
50
  fields = (
50
- 'id', 'name', 'all', 'icon', 'header_image', 'header_image_thumb'
51
+ 'id', 'name', 'all', 'icon',
52
+ 'header_image', 'header_image_thumb',
53
+ 'last_modified'
51
54
  )
52
55
 
56
+
53
57
  def get_header_image_thumb(self, obj):
54
58
  if obj.header_image:
55
59
  thumbnailer = get_thumbnailer(obj.header_image.path)
@@ -60,10 +64,7 @@ class CategorySerializer(serializers.ModelSerializer):
60
64
  request = get_current_request()
61
65
  if request:
62
66
  url = request.build_absolute_uri(url)
63
- return {
64
- 'url': url,
65
- 'last_change': obj.header_image_last_change.timestamp()
66
- }
67
+ return url
67
68
  return
68
69
 
69
70
 
simo/core/tasks.py CHANGED
@@ -166,7 +166,7 @@ def sync_with_remote():
166
166
 
167
167
  print("Responded with: ", json.dumps(r_json))
168
168
 
169
- if 'hub_uid' in response:
169
+ if 'hub_uid' in r_json:
170
170
  dynamic_settings['core__hub_uid'] = r_json['hub_uid']
171
171
 
172
172
  for instance in instances:
Binary file
simo/fleet/controllers.py CHANGED
@@ -25,7 +25,8 @@ from .forms import (
25
25
  ColonelDHTSensorConfigForm, DS18B20SensorConfigForm,
26
26
  BME680SensorConfigForm, MPC9808SensorConfigForm,
27
27
  DualMotorValveForm, BlindsConfigForm, BurglarSmokeDetectorConfigForm,
28
- TTLockConfigForm, DALIDeviceConfigForm, DaliLampForm, DaliGearGroupForm
28
+ TTLockConfigForm, DALIDeviceConfigForm, DaliLampForm, DaliGearGroupForm,
29
+ DaliOccupancySensorConfigForm, DALILightSensorConfigForm
29
30
  )
30
31
 
31
32
 
@@ -633,4 +634,19 @@ class DALIGearGroup(FleeDeviceMixin, BaseDimmer):
633
634
  class DALIRelay(BaseSwitch, DALIDevice):
634
635
  family = 'dali'
635
636
  manual_add = False
636
- name = 'DALI Relay'
637
+ name = 'DALI Relay'
638
+
639
+
640
+ class DALIOccupancySensor(BaseBinarySensor, DALIDevice):
641
+ family = 'dali'
642
+ manual_add = False
643
+ name = 'DALI Occupancy Sensor'
644
+ config_form = DaliOccupancySensorConfigForm
645
+
646
+
647
+ class DALILightSensor(BaseNumericSensor, DALIDevice):
648
+ family = 'dali'
649
+ manual_add = False
650
+ name = 'DALI Light Sensor'
651
+ default_value_units = 'lux'
652
+ config_form = DALILightSensorConfigForm
simo/fleet/forms.py CHANGED
@@ -1073,7 +1073,7 @@ class DaliLampForm(DALIDeviceConfigForm, BaseComponentForm):
1073
1073
  help_text="Update device config on colonel boot."
1074
1074
  )
1075
1075
  fade_time = forms.TypedChoiceField(
1076
- initial=3, choices=(
1076
+ initial=3, coerce=int, choices=(
1077
1077
  (1, "0.7 s"), (2, "1.0 s"), (3, "1.4 s"), (4, "2.0 s"), (5, "2.8 s"),
1078
1078
  (6, "4.0 s"), (7, "5.7 s"), (8, "8.0 s")
1079
1079
  )
@@ -1185,4 +1185,25 @@ class DaliGearGroupForm(DALIDeviceConfigForm, BaseComponentForm):
1185
1185
  obj.controller._get_colonel_config()
1186
1186
  ]
1187
1187
  ).publish()
1188
- return obj
1188
+ return obj
1189
+
1190
+
1191
+ class DaliOccupancySensorConfigForm(DALIDeviceConfigForm, BaseComponentForm):
1192
+ boot_update = forms.BooleanField(
1193
+ initial=False, required=False,
1194
+ help_text="Update device config on colonel boot."
1195
+ )
1196
+ hold_time = forms.TypedChoiceField(
1197
+ initial=3, coerce=int, choices=(
1198
+ (1, "10 s"), (2, "20 s"), (3, "30 s"), (4, "40 s"), (5, "50 s"),
1199
+ (6, "1 min"), (9, "1.5 min"), (12, "2 min"), (18, "3 min"),
1200
+ (30, "5 min"), (60, "10 min"), (120, "20 min"),
1201
+ )
1202
+ )
1203
+
1204
+
1205
+ class DALILightSensorConfigForm(DALIDeviceConfigForm, BaseComponentForm):
1206
+ boot_update = forms.BooleanField(
1207
+ initial=False, required=False,
1208
+ help_text="Update device config on colonel boot."
1209
+ )
simo/fleet/models.py CHANGED
@@ -262,7 +262,8 @@ def after_colonel_save(sender, instance, created, *args, **kwargs):
262
262
  fleet_gateway, new = Gateway.objects.get_or_create(
263
263
  type='simo.fleet.gateways.FleetGatewayHandler'
264
264
  )
265
- fleet_gateway.run()
265
+ if fleet_gateway.status != 'running':
266
+ fleet_gateway.start()
266
267
 
267
268
 
268
269
  @receiver(pre_delete, sender=Component)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.0.33
3
+ Version: 2.0.34
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
@@ -26,7 +26,7 @@ simo/_hub_template/hub/supervisor.conf,sha256=IY3fdK0fDD2eAothB0n54xhjQj8LYoXIR9
26
26
  simo/_hub_template/hub/urls.py,sha256=Ydm-1BkYAzWeEF-MKSDIFf-7aE4qNLPm48-SA51XgJQ,25
27
27
  simo/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  simo/core/admin.py,sha256=xVMFl1MvQ-THwrnAVSvIkhbfbIIc4r_dDGEkpkRoSBk,17751
29
- simo/core/api.py,sha256=v8dwgmDUwiueELUJ5DGNepgZw6tsveA21MSJEKYArKk,24445
29
+ simo/core/api.py,sha256=HmuMTAo9vLWMBV8K6r-86IrmaCKHY94hjbyoyIPPXTM,25135
30
30
  simo/core/api_auth.py,sha256=_3hG4e1eLKrcRnSAOB_xTL6cwtOJ2_7JS7GZU_iqTgA,1251
31
31
  simo/core/api_meta.py,sha256=ySmmhtVrWatI3yqnYPuP5ipapmJfyfEbl32w-7_W5O4,3551
32
32
  simo/core/app_widgets.py,sha256=EEQOto3fGR0syDqpJE38tQrx8DoTTyg26nF5kYzHY38,2018
@@ -34,30 +34,30 @@ simo/core/auto_urls.py,sha256=0gu-IL7PHobrmKW6ksffiOkAYu-aIorykWdxRNtwGYo,1194
34
34
  simo/core/autocomplete_views.py,sha256=JT5LA2_Wtr60XYSAIqaXFKFYPjrmkEf6yunXD9y2zco,4022
35
35
  simo/core/base_types.py,sha256=yqbIZqBksrAkEuHRbt6iExwPDDy0K5II2NzRCkmOvMU,589
36
36
  simo/core/context.py,sha256=98PXAMie43faRVBFkOG22uNpvGRNprcGhzjBFkrxaRY,1367
37
- simo/core/controllers.py,sha256=fmzF90-UqDgrjM5XQWJLpDTHawLulqwKtvuHmovybAc,27189
37
+ simo/core/controllers.py,sha256=Z_sXPaehJcOS8Zz1UZZ2n7-1cjx3_B9dVjHBQHgjtTc,27281
38
38
  simo/core/dynamic_settings.py,sha256=U2WNL96JzVXdZh0EqMPWrxqO6BaRR2Eo5KTDqz7MC4o,1943
39
39
  simo/core/events.py,sha256=LvtonJGNyCb6HLozs4EG0WZItnDwNdtnGQ4vTcnKvUs,4438
40
40
  simo/core/filters.py,sha256=ghtOZcrwNAkIyF5_G9Sn73NkiI71mXv0NhwCk4IyMIM,411
41
- simo/core/forms.py,sha256=EeVU1y5gZCgGEf8BS8mBeQ5qTw-PG9BdVNRMAge3w0Y,23608
41
+ simo/core/forms.py,sha256=VoNKoLDR7AAJWHiEUTT8tYcNoVwZh4XxX1-lZEoRzpI,23688
42
42
  simo/core/gateways.py,sha256=s_c2W0v2_te89i6LS4Nj7F2wn9UwjZXPT7pfy6SToVo,3714
43
43
  simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
44
44
  simo/core/managers.py,sha256=Qdg2-Qh4dLbW0A5Dmtnpct6CUhEuuvdbIskBijQxopU,2360
45
45
  simo/core/middleware.py,sha256=pO52hQOJV_JRmNyUe7zfufSnJFlRITOWX6jwkoPWJhk,2052
46
- simo/core/models.py,sha256=mPJ_lHlawQ-8LgpiLUFmOs_6xelzbDCVrWz5ja4cufQ,20163
46
+ simo/core/models.py,sha256=W5rShDy8l6GQzTRFiBZFAuibe_fg_LRwSNk973mv_m8,20134
47
47
  simo/core/permissions.py,sha256=yqVXq6SNZccSKcOoGdb0oh-WHsyTTtI9ovJdJyhjv28,2707
48
48
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
49
- simo/core/serializers.py,sha256=A-SXL_ANHVwTPvokUYA0OovXPqjKZpjwDFkpIGDQ7fs,18342
49
+ simo/core/serializers.py,sha256=dbQ78K9ePBChFPjJHXGj8BkqXQfIFcfFpOtcupGUuz8,18337
50
50
  simo/core/signal_receivers.py,sha256=C6Jk7wVEtyo4hwcrU7L0ijtpK0wce2MNwpyBgSfSJ-U,5467
51
51
  simo/core/socket_consumers.py,sha256=n7VE2Fvqt4iEAYLTRbTPOcI-7tszMAADu7gimBxB-Fg,9635
52
52
  simo/core/storage.py,sha256=YlxmdRs-zhShWtFKgpJ0qp2NDBuIkJGYC1OJzqkbttQ,572
53
- simo/core/tasks.py,sha256=zThsfJR08WnBPot8u8GiM0AplageHl-8devq1U_cOoI,12268
53
+ simo/core/tasks.py,sha256=jwH5WiDizCeMTvFwB9MWAI3CEBzlqS3cxwamZeLgrm0,12266
54
54
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
55
55
  simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
56
56
  simo/core/views.py,sha256=hlAKpAbCbqI3a-uL5tDp532T2oLFiF0MBzKUJ_SNzo0,5833
57
57
  simo/core/widgets.py,sha256=J9e06C6I22F6xKic3VMgG7WeX07glAcl-4bF2Mg180A,2827
58
58
  simo/core/__pycache__/__init__.cpython-38.pyc,sha256=y0IW37wBUIGa3Eh_ZG28pRqHKoLiPyTgUX2OnbkEPlc,158
59
59
  simo/core/__pycache__/admin.cpython-38.pyc,sha256=1OisxqtyWMbzpgeeu5vtBW3gp3Nts4Ei4ff1P-SPpq4,13545
60
- simo/core/__pycache__/api.cpython-38.pyc,sha256=duJwBDHhHPR3_ROeH28dRqOo__yPuQKB6_2dUMLFBEs,19607
60
+ simo/core/__pycache__/api.cpython-38.pyc,sha256=RsMxUiiMEEXsSh2fBbrkjsIUOKUy81dmN9_20SB7CR8,19942
61
61
  simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=5UTBr3rDMERAfc0OuOVDwGeQkt6Q7GLBtZJAMBse1sg,1712
62
62
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=94T3_rybn2T1_bkaDQnQRyjy21LBaGOnz-mmkJ6T0N8,2840
63
63
  simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=9Es2wZNduzUJv-jZ_HX0-L3vqwpXWBbseEwoC5K6b-w,3465
@@ -65,19 +65,19 @@ simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=SVl4fF0-yiq7e9gt08jIM6_rL4
65
65
  simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=hJ6JILI1LqrAtpQMvxnLvljGdW1v1gpvBsD79vFkZ58,3972
66
66
  simo/core/__pycache__/base_types.cpython-38.pyc,sha256=CasZJN42cK_ymoQgn5E4s8oOkuZJ18fVHCgN4GPuT7c,735
67
67
  simo/core/__pycache__/context.cpython-38.pyc,sha256=MSZPDhqMhCpUuBJl3HCIBHZA3BntYeP8RAnQcdqAH9k,1278
68
- simo/core/__pycache__/controllers.cpython-38.pyc,sha256=gFw0h-EiszXVL7miIRW82Va8cYuigV8ZO1aTRkU_8mA,23919
68
+ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=HX7XcVpmNkqM8gVnWru43nmrkR5B9tlgWdZrosCaRjE,23978
69
69
  simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=ELu06Hub4DOidja71ybvD3ZM4HdXiyZjNJrZfnXZXNA,2476
70
70
  simo/core/__pycache__/events.cpython-38.pyc,sha256=A1Axx-qftd1r7st7wkO3DkvTdt9-RkcJe5KJhpzJVk8,5109
71
71
  simo/core/__pycache__/filters.cpython-38.pyc,sha256=VIMADCBiYhziIyRmxAyUDJluZvuZmiC4bNYWTRsGSao,721
72
- simo/core/__pycache__/forms.cpython-38.pyc,sha256=YPbm885JglxCGKbRX2oKatY7iSkfp7HXy4S9zOE-A4E,19896
72
+ simo/core/__pycache__/forms.cpython-38.pyc,sha256=69AqXKv_0SgFX_m6PCC1VdBEGjgGz-kkBTCaxIQZ0t0,19936
73
73
  simo/core/__pycache__/gateways.cpython-38.pyc,sha256=XBiwMfBkjoQ2re6jvADJOwK0_0Aav-crzie9qtfqT9U,4599
74
74
  simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NMEdPAiHK0cFaIL7I8,1623
75
75
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=ObkzRjSOs2UQmjwFWDvZHreNzc_P5k7dVA_f7L7S7Q4,2529
76
76
  simo/core/__pycache__/middleware.cpython-38.pyc,sha256=ESR5JPtITo9flczO0672sfzYUxrc_cQU0e0w5DFL-60,2038
77
- simo/core/__pycache__/models.cpython-38.pyc,sha256=16bd4AJuGTgnCwPIIVJlgpI08_FYT36sSdqxLRAOy4k,17301
77
+ simo/core/__pycache__/models.cpython-38.pyc,sha256=UNX6Btm5ZnpLzSCWgevQnSYzAyDWttA2Ivy7CGPu8DU,17288
78
78
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=flJOCh94U8mFhE0XWzUD0sGR6Xe1HlfG4hQtNSnAGZ4,2788
79
79
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
80
- simo/core/__pycache__/serializers.cpython-38.pyc,sha256=3SuqNGrpL4shiM_c4aFXCwMOEjRgqZ0tyeGnBodh5t4,17229
80
+ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=ltj2lqyqt2ctV6svTQ_VkTmq_aOx8iPhTdu5QQhScdk,17213
81
81
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=UcKT8RK_14CI-JEWfplnIxskmWec_w5-gqKUXITLDA4,4323
82
82
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=NJUr7nRyHFvmAumxxWpsod5wzVVZM99rCEuJs1utHA4,8432
83
83
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=BTkYH8QQyjqI0WOtJC8fHNtgu0YA1vjqZclXjC2vCVI,1116
@@ -177,6 +177,7 @@ simo/core/migrations/0032_auto_20240506_0834.py,sha256=w-dXSZVYZD0B6pRmMXLy27Y2t
177
177
  simo/core/migrations/0033_auto_20240509_0821.py,sha256=lao8AaCr4WrrXlRxdRmWBbC4sk2-zs1kCuBxbRN0mog,793
178
178
  simo/core/migrations/0034_component_error_msg.py,sha256=Ag45Ib_8fCLRLKatXqfiSzqnx-IWBQ3wBUpzaV5bAFg,411
179
179
  simo/core/migrations/0035_remove_instance_share_location.py,sha256=PeofRnw_INwN14JS3hkmbJRkxEvZ5LFrdF3XJ7UqixA,336
180
+ simo/core/migrations/0036_auto_20240521_0823.py,sha256=dDgrcSGjONisbEGTfGYS-AaycI8XbHLf5aL2cbFHAwk,529
180
181
  simo/core/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
181
182
  simo/core/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=w6GiBXVxWj30Bg4Sn_pFVeA041d-pCrkaq8mR3KuF70,5381
182
183
  simo/core/migrations/__pycache__/0002_load_icons.cpython-38.pyc,sha256=Nb9RrPjVYo_RpZ5PmzoaEIWGCeVt4kicpmGiKlBrpIw,2123
@@ -213,6 +214,7 @@ simo/core/migrations/__pycache__/0032_auto_20240506_0834.cpython-38.pyc,sha256=U
213
214
  simo/core/migrations/__pycache__/0033_auto_20240509_0821.cpython-38.pyc,sha256=9XEpmCp_Jt8ciKKaheJ_H7A6lyYwNXvJUbzTTEXXKOI,919
214
215
  simo/core/migrations/__pycache__/0034_component_error_msg.cpython-38.pyc,sha256=9NBpcN_XnsUi-gyWym92ISjFCH6l4FUu5_7KiW1kVGk,622
215
216
  simo/core/migrations/__pycache__/0035_remove_instance_share_location.cpython-38.pyc,sha256=S2gLxKMlJmiPj24MxHl4MdI7tUD9QE9c530smcYcPVU,558
217
+ simo/core/migrations/__pycache__/0036_auto_20240521_0823.cpython-38.pyc,sha256=iIdvU2s5UBI0guWpQWOSx7QynQ99myuK6Dqopeg7V0I,693
216
218
  simo/core/migrations/__pycache__/__init__.cpython-38.pyc,sha256=VZmDQ57BTcebuM0KMhjiTOabgWZCBxQmSJzWZos9SO8,169
217
219
  simo/core/static/ansi_styles.css,sha256=4ieJGrjZPKyPSago9FdB_gflHoGE1vxCHi8qVn5tY-Y,37352
218
220
  simo/core/static/admin/Img/plus.svg,sha256=2NpSFPWqGIjpAQGFI7LDQHPKagEhYkJiJX95ufCoZaI,741
@@ -10180,11 +10182,11 @@ simo/fleet/api.py,sha256=Hxn84xI-Q77HxjINgRbjSJQOv9jii4OL20LxK0VSrS8,2499
10180
10182
  simo/fleet/auto_urls.py,sha256=X04oKJWA48wFW5iXg3PPROY2KDdHn_a99orQSE28QC4,518
10181
10183
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10182
10184
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10183
- simo/fleet/controllers.py,sha256=ChZkQ3XFr6gqLosO2Tp_62aRVBJBoSJUWg8h83f_trg,22718
10184
- simo/fleet/forms.py,sha256=PLjNsE5jKueZgPT76UyP7wQU8SF15oAUVJ9lkRDnN_U,42826
10185
+ simo/fleet/controllers.py,sha256=ROQWoCWLOiXX4Xh2E9ZPor1ypOibGfd7m8GItP1Si28,23172
10186
+ simo/fleet/forms.py,sha256=d3j_nv8uW1e3ptmaMlJZ6buOdFVKOfs6J7WyCbcKoYA,43582
10185
10187
  simo/fleet/gateways.py,sha256=KV5i5fxXIrlK-k6zyEkk83x11GJt-ELQ0npb4Ac83cM,3693
10186
10188
  simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10187
- simo/fleet/models.py,sha256=zkmDVjBEv5YkyHKSL5sRamETNPj6EBzqmBGXjdYKZsc,15249
10189
+ simo/fleet/models.py,sha256=bD5AebGFCAYGXPYhTA2nK1X9KpMG4WK4zFk9OzBDoHI,15301
10188
10190
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10189
10191
  simo/fleet/serializers.py,sha256=-16BjY_bp9VbDOYuD0V54h7r_RHpuLNkJX0SydWL9aU,2247
10190
10192
  simo/fleet/socket_consumers.py,sha256=Mfdb3O19GvHA7aYmBzzqvkldnT_F3A6KOMBviz30lK4,17906
@@ -10197,8 +10199,8 @@ simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rL9fb7cCQatyFvXyKmlNOKmxVo8vHYe
10197
10199
  simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=SqyTuaz_kEBvx-bL46SclsZEEP5RFh6U6TGKyXDdiOE,565
10198
10200
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10199
10201
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10200
- simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=l0btLscScV1CYBVXZrD11DBo8icMelQTRiO2wG15k4c,19306
10201
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=YFZJ6duxwkzeS7YfaXqQZt5YR-g0NXCqTWGnZZGf3zc,30975
10202
+ simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=IInB1lBX4uFj1ZDyzCJEDABPXWTMwUpKBczkoJyj4SI,19842
10203
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=aW_L2Q8y7YACrV6wlO3_JL-Id_16biEkXT_BAPnqzHg,31617
10202
10204
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=YAcgTOqJbtjGI03lvEcU6keFfrwAHkObVmErYzfRvjk,3569
10203
10205
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10204
10206
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=dQ5Fj9nXg7vgFfACzxWurhqGw8EnYa9Px7SwmGiAih4,12904
@@ -10464,8 +10466,8 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10464
10466
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10465
10467
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10466
10468
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10467
- simo-2.0.33.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10468
- simo-2.0.33.dist-info/METADATA,sha256=l6JMaeF4tuNfq-F8yn2xIKSJ0rYWJIlpetgkliIxHVk,1730
10469
- simo-2.0.33.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10470
- simo-2.0.33.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10471
- simo-2.0.33.dist-info/RECORD,,
10469
+ simo-2.0.34.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10470
+ simo-2.0.34.dist-info/METADATA,sha256=aupHMz4VI42i2kPGzjG86agyXhh2e5V_Zc-FI9MLUcA,1730
10471
+ simo-2.0.34.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10472
+ simo-2.0.34.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10473
+ simo-2.0.34.dist-info/RECORD,,
File without changes