simo 2.0.12__py3-none-any.whl → 2.0.14__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__/forms.cpython-38.pyc +0 -0
- simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
- simo/core/admin.py +2 -2
- simo/core/forms.py +5 -4
- simo/core/serializers.py +37 -11
- simo/fleet/__pycache__/controllers.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
- simo/fleet/controllers.py +23 -1
- simo/fleet/forms.py +57 -27
- {simo-2.0.12.dist-info → simo-2.0.14.dist-info}/METADATA +1 -1
- {simo-2.0.12.dist-info → simo-2.0.14.dist-info}/RECORD +15 -15
- {simo-2.0.12.dist-info → simo-2.0.14.dist-info}/LICENSE.md +0 -0
- {simo-2.0.12.dist-info → simo-2.0.14.dist-info}/WHEEL +0 -0
- {simo-2.0.12.dist-info → simo-2.0.14.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/core/admin.py
CHANGED
|
@@ -336,9 +336,9 @@ class ComponentAdmin(admin.ModelAdmin):
|
|
|
336
336
|
'alarm_category', 'arm_status'
|
|
337
337
|
):
|
|
338
338
|
if field_neme in form.fields:
|
|
339
|
-
form.fields.pop(field_neme)
|
|
339
|
+
form.fields.pop(field_neme, None)
|
|
340
340
|
if 'slaves' not in form.declared_fields:
|
|
341
|
-
form.fields.pop('slaves')
|
|
341
|
+
form.fields.pop('slaves', None)
|
|
342
342
|
|
|
343
343
|
ctx['is_last'] = True
|
|
344
344
|
ctx['current_step'] = 3
|
simo/core/forms.py
CHANGED
|
@@ -287,8 +287,8 @@ class ComponentAdminForm(forms.ModelForm):
|
|
|
287
287
|
model = Component
|
|
288
288
|
fields = '__all__'
|
|
289
289
|
exclude = (
|
|
290
|
-
'gateway', 'controller_uid', 'base_type', 'instance_methods'
|
|
291
|
-
'alive', 'value_type', 'value', 'arm_status',
|
|
290
|
+
'gateway', 'controller_uid', 'base_type', 'instance_methods',
|
|
291
|
+
'alive', 'value_type', 'value', 'arm_status', 'slaves',
|
|
292
292
|
)
|
|
293
293
|
widgets = {
|
|
294
294
|
'icon': autocomplete.ModelSelect2(
|
|
@@ -331,7 +331,8 @@ class ComponentAdminForm(forms.ModelForm):
|
|
|
331
331
|
main_fields = (
|
|
332
332
|
'name', 'icon', 'zone', 'category',
|
|
333
333
|
'show_in_app', 'battery_level',
|
|
334
|
-
'instance_methods',
|
|
334
|
+
#'instance_methods',
|
|
335
|
+
'value_units',
|
|
335
336
|
'alarm_category', 'arm_status',
|
|
336
337
|
)
|
|
337
338
|
base_fields = ['id', 'gateway', 'base_type', 'name']
|
|
@@ -347,7 +348,7 @@ class ComponentAdminForm(forms.ModelForm):
|
|
|
347
348
|
|
|
348
349
|
base_fields.append('show_in_app')
|
|
349
350
|
base_fields.append('control')
|
|
350
|
-
base_fields.append('instance_methods')
|
|
351
|
+
#base_fields.append('instance_methods')
|
|
351
352
|
|
|
352
353
|
fieldsets = [
|
|
353
354
|
(_("Base settings"), {'fields': base_fields}),
|
simo/core/serializers.py
CHANGED
|
@@ -8,6 +8,8 @@ from collections.abc import Iterable
|
|
|
8
8
|
from easy_thumbnails.files import get_thumbnailer
|
|
9
9
|
from simo.core.middleware import get_current_request
|
|
10
10
|
from rest_framework import serializers
|
|
11
|
+
from rest_framework.fields import SkipField
|
|
12
|
+
from rest_framework.relations import Hyperlink, PKOnlyObject
|
|
11
13
|
from simo.core.forms import HiddenField, FormsetField
|
|
12
14
|
from rest_framework.relations import PrimaryKeyRelatedField, ManyRelatedField
|
|
13
15
|
from .drf_braces.serializers.form_serializer import (
|
|
@@ -158,7 +160,30 @@ class ComponentFormsetField(FormSerializer):
|
|
|
158
160
|
return kwargs
|
|
159
161
|
|
|
160
162
|
def to_representation(self, instance):
|
|
161
|
-
|
|
163
|
+
"""
|
|
164
|
+
Object instance -> Dict of primitive datatypes.
|
|
165
|
+
"""
|
|
166
|
+
ret = OrderedDict()
|
|
167
|
+
fields = self._readable_fields
|
|
168
|
+
|
|
169
|
+
for field in fields:
|
|
170
|
+
try:
|
|
171
|
+
attribute = field.get_attribute(instance)
|
|
172
|
+
except SkipField:
|
|
173
|
+
continue
|
|
174
|
+
except:
|
|
175
|
+
ret[field.field_name] = None
|
|
176
|
+
continue
|
|
177
|
+
|
|
178
|
+
check_for_none = attribute.pk if isinstance(
|
|
179
|
+
attribute, PKOnlyObject
|
|
180
|
+
) else attribute
|
|
181
|
+
if check_for_none is None:
|
|
182
|
+
ret[field.field_name] = None
|
|
183
|
+
else:
|
|
184
|
+
ret[field.field_name] = field.to_representation(attribute)
|
|
185
|
+
|
|
186
|
+
return ret
|
|
162
187
|
|
|
163
188
|
def get_form(self, data=None, **kwargs):
|
|
164
189
|
form = super().get_form(data=data, **kwargs)
|
|
@@ -188,7 +213,7 @@ class ComponentManyToManyRelatedField(serializers.Field):
|
|
|
188
213
|
super().__init__(*args, **kwargs)
|
|
189
214
|
|
|
190
215
|
def to_representation(self, value):
|
|
191
|
-
return [obj.pk for obj in value]
|
|
216
|
+
return [obj.pk for obj in value.all()]
|
|
192
217
|
|
|
193
218
|
def to_internal_value(self, data):
|
|
194
219
|
if data == [] and self.allow_blank:
|
|
@@ -198,7 +223,6 @@ class ComponentManyToManyRelatedField(serializers.Field):
|
|
|
198
223
|
|
|
199
224
|
class ComponentSerializer(FormSerializer):
|
|
200
225
|
id = ObjectSerializerMethodField()
|
|
201
|
-
controller_methods = serializers.SerializerMethodField()
|
|
202
226
|
last_change = TimestampField(read_only=True)
|
|
203
227
|
read_only = serializers.SerializerMethodField()
|
|
204
228
|
app_widget = serializers.SerializerMethodField()
|
|
@@ -214,7 +238,6 @@ class ComponentSerializer(FormSerializer):
|
|
|
214
238
|
|
|
215
239
|
class Meta:
|
|
216
240
|
form = ComponentAdminForm
|
|
217
|
-
exclude = ('instance_methods', )
|
|
218
241
|
field_mapping = {
|
|
219
242
|
HiddenField: HiddenSerializerField,
|
|
220
243
|
forms.TypedChoiceField: serializers.ChoiceField,
|
|
@@ -228,7 +251,7 @@ class ComponentSerializer(FormSerializer):
|
|
|
228
251
|
def get_fields(self):
|
|
229
252
|
self.set_form_cls()
|
|
230
253
|
|
|
231
|
-
ret =
|
|
254
|
+
ret = OrderedDict()
|
|
232
255
|
|
|
233
256
|
field_mapping = reduce_attr_dict_from_instance(
|
|
234
257
|
self,
|
|
@@ -245,11 +268,11 @@ class ComponentSerializer(FormSerializer):
|
|
|
245
268
|
if field_name in getattr(self.Meta, 'exclude', []):
|
|
246
269
|
continue
|
|
247
270
|
|
|
248
|
-
# if field is already defined via declared fields
|
|
249
|
-
# skip mapping it from forms which then honors
|
|
250
|
-
# the custom validation defined on the DRF declared field
|
|
251
|
-
if field_name in ret:
|
|
252
|
-
|
|
271
|
+
# # if field is already defined via declared fields
|
|
272
|
+
# # skip mapping it from forms which then honors
|
|
273
|
+
# # the custom validation defined on the DRF declared field
|
|
274
|
+
# if field_name in ret:
|
|
275
|
+
# continue
|
|
253
276
|
|
|
254
277
|
form_field = form[field_name]
|
|
255
278
|
|
|
@@ -277,7 +300,10 @@ class ComponentSerializer(FormSerializer):
|
|
|
277
300
|
ret[field_name].initial = form_field.initial
|
|
278
301
|
ret[field_name].default = form_field.initial
|
|
279
302
|
|
|
280
|
-
|
|
303
|
+
for name, field in super(FormSerializerBase, self).get_fields().items():
|
|
304
|
+
if name in ret:
|
|
305
|
+
continue
|
|
306
|
+
ret[name] = field
|
|
281
307
|
return ret
|
|
282
308
|
|
|
283
309
|
def _get_field_kwargs(self, form_field, serializer_field_class):
|
|
Binary file
|
|
Binary file
|
simo/fleet/controllers.py
CHANGED
|
@@ -112,7 +112,6 @@ class DS18B20Sensor(FleeDeviceMixin, BasicSensorMixin, BaseNumericSensor):
|
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
class BaseClimateSensor(FleeDeviceMixin, BasicSensorMixin, BaseMultiSensor):
|
|
115
|
-
manual_add = False
|
|
116
115
|
app_widget = NumericSensorWidget
|
|
117
116
|
|
|
118
117
|
def __init__(self, *args, **kwargs):
|
|
@@ -195,6 +194,29 @@ class BasicOutputMixin:
|
|
|
195
194
|
class Switch(FleeDeviceMixin, BasicOutputMixin, BaseSwitch):
|
|
196
195
|
config_form = ColonelSwitchConfigForm
|
|
197
196
|
|
|
197
|
+
def signal(self, pulses):
|
|
198
|
+
'''
|
|
199
|
+
Expecting list of tuples where each item represents component value
|
|
200
|
+
followed by duration in miliseconds.
|
|
201
|
+
Maximum of 20 pulses is accepted, each pulse might not be longer than 3000ms
|
|
202
|
+
If you need anything longer than this, use on(), off() methods instead.
|
|
203
|
+
:param pulses: [(True, 200), (False, 600), (True, 200)]
|
|
204
|
+
:return: None
|
|
205
|
+
'''
|
|
206
|
+
assert len(pulses) > 0, "At least on pulse is expected"
|
|
207
|
+
assert len(pulses) <= 20, "No more than 20 pulses is accepted"
|
|
208
|
+
for i, pulse in enumerate(pulses):
|
|
209
|
+
assert isinstance(pulse[0], bool), f"{i+1}-th pulse is not boolean!"
|
|
210
|
+
assert pulse[1] <= 3000, "Pulses must not exceed 3000ms"
|
|
211
|
+
|
|
212
|
+
GatewayObjectCommand(
|
|
213
|
+
self.component.gateway,
|
|
214
|
+
Colonel(id=self.component.config['colonel']),
|
|
215
|
+
command='call', method='signal', args=[pulses],
|
|
216
|
+
id=self.component.id,
|
|
217
|
+
).publish()
|
|
218
|
+
|
|
219
|
+
|
|
198
220
|
|
|
199
221
|
class PWMOutput(FleeDeviceMixin, BasicOutputMixin, BaseDimmer):
|
|
200
222
|
name = "Dimmer"
|
simo/fleet/forms.py
CHANGED
|
@@ -196,18 +196,10 @@ class ColonelBinarySensorConfigForm(ColonelComponentForm):
|
|
|
196
196
|
]
|
|
197
197
|
)
|
|
198
198
|
)
|
|
199
|
-
pull = forms.ChoiceField(
|
|
200
|
-
choices=(
|
|
201
|
-
('HIGH', "HIGH"), ('LOW', "LOW"), ("FLOATING", "leave floating"),
|
|
202
|
-
),
|
|
203
|
-
help_text="If you are not sure what is this all about, "
|
|
204
|
-
"you are most definitely want to pull this HIGH or LOW "
|
|
205
|
-
"but not leave it floating!"
|
|
206
|
-
)
|
|
207
199
|
inverse = forms.TypedChoiceField(
|
|
208
|
-
choices=((1, "Yes"), (0, "No")), coerce=int,
|
|
209
|
-
help_text="Hint: Set
|
|
210
|
-
"you deliver GND to the
|
|
200
|
+
choices=((1, "Yes"), (0, "No")), coerce=int, initial=1,
|
|
201
|
+
help_text="Hint: Set inverse to Yes, to get ON signal when "
|
|
202
|
+
"you deliver GND to the input and OFF when you cut it out."
|
|
211
203
|
)
|
|
212
204
|
debounce = forms.IntegerField(
|
|
213
205
|
min_value=0, max_value=1000 * 60 * 60, required=False, initial=0,
|
|
@@ -215,7 +207,6 @@ class ColonelBinarySensorConfigForm(ColonelComponentForm):
|
|
|
215
207
|
"between ON/OFF states when engaged. <br>"
|
|
216
208
|
"Set debounce value in milliseconds, to remediate this. "
|
|
217
209
|
"100ms offers a good starting point!"
|
|
218
|
-
|
|
219
210
|
)
|
|
220
211
|
|
|
221
212
|
def clean(self):
|
|
@@ -508,17 +499,12 @@ class ColonelSwitchConfigForm(ColonelComponentForm):
|
|
|
508
499
|
]
|
|
509
500
|
)
|
|
510
501
|
)
|
|
511
|
-
engaged_action = forms.ChoiceField(
|
|
512
|
-
choices=(('HIGH', "HIGH"), ('LOW', "LOW")),
|
|
513
|
-
)
|
|
514
502
|
auto_off = forms.FloatField(
|
|
515
503
|
required=False, min_value=0.01, max_value=1000000000,
|
|
516
504
|
help_text="If provided, switch will be turned off after "
|
|
517
505
|
"given amount of seconds after every turn on event."
|
|
518
506
|
)
|
|
519
|
-
inverse = forms.BooleanField(
|
|
520
|
-
label=_("Inverse switch value"), required=False
|
|
521
|
-
)
|
|
507
|
+
inverse = forms.BooleanField(required=False)
|
|
522
508
|
slaves = forms.ModelMultipleChoiceField(
|
|
523
509
|
required=False,
|
|
524
510
|
queryset=Component.objects.filter(
|
|
@@ -681,14 +667,30 @@ class ColonelRGBLightConfigForm(ColonelComponentForm):
|
|
|
681
667
|
num_leds = forms.IntegerField(
|
|
682
668
|
label=_("Number of leds"), min_value=1, max_value=2000
|
|
683
669
|
)
|
|
684
|
-
|
|
685
|
-
|
|
670
|
+
strip_type = forms.ChoiceField(
|
|
671
|
+
label="LED strip type",
|
|
672
|
+
choices=(
|
|
673
|
+
("WS2811", "WS2811"),
|
|
674
|
+
('WS2812', "WS2812"),
|
|
675
|
+
('WS2812B', "WS2812B"),
|
|
676
|
+
('WS2813', "WS2813"),
|
|
677
|
+
('WS2815', "WS2815"),
|
|
678
|
+
('SK6812', "SK6812"),
|
|
679
|
+
('generic', "Generic"),
|
|
680
|
+
)
|
|
686
681
|
)
|
|
687
|
-
|
|
688
|
-
|
|
682
|
+
has_white = forms.BooleanField(initial=False, required=False)
|
|
683
|
+
color_order = forms.ChoiceField(
|
|
684
|
+
required=False, choices=(
|
|
685
|
+
(None, 'Default'),
|
|
689
686
|
("RGB", "RGB"), ("RBG", "RBG"), ("GRB", "GRB"),
|
|
690
687
|
("RGBW", "RGBW"), ("RBGW", "RBGW"), ("GRBW", "GRBW"),
|
|
691
|
-
)
|
|
688
|
+
),
|
|
689
|
+
)
|
|
690
|
+
custom_timing = forms.CharField(
|
|
691
|
+
required=False,
|
|
692
|
+
help_text="Custom addressable led strip timing (T0H, T0L, T1H, T1L). <br>"
|
|
693
|
+
"For example SK6812 is: (300, 900, 600, 600)"
|
|
692
694
|
)
|
|
693
695
|
controls = FormsetField(
|
|
694
696
|
formset_factory(
|
|
@@ -698,12 +700,26 @@ class ColonelRGBLightConfigForm(ColonelComponentForm):
|
|
|
698
700
|
|
|
699
701
|
def save(self, commit=True):
|
|
700
702
|
self.instance.config['output_pin_no'] = self.cleaned_data['output_pin'].no
|
|
701
|
-
if len(self.cleaned_data['order']) > 3:
|
|
702
|
-
self.instance.config['has_white'] = True
|
|
703
|
-
else:
|
|
704
|
-
self.instance.config['has_white'] = False
|
|
705
703
|
return super().save(commit)
|
|
706
704
|
|
|
705
|
+
def clean_custom_timing(self):
|
|
706
|
+
custom_timing = self.cleaned_data.get('custom_timing')
|
|
707
|
+
if not custom_timing:
|
|
708
|
+
return custom_timing
|
|
709
|
+
custom_timing = custom_timing.strip().\
|
|
710
|
+
strip('(').strip('[').rstrip(')').rstrip(']').split(',')
|
|
711
|
+
if len(custom_timing.split(',')) != 4:
|
|
712
|
+
raise forms.ValidationError("Tuple of 4 integers please.")
|
|
713
|
+
for t in custom_timing.split(','):
|
|
714
|
+
try:
|
|
715
|
+
t = int(t)
|
|
716
|
+
except:
|
|
717
|
+
raise forms.ValidationError(f"Integers only please.")
|
|
718
|
+
if t <= 0:
|
|
719
|
+
raise forms.ValidationError(f"Intervals must be greater than 0.")
|
|
720
|
+
if t > 100000:
|
|
721
|
+
raise forms.ValidationError(f"{t} seems way to much!")
|
|
722
|
+
return f"({custom_timing})"
|
|
707
723
|
|
|
708
724
|
def clean(self):
|
|
709
725
|
super().clean()
|
|
@@ -712,6 +728,20 @@ class ColonelRGBLightConfigForm(ColonelComponentForm):
|
|
|
712
728
|
if not self.cleaned_data.get('output_pin'):
|
|
713
729
|
return self.cleaned_data
|
|
714
730
|
|
|
731
|
+
if self.cleaned_data.get('color_order'):
|
|
732
|
+
if self.cleaned_data['has_white']:
|
|
733
|
+
if len(self.cleaned_data['color_order']) != 4:
|
|
734
|
+
self.add_error(
|
|
735
|
+
"color_order",
|
|
736
|
+
_("4 colors expected for stripes with dedicated White led.")
|
|
737
|
+
)
|
|
738
|
+
else:
|
|
739
|
+
if len(self.cleaned_data['color_order']) != 3:
|
|
740
|
+
self.add_error(
|
|
741
|
+
"color_order",
|
|
742
|
+
_("3 colors expected for stripes without dedicated White led.")
|
|
743
|
+
)
|
|
744
|
+
|
|
715
745
|
self._clean_pin('output_pin')
|
|
716
746
|
|
|
717
747
|
if not self.cleaned_data.get('controls'):
|
|
@@ -25,7 +25,7 @@ simo/_hub_template/hub/settings.py,sha256=4QhvhbtLRxHvAntwqG_qeAAtpDUqKvN4jzw9u3
|
|
|
25
25
|
simo/_hub_template/hub/supervisor.conf,sha256=IY3fdK0fDD2eAothB0n54xhjQj8LYoXIR96-Adda5Z8,1353
|
|
26
26
|
simo/_hub_template/hub/urls.py,sha256=Ydm-1BkYAzWeEF-MKSDIFf-7aE4qNLPm48-SA51XgJQ,25
|
|
27
27
|
simo/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
-
simo/core/admin.py,sha256=
|
|
28
|
+
simo/core/admin.py,sha256=5QFmf7ZOqkSEba2Fo-UfJp5dVe-vhKUtOUlAnfQGhno,17634
|
|
29
29
|
simo/core/api.py,sha256=OVvv3a7KYJGbuUgSOfWzPg8hoCCRhdDejQ2kVs0H2p8,23803
|
|
30
30
|
simo/core/api_auth.py,sha256=_3hG4e1eLKrcRnSAOB_xTL6cwtOJ2_7JS7GZU_iqTgA,1251
|
|
31
31
|
simo/core/api_meta.py,sha256=dZkz7z-7GaMPVAsfQxOYCvpYaMPx_v2zynbY6JM8oD8,3477
|
|
@@ -38,7 +38,7 @@ simo/core/controllers.py,sha256=2D7YCLktx7a-4tn80DenQP2CdY0dc2bWg6IRU69YTZ8,2724
|
|
|
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=H66FJCX_OJ8ADTfFHRLLl6xEg5AsaFH59rbd2rCE2c8,21711
|
|
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
|
|
@@ -46,7 +46,7 @@ simo/core/middleware.py,sha256=64PYjnyRnYf4sgMvPfR0oQqf9UEtxUwnhJe3RV6z_HI,2040
|
|
|
46
46
|
simo/core/models.py,sha256=j5AymbJFt5HOIOYsHJ8UUKhb1TvIoqgH0T1y3BeGJuM,19408
|
|
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=dY2R9KPvmmwMP4Up_6AHM6lf0MY3BoON8Dn8ixFubAI,17118
|
|
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
|
|
@@ -56,7 +56,7 @@ simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
|
|
|
56
56
|
simo/core/views.py,sha256=hlAKpAbCbqI3a-uL5tDp532T2oLFiF0MBzKUJ_SNzo0,5833
|
|
57
57
|
simo/core/widgets.py,sha256=J9e06C6I22F6xKic3VMgG7WeX07glAcl-4bF2Mg180A,2827
|
|
58
58
|
simo/core/__pycache__/__init__.cpython-38.pyc,sha256=y0IW37wBUIGa3Eh_ZG28pRqHKoLiPyTgUX2OnbkEPlc,158
|
|
59
|
-
simo/core/__pycache__/admin.cpython-38.pyc,sha256=
|
|
59
|
+
simo/core/__pycache__/admin.cpython-38.pyc,sha256=D9Hu5xMkclP6xFjEOLB-mBOe0ZMuCF10uilsROKkvmM,13446
|
|
60
60
|
simo/core/__pycache__/api.cpython-38.pyc,sha256=W-CdACWTu_ebqH52riswadzT7z2mNRZJU8HngqbYXzw,18874
|
|
61
61
|
simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=5UTBr3rDMERAfc0OuOVDwGeQkt6Q7GLBtZJAMBse1sg,1712
|
|
62
62
|
simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=7dDi_Aay7T4eSNYmEItMlb7yU91-5_pzEVg8GXXf4Qc,2783
|
|
@@ -69,7 +69,7 @@ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=-NjuX7iGheE_ZMqkZ6g4ZnnV
|
|
|
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=ikU7wTC6vxzsCJJul0VD5qFJlpXHvvksSkwGun8tYVM,18187
|
|
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
|
|
@@ -77,7 +77,7 @@ simo/core/__pycache__/middleware.cpython-38.pyc,sha256=bGOFJNEhJeLbpsZp8LYn1VA3p
|
|
|
77
77
|
simo/core/__pycache__/models.cpython-38.pyc,sha256=Gm36LWRxswvWiB3Wz0F7g32ZVXugh7chSSBz1lgBPZs,16995
|
|
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=07FzXZGZBEHlx1vboZThhU98WpmJDSbcQP3uYWNKMDw,16551
|
|
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
|
|
@@ -10168,8 +10168,8 @@ simo/fleet/api.py,sha256=Hxn84xI-Q77HxjINgRbjSJQOv9jii4OL20LxK0VSrS8,2499
|
|
|
10168
10168
|
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
|
-
simo/fleet/controllers.py,sha256=
|
|
10172
|
-
simo/fleet/forms.py,sha256=
|
|
10171
|
+
simo/fleet/controllers.py,sha256=rTxRFf-LKWAZxzixrsLZHHm51BmMx9a1PLdgf6inlNM,20533
|
|
10172
|
+
simo/fleet/forms.py,sha256=Ree_e3V0rBkVk1bVPr4aV8bsdo0pfCS8i5UV2OBtMJQ,37684
|
|
10173
10173
|
simo/fleet/gateways.py,sha256=KV5i5fxXIrlK-k6zyEkk83x11GJt-ELQ0npb4Ac83cM,3693
|
|
10174
10174
|
simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
|
|
10175
10175
|
simo/fleet/models.py,sha256=J-rnn7Ew-7s3646NNRVY947Sbz21mUD_nBHtuHAKXds,14160
|
|
@@ -10184,8 +10184,8 @@ simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rL9fb7cCQatyFvXyKmlNOKmxVo8vHYe
|
|
|
10184
10184
|
simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=SqyTuaz_kEBvx-bL46SclsZEEP5RFh6U6TGKyXDdiOE,565
|
|
10185
10185
|
simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
|
|
10186
10186
|
simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
|
|
10187
|
-
simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=
|
|
10188
|
-
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256
|
|
10187
|
+
simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=l9bz18Qp33C12TJOKPSn9vIXnlBKnBusODNk7Fg64qA,18103
|
|
10188
|
+
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=IvK-njOrKBAlvzSGsvPrKnsHwB1gcRrmWL8Nlkg_fF0,27050
|
|
10189
10189
|
simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=YAcgTOqJbtjGI03lvEcU6keFfrwAHkObVmErYzfRvjk,3569
|
|
10190
10190
|
simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
|
|
10191
10191
|
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=S9pPqRjIxASXahoIOkkjQX7cBwjkdu4d2nXMju0-Cf8,12283
|
|
@@ -10444,8 +10444,8 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
10444
10444
|
simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10445
10445
|
simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10446
10446
|
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.
|
|
10447
|
+
simo-2.0.14.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
|
|
10448
|
+
simo-2.0.14.dist-info/METADATA,sha256=OG2N3Ch_c8-PXckNAykpPaxULK-HirD-InkoYjVk1ac,1700
|
|
10449
|
+
simo-2.0.14.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
10450
|
+
simo-2.0.14.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
|
|
10451
|
+
simo-2.0.14.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|