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.
- simo/core/__pycache__/admin.cpython-38.pyc +0 -0
- simo/core/__pycache__/controllers.cpython-38.pyc +0 -0
- simo/core/__pycache__/events.cpython-38.pyc +0 -0
- simo/core/__pycache__/middleware.cpython-38.pyc +0 -0
- simo/core/__pycache__/socket_consumers.cpython-38.pyc +0 -0
- simo/core/__pycache__/views.cpython-38.pyc +0 -0
- simo/core/controllers.py +3 -1
- simo/core/events.py +11 -4
- simo/core/management/update.py +5 -3
- simo/core/middleware.py +5 -5
- simo/core/socket_consumers.py +6 -2
- simo/core/static/admin/js/codemirror-init.js +1 -0
- simo/fleet/__pycache__/models.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/socket_consumers.cpython-38.pyc +0 -0
- simo/fleet/models.py +4 -0
- simo/fleet/socket_consumers.py +13 -5
- simo/generic/__pycache__/controllers.cpython-38.pyc +0 -0
- simo/generic/__pycache__/forms.cpython-38.pyc +0 -0
- simo/generic/__pycache__/gateways.cpython-38.pyc +0 -0
- simo/generic/controllers.py +5 -1
- simo/generic/forms.py +15 -5
- simo/generic/gateways.py +3 -0
- simo/generic/scripting/__pycache__/helpers.cpython-38.pyc +0 -0
- {simo-2.5.1.dist-info → simo-2.5.3.dist-info}/METADATA +1 -1
- {simo-2.5.1.dist-info → simo-2.5.3.dist-info}/RECORD +29 -28
- {simo-2.5.1.dist-info → simo-2.5.3.dist-info}/LICENSE.md +0 -0
- {simo-2.5.1.dist-info → simo-2.5.3.dist-info}/WHEEL +0 -0
- {simo-2.5.1.dist-info → simo-2.5.3.dist-info}/entry_points.txt +0 -0
- {simo-2.5.1.dist-info → simo-2.5.3.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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:
|
simo/core/management/update.py
CHANGED
|
@@ -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
|
-
[
|
|
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
|
-
|
|
30
|
-
if
|
|
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
|
-
|
|
38
|
-
|
|
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
|
simo/core/socket_consumers.py
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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:
|
|
Binary file
|
|
Binary file
|
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)
|
simo/fleet/socket_consumers.py
CHANGED
|
@@ -218,18 +218,26 @@ class FleetConsumer(AsyncWebsocketConsumer):
|
|
|
218
218
|
}
|
|
219
219
|
}
|
|
220
220
|
config_data['settings'].update(instance_options)
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
232
|
-
)(self.colonel
|
|
239
|
+
get_components, thread_sensitive=True
|
|
240
|
+
)(self.colonel)
|
|
233
241
|
|
|
234
242
|
def get_comp_config(comp):
|
|
235
243
|
try:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/generic/controllers.py
CHANGED
|
@@ -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 {
|
|
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.
|
|
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'
|
|
Binary file
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
10339
|
-
simo/generic/forms.py,sha256=
|
|
10340
|
-
simo/generic/gateways.py,sha256=
|
|
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=
|
|
10348
|
-
simo/generic/__pycache__/forms.cpython-38.pyc,sha256=
|
|
10349
|
-
simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=
|
|
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.
|
|
10546
|
-
simo-2.5.
|
|
10547
|
-
simo-2.5.
|
|
10548
|
-
simo-2.5.
|
|
10549
|
-
simo-2.5.
|
|
10550
|
-
simo-2.5.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|