simo 2.8.4__py3-none-any.whl → 2.8.6__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/__pycache__/asgi.cpython-312.pyc +0 -0
- simo/__pycache__/settings.cpython-312.pyc +0 -0
- simo/asgi.py +21 -1
- simo/backups/tasks.py +1 -1
- simo/core/__pycache__/models.cpython-312.pyc +0 -0
- simo/core/management/_hub_template/hub/supervisor.conf +1 -0
- simo/core/models.py +1 -0
- simo/core/templates/admin/component_history.html +2 -2
- simo/fleet/__pycache__/admin.cpython-312.pyc +0 -0
- simo/fleet/__pycache__/apps.cpython-312.pyc +0 -0
- simo/fleet/__pycache__/models.cpython-312.pyc +0 -0
- simo/fleet/__pycache__/socket_consumers.cpython-312.pyc +0 -0
- simo/fleet/admin.py +24 -3
- simo/fleet/apps.py +10 -0
- simo/fleet/models.py +12 -1
- simo/fleet/socket_consumers.py +31 -7
- simo/fleet/tasks.py +13 -0
- simo/fleet/templates/admin/colonel_history.html +5 -0
- simo/settings.py +7 -1
- {simo-2.8.4.dist-info → simo-2.8.6.dist-info}/METADATA +2 -2
- {simo-2.8.4.dist-info → simo-2.8.6.dist-info}/RECORD +25 -22
- {simo-2.8.4.dist-info → simo-2.8.6.dist-info}/LICENSE.md +0 -0
- {simo-2.8.4.dist-info → simo-2.8.6.dist-info}/WHEEL +0 -0
- {simo-2.8.4.dist-info → simo-2.8.6.dist-info}/entry_points.txt +0 -0
- {simo-2.8.4.dist-info → simo-2.8.6.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
simo/asgi.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import importlib
|
|
1
|
+
import importlib, datetime, sys
|
|
2
2
|
from django.core.asgi import get_asgi_application
|
|
3
3
|
from channels.auth import AuthMiddlewareStack
|
|
4
4
|
from channels.routing import ProtocolTypeRouter, URLRouter
|
|
@@ -21,6 +21,26 @@ for name, app in apps.app_configs.items():
|
|
|
21
21
|
if isinstance(item, list) and var_name == 'urlpatterns':
|
|
22
22
|
urlpatterns.extend(item)
|
|
23
23
|
|
|
24
|
+
|
|
25
|
+
class TimestampedStream:
|
|
26
|
+
"""Adds timestamps to all the prints"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, stream):
|
|
29
|
+
self.stream = stream
|
|
30
|
+
|
|
31
|
+
def write(self, data):
|
|
32
|
+
if data != '\n':
|
|
33
|
+
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
34
|
+
self.stream.write(f'[{timestamp}] {data}')
|
|
35
|
+
else:
|
|
36
|
+
self.stream.write(data)
|
|
37
|
+
|
|
38
|
+
def flush(self):
|
|
39
|
+
self.stream.flush()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
sys.stdout = TimestampedStream(sys.stdout)
|
|
43
|
+
|
|
24
44
|
application = ProtocolTypeRouter({
|
|
25
45
|
"http": get_asgi_application(),
|
|
26
46
|
'websocket': AuthMiddlewareStack(
|
simo/backups/tasks.py
CHANGED
|
@@ -315,7 +315,7 @@ def perform_backup():
|
|
|
315
315
|
|
|
316
316
|
if other_month_folders:
|
|
317
317
|
# delete old backups to free up at least 20G of space
|
|
318
|
-
while shutil.disk_usage(
|
|
318
|
+
while shutil.disk_usage(sd_mountpoint).free < 20 * 1024 * 1024 * 1024:
|
|
319
319
|
remove_folder = other_month_folders.pop()[0]
|
|
320
320
|
print(f"REMOVE: {remove_folder}")
|
|
321
321
|
shutil.rmtree(remove_folder)
|
|
Binary file
|
simo/core/models.py
CHANGED
|
@@ -14,6 +14,7 @@ from django.conf import settings
|
|
|
14
14
|
from django.core.files.storage import FileSystemStorage
|
|
15
15
|
from timezone_utils.choices import ALL_TIMEZONES_CHOICES
|
|
16
16
|
from location_field.models.plain import PlainLocationField
|
|
17
|
+
from actstream import action # do not delete from here!
|
|
17
18
|
from model_utils import FieldTracker
|
|
18
19
|
from dirtyfields import DirtyFieldsMixin
|
|
19
20
|
from simo.core.utils.mixins import SimoAdminMixin
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<h3>Value:</h3>
|
|
3
3
|
<ul style="margin-left: 1.5em;">
|
|
4
4
|
{% for history_item in value_history %}
|
|
5
|
-
<li>[{{ history_item.user }}] {{ history_item.date }} - <strong>{{ history_item.value }}</strong></li>
|
|
5
|
+
<li>[{{ history_item.user }}] {{ history_item.date|date:"Y-m-d H:i:s" }} - <strong>{{ history_item.value }}</strong></li>
|
|
6
6
|
{% endfor %}
|
|
7
7
|
</ul>
|
|
8
8
|
{% endif %}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<h3>Security:</h3>
|
|
13
13
|
<ul style="margin-left: 1.5em;">
|
|
14
14
|
{% for history_item in arm_status_history %}
|
|
15
|
-
<li>[{{ history_item.user }}] {{ history_item.date }} - <strong>{{ history_item.value }}</strong></li>
|
|
15
|
+
<li>[{{ history_item.user }}] {{ history_item.date|date:"Y-m-d H:i:s" }} - <strong>{{ history_item.value }}</strong></li>
|
|
16
16
|
{% endfor %}
|
|
17
17
|
</ul>
|
|
18
18
|
{% endif %}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/fleet/admin.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from threading import Timer
|
|
2
|
+
from actstream.models import actor_stream
|
|
2
3
|
from django.contrib import admin
|
|
3
4
|
from django.utils.safestring import mark_safe
|
|
4
5
|
from django.template.loader import render_to_string
|
|
@@ -60,10 +61,8 @@ class ColonelAdmin(admin.ModelAdmin):
|
|
|
60
61
|
readonly_fields = (
|
|
61
62
|
'type', 'uid', 'connected', 'last_seen',
|
|
62
63
|
'firmware_version', 'newer_firmware_available',
|
|
64
|
+
'history',
|
|
63
65
|
)
|
|
64
|
-
fields = (
|
|
65
|
-
'name', 'instance', 'enabled', 'firmware_auto_update'
|
|
66
|
-
) + readonly_fields + ('pwm_frequency', 'logs_stream', 'log', )
|
|
67
66
|
|
|
68
67
|
actions = (
|
|
69
68
|
'check_for_upgrade', 'update_firmware', 'update_config', 'restart',
|
|
@@ -73,6 +72,19 @@ class ColonelAdmin(admin.ModelAdmin):
|
|
|
73
72
|
|
|
74
73
|
inlines = InterfaceInline, ColonelPinsInline
|
|
75
74
|
|
|
75
|
+
fieldsets = (
|
|
76
|
+
("", {'fields': (
|
|
77
|
+
'name', 'instance', 'enabled', 'firmware_auto_update',
|
|
78
|
+
'type', 'uid', 'connected', 'last_seen',
|
|
79
|
+
'firmware_version', 'newer_firmware_available',
|
|
80
|
+
'pwm_frequency', 'logs_stream', 'log'
|
|
81
|
+
)}),
|
|
82
|
+
("History", {
|
|
83
|
+
'fields': ('history',),
|
|
84
|
+
'classes': ('collapse',),
|
|
85
|
+
}),
|
|
86
|
+
)
|
|
87
|
+
|
|
76
88
|
def get_queryset(self, request):
|
|
77
89
|
qs = super().get_queryset(request)
|
|
78
90
|
return qs.filter(instance=get_current_instance())
|
|
@@ -165,6 +177,15 @@ class ColonelAdmin(admin.ModelAdmin):
|
|
|
165
177
|
return mark_safe('<img src="%s" alt="True">' % static('admin/img/icon-yes.svg'))
|
|
166
178
|
return mark_safe('<img src="%s" alt="False">' % static('admin/img/icon-no.svg'))
|
|
167
179
|
|
|
180
|
+
def history(self, obj):
|
|
181
|
+
if not obj:
|
|
182
|
+
return ''
|
|
183
|
+
actions = actor_stream(obj)[:100]
|
|
184
|
+
if not len(actions):
|
|
185
|
+
return ''
|
|
186
|
+
return render_to_string(
|
|
187
|
+
'admin/colonel_history.html', {'actions': actor_stream(obj)[:100]}
|
|
188
|
+
)
|
|
168
189
|
|
|
169
190
|
@admin.register(Interface)
|
|
170
191
|
class InterfaceAdmin(admin.ModelAdmin):
|
simo/fleet/apps.py
ADDED
simo/fleet/models.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import requests
|
|
2
2
|
import time
|
|
3
|
+
from actstream import action
|
|
3
4
|
from django.core.exceptions import ValidationError
|
|
4
5
|
from django.db import transaction
|
|
5
6
|
from django.db import models
|
|
@@ -281,6 +282,17 @@ def after_colonel_save(sender, instance, created, *args, **kwargs):
|
|
|
281
282
|
Interface.objects.create(colonel=instance, no=1)
|
|
282
283
|
Interface.objects.create(colonel=instance, no=2)
|
|
283
284
|
|
|
285
|
+
if 'socket_connected' in instance.get_dirty_fields():
|
|
286
|
+
if instance.socket_connected:
|
|
287
|
+
verb = 'connected'
|
|
288
|
+
else:
|
|
289
|
+
verb = 'disconnected'
|
|
290
|
+
action.send(
|
|
291
|
+
instance, target=instance, verb=verb,
|
|
292
|
+
instance_id=instance.instance.id,
|
|
293
|
+
action_type='colonel_status', value=verb
|
|
294
|
+
)
|
|
295
|
+
|
|
284
296
|
|
|
285
297
|
@receiver(post_save, sender=Component)
|
|
286
298
|
def post_component_save(sender, instance, created, *args, **kwargs):
|
|
@@ -472,7 +484,6 @@ def post_interface_save(sender, instance, created, *args, **kwargs):
|
|
|
472
484
|
|
|
473
485
|
|
|
474
486
|
|
|
475
|
-
|
|
476
487
|
@receiver(post_delete, sender=Interface)
|
|
477
488
|
def post_interface_delete(sender, instance, *args, **kwargs):
|
|
478
489
|
with transaction.atomic():
|
simo/fleet/socket_consumers.py
CHANGED
|
@@ -5,6 +5,7 @@ import pytz
|
|
|
5
5
|
import traceback
|
|
6
6
|
import sys
|
|
7
7
|
import zlib
|
|
8
|
+
import time
|
|
8
9
|
from django.db import transaction
|
|
9
10
|
from logging.handlers import RotatingFileHandler
|
|
10
11
|
from django.utils import timezone
|
|
@@ -27,10 +28,15 @@ from .controllers import TTLock
|
|
|
27
28
|
|
|
28
29
|
@capture_socket_errors
|
|
29
30
|
class FleetConsumer(AsyncWebsocketConsumer):
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def __init__(self, *args, **kwargs):
|
|
34
|
+
super().__init__(*args, **kwargs)
|
|
35
|
+
self.colonel = None
|
|
36
|
+
self.colonel_logger = None
|
|
37
|
+
self.connected = False
|
|
38
|
+
self.mqtt_client = None
|
|
39
|
+
self.last_seen = 0
|
|
34
40
|
|
|
35
41
|
|
|
36
42
|
async def disconnect(self, code):
|
|
@@ -189,10 +195,26 @@ class FleetConsumer(AsyncWebsocketConsumer):
|
|
|
189
195
|
self.colonel.minor_upgrade_available
|
|
190
196
|
)
|
|
191
197
|
|
|
192
|
-
await asyncio.sleep(
|
|
198
|
+
await asyncio.sleep(2)
|
|
199
|
+
|
|
193
200
|
# Default pinging system sometimes get's lost somewhere,
|
|
194
|
-
# therefore we use our own to ensure connection
|
|
201
|
+
# therefore we use our own to ensure connection and understand if
|
|
202
|
+
# colonel is connected or not
|
|
203
|
+
|
|
195
204
|
await self.send_data({'command': 'ping'})
|
|
205
|
+
ping_start = time.time()
|
|
206
|
+
await asyncio.sleep(0.1)
|
|
207
|
+
|
|
208
|
+
while ping_start > self.last_seen:
|
|
209
|
+
if time.time() - ping_start > 3:
|
|
210
|
+
def disconnect_socket():
|
|
211
|
+
self.colonel.socket_connected = False
|
|
212
|
+
self.colonel.save(update_fields=['socket_connected'])
|
|
213
|
+
await sync_to_async(disconnect_socket, thread_sensitive=True)()
|
|
214
|
+
break
|
|
215
|
+
await asyncio.sleep(0.1)
|
|
216
|
+
|
|
217
|
+
|
|
196
218
|
|
|
197
219
|
async def firmware_update(self, to_version):
|
|
198
220
|
print("Firmware update: ", str(self.colonel))
|
|
@@ -366,8 +388,9 @@ class FleetConsumer(AsyncWebsocketConsumer):
|
|
|
366
388
|
drop_current_instance()
|
|
367
389
|
try:
|
|
368
390
|
if text_data:
|
|
369
|
-
print(f"{self.colonel}: {text_data}")
|
|
370
391
|
data = json.loads(text_data)
|
|
392
|
+
if 'ping' not in data:
|
|
393
|
+
print(f"{self.colonel}: {text_data}")
|
|
371
394
|
if 'get_config' in data:
|
|
372
395
|
config = await self.get_config_data()
|
|
373
396
|
print("Send config: ", config)
|
|
@@ -453,6 +476,7 @@ class FleetConsumer(AsyncWebsocketConsumer):
|
|
|
453
476
|
|
|
454
477
|
|
|
455
478
|
async def log_colonel_connected(self):
|
|
479
|
+
self.last_seen = time.time()
|
|
456
480
|
|
|
457
481
|
def save_last_seen():
|
|
458
482
|
self.colonel.socket_connected = True
|
simo/fleet/tasks.py
CHANGED
|
@@ -5,6 +5,18 @@ from simo.core.middleware import drop_current_instance
|
|
|
5
5
|
from celeryc import celery_app
|
|
6
6
|
|
|
7
7
|
|
|
8
|
+
@celery_app.task
|
|
9
|
+
def check_colonels_connected():
|
|
10
|
+
from .models import Colonel
|
|
11
|
+
drop_current_instance()
|
|
12
|
+
for lost_colonel in Colonel.objects.filter(
|
|
13
|
+
socket_connected=True,
|
|
14
|
+
last_seen__lt=timezone.now() - datetime.timedelta(seconds=20)
|
|
15
|
+
):
|
|
16
|
+
lost_colonel.socket_connected = False
|
|
17
|
+
lost_colonel.save()
|
|
18
|
+
|
|
19
|
+
|
|
8
20
|
@celery_app.task
|
|
9
21
|
def check_colonel_components_alive():
|
|
10
22
|
from simo.core.models import Component
|
|
@@ -24,4 +36,5 @@ def check_colonel_components_alive():
|
|
|
24
36
|
|
|
25
37
|
@celery_app.on_after_finalize.connect
|
|
26
38
|
def setup_periodic_tasks(sender, **kwargs):
|
|
39
|
+
sender.add_periodic_task(10, check_colonels_connected.s())
|
|
27
40
|
sender.add_periodic_task(20, check_colonel_components_alive.s())
|
simo/settings.py
CHANGED
|
@@ -3,6 +3,7 @@ Django settings for SIMO.io project.
|
|
|
3
3
|
"""
|
|
4
4
|
import sys
|
|
5
5
|
import os
|
|
6
|
+
import datetime
|
|
6
7
|
|
|
7
8
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
|
8
9
|
BASE_DIR = '/etc/SIMO'
|
|
@@ -288,4 +289,9 @@ ACTSTREAM_SETTINGS = {
|
|
|
288
289
|
'USE_PREFETCH': True,
|
|
289
290
|
'USE_JSONFIELD': True,
|
|
290
291
|
'GFK_FETCH_DEPTH': 1,
|
|
291
|
-
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
DATETIME_FORMAT = 'Y-m-d H:i:s'
|
|
296
|
+
|
|
297
|
+
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: simo
|
|
3
|
-
Version: 2.8.
|
|
4
|
-
Summary: Smart Home
|
|
3
|
+
Version: 2.8.6
|
|
4
|
+
Summary: Smart Home Supremacy
|
|
5
5
|
Author-email: Simanas Venčkauskas <simanas@simo.io>
|
|
6
6
|
Project-URL: Homepage, https://simo.io
|
|
7
7
|
Project-URL: Issues, https://github.com/pypa/sampleproject/issues
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
simo/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
2
|
-
simo/asgi.py,sha256
|
|
2
|
+
simo/asgi.py,sha256=-CIyRRKCfZqMS7SIh69Me07JWE-CjcNzls_lEvchaqc,1301
|
|
3
3
|
simo/celeryc.py,sha256=eab7_e9rw0c__DCeoUFUh_tjAGVlulxVrk75BaJf57Q,1512
|
|
4
4
|
simo/conf.py,sha256=H2BhXAV8MEDVXF8AbkaLSfR4ULd-9_bS4bnhE5sE5fg,112
|
|
5
|
-
simo/settings.py,sha256=
|
|
5
|
+
simo/settings.py,sha256=EloltW6viNx4v6bMOorAvtjxsZ4nWI_5FiWZzQ6NCLE,7062
|
|
6
6
|
simo/urls.py,sha256=d8g-wN0Xr2PVIV8RZl_h_PMN9KGZNIE9to2hQj1p1TU,2497
|
|
7
7
|
simo/__pycache__/__init__.cpython-312.pyc,sha256=a12_Zr7kC5DXzcFxA5eMu-TiSU5xbdF5cdKq-gwc3x0,159
|
|
8
8
|
simo/__pycache__/__init__.cpython-38.pyc,sha256=j81de0BqHMr6bs0C7cuYrXl7HwtK_vv8hDEtAdSwDJc,153
|
|
9
|
-
simo/__pycache__/asgi.cpython-312.pyc,sha256=
|
|
9
|
+
simo/__pycache__/asgi.cpython-312.pyc,sha256=V3Whr1WOgmiagL6BzfKuQqwlSZHUbmi6gqsTga8N9oI,2458
|
|
10
10
|
simo/__pycache__/asgi.cpython-38.pyc,sha256=5W_YSKOIrRd6NQQuJDuA3Yuj688GzirXVVOyLe8wJIQ,845
|
|
11
11
|
simo/__pycache__/celeryc.cpython-312.pyc,sha256=MQlG6VeEdCpXPpiiAwZavriWKwHbhwTMrfAwdhnb2kw,2375
|
|
12
12
|
simo/__pycache__/celeryc.cpython-38.pyc,sha256=eSRoaKwfYlxVaxAiwqpQ2ndEcx7W-VpZtbxRFSV8UYg,1653
|
|
13
13
|
simo/__pycache__/conf.cpython-312.pyc,sha256=q63YJWqaaaQLz3qXW8clENjvH1zUfY_k34_m56n5gRY,320
|
|
14
14
|
simo/__pycache__/conf.cpython-38.pyc,sha256=MYP2yk3ULxiYwZsZR6tCLjKnU-z03A3avzQzIn66y3k,273
|
|
15
|
-
simo/__pycache__/settings.cpython-312.pyc,sha256=
|
|
15
|
+
simo/__pycache__/settings.cpython-312.pyc,sha256=rwwP1a_wo7d0MqznWZ8HOibSJvfy4JI2-BPKBjV0qKI,6738
|
|
16
16
|
simo/__pycache__/settings.cpython-38.pyc,sha256=4w3ds3D9S78zbsovXsXC05PYBAafDrtsOhX14FT0YyE,6149
|
|
17
17
|
simo/__pycache__/urls.cpython-312.pyc,sha256=mIg_YD7zgjmIzfWzpGpikMqanGKP2O-iuA1ixqQngnc,3689
|
|
18
18
|
simo/__pycache__/urls.cpython-38.pyc,sha256=u0x6EqT8S1YfDOSPgbI8Kf-RDlveY9OV-EDXMYKAQ7w,2125
|
|
@@ -61,7 +61,7 @@ simo/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
61
61
|
simo/backups/admin.py,sha256=cEakxnQlOHvUf8LdBdekXpDAvnqPoVN8y7pnN3WK29A,2487
|
|
62
62
|
simo/backups/dynamic_settings.py,sha256=Q52RLa3UQsmAhqkwR16cM6pbBnIbXqmVQ2oIUP2ZVD0,416
|
|
63
63
|
simo/backups/models.py,sha256=-tgILgkqmBEuxBwoymKZN1a0UVQzmJvqWrIGYMMFDaQ,695
|
|
64
|
-
simo/backups/tasks.py,sha256=
|
|
64
|
+
simo/backups/tasks.py,sha256=UtWMsHONhL_rBAedCk7Mirbp0sZ-glF49bnR2mdTM4U,13370
|
|
65
65
|
simo/backups/__pycache__/__init__.cpython-312.pyc,sha256=wl1RXj84eHmQ_WAvVl7oahd1qa8ezF1HcwRQzho7DyU,167
|
|
66
66
|
simo/backups/__pycache__/__init__.cpython-38.pyc,sha256=vzOf-JIMeZ6P85FyvTpYev3mscFosUy-SJTshcQbOHU,161
|
|
67
67
|
simo/backups/__pycache__/admin.cpython-312.pyc,sha256=4rXygr4247idEgFvadmM4L7-1rRChe7zgoGYTzo2UGI,3863
|
|
@@ -108,7 +108,7 @@ simo/core/gateways.py,sha256=Y2BME6zSyeUq_e-hzEUF6gErCUCP6nFxedkLZKiLVOo,4141
|
|
|
108
108
|
simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
|
|
109
109
|
simo/core/managers.py,sha256=Ampwe5K7gfE6IJULNCV35V8ysmMOdS_wz7mRzfaLZUw,3014
|
|
110
110
|
simo/core/middleware.py,sha256=zX6N4P_KR7gG8N2-NcR7jKtuCEhCGRh51g4EktAhP7w,3272
|
|
111
|
-
simo/core/models.py,sha256=
|
|
111
|
+
simo/core/models.py,sha256=Nw-XT0v0y5pBYlKKhzoI68HiEMMTp7fqZQZgKmeOW7Q,23752
|
|
112
112
|
simo/core/permissions.py,sha256=Ef4NO7QwwDd3Z-v61R0BeCBXxTOJz9qBvzRTIB5tHwI,2943
|
|
113
113
|
simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
|
|
114
114
|
simo/core/serializers.py,sha256=adqe8oYP5f7hGFXcxa-Zmce2KOwy3hZOaWE3MaAFtpM,23157
|
|
@@ -162,7 +162,7 @@ simo/core/__pycache__/managers.cpython-312.pyc,sha256=RpeR1Z0GtSZht4_a4iDfTU_E8P
|
|
|
162
162
|
simo/core/__pycache__/managers.cpython-38.pyc,sha256=6RTIxyjOgpQGtAqcUyE2vFPS09w1V5Wmd_vOV7rHRRI,3370
|
|
163
163
|
simo/core/__pycache__/middleware.cpython-312.pyc,sha256=2VhHTVY-rdPNqNX0wst2ioVbHD5uMqHkY-tpujLdpH0,4195
|
|
164
164
|
simo/core/__pycache__/middleware.cpython-38.pyc,sha256=SgTLFNkKxvJ62hevSAVNZHgHdG_u2p7AZBhrj-jfFPs,2649
|
|
165
|
-
simo/core/__pycache__/models.cpython-312.pyc,sha256=
|
|
165
|
+
simo/core/__pycache__/models.cpython-312.pyc,sha256=z6RR7Rv4POCpVl5acn2VHVhLLRh59YhO1jq_JSO8CmI,31960
|
|
166
166
|
simo/core/__pycache__/models.cpython-38.pyc,sha256=A4JsWsDMBaQ_U5sV5cX0c_Uox9mP5fAqn_712EjfNS4,19605
|
|
167
167
|
simo/core/__pycache__/permissions.cpython-312.pyc,sha256=yqG6t9NZZtL30Hr7razjiG6JDGKiz0Qjcjxgv1C93vM,4450
|
|
168
168
|
simo/core/__pycache__/permissions.cpython-38.pyc,sha256=UdtxCTXPEbe99vgZOfRz9wfKSYvUn9hSRbpIV9CJSyI,2988
|
|
@@ -253,7 +253,7 @@ simo/core/management/_hub_template/hub/celeryc.py,sha256=3ksDXftIZKJ4Cq9WNKJERdZ
|
|
|
253
253
|
simo/core/management/_hub_template/hub/manage.py,sha256=PNNlw3EVeIJDgkG0l-klqoxsKWfTYWG9jzRG0upmAaI,620
|
|
254
254
|
simo/core/management/_hub_template/hub/nginx.conf,sha256=40hvXL42MeiqqkLURNcDQsRudv1dNFLJnvb2-Y3RCkk,2394
|
|
255
255
|
simo/core/management/_hub_template/hub/settings.py,sha256=4QhvhbtLRxHvAntwqG_qeAAtpDUqKvN4jzw9u3vqff8,361
|
|
256
|
-
simo/core/management/_hub_template/hub/supervisor.conf,sha256
|
|
256
|
+
simo/core/management/_hub_template/hub/supervisor.conf,sha256=11c39qVa1V5qf6OOK2PJhqKJXi5wfMhQNwd-TdWq2yA,2393
|
|
257
257
|
simo/core/management/_hub_template/hub/urls.py,sha256=Ydm-1BkYAzWeEF-MKSDIFf-7aE4qNLPm48-SA51XgJQ,25
|
|
258
258
|
simo/core/management/_hub_template/hub/wsgi.py,sha256=Lo-huLHnMDTxSmMBOodVFMWBls9poddrV2KRzXU0xGo,280
|
|
259
259
|
simo/core/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -10308,7 +10308,7 @@ simo/core/templates/admin/action_intermediate_form.html,sha256=rOWF3UDv-SQZUfOzp
|
|
|
10308
10308
|
simo/core/templates/admin/base.html,sha256=yACgUEp8VLmvWwlLM0ygaeorWdn6ykX-7NkXFz3iZAI,6281
|
|
10309
10309
|
simo/core/templates/admin/clearable_easy_thumbnails_widget.html,sha256=Gh0z_KIEt3QC53HKJ_3QiPt9nIFCvwAx1gCny-dPHOM,704
|
|
10310
10310
|
simo/core/templates/admin/component_change_list.html,sha256=N3seVjTkIRXIXKGsleB7oWUnPlMRXDIqOPqfEyq4PNE,3320
|
|
10311
|
-
simo/core/templates/admin/component_history.html,sha256=
|
|
10311
|
+
simo/core/templates/admin/component_history.html,sha256=7vkWSDu5xugkrb79IffJ-CZts9h2EMZr9Gi4tqHBc0I,579
|
|
10312
10312
|
simo/core/templates/admin/formset_widget.html,sha256=NAonHNLyicsoE4Iir3My4AlVSz4Q7-1OA19zgsIOjJA,3563
|
|
10313
10313
|
simo/core/templates/admin/index.html,sha256=AJpt1FA4g6IAFQA99-3glJ88RmoWJ0YXBIz_DUt-R14,4015
|
|
10314
10314
|
simo/core/templates/admin/item_name_display.html,sha256=Y3zk-rc-y8_6dC6_WrSy6tx6Z-6IZzZ5w3a1hMxlpz4,357
|
|
@@ -10404,8 +10404,9 @@ simo/core/utils/__pycache__/type_constants.cpython-38.pyc,sha256=ERC5U7T5pThjLrs
|
|
|
10404
10404
|
simo/core/utils/__pycache__/validators.cpython-312.pyc,sha256=w8-XwptooefG-7gIIngVt1WWssIqNU3P1jPHBoYSYH4,1879
|
|
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
|
-
simo/fleet/admin.py,sha256=
|
|
10407
|
+
simo/fleet/admin.py,sha256=J_kiwYIGMTxnRuytl_YoM7Pxrj5LzlN9xC8E7Ag5yvQ,7006
|
|
10408
10408
|
simo/fleet/api.py,sha256=rJwAYJvp0uslW7O6Q4XOpOa8hfCdy3keUD7b3UNL43E,3424
|
|
10409
|
+
simo/fleet/apps.py,sha256=je8mRXMcRq4lABQZlyF2G2hOCkBUicR9I2jvrLDA8eI,238
|
|
10409
10410
|
simo/fleet/auto_urls.py,sha256=vrfrooPyY4pDuQjya-eLxCgZldfhwbEeEiXa7diO_CY,847
|
|
10410
10411
|
simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
|
|
10411
10412
|
simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
|
|
@@ -10413,19 +10414,20 @@ simo/fleet/controllers.py,sha256=HV6onYd11YAc_f_8NFHAbv5IJZUEd1bDGTRMQtfFe-g,289
|
|
|
10413
10414
|
simo/fleet/forms.py,sha256=VcqATlX-omZruUgUC2fJpeLNUGSR-szmf36_M3aa5dg,66850
|
|
10414
10415
|
simo/fleet/gateways.py,sha256=C7dyapWDlJ5erYPNLkSoH50I8kj0lIXicSno0_CrdXc,5783
|
|
10415
10416
|
simo/fleet/managers.py,sha256=ZNeHFSkF5kzsl9E1DCBevOW6kXJlD6kw0LU4B-JMOG8,828
|
|
10416
|
-
simo/fleet/models.py,sha256=
|
|
10417
|
+
simo/fleet/models.py,sha256=lPiIurCNK--4mPFsg_QLo6GHbpYfE8Aju_G4VAKsRLM,17895
|
|
10417
10418
|
simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
|
|
10418
10419
|
simo/fleet/serializers.py,sha256=PQnjp7LaEpMts-om2OPV5XOU9ut6KFWiePPDCXK0M98,2679
|
|
10419
|
-
simo/fleet/socket_consumers.py,sha256=
|
|
10420
|
-
simo/fleet/tasks.py,sha256=
|
|
10420
|
+
simo/fleet/socket_consumers.py,sha256=fFsnpAvItGT1tYbkAkpTxBjG5v0cT-o-fmQRM9S1wsg,19630
|
|
10421
|
+
simo/fleet/tasks.py,sha256=VSY0cMFIs7Ocjz0_HwRLp-yaDdBl1T8U9T-7b8Ggegc,1308
|
|
10421
10422
|
simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
|
|
10422
10423
|
simo/fleet/views.py,sha256=3F8im6BsSOaK3KEuBNESE4sDbS_dWHYaOdhTR4cCLjE,5189
|
|
10423
10424
|
simo/fleet/__pycache__/__init__.cpython-312.pyc,sha256=-BZyG4uq87W18Ra1pKTjSzDgiLEAcw254NqdRX-vSJo,165
|
|
10424
10425
|
simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
|
|
10425
|
-
simo/fleet/__pycache__/admin.cpython-312.pyc,sha256=
|
|
10426
|
+
simo/fleet/__pycache__/admin.cpython-312.pyc,sha256=8TOuku1Atv-LyaVi4OICTc43iBFPgxCjrgjA9q6CN1s,9890
|
|
10426
10427
|
simo/fleet/__pycache__/admin.cpython-38.pyc,sha256=iweeu5AkaggBhQntP6-VF_eEodkNc6E7zKy0VjfwC2o,6652
|
|
10427
10428
|
simo/fleet/__pycache__/api.cpython-312.pyc,sha256=OM7s1FqGqTC2vwOOto0GhZrObEnI58SxMcTWaPtHD4Y,5892
|
|
10428
10429
|
simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rZ1mkfkaMBEXhi9sw_jTKdk2CPJhBNxoImtjQ3Rf1VY,4016
|
|
10430
|
+
simo/fleet/__pycache__/apps.cpython-312.pyc,sha256=S8OK4R0W9VbNfD4Nos_CybjZ3AXS8CxvRaRUJO57xQA,707
|
|
10429
10431
|
simo/fleet/__pycache__/auto_urls.cpython-312.pyc,sha256=32yXKNoqMxNgYvsspUgx1A84LVQqr8LP4BRvURNCgeY,1026
|
|
10430
10432
|
simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=jHsvfwAumiBusr91QK1-qC-nmpPEC3r2uMGG8g0fABE,769
|
|
10431
10433
|
simo/fleet/__pycache__/base_types.cpython-312.pyc,sha256=cq-Pnje7FoMP608U_L_gsCfY_JMY23z87Uao-AxjNBw,304
|
|
@@ -10439,13 +10441,13 @@ simo/fleet/__pycache__/gateways.cpython-312.pyc,sha256=ZZGBAH2w9YmFvSrajZY8fUXd_
|
|
|
10439
10441
|
simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=MIpXuGWitGNdsxJ99fWvMXJ6sVE96ac7iR4K4aM4Sds,5148
|
|
10440
10442
|
simo/fleet/__pycache__/managers.cpython-312.pyc,sha256=sgcaERbhjilkFDCPqc8YZwSiEfRkXpufe0qDPqgLOiU,1733
|
|
10441
10443
|
simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=Vmm23zoQnS3-uS5_WJt2n3wtjhLiEhLWaYxXJCU6Gts,1339
|
|
10442
|
-
simo/fleet/__pycache__/models.cpython-312.pyc,sha256=
|
|
10444
|
+
simo/fleet/__pycache__/models.cpython-312.pyc,sha256=OkCAXSrrMaxfsclJQV0yhlcBFerKV-xA7FQfR-2e7e0,25400
|
|
10443
10445
|
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=AXk1Q_nnHDXirHYgM3EW5pLsrR2CaPWk4EuvGCuDUpI,14131
|
|
10444
10446
|
simo/fleet/__pycache__/routing.cpython-312.pyc,sha256=vafYpGAtYc2NYxBQObMX6eIZfVZflOYgzjYv0SL1jAQ,385
|
|
10445
10447
|
simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
|
|
10446
10448
|
simo/fleet/__pycache__/serializers.cpython-312.pyc,sha256=reKKBMohl7vi7iJ6wjRbOBoFn7J9ny8EE9wv5spBHYM,4912
|
|
10447
10449
|
simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=l_FzORWCM1hcSZV0AaGRO-p0CMTcEfqnLGgbn2IVvI0,3648
|
|
10448
|
-
simo/fleet/__pycache__/socket_consumers.cpython-312.pyc,sha256=
|
|
10450
|
+
simo/fleet/__pycache__/socket_consumers.cpython-312.pyc,sha256=r2n7h89t1HgI16UdUsaR9nrFFPgb-b2z9emn2eMdPZQ,28536
|
|
10449
10451
|
simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=lEC1SkY_KgRY0QoBUMPjnbFwSa7qmCf-4eNQ45hAy68,14141
|
|
10450
10452
|
simo/fleet/__pycache__/tasks.cpython-312.pyc,sha256=1XDir2GWxl7c17n0ZuCxOFKsLjaCqXgqVT4TcDvzhm8,1817
|
|
10451
10453
|
simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
|
|
@@ -10588,6 +10590,7 @@ simo/fleet/migrations/__pycache__/0044_auto_20241210_0707.cpython-312.pyc,sha256
|
|
|
10588
10590
|
simo/fleet/migrations/__pycache__/0044_auto_20241210_0707.cpython-38.pyc,sha256=M99PMBDgOdS_0KIEhlUamHWeTVCTdIHFXIvYTRX15Z8,1029
|
|
10589
10591
|
simo/fleet/migrations/__pycache__/__init__.cpython-312.pyc,sha256=1rujN3qD3L0Q2MRB-gxwRKyShgUTX9NBpDGaIl42ozU,176
|
|
10590
10592
|
simo/fleet/migrations/__pycache__/__init__.cpython-38.pyc,sha256=5k1KW0jeSDzw6RnVPRq4CaO13Lg7M0F-pxA_gqqZ6Mg,170
|
|
10593
|
+
simo/fleet/templates/admin/colonel_history.html,sha256=YfA6LDVExk1sAWhBuiCLA6vb3XcBNN7_fpJNZzGFtB0,169
|
|
10591
10594
|
simo/fleet/templates/fleet/controllers_info/Button.md,sha256=GIuxqG617174NEtpPeCGVocxO4YMe7-CacgVSu_L5-E,739
|
|
10592
10595
|
simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LSTY9YPFuVPIbVsYCAifcotrXJcOXl2k774_vo6nAE,770
|
|
10593
10596
|
simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -10930,9 +10933,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
10930
10933
|
simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10931
10934
|
simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10932
10935
|
simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10933
|
-
simo-2.8.
|
|
10934
|
-
simo-2.8.
|
|
10935
|
-
simo-2.8.
|
|
10936
|
-
simo-2.8.
|
|
10937
|
-
simo-2.8.
|
|
10938
|
-
simo-2.8.
|
|
10936
|
+
simo-2.8.6.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
|
|
10937
|
+
simo-2.8.6.dist-info/METADATA,sha256=mFNkzajYfWS7t90qazcDEGula2-oxIgJyKptnT7M4DY,2005
|
|
10938
|
+
simo-2.8.6.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
10939
|
+
simo-2.8.6.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
|
|
10940
|
+
simo-2.8.6.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
|
|
10941
|
+
simo-2.8.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|