simo 2.5.1__py3-none-any.whl → 2.5.3__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/controllers.py CHANGED
@@ -695,6 +695,8 @@ class RGBWLight(ControllerBase, TimerMixin, OnOffPokerMixin):
695
695
  def _validate_val(self, value, occasion=None):
696
696
  assert 0 <= value['active'] <= 4
697
697
  assert isinstance(value['is_on'], bool)
698
+ if 'scenes' not in value:
699
+ value['scenes'] = self.component.value['scenes']
698
700
  for color in value['scenes']:
699
701
  if not is_hex_color(color):
700
702
  raise ValidationError("Bad color value!")
@@ -704,6 +706,7 @@ class RGBWLight(ControllerBase, TimerMixin, OnOffPokerMixin):
704
706
  else:
705
707
  if len(color) != 7:
706
708
  raise ValidationError("Bad color value!")
709
+
707
710
  return value
708
711
 
709
712
  def turn_off(self):
@@ -722,7 +725,6 @@ class RGBWLight(ControllerBase, TimerMixin, OnOffPokerMixin):
722
725
  self.send(self.component.value)
723
726
 
724
727
 
725
-
726
728
  class MultiSwitchBase(ControllerBase):
727
729
 
728
730
  def _validate_val(self, value, occasion=None):
simo/core/events.py CHANGED
@@ -3,6 +3,7 @@ import sys
3
3
  import json
4
4
  import traceback
5
5
  import pytz
6
+ import inspect
6
7
  from django.contrib.contenttypes.models import ContentType
7
8
  from django.conf import settings
8
9
  import paho.mqtt.client as mqtt
@@ -129,10 +130,16 @@ class OnChangeMixin:
129
130
 
130
131
  self.refresh_from_db()
131
132
 
132
- try:
133
- self._on_change_function(self)
134
- except Exception:
135
- print(traceback.format_exc(), file=sys.stderr)
133
+ if inspect.getfullargspec(self._on_change_function).args:
134
+ try:
135
+ self._on_change_function(self)
136
+ except Exception:
137
+ print(traceback.format_exc(), file=sys.stderr)
138
+ else:
139
+ try:
140
+ self._on_change_function()
141
+ except Exception:
142
+ print(traceback.format_exc(), file=sys.stderr)
136
143
 
137
144
  def on_change(self, function):
138
145
  if function:
@@ -10,8 +10,10 @@ HUB_DIR = '/etc/SIMO/hub'
10
10
 
11
11
  def perform_update():
12
12
 
13
+ pip_executable = os.path.join(os.path.dirname(sys.executable), 'pip')
14
+
13
15
  proc = subprocess.Popen(
14
- ['pip', 'install', 'simo', '--upgrade'],
16
+ [pip_executable, 'install', 'simo', '--upgrade'],
15
17
  cwd=HUB_DIR, stderr=subprocess.PIPE
16
18
  )
17
19
  out, err = proc.communicate()
@@ -19,7 +21,7 @@ def perform_update():
19
21
  raise Exception(err.decode())
20
22
 
21
23
  proc = subprocess.Popen(
22
- [os.path.join(HUB_DIR, 'manage.py'), 'migrate'],
24
+ [sys.executable, os.path.join(HUB_DIR, 'manage.py'), 'migrate'],
23
25
  cwd=HUB_DIR,
24
26
  stderr=subprocess.PIPE
25
27
  )
@@ -28,7 +30,7 @@ def perform_update():
28
30
  raise Exception(err.decode())
29
31
 
