simo 2.0.15__py3-none-any.whl → 2.0.17__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__/forms.cpython-38.pyc +0 -0
- simo/core/__pycache__/models.cpython-38.pyc +0 -0
- simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
- simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
- simo/core/forms.py +23 -0
- simo/core/models.py +2 -2
- simo/core/serializers.py +2 -1
- simo/core/tasks.py +3 -6
- simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/models.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/tasks.cpython-38.pyc +0 -0
- simo/fleet/forms.py +18 -3
- simo/fleet/models.py +2 -2
- simo/fleet/tasks.py +25 -0
- simo/generic/__pycache__/forms.cpython-38.pyc +0 -0
- simo/generic/__pycache__/models.cpython-38.pyc +0 -0
- simo/generic/forms.py +14 -2
- simo/generic/models.py +41 -0
- simo/users/__pycache__/models.cpython-38.pyc +0 -0
- simo/users/models.py +1 -1
- {simo-2.0.15.dist-info → simo-2.0.17.dist-info}/METADATA +1 -1
- {simo-2.0.15.dist-info → simo-2.0.17.dist-info}/RECORD +25 -23
- {simo-2.0.15.dist-info → simo-2.0.17.dist-info}/LICENSE.md +0 -0
- {simo-2.0.15.dist-info → simo-2.0.17.dist-info}/WHEEL +0 -0
- {simo-2.0.15.dist-info → simo-2.0.17.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/core/forms.py
CHANGED
|
@@ -507,11 +507,22 @@ class SwitchForm(BaseComponentForm):
|
|
|
507
507
|
)
|
|
508
508
|
)
|
|
509
509
|
|
|
510
|
+
def __init__(self, *args, **kwargs):
|
|
511
|
+
super().__init__(*args, **kwargs)
|
|
512
|
+
if self.instance.pk:
|
|
513
|
+
self.fields['slaves'].initial = self.instance.slaves.all()
|
|
514
|
+
|
|
510
515
|
def clean_slaves(self):
|
|
511
516
|
if not self.cleaned_data['slaves'] or not self.instance:
|
|
512
517
|
return self.cleaned_data['slaves']
|
|
513
518
|
return validate_slaves(self.cleaned_data['slaves'], self.instance)
|
|
514
519
|
|
|
520
|
+
def save(self, commit=True):
|
|
521
|
+
obj = super().save(commit=commit)
|
|
522
|
+
if commit:
|
|
523
|
+
obj.slaves.set(self.cleaned_data['slaves'])
|
|
524
|
+
return obj
|
|
525
|
+
|
|
515
526
|
|
|
516
527
|
class DoubleSwitchConfigForm(BaseComponentForm):
|
|
517
528
|
icon_1 = forms.ModelChoiceField(
|
|
@@ -634,11 +645,23 @@ class DimmerConfigForm(BaseComponentForm):
|
|
|
634
645
|
)
|
|
635
646
|
)
|
|
636
647
|
|
|
648
|
+
def __init__(self, *args, **kwargs):
|
|
649
|
+
super().__init__(*args, **kwargs)
|
|
650
|
+
if self.instance.pk:
|
|
651
|
+
self.fields['slaves'].initial = self.instance.slaves.all()
|
|
652
|
+
|
|
637
653
|
def clean_slaves(self):
|
|
638
654
|
if not self.cleaned_data['slaves'] or not self.instance:
|
|
639
655
|
return self.cleaned_data['slaves']
|
|
640
656
|
return validate_slaves(self.cleaned_data['slaves'], self.instance)
|
|
641
657
|
|
|
658
|
+
def save(self, commit=True):
|
|
659
|
+
self.instance.config['output_pin_no'] = self.cleaned_data['output_pin'].no
|
|
660
|
+
obj = super().save(commit=commit)
|
|
661
|
+
if commit:
|
|
662
|
+
obj.slaves.set(self.cleaned_data['slaves'])
|
|
663
|
+
return obj
|
|
664
|
+
|
|
642
665
|
|
|
643
666
|
class DimmerPlusConfigForm(BaseComponentForm):
|
|
644
667
|
main_min = forms.FloatField(
|
simo/core/models.py
CHANGED
|
@@ -79,7 +79,7 @@ class Instance(DirtyFieldsMixin, models.Model, SimoAdminMixin):
|
|
|
79
79
|
)
|
|
80
80
|
name = models.CharField(max_length=100, db_index=True, unique=True)
|
|
81
81
|
slug = models.CharField(max_length=100, db_index=True, unique=True)
|
|
82
|
-
cover_image =
|
|
82
|
+
cover_image = models.ImageField(
|
|
83
83
|
upload_to='hub_covers', null=True, blank=True
|
|
84
84
|
)
|
|
85
85
|
cover_image_synced = models.BooleanField(default=False)
|
|
@@ -151,7 +151,7 @@ class Category(DirtyFieldsMixin, models.Model, SimoAdminMixin):
|
|
|
151
151
|
instance = models.ForeignKey(Instance, on_delete=models.CASCADE)
|
|
152
152
|
name = models.CharField(_('name'), max_length=40)
|
|
153
153
|
icon = models.ForeignKey(Icon, on_delete=models.SET_NULL, null=True)
|
|
154
|
-
header_image =
|
|
154
|
+
header_image = models.ImageField(
|
|
155
155
|
upload_to='categories', null=True, blank=True,
|
|
156
156
|
help_text="Will be cropped down to: 830x430"
|
|
157
157
|
)
|
simo/core/serializers.py
CHANGED
|
@@ -51,7 +51,8 @@ class CategorySerializer(serializers.ModelSerializer):
|
|
|
51
51
|
|
|
52
52
|
def get_header_image_thumb(self, obj):
|
|
53
53
|
if obj.header_image:
|
|
54
|
-
|
|
54
|
+
thumbnailer = get_thumbnailer(obj.header_image.path)
|
|
55
|
+
url = thumbnailer.get_thumbnail(
|
|
55
56
|
{'size': (830, 430), 'crop': True}
|
|
56
57
|
).url
|
|
57
58
|
request = get_current_request()
|
simo/core/tasks.py
CHANGED
|
@@ -7,20 +7,16 @@ import datetime
|
|
|
7
7
|
import requests
|
|
8
8
|
import subprocess
|
|
9
9
|
import threading
|
|
10
|
-
import simo
|
|
11
10
|
import pkg_resources
|
|
12
11
|
from django.db.models import Q
|
|
13
12
|
from django.db import connection
|
|
14
|
-
from django.db import transaction
|
|
15
13
|
from django.template.loader import render_to_string
|
|
16
|
-
from easy_thumbnails.files import get_thumbnailer
|
|
17
14
|
from celeryc import celery_app
|
|
18
15
|
from django.utils import timezone
|
|
19
|
-
from
|
|
16
|
+
from easy_thumbnails.files import get_thumbnailer
|
|
20
17
|
from simo.conf import dynamic_settings
|
|
21
18
|
from simo.core.utils.helpers import get_self_ip
|
|
22
19
|
from .models import Instance, Component, ComponentHistory, HistoryAggregate
|
|
23
|
-
from .utils.helpers import get_random_string, is_update_available
|
|
24
20
|
|
|
25
21
|
|
|
26
22
|
def supervisor_restart():
|
|
@@ -150,7 +146,8 @@ def sync_with_remote():
|
|
|
150
146
|
if instance.share_location:
|
|
151
147
|
instance_data['location'] = instance.location
|
|
152
148
|
if instance.cover_image and not instance.cover_image_synced:
|
|
153
|
-
|
|
149
|
+
thumbnailer = get_thumbnailer(instance.cover_image.path)
|
|
150
|
+
cover_imb_path = thumbnailer.get_thumbnail(
|
|
154
151
|
{'size': (880, 490), 'crop': True}
|
|
155
152
|
).path
|
|
156
153
|
with open(cover_imb_path, 'rb') as img:
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/fleet/forms.py
CHANGED
|
@@ -526,12 +526,16 @@ class ColonelSwitchConfigForm(ColonelComponentForm):
|
|
|
526
526
|
)
|
|
527
527
|
)
|
|
528
528
|
|
|
529
|
+
def __init__(self, *args, **kwargs):
|
|
530
|
+
super().__init__(*args, **kwargs)
|
|
531
|
+
if self.instance.pk:
|
|
532
|
+
self.fields['slaves'].initial = self.instance.slaves.all()
|
|
533
|
+
|
|
529
534
|
def clean_slaves(self):
|
|
530
535
|
if not self.cleaned_data['slaves'] or not self.instance:
|
|
531
536
|
return self.cleaned_data['slaves']
|
|
532
537
|
return validate_slaves(self.cleaned_data['slaves'], self.instance)
|
|
533
538
|
|
|
534
|
-
|
|
535
539
|
def clean(self):
|
|
536
540
|
super().clean()
|
|
537
541
|
if not self.cleaned_data.get('colonel'):
|
|
@@ -551,7 +555,10 @@ class ColonelSwitchConfigForm(ColonelComponentForm):
|
|
|
551
555
|
|
|
552
556
|
def save(self, commit=True):
|
|
553
557
|
self.instance.config['output_pin_no'] = self.cleaned_data['output_pin'].no
|
|
554
|
-
|
|
558
|
+
obj = super().save(commit=commit)
|
|
559
|
+
if commit:
|
|
560
|
+
obj.slaves.set(self.cleaned_data['slaves'])
|
|
561
|
+
return obj
|
|
555
562
|
|
|
556
563
|
|
|
557
564
|
class ColonelPWMOutputConfigForm(ColonelComponentForm):
|
|
@@ -625,6 +632,11 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
|
|
|
625
632
|
)
|
|
626
633
|
)
|
|
627
634
|
|
|
635
|
+
def __init__(self, *args, **kwargs):
|
|
636
|
+
super().__init__(*args, **kwargs)
|
|
637
|
+
if self.instance.pk:
|
|
638
|
+
self.fields['slaves'].initial = self.instance.slaves.all()
|
|
639
|
+
|
|
628
640
|
def clean_slaves(self):
|
|
629
641
|
if not self.cleaned_data['slaves'] or not self.instance:
|
|
630
642
|
return self.cleaned_data['slaves']
|
|
@@ -649,7 +661,10 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
|
|
|
649
661
|
|
|
650
662
|
def save(self, commit=True):
|
|
651
663
|
self.instance.config['output_pin_no'] = self.cleaned_data['output_pin'].no
|
|
652
|
-
|
|
664
|
+
obj = super().save(commit=commit)
|
|
665
|
+
if commit:
|
|
666
|
+
obj.slaves.set(self.cleaned_data['slaves'])
|
|
667
|
+
return obj
|
|
653
668
|
|
|
654
669
|
|
|
655
670
|
class ColonelRGBLightConfigForm(ColonelComponentForm):
|
simo/fleet/models.py
CHANGED
|
@@ -101,9 +101,9 @@ class Colonel(DirtyFieldsMixin, models.Model):
|
|
|
101
101
|
return self.name if self.name else self.uid
|
|
102
102
|
|
|
103
103
|
def save(self, *args, **kwargs):
|
|
104
|
-
if 'socket_connected' in self.get_dirty_fields() and self.
|
|
104
|
+
if 'socket_connected' in self.get_dirty_fields() and self.socket_connected:
|
|
105
105
|
for comp in self.components.all():
|
|
106
|
-
comp.alive =
|
|
106
|
+
comp.alive = True
|
|
107
107
|
comp.save()
|
|
108
108
|
|
|
109
109
|
if self.minor_upgrade_available and self.firmware_version == self.minor_upgrade_available:
|
simo/fleet/tasks.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
from django.db.models import Prefetch
|
|
3
|
+
from django.utils import timezone
|
|
4
|
+
from celeryc import celery_app
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@celery_app.task
|
|
8
|
+
def check_colonel_components_alive():
|
|
9
|
+
from simo.core.models import Component
|
|
10
|
+
from .models import Colonel
|
|
11
|
+
for lost_colonel in Colonel.objects.filter(
|
|
12
|
+
last_seen__lt=timezone.now() - datetime.timedelta(seconds=60)
|
|
13
|
+
).prefetch_related(Prefetch(
|
|
14
|
+
'components', queryset=Component.objects.filter(alive=True),
|
|
15
|
+
to_attr='alive_components'
|
|
16
|
+
)):
|
|
17
|
+
for comp in lost_colonel.alive_components:
|
|
18
|
+
print(f"{comp} is no longer alive!")
|
|
19
|
+
comp.alive = False
|
|
20
|
+
comp.save()
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@celery_app.on_after_finalize.connect
|
|
24
|
+
def setup_periodic_tasks(sender, **kwargs):
|
|
25
|
+
sender.add_periodic_task(20, check_colonel_components_alive.s())
|
|
Binary file
|
|
Binary file
|
simo/generic/forms.py
CHANGED
|
@@ -218,6 +218,16 @@ class AlarmGroupConfigForm(BaseComponentForm):
|
|
|
218
218
|
required=False,
|
|
219
219
|
help_text="Defines if this is your main/top global alarm group."
|
|
220
220
|
)
|
|
221
|
+
arm_on_away = forms.ChoiceField(
|
|
222
|
+
required=False,
|
|
223
|
+
choices=(
|
|
224
|
+
(None, "No"),
|
|
225
|
+
('on_away', "Yes"),
|
|
226
|
+
('on_away_and_locked', "Yes, but only if at least one arming lock is Locked."),
|
|
227
|
+
('on_away_and_locked_all', "Yes, but only if all arming locks are Locked."),
|
|
228
|
+
),
|
|
229
|
+
help_text="Arm automatically as soon as everybody leaves.<br>"
|
|
230
|
+
)
|
|
221
231
|
arming_locks = forms.ModelMultipleChoiceField(
|
|
222
232
|
Component.objects.filter(base_type='lock'),
|
|
223
233
|
label="Arming locks", required=False,
|
|
@@ -228,7 +238,9 @@ class AlarmGroupConfigForm(BaseComponentForm):
|
|
|
228
238
|
)
|
|
229
239
|
),
|
|
230
240
|
help_text="Alarm group will get armed automatically whenever "
|
|
231
|
-
"any of assigned locks
|
|
241
|
+
"any of assigned locks changes it's state to locked. <br>"
|
|
242
|
+
"If Arm on away is enabled and set to work with arming locks, "
|
|
243
|
+
"arming will take effect only after everybody leaves."
|
|
232
244
|
)
|
|
233
245
|
disarming_locks = forms.ModelMultipleChoiceField(
|
|
234
246
|
Component.objects.filter(base_type='lock'),
|
|
@@ -240,7 +252,7 @@ class AlarmGroupConfigForm(BaseComponentForm):
|
|
|
240
252
|
)
|
|
241
253
|
),
|
|
242
254
|
help_text="Alarm group will be disarmed automatically whenever "
|
|
243
|
-
"any of assigned locks
|
|
255
|
+
"any of assigned locks changes it's state to unlocked. "
|
|
244
256
|
)
|
|
245
257
|
notify_on_breach = forms.IntegerField(
|
|
246
258
|
required=False, min_value=0,
|
simo/generic/models.py
CHANGED
|
@@ -5,6 +5,7 @@ from threading import Timer
|
|
|
5
5
|
from django.db.models.signals import pre_save, post_save, post_delete
|
|
6
6
|
from django.dispatch import receiver
|
|
7
7
|
from simo.core.models import Instance, Component
|
|
8
|
+
from simo.users.models import InstanceUser
|
|
8
9
|
from .controllers import AlarmGroup
|
|
9
10
|
|
|
10
11
|
|
|
@@ -124,6 +125,10 @@ def bind_controlling_locks_to_alarm_groups(sender, instance, *args, **kwargs):
|
|
|
124
125
|
base_type=AlarmGroup.base_type,
|
|
125
126
|
config__arming_locks__contains=instance.id
|
|
126
127
|
):
|
|
128
|
+
if ag.config.get(
|
|
129
|
+
'arm_on_away', ''
|
|
130
|
+
).startswith('on_away_and_locked'):
|
|
131
|
+
continue
|
|
127
132
|
ag.arm()
|
|
128
133
|
elif instance.value == 'unlocked':
|
|
129
134
|
for ag in Component.objects.filter(
|
|
@@ -132,3 +137,39 @@ def bind_controlling_locks_to_alarm_groups(sender, instance, *args, **kwargs):
|
|
|
132
137
|
):
|
|
133
138
|
ag.disarm()
|
|
134
139
|
|
|
140
|
+
|
|
141
|
+
@receiver(post_save, sender=InstanceUser)
|
|
142
|
+
def bind_alarm_groups(sender, instance, created, *args, **kwargs):
|
|
143
|
+
if created:
|
|
144
|
+
return
|
|
145
|
+
if instance.at_home:
|
|
146
|
+
return
|
|
147
|
+
if 'at_home' not in instance.get_dirty_fields():
|
|
148
|
+
return
|
|
149
|
+
users_at_home = InstanceUser.objects.filter(
|
|
150
|
+
instance=instance.instance, at_home=True
|
|
151
|
+
).exclude(is_active=False).exclude(instance.id)
|
|
152
|
+
if not users_at_home.count():
|
|
153
|
+
for ag in Component.objects.filter(
|
|
154
|
+
zone__instance=instance.instance,
|
|
155
|
+
base_type=AlarmGroup.base_type,
|
|
156
|
+
config__has_key='arm_on_away'
|
|
157
|
+
).exclude(config__arm_on_away=None):
|
|
158
|
+
if ag.config.get('arm_on_away') == 'on_away':
|
|
159
|
+
ag.arm()
|
|
160
|
+
elif ag.config.get('arm_on_away').startswith('on_away_and_locked'):
|
|
161
|
+
locked_states = [
|
|
162
|
+
True if l['value'] == 'locked' else False
|
|
163
|
+
for l in Component.objects.filter(
|
|
164
|
+
base_type='lock', id__in=ag.config.get('arming_locks', []),
|
|
165
|
+
).values('value')
|
|
166
|
+
]
|
|
167
|
+
if not any(locked_states):
|
|
168
|
+
continue
|
|
169
|
+
if ag.config['arm_on_away'] == 'on_away_and_locked':
|
|
170
|
+
ag.arm()
|
|
171
|
+
continue
|
|
172
|
+
if ag.config['arm_on_away'] == 'on_away_and_locked_all' \
|
|
173
|
+
and all(locked_states):
|
|
174
|
+
ag.arm()
|
|
175
|
+
continue
|
|
Binary file
|
simo/users/models.py
CHANGED
|
@@ -113,7 +113,7 @@ def post_instance_user_save(sender, instance, created, **kwargs):
|
|
|
113
113
|
if 'at_home' in dirty_fields:
|
|
114
114
|
def post_update():
|
|
115
115
|
ObjectChangeEvent(
|
|
116
|
-
instance, dirty_fields=dirty_fields
|
|
116
|
+
instance.instance, instance, dirty_fields=dirty_fields
|
|
117
117
|
).publish()
|
|
118
118
|
transaction.on_commit(post_update)
|
|
119
119
|
if 'role' or 'is_active' in instance.dirty_fields:
|
|
@@ -38,19 +38,19 @@ simo/core/controllers.py,sha256=2NH1xZFA4_YWNjJWjHqEvCB6SerebiQ5eHZix_xYvx8,2696
|
|
|
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=
|
|
41
|
+
simo/core/forms.py,sha256=iI3tiHMbjSrjldH8W8OYh8qJyT8QTVtfYczTPINY1ds,22502
|
|
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=WoQ4OX3akIvoroSYji-nLVqXBSJzCiC1u_IiWkKbKmA,2413
|
|
45
45
|
simo/core/middleware.py,sha256=64PYjnyRnYf4sgMvPfR0oQqf9UEtxUwnhJe3RV6z_HI,2040
|
|
46
|
-
simo/core/models.py,sha256=
|
|
46
|
+
simo/core/models.py,sha256=dPLPju4xxc46x9JciOTC65SFSPogboXyNxjwrewXB1Y,19400
|
|
47
47
|
simo/core/permissions.py,sha256=UmFjGPDWtAUbaWxJsWORb2q6BREHqndv9mkSIpnmdLk,1379
|
|
48
48
|
simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
|
|
49
|
-
simo/core/serializers.py,sha256=
|
|
49
|
+
simo/core/serializers.py,sha256=1A0CW85d8U_xX5JSda7DHuQ_RigCcRxBE5VNhNEoYqQ,17161
|
|
50
50
|
simo/core/signal_receivers.py,sha256=EZ8NSYZxUgSaLS16YZdK7T__l8dl0joMRllOxx5PUt4,2809
|
|
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=
|
|
53
|
+
simo/core/tasks.py,sha256=K64_8msFxUnggQDD2lBhtv4l7WliajQTlJNwe-m4BvY,10920
|
|
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
|
|
@@ -69,19 +69,19 @@ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=WmItOZU7CPqyYhxxB1F9I7QA
|
|
|
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=
|
|
72
|
+
simo/core/__pycache__/forms.cpython-38.pyc,sha256=iuxu0J6KHGL2TJl2nPIrVEkSFurM9N95kHFI-OAfT34,19047
|
|
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=5vstOMfm997CZBBkaSiaS7EojhLTWZlbeA_EQ8u-yfg,2554
|
|
76
76
|
simo/core/__pycache__/middleware.cpython-38.pyc,sha256=bGOFJNEhJeLbpsZp8LYn1VA3paLF5HULHQ6IFKa7Juc,2022
|
|
77
|
-
simo/core/__pycache__/models.cpython-38.pyc,sha256=
|
|
77
|
+
simo/core/__pycache__/models.cpython-38.pyc,sha256=J3VZfFaU-aMkptCoviPvAJzJ8zBptGHmt504zjf2TCI,17006
|
|
78
78
|
simo/core/__pycache__/permissions.cpython-38.pyc,sha256=uygjPbfRQiEzyo5-McCxsuMDJLbDYO_TLu55U7bJbR0,1809
|
|
79
79
|
simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
|
|
80
|
-
simo/core/__pycache__/serializers.cpython-38.pyc,sha256=
|
|
80
|
+
simo/core/__pycache__/serializers.cpython-38.pyc,sha256=NbXYWaJMtJebncJdhHt1uaKtCICU7G9Oe-uj0AWO7ds,16578
|
|
81
81
|
simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=sgjH_wv-1U99auH5uHb3or0qettPeHAlsz8P7B03ajY,2430
|
|
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
|
|
84
|
-
simo/core/__pycache__/tasks.cpython-38.pyc,sha256=
|
|
84
|
+
simo/core/__pycache__/tasks.cpython-38.pyc,sha256=9L1a14-cifiS4WSS7SliJ2486tpL245YbPkmUiCUe3A,8244
|
|
85
85
|
simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
|
|
86
86
|
simo/core/__pycache__/views.cpython-38.pyc,sha256=YrKRZPaV_JM4VGpdhVhsK-90UwUTOqp-V-Yj0SRGZgs,4212
|
|
87
87
|
simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
|
|
@@ -10169,13 +10169,14 @@ simo/fleet/auto_urls.py,sha256=X04oKJWA48wFW5iXg3PPROY2KDdHn_a99orQSE28QC4,518
|
|
|
10169
10169
|
simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
|
|
10170
10170
|
simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
|
|
10171
10171
|
simo/fleet/controllers.py,sha256=rTxRFf-LKWAZxzixrsLZHHm51BmMx9a1PLdgf6inlNM,20533
|
|
10172
|
-
simo/fleet/forms.py,sha256=
|
|
10172
|
+
simo/fleet/forms.py,sha256=ucH9mkwHDA8iUaxVP5W9O8tyoKUb7N2V0KCVSD-oCWI,38237
|
|
10173
10173
|
simo/fleet/gateways.py,sha256=KV5i5fxXIrlK-k6zyEkk83x11GJt-ELQ0npb4Ac83cM,3693
|
|
10174
10174
|
simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
|
|
10175
|
-
simo/fleet/models.py,sha256=
|
|
10175
|
+
simo/fleet/models.py,sha256=1Wb9xPc61OtoiYu9aS4KezchPGZTC4CDxa2dqVhltqM,14161
|
|
10176
10176
|
simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
|
|
10177
10177
|
simo/fleet/serializers.py,sha256=zEpXAXxjk4Rf1JhlNnLTrs20qJggqjvIySbeHVo4Tt4,1505
|
|
10178
10178
|
simo/fleet/socket_consumers.py,sha256=Z-MooNN2HQccdhkynADJks5slbK9mGsnEpMLuA51H3I,18534
|
|
10179
|
+
simo/fleet/tasks.py,sha256=AGq9BXFNAqkhOANsPvId8yjEbDtVCB3MRsi_AKDpgIM,821
|
|
10179
10180
|
simo/fleet/utils.py,sha256=2gcjbwQawsGw2edr_wm9q6XacGpYqO-gd4BF1t0Hg6U,3511
|
|
10180
10181
|
simo/fleet/views.py,sha256=YKkcf8KcLgiPjr-brIHvu5yr1zZUIs8aytAgwdo49Pg,1694
|
|
10181
10182
|
simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
|
|
@@ -10185,13 +10186,14 @@ simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=SqyTuaz_kEBvx-bL46SclsZEE
|
|
|
10185
10186
|
simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
|
|
10186
10187
|
simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
|
|
10187
10188
|
simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=l9bz18Qp33C12TJOKPSn9vIXnlBKnBusODNk7Fg64qA,18103
|
|
10188
|
-
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=
|
|
10189
|
+
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=vFMihKqwLKQRO9GoErkNZwGmDPQd6OYywh9iiZ8rf84,27566
|
|
10189
10190
|
simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=YAcgTOqJbtjGI03lvEcU6keFfrwAHkObVmErYzfRvjk,3569
|
|
10190
10191
|
simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
|
|
10191
|
-
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=
|
|
10192
|
+
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=DQtRR6kI9bt3atgJ0pArCVfSyuutqb6SpxYrsBg10cM,12277
|
|
10192
10193
|
simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
|
|
10193
10194
|
simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=yuY2H7jcboQGZdjb5WIsgNHXFhI9IPMUrEu9NgSiXNo,2452
|
|
10194
10195
|
simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=RjzPD580096fby0HYLzZorm61zdZNOq5AHXmNAC4Yd8,13764
|
|
10196
|
+
simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
|
|
10195
10197
|
simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=dTuvW9MnhUycwdCc6eHYfHsMlvZw-CmEWXWYu18X8Uw,1955
|
|
10196
10198
|
simo/fleet/__pycache__/views.cpython-38.pyc,sha256=7hhRBlf6Vczg0TTdwTE5Hc5B-F7VcvFg1iS6mfs-fgo,1790
|
|
10197
10199
|
simo/fleet/migrations/0001_initial.py,sha256=lce8nkD8Sz6pYr-XJSpDm4CMDuB6TA__WtnHpIp-eA4,1326
|
|
@@ -10268,18 +10270,18 @@ simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
10268
10270
|
simo/generic/app_widgets.py,sha256=E_pnpA1hxMIhenRCrHoQ5cik06jm2BAHCkl_eo-OudU,1264
|
|
10269
10271
|
simo/generic/base_types.py,sha256=djymox_boXTHX1BTTCLXrCH7ED-uAsV_idhaDOc3OLI,409
|
|
10270
10272
|
simo/generic/controllers.py,sha256=WYuOUzDWvkYRaTvlbdGy_qmwp1o_ohqKDfV7OrOq2QU,52218
|
|
10271
|
-
simo/generic/forms.py,sha256=
|
|
10273
|
+
simo/generic/forms.py,sha256=U6MIS5U7jLG6XabqCZvrfSoiNCQiWZYE8VZPnyN3SJw,23757
|
|
10272
10274
|
simo/generic/gateways.py,sha256=b3tQ2bAkDVYXCF5iZi2yi-6nZAM8WmHE9ICwxMyR0to,17034
|
|
10273
|
-
simo/generic/models.py,sha256=
|
|
10275
|
+
simo/generic/models.py,sha256=iUE1-PVyAPvOkxczU6sXZKUwWVQxkljtx2E4g9WstnU,6711
|
|
10274
10276
|
simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
|
|
10275
10277
|
simo/generic/socket_consumers.py,sha256=NfTQGYtVAc864IoogZRxf_0xpDPM0eMCWn0SlKA5P7Y,1751
|
|
10276
10278
|
simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
|
|
10277
10279
|
simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=0IoKRG9n1tkNRRkrqAeOQwWBPd_33u98JBcVtMVVCio,2374
|
|
10278
10280
|
simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=ptw6axyAqemZA35oa6vzr7EihzvbhW9w7Y-G6kfDedU,555
|
|
10279
10281
|
simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=e0bvgyePgJbIs1omBq0TRPlVSKar2sK_JbUKqDRj7mY,33235
|
|
10280
|
-
simo/generic/__pycache__/forms.cpython-38.pyc,sha256=
|
|
10282
|
+
simo/generic/__pycache__/forms.cpython-38.pyc,sha256=lqpRTX5rnrkyJZ5Dga4e9y2WJ81r394AW5DV4KkvxXQ,17856
|
|
10281
10283
|
simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=a4lLIMPyxm9tNzIqorXHIPZFVTcXlPsM1ycJMghxcHA,12673
|
|
10282
|
-
simo/generic/__pycache__/models.cpython-38.pyc,sha256=
|
|
10284
|
+
simo/generic/__pycache__/models.cpython-38.pyc,sha256=GQeX2Y6diAiDKwd43RvSjRF3jGpkvXSu3ja7daEfQSA,5006
|
|
10283
10285
|
simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
|
|
10284
10286
|
simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=piFHces0J9QuXu_CNBCQCYjoZEeoaxyVjLfJ9KaR8C8,1898
|
|
10285
10287
|
simo/generic/static/weather_icons/01d@2x.png,sha256=TZfWi6Rfddb2P-oldWWcjUiuCHiU9Yrc5hyrQAhF26I,948
|
|
@@ -10359,7 +10361,7 @@ simo/users/auth_backends.py,sha256=I5pnaTa20-Lxfw_dFG8471xDITb0_fQl1PVhJalp5vU,3
|
|
|
10359
10361
|
simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
|
|
10360
10362
|
simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
|
|
10361
10363
|
simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
|
|
10362
|
-
simo/users/models.py,sha256=
|
|
10364
|
+
simo/users/models.py,sha256=Sr2T0GaN8l4iXIRR_ZXdaJO088nn5REyhwQju1S3X2g,18585
|
|
10363
10365
|
simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
|
|
10364
10366
|
simo/users/serializers.py,sha256=Gay16bdHinjhbn1Ly2KBwnomwK2d4jclO-OqAVeWbZI,2491
|
|
10365
10367
|
simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
|
|
@@ -10374,7 +10376,7 @@ simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=MuOieBIXt6lrDx83-UQtd
|
|
|
10374
10376
|
simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
|
|
10375
10377
|
simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
|
|
10376
10378
|
simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
|
|
10377
|
-
simo/users/__pycache__/models.cpython-38.pyc,sha256=
|
|
10379
|
+
simo/users/__pycache__/models.cpython-38.pyc,sha256=xgieyXEO74tyeN2rTUaPb0ciRgqx6XNGerGre4BYj9E,17526
|
|
10378
10380
|
simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
|
|
10379
10381
|
simo/users/__pycache__/serializers.cpython-38.pyc,sha256=RfyHFuPrIhPJ62h5RHy3h17S-5DX41hL5cLhmcDIaXo,3435
|
|
10380
10382
|
simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
|
|
@@ -10444,8 +10446,8 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
10444
10446
|
simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10445
10447
|
simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10446
10448
|
simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10447
|
-
simo-2.0.
|
|
10448
|
-
simo-2.0.
|
|
10449
|
-
simo-2.0.
|
|
10450
|
-
simo-2.0.
|
|
10451
|
-
simo-2.0.
|
|
10449
|
+
simo-2.0.17.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
|
|
10450
|
+
simo-2.0.17.dist-info/METADATA,sha256=G9pIgmqL-p_PAXm14_HZElA4R_pGjIBC9ZGAxzZ4nGU,1700
|
|
10451
|
+
simo-2.0.17.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
10452
|
+
simo-2.0.17.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
|
|
10453
|
+
simo-2.0.17.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|