30
32
  proc = subprocess.Popen(
31
- [os.path.join(HUB_DIR, 'manage.py'), 'collectstatic',
33
+ [sys.executable, os.path.join(HUB_DIR, 'manage.py'), 'collectstatic',
32
34
  '--noinput'],
33
35
  cwd=HUB_DIR, stderr=subprocess.PIPE
34
36
  )
simo/core/middleware.py CHANGED
@@ -26,16 +26,16 @@ def introduce_instance(instance, request=None):
26
26
 
27
27
 
28
28
  def get_current_instance(request=None):
29
- instance = getattr(_thread_locals, 'instance', None)
30
- if not instance and request and request.session.get('instance_id'):
31
- from simo.core.models import Instance
29
+ from simo.core.models import Instance
30
+ if request and request.session.get('instance_id'):
32
31
  instance = Instance.objects.filter(
33
32
  id=request.session['instance_id'], is_active=True
34
33
  ).first()
35
34
  if not instance:
36
35
  del request.session['instance_id']
37
- else:
38
- introduce_instance(instance, request)
36
+ introduce_instance(instance, request)
37
+
38
+ instance = getattr(_thread_locals, 'instance', None)
39
39
 
40
40
  if not instance:
41
41
  from .models import Instance
@@ -71,7 +71,9 @@ class LogConsumer(AsyncWebsocketConsumer):
71
71
  if not role or not role.is_superuser:
72
72
  return self.close()
73
73
 
74
- self.log_file_path = get_log_file_path(self.obj)
74
+ self.log_file_path = await sync_to_async(
75
+ get_log_file_path, thread_sensitive=True
76
+ )(self.obj)
75
77
  self.log_file = open(self.log_file_path)
76
78
  lines = [l.rstrip('\n') for l in self.log_file]
77
79
 
@@ -105,7 +107,9 @@ class LogConsumer(AsyncWebsocketConsumer):
105
107
  try:
106
108
  line = self.log_file.readline()
107
109
  except:
108
- self.log_file_path = get_log_file_path(self.obj)
110
+ self.log_file_path = await sync_to_async(
111
+ get_log_file_path, thread_sensitive=True
112
+ )(self.obj)
109
113
  self.log_file = open(self.log_file_path)
110
114
  continue
111
115
  if not line:
@@ -20,6 +20,7 @@
20
20
  var editor = CodeMirror.fromTextArea(
21
21
  element, settings
22
22
  );
23
+ editor.setSize(650, "100%");
23
24
  editor.on('change', function(editor){
24
25
  $(element).val(editor.doc.getValue());
25
26
  });
simo/fleet/models.py CHANGED
@@ -270,6 +270,10 @@ def after_colonel_save(sender, instance, created, *args, **kwargs):
270
270
  )
271
271
  if fleet_gateway.status != 'running':
272
272
  fleet_gateway.start()
273
+ # create i2c and dali interfaces automatically for game-changer boards
274
+ if instance.type == 'game-changer':
275
+ Interface.objects.create(colonel=instance, no=1, type='i2c')
276
+ Interface.objects.create(colonel=instance, no=2, type='dali')
273
277
 
274
278
 
275
279
  @receiver(post_save, sender=Component)
@@ -218,18 +218,26 @@ class FleetConsumer(AsyncWebsocketConsumer):
218
218
  }
219
219
  }
220
220
  config_data['settings'].update(instance_options)
221
- interfaces = await sync_to_async(list, thread_sensitive=True)(
222
- self.colonel.interfaces.all().select_related(
221
+
222
+ def get_interfaces(colonel):
223
+ return list(colonel.interfaces.all().select_related(
223
224
  'pin_a', 'pin_b'
224
- )
225
+ ))
226
+ interfaces = await sync_to_async(get_interfaces, thread_sensitive=True)(
227
+ self.colonel
225
228
  )
226
229
  for interface in interfaces:
227
230
  config_data['interfaces'][f'{interface.type}-{interface.no}'] = {
228
231
  'pin_a': interface.pin_a.no, 'pin_b': interface.pin_b.no,
229
232
  }
233
+
234
+ def get_components(colonel):
235
+ return list(
236
+ colonel.components.all().prefetch_related('slaves')
237
+ )
230
238
  components = await sync_to_async(
231
- list, thread_sensitive=True
232
- )(self.colonel.components.all().prefetch_related('slaves'))
239
+ get_components, thread_sensitive=True
240
+ )(self.colonel)
233
241
 
234
242
  def get_comp_config(comp):
235
243
  try:
@@ -138,7 +138,11 @@ class Script(ControllerBase, TimerMixin):
138
138
  content = F"Server error {response.status_code}: {soup.title.string}"
139
139
  return {'status': 'error', 'result': content}
140
140
 
141
- return {'status': 'success', 'result': response.content.decode()}
141
+ return {
142
+ 'status': 'success',
143
+ 'result': response.json()['script'],
144
+ 'description': response.json()['description']
145
+ }
142
146
 
143
147
 
144
148
  class PresenceLighting(Script):
simo/generic/forms.py CHANGED
@@ -49,8 +49,8 @@ class ScriptConfigForm(BaseComponentForm):
49
49
  "The more defined, exact and clear is your description the more "
50
50
  "accurate automation script SIMO.io AI assistanw will generate.<br>"
51
51
  "Use component, zone and category id's for best accuracy. <br>"
52
- "SIMO.io AI will re-generate your automation code, "
53
- "every time this field is changed. <br>"
52
+ "SIMO.io AI will re-generate your automation code and update it's description in Notes field "
53
+ "every time this field is changed and it might take up to 60s to do it. <br>"
54
54
  "Actual script code can only be edited via SIMO.io Admin.",
55
55
  )
56
56
  code = forms.CharField(widget=PythonCode, required=False)
@@ -60,6 +60,8 @@ class ScriptConfigForm(BaseComponentForm):
60
60
 
61
61
  app_exclude_fields = ('alarm_category', 'code', 'log')
62
62
 
63
+ _ai_resp = None
64
+
63
65
  def __init__(self, *args, **kwargs):
64
66
  super().__init__(*args, **kwargs)
65
67
  self.basic_fields.extend(['autostart', 'keep_alive'])
@@ -80,7 +82,7 @@ class ScriptConfigForm(BaseComponentForm):
80
82
  base_fields = (
81
83
  'id', 'gateway', 'base_type', 'name', 'icon', 'zone', 'category',
82
84
  'show_in_app', 'autostart', 'keep_alive',
83
- 'assistant_request', 'code', 'control', 'log'
85
+ 'assistant_request', 'notes', 'code', 'control', 'log'
84
86
  )
85
87
 
86
88
  fieldsets = [
@@ -92,6 +94,7 @@ class ScriptConfigForm(BaseComponentForm):
92
94
  ]
93
95
  return fieldsets
94
96
 
97
+
95
98
  def clean(self):
96
99
  if self.cleaned_data.get('assistant_request'):
97
100
  if self.instance.pk:
@@ -100,19 +103,26 @@ class ScriptConfigForm(BaseComponentForm):
100
103
  != self.cleaned_data['assistant_request']
101
104
  else:
102
105
  call_assistant = True
106
+ call_assistant = False
103
107
  if call_assistant:
104
108
  resp = self.instance.ai_assistant(
105
109
  self.cleaned_data['assistant_request'],
106
110
  )
107
111
  if resp['status'] == 'success':
108
- self.cleaned_data['code'] = resp['result']
109
- self.instance.config['code'] = resp['result']
112
+ self._ai_resp = resp
110
113
  elif resp['status'] == 'error':
111
114
  self.add_error('assistant_request', resp['result'])
112
115
 
113
116
  return self.cleaned_data
114
117
 
115
118
  def save(self, commit=True):
119
+ if commit and self._ai_resp:
120
+ self.instance.config['code'] = self._ai_resp['result']
121
+ self.instance.notes = self._ai_resp['description']
122
+ if 'code' in self.cleaned_data:
123
+ self.cleaned_data['code'] = self._ai_resp['result']
124
+ if 'notes' in self.cleaned_data:
125
+ self.cleaned_data['notes'] = self._ai_resp['description']
116
126
  obj = super().save(commit)
117
127
  if commit:
118
128
  obj.controller.stop()
simo/generic/gateways.py CHANGED
@@ -145,7 +145,10 @@ class ScriptRunHandler(multiprocessing.Process):
145
145
  else:
146
146
  code = self.component.config.get('code')
147
147
  def run_code():
148
+ start = time.time()
148
149
  exec(code, globals())
150
+ if 'class Automation:' in code and time.time() - start < 1:
151
+ Automation().run()
149
152
 
150
153
  if not code:
151
154
  self.component.value = 'finished'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.1
3
+ Version: 2.5.3
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
@@ -43,22 +43,22 @@ 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=nX6AtkYX6GjRnHuywWesrvRwA8EBHt_fR7yB_8BGA_I,29932
46
+ simo/core/controllers.py,sha256=JeOvn1Y4MYGkimqEB_6u3B-KwJk3qLjY63ELlFXih14,30027
47
47
  simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ,1872
48
- simo/core/events.py,sha256=HXapr_aLPM-T42yl4RB3M_HC76Bg_KmGJry5M8AlNK8,4493
48
+ simo/core/events.py,sha256=fH6d5HcPdDqT3R7CZPdo69qTszJ23j3GJt3IFOso3WA,4757
49
49
  simo/core/filters.py,sha256=ghtOZcrwNAkIyF5_G9Sn73NkiI71mXv0NhwCk4IyMIM,411
50
50
  simo/core/form_fields.py,sha256=9tIjiEN3IE55GPyB4tOlfkd51JDne3-h8pKhpL3tLFE,2220
51
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=aEHwnyR9IFGWxmrYuViJiXIWcCpD5GUeCxcTCpfX_Q8,2934
55
+ simo/core/middleware.py,sha256=ypyZfVZN3bEEudhg3-Ho4GacMol4u1QJ19it6MnZ_D8,2896
56
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
59
  simo/core/serializers.py,sha256=Pa2lhJ6VgNalbH4awbKdGJCYAPNsu5WQWfo6Tz6LbOQ,20782
60
60
  simo/core/signal_receivers.py,sha256=9-qFCCeSLcMFEMg6QUtKOVgUsoNoqhzGoI98nuNSTEo,6228
61
- simo/core/socket_consumers.py,sha256=n7VE2Fvqt4iEAYLTRbTPOcI-7tszMAADu7gimBxB-Fg,9635
61
+ simo/core/socket_consumers.py,sha256=trRZvBGTJ7xIbfdmVvn7zoiWp_qssSkMZykDrI5YQyE,9783
62
62
  simo/core/storage.py,sha256=_5igjaoWZAiExGWFEJMElxUw55DzJG1jqFty33xe8BE,342
63
63
  simo/core/tasks.py,sha256=wYCaARytOqnBkoZ1zV59yCtZBqmu3Sd-eNpyZsv4LW0,14572
64
64
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
@@ -66,7 +66,7 @@ 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=ksoB8Jz8PxcFQ3FlgPJtShwTnBR0LayaVZv6ezDe9OE,13723
69
+ simo/core/__pycache__/admin.cpython-38.pyc,sha256=uM58xiBAbbstmKZ0CoxLSk_RRu5TDVuHJNOveXUhFqM,13723
70
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
@@ -76,26 +76,26 @@ simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=Tyf8PYHq5YqSwTp25Joy-eura_
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=P90-jhkH086_z3Mawo-gYjBWRnZtsxTffqtsSiTTDDU,26864
79
+ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=ycGGRvBwNsOl2obNKl5t77UK5mkn8bEU4_1dE0K_Z9k,26897
80
80
  simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=wGpnscX1DxFpRl54MQURhjz2aD3NJohSzw9JCFnzh2Y,2384
81
- simo/core/__pycache__/events.cpython-38.pyc,sha256=wMN1cxlAKSGVzBU4rAsnbIJwMgbKImBCoSBgdZhkPUg,5131
81
+ simo/core/__pycache__/events.cpython-38.pyc,sha256=yip7WSyX4pUy2wJE820W4fD7iwoIWGhdHfloFb_N0R8,5257
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
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=Ae2NvZ8sv-AeYoFS-xzuA196ajCuE411Ao-U1SY5HXU,2500
88
+ simo/core/__pycache__/middleware.cpython-38.pyc,sha256=w97mv2fyREGL8F0rDHFyZvFD85DqiOSW_R1OlLXkrHs,2494
89
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
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
- simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=NJUr7nRyHFvmAumxxWpsod5wzVVZM99rCEuJs1utHA4,8432
94
+ simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=KqbO1cOewodVPcy0-htVefyUjCuELKV0o7fOfYqfgPc,8490
95
95
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=9R1Xu0FJDflfRXUPsqEgt0SpwiP7FGk7HaR8s8XRyI8,721
96
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
- simo/core/__pycache__/views.cpython-38.pyc,sha256=ySH8l-clhUdpkIVm9aMQOlt1VoZoJgNrqoE_sEiYMR8,2495
98
+ simo/core/__pycache__/views.cpython-38.pyc,sha256=K_QM967bIJeU02DJu0Dm7j8RiFDKn_TLzX77YzNkA7c,2495
99
99
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
100
100
  simo/core/db_backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
101
  simo/core/db_backend/base.py,sha256=wY5jsZ8hQpwot3o-7JNtDe33xy-vlfMLXa011htDojI,601
@@ -147,7 +147,7 @@ simo/core/drf_braces/tests/serializers/test_enforce_validation_serializer.py,sha
147
147
  simo/core/drf_braces/tests/serializers/test_form_serializer.py,sha256=IE2xQ1SzhSsOy2BFsBYw_Po-ujKBgIuNoTRxCzhyilE,12995
148
148
  simo/core/drf_braces/tests/serializers/test_swapping.py,sha256=o-B5YV5HDxHCVrXYGODeF7lB3rPDGtafNgClx97d6w4,1220
149
149
  simo/core/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
- simo/core/management/update.py,sha256=Fj7-Zm4kvngPAE2NaUG21GOQfg86lKVtW79ZRH2sZD8,1795
150
+ simo/core/management/update.py,sha256=t-54NN9enr10ldWRemmIHEaSQSOHqTchbZzqucm1P6s,1911
151
151
  simo/core/management/__pycache__/__init__.cpython-38.pyc,sha256=Ptf1WzljXMt3wP1tzOy6q3JfLERYDs66wSHBVdrzjHg,169
152
152
  simo/core/management/_hub_template/hub/asgi.py,sha256=ElN_fdeSkf0Ysa7pS9rJVmZ1HmLhFxb8jFaMLqe1220,126
153
153
  simo/core/management/_hub_template/hub/celeryc.py,sha256=3ksDXftIZKJ4Cq9WNKJERdZdQlDEnjTQXycweRFmsSQ,27
@@ -255,7 +255,7 @@ simo/core/static/admin/Img/plus.svg,sha256=2NpSFPWqGIjpAQGFI7LDQHPKagEhYkJiJX95u
255
255
  simo/core/static/admin/Img/simo_Logo.svg,sha256=incyY8KA0x84qZFnApx0WB_cUA9-HtoJfspQKAq2sqU,7232
256
256
  simo/core/static/admin/css/simo.css,sha256=KZKMcrywUsoPDvQRm1Z6dgVbWsMQaYn36gVmFTMkUJI,7860
257
257
  simo/core/static/admin/js/admin_scripts.js,sha256=OuIrjNnIbudw83j9mqbO4TMQq8LrvBlqNsUlHbZSRVA,5279
258
- simo/core/static/admin/js/codemirror-init.js,sha256=1z737JEq6p6tpivPaOt3al4KhXz4HWbHOfA6oobbTow,1325
258
+ simo/core/static/admin/js/codemirror-init.js,sha256=tuZq1GBz7EFO8BgmPNzs66AT5Ct59_WwqQ9pyOUaIhU,1362
259
259
  simo/core/static/admin/js/formsets.js,sha256=KPgFCKHVuRCnPLsHbpWtmSwA0LhjAeW_Pbji0zWyyhk,744
260
260
  simo/core/static/admin/js/icon-autocomplete.js,sha256=5E_4L7BmS10UGMmEjCOB8Oxt5195NBiARmWRnXEx_AY,1416
261
261
  simo/core/static/admin/js/log_output_widget.js,sha256=M1FUrEVkC0rViv2bwqTvFis_LJyRBFmmNIguCQHUKsQ,2001
@@ -10224,10 +10224,10 @@ simo/fleet/controllers.py,sha256=i1GwbT6apIvdyfuVQYNkliBNlKmffCOdpjall3o3NxQ,327
10224
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=DiO82bXZTH6e2mcN0TkTyR7n1YUYnMX_SNzR-lYjiY8,16542
10227
+ simo/fleet/models.py,sha256=eaXuUdiK9LnBFHARcR9sC049It1s6OrPTWVmysfQyYg,16812
10228
10228
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10229
10229
  simo/fleet/serializers.py,sha256=-16BjY_bp9VbDOYuD0V54h7r_RHpuLNkJX0SydWL9aU,2247
10230
- simo/fleet/socket_consumers.py,sha256=aBNTxvYIw5a5l2ns9x0LnjVJvp4NValEJG4MT4hGAT0,17903
10230
+ simo/fleet/socket_consumers.py,sha256=8RLEmKQ0Q7nVgJJ6IrU4ioocsWBJrgBVH_AUpVas1no,18095
10231
10231
  simo/fleet/tasks.py,sha256=AGq9BXFNAqkhOANsPvId8yjEbDtVCB3MRsi_AKDpgIM,821
10232
10232
  simo/fleet/utils.py,sha256=4RaoxyOByh3_Svb-WgTdQjG6R6ZGRN4Zf7-daFc4H80,4708
10233
10233
  simo/fleet/views.py,sha256=OzsumjMjjt2WEXuThBzSAHcTNLU2dyBtvz4IyeHoAaA,3226
@@ -10241,10 +10241,10 @@ simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=K_UMv4Vnc1JBd7GHIekm_6Y
10241
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=fMjWveEDpdGNgffMBPW2IPPz2w_umlSu6UB7BW8z6g4,13802
10244
+ simo/fleet/__pycache__/models.cpython-38.pyc,sha256=am7ceraEUIJPD5qO3y-_X1riXIYsZGYZOlZmGjqhy7g,13906
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
- simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=oAnUJbrKjhC3-G-o4F-bx3ZztQf7JhmHi-Sh3cm4-4s,13549
10247
+ simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=cNLhA0PTF2BgXXcw4b4va1zIw-gBrghoRrSr8iZluE0,13893
10248
10248
  simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
10249
10249
  simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=J2N68RzYUnzFeqKH50x9Vtrwd3nrkMKBWOfD99IvfIs,3344
10250
10250
  simo/fleet/__pycache__/views.cpython-38.pyc,sha256=qwW2t_SNX7lLBS1RvYuxYBk9XRkeUcir5O5VYcrjMLY,3136
@@ -10335,18 +10335,18 @@ simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LS
10335
10335
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10336
10336
  simo/generic/app_widgets.py,sha256=E_pnpA1hxMIhenRCrHoQ5cik06jm2BAHCkl_eo-OudU,1264
10337
10337
  simo/generic/base_types.py,sha256=djymox_boXTHX1BTTCLXrCH7ED-uAsV_idhaDOc3OLI,409
10338
- simo/generic/controllers.py,sha256=qqtIj9G3KzPi_IEA2IP1OEYujxCjYbGSKNVUUO8iim0,59825
10339
- simo/generic/forms.py,sha256=QiVRQ-l2jgiEsnnUYqhCZkKwprMy-D-Wu_EDlBSLz60,32304
10340
- simo/generic/gateways.py,sha256=cc_q_g2HsI2_rWmr8yZ3spnMPwsgoYS5ApWRimc11wU,18831
10338
+ simo/generic/controllers.py,sha256=NQelUJhAVsPH88RRiX4D0-NBb3pwwXcF2orMVdfneic,59918
10339
+ simo/generic/forms.py,sha256=GuB-5H-GX9_2Q-YjwrHVcryTDo5CuJb3rsFG7-mMr5A,32759
10340
+ simo/generic/gateways.py,sha256=JaX-wVaYh3CTkryq-Lq_UQfA4JWdxY42QkchstC12Sw,18982
10341
10341
  simo/generic/models.py,sha256=YEAFfkARsAellfDwmmqGSx7nKkEF5XngciRB4qP1MKk,7596
10342
10342
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10343
10343
  simo/generic/socket_consumers.py,sha256=K2OjphIhKJH48BvfFfoCOyCQZ1NmXb_phs6y1IP-qaQ,1757
10344
10344
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
10345
10345
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=0IoKRG9n1tkNRRkrqAeOQwWBPd_33u98JBcVtMVVCio,2374
10346
10346
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=ptw6axyAqemZA35oa6vzr7EihzvbhW9w7Y-G6kfDedU,555
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
10347
+ simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=QrZsXgBvwrlGtI0PwQAl8TFDD5RAkm3mjIvfmJSpbq8,37734
10348
+ simo/generic/__pycache__/forms.cpython-38.pyc,sha256=BS9XscqbEcTPIr6kzZzpya2SCgqiGkLGXWiACt0_IFo,23316
10349
+ simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=H5cK5eNQ6P24wSmoRUKvVhkggrKEJ1UGiCkQQ5g98xI,14073
10350
10350
  simo/generic/__pycache__/models.cpython-38.pyc,sha256=ES8wXkdKn0m-yaJlvhyaIOSppuX9Ckz-bOs9DCpVvaQ,5825
10351
10351
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10352
10352
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=qJO5kvQLWhsQDOr1AtAtsAybuRWioxSkQei3Pc7rdP0,1737
@@ -10354,6 +10354,7 @@ simo/generic/scripting/__init__.py,sha256=aZZvNBae7unnux_zGHCIWCV2z47hVJc-DIL72H
10354
10354
  simo/generic/scripting/helpers.py,sha256=cuJ7B79auIw6CmgkcPoQsJekUPIXq00ucneRALdPWwE,919
10355
10355
  simo/generic/scripting/serializers.py,sha256=PjyFrjdPK1mBsgbNhyqMi9SWzcymqTa742ipy0LhAN4,1996
10356
10356
  simo/generic/scripting/__pycache__/__init__.cpython-38.pyc,sha256=eHncoNpv5dy35IO1_htWd8CK0sHFBnU_WJ0hl5TKOHQ,794
10357
+ simo/generic/scripting/__pycache__/helpers.cpython-38.pyc,sha256=S8uwKmMjF9ySsm6xQrDSP6bOA0_IcYyfqluA-qtWfNo,1410
10357
10358
  simo/generic/scripting/__pycache__/serializers.cpython-38.pyc,sha256=JD9KCNO27H18mkFaeSMdybTMdTvodqcZSLNbC3pheHU,3412
10358
10359
  simo/generic/static/weather_icons/01d@2x.png,sha256=TZfWi6Rfddb2P-oldWWcjUiuCHiU9Yrc5hyrQAhF26I,948
10359
10360
  simo/generic/static/weather_icons/01n@2x.png,sha256=e9RleTa0T7To9Wi2wJ-9waeTbfHOsUB_xGwkx-89eEg,945
@@ -10542,9 +10543,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10542
10543
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10543
10544
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10544
10545
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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,,
10546
+ simo-2.5.3.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10547
+ simo-2.5.3.dist-info/METADATA,sha256=twUguJgwbaneN3x1oCPaSpfAtyfKV73LVKhxPl4NW8M,1923
10548
+ simo-2.5.3.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
10549
+ simo-2.5.3.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10550
+ simo-2.5.3.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10551
+ simo-2.5.3.dist-info/RECORD,,
File without changes