simo 2.0.38__py3-none-any.whl → 2.0.40__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__/api.cpython-38.pyc +0 -0
- simo/core/__pycache__/permissions.cpython-38.pyc +0 -0
- simo/core/api.py +18 -17
- simo/core/permissions.py +4 -4
- simo/core/utils/__pycache__/json.cpython-38.pyc +0 -0
- simo/core/utils/json.py +7 -5
- simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
- simo/fleet/forms.py +30 -8
- simo/generic/__pycache__/controllers.cpython-38.pyc +0 -0
- simo/generic/__pycache__/forms.cpython-38.pyc +0 -0
- simo/generic/controllers.py +9 -1
- simo/generic/forms.py +9 -1
- simo/users/__pycache__/models.cpython-38.pyc +0 -0
- simo/users/models.py +9 -1
- {simo-2.0.38.dist-info → simo-2.0.40.dist-info}/METADATA +1 -1
- {simo-2.0.38.dist-info → simo-2.0.40.dist-info}/RECORD +19 -19
- {simo-2.0.38.dist-info → simo-2.0.40.dist-info}/LICENSE.md +0 -0
- {simo-2.0.38.dist-info → simo-2.0.40.dist-info}/WHEEL +0 -0
- {simo-2.0.38.dist-info → simo-2.0.40.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
simo/core/api.py
CHANGED
|
@@ -147,6 +147,8 @@ def get_components_queryset(instance, user):
|
|
|
147
147
|
if user.is_superuser:
|
|
148
148
|
return qs
|
|
149
149
|
|
|
150
|
+
c_ids = set()
|
|
151
|
+
|
|
150
152
|
from simo.generic.controllers import WeatherForecast
|
|
151
153
|
general_components = []
|
|
152
154
|
if instance.indoor_climate_sensor:
|
|
@@ -156,22 +158,21 @@ def get_components_queryset(instance, user):
|
|
|
156
158
|
controller_uid=WeatherForecast.uid, config__is_main=True
|
|
157
159
|
).values('id').first()
|
|
158
160
|
if wf_c:
|
|
159
|
-
|
|
161
|
+
c_ids.add(wf_c['id'])
|
|
160
162
|
main_alarm_group = Component.objects.filter(
|
|
161
163
|
zone__instance=instance,
|
|
162
164
|
base_type='alarm-group', config__is_main=True
|
|
163
165
|
).values('id').first()
|
|
164
166
|
if main_alarm_group:
|
|
165
|
-
|
|
167
|
+
c_ids.add(main_alarm_group['id'])
|
|
168
|
+
|
|
169
|
+
user_role = user.get_role(instance)
|
|
166
170
|
|
|
167
|
-
|
|
168
|
-
cp.
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
]
|
|
173
|
-
qs = qs.filter(Q(id__in=c_ids) | Q(id__in=general_components))
|
|
174
|
-
return qs
|
|
171
|
+
for cp in user_role.component_permissions.all():
|
|
172
|
+
if cp.read:
|
|
173
|
+
c_ids.add(cp.id)
|
|
174
|
+
|
|
175
|
+
return qs.filter(id__in=c_ids)
|
|
175
176
|
|
|
176
177
|
|
|
177
178
|
class ComponentViewSet(
|
|
@@ -188,9 +189,7 @@ class ComponentViewSet(
|
|
|
188
189
|
return permissions
|
|
189
190
|
|
|
190
191
|
def get_queryset(self):
|
|
191
|
-
return get_components_queryset(self.instance, self.request.user)
|
|
192
|
-
zone__instance=self.instance
|
|
193
|
-
)
|
|
192
|
+
return get_components_queryset(self.instance, self.request.user)
|
|
194
193
|
|
|
195
194
|
def get_view_name(self):
|
|
196
195
|
singular = "Component"
|
|
@@ -209,7 +208,7 @@ class ComponentViewSet(
|
|
|
209
208
|
_('"%s" method not found on controller') % method_name,
|
|
210
209
|
code=400
|
|
211
210
|
)
|
|
212
|
-
|
|
211
|
+
|
|
213
212
|
call = getattr(component, method_name)
|
|
214
213
|
|
|
215
214
|
if not isinstance(param, list) and not isinstance(param, dict):
|
|
@@ -255,14 +254,16 @@ class ComponentViewSet(
|
|
|
255
254
|
|
|
256
255
|
@action(detail=True, methods=['post'])
|
|
257
256
|
def controller(self, request, pk=None, *args, **kwargs):
|
|
257
|
+
start = time.time()
|
|
258
258
|
component = self.get_object()
|
|
259
|
+
print(f"Component retrieved in : {time.time() - start}s")
|
|
259
260
|
data = request.data
|
|
260
261
|
if not isinstance(request.data, dict):
|
|
261
262
|
data = data.dict()
|
|
262
263
|
request_data = restore_json(data)
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
264
|
+
resp = self.perform_controller_method(request_data, component)
|
|
265
|
+
print(f"Command executed in : {time.time() - start}s")
|
|
266
|
+
return resp
|
|
266
267
|
|
|
267
268
|
@action(detail=False, methods=['post'])
|
|
268
269
|
def control(self, request, *args, **kwargs):
|
simo/core/permissions.py
CHANGED
|
@@ -78,8 +78,8 @@ class ComponentPermission(BasePermission):
|
|
|
78
78
|
return True
|
|
79
79
|
if user_role.is_owner and request.method != 'DELETE':
|
|
80
80
|
return True
|
|
81
|
-
if request.method == 'POST'
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
81
|
+
if request.method == 'POST':
|
|
82
|
+
for perm in user_role.component_permissions.all():
|
|
83
|
+
if perm.component == obj:
|
|
84
|
+
return perm.write
|
|
85
85
|
return False
|
|
Binary file
|
simo/core/utils/json.py
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
|
|
2
2
|
def restore_json(data):
|
|
3
|
+
clean_data = {}
|
|
3
4
|
for key, val in data.items():
|
|
4
5
|
if not isinstance(val, str):
|
|
6
|
+
clean_data[key] = val
|
|
5
7
|
continue
|
|
6
8
|
try:
|
|
7
|
-
|
|
9
|
+
clean_data[key] = int(val)
|
|
8
10
|
continue
|
|
9
11
|
except:
|
|
10
12
|
pass
|
|
11
13
|
try:
|
|
12
|
-
|
|
14
|
+
clean_data[key] = float(val)
|
|
13
15
|
continue
|
|
14
16
|
except:
|
|
15
17
|
pass
|
|
16
18
|
if val.lower() == 'true':
|
|
17
|
-
|
|
19
|
+
clean_data[key] = True
|
|
18
20
|
elif val.lower() == 'false':
|
|
19
|
-
|
|
20
|
-
return
|
|
21
|
+
clean_data[key] = False
|
|
22
|
+
return clean_data
|
|
Binary file
|
simo/fleet/forms.py
CHANGED
|
@@ -159,9 +159,9 @@ class ColonelComponentForm(BaseComponentForm):
|
|
|
159
159
|
if 'controls' in self.cleaned_data:
|
|
160
160
|
del self.cleaned_data['controls']
|
|
161
161
|
|
|
162
|
-
def save(self, commit=True):
|
|
162
|
+
def save(self, commit=True, update_colonel=True):
|
|
163
163
|
obj = super().save(commit)
|
|
164
|
-
if commit and 'colonel' in self.cleaned_data:
|
|
164
|
+
if commit and 'colonel' in self.cleaned_data and update_colonel:
|
|
165
165
|
self.cleaned_data['colonel'].components.add(obj)
|
|
166
166
|
self.cleaned_data['colonel'].rebuild_occupied_pins()
|
|
167
167
|
self.cleaned_data['colonel'].save()
|
|
@@ -578,7 +578,7 @@ class ColonelSwitchConfigForm(ColonelComponentForm):
|
|
|
578
578
|
|
|
579
579
|
controls = FormsetField(
|
|
580
580
|
formset_factory(
|
|
581
|
-
ControlPinForm, can_delete=True, can_order=True, extra=0, max_num=
|
|
581
|
+
ControlPinForm, can_delete=True, can_order=True, extra=0, max_num=10
|
|
582
582
|
)
|
|
583
583
|
)
|
|
584
584
|
|
|
@@ -649,7 +649,7 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
|
|
|
649
649
|
help_text="Minumum PWM signal output duty (0 - 1023)"
|
|
650
650
|
)
|
|
651
651
|
duty_max = forms.IntegerField(
|
|
652
|
-
min_value=0, max_value=1023, required=True, initial=
|
|
652
|
+
min_value=0, max_value=1023, required=True, initial=900,
|
|
653
653
|
help_text="Maximum PWM signal output duty (0 - 1023)"
|
|
654
654
|
)
|
|
655
655
|
turn_on_time = forms.IntegerField(
|
|
@@ -686,13 +686,14 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
|
|
|
686
686
|
)
|
|
687
687
|
controls = FormsetField(
|
|
688
688
|
formset_factory(
|
|
689
|
-
ControlPinForm, can_delete=True, can_order=True, extra=0, max_num=
|
|
689
|
+
ControlPinForm, can_delete=True, can_order=True, extra=0, max_num=10
|
|
690
690
|
)
|
|
691
691
|
)
|
|
692
692
|
|
|
693
693
|
def __init__(self, *args, **kwargs):
|
|
694
694
|
super().__init__(*args, **kwargs)
|
|
695
|
-
|
|
695
|
+
if 'value_units' in self.fields:
|
|
696
|
+
self.fields['value_units'].initial = self.controller.default_value_units
|
|
696
697
|
self.basic_fields.extend(
|
|
697
698
|
['value_units', 'turn_on_time', 'turn_off_time', 'skew']
|
|
698
699
|
)
|
|
@@ -723,9 +724,29 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
|
|
|
723
724
|
def save(self, commit=True):
|
|
724
725
|
if 'output_pin' in self.cleaned_data:
|
|
725
726
|
self.instance.config['output_pin_no'] = self.cleaned_data['output_pin'].no
|
|
726
|
-
|
|
727
|
+
|
|
728
|
+
update_colonel = False
|
|
729
|
+
if not self.instance.pk:
|
|
730
|
+
update_colonel = True
|
|
731
|
+
elif 'output_pin' in self.changed_data:
|
|
732
|
+
update_colonel = True
|
|
733
|
+
elif 'slaves' in self.changed_data:
|
|
734
|
+
update_colonel = True
|
|
735
|
+
if not update_colonel:
|
|
736
|
+
old = Component.objects.get(id=self.instance.id)
|
|
737
|
+
if old.config.get('controls') != self.cleaned_data.get('controls'):
|
|
738
|
+
update_colonel = True
|
|
739
|
+
|
|
740
|
+
obj = super().save(commit=commit, update_colonel=update_colonel)
|
|
727
741
|
if commit and 'slaves' in self.cleaned_data:
|
|
728
742
|
obj.slaves.set(self.cleaned_data['slaves'])
|
|
743
|
+
if not update_colonel:
|
|
744
|
+
GatewayObjectCommand(
|
|
745
|
+
obj.gateway, self.cleaned_data['colonel'], id=obj.id,
|
|
746
|
+
command='call', method='update_config', args=[
|
|
747
|
+
obj.controller._get_colonel_config()
|
|
748
|
+
]
|
|
749
|
+
).publish()
|
|
729
750
|
return obj
|
|
730
751
|
|
|
731
752
|
|
|
@@ -1122,8 +1143,9 @@ class TTLockConfigForm(ColonelComponentForm):
|
|
|
1122
1143
|
return self.cleaned_data
|
|
1123
1144
|
|
|
1124
1145
|
def save(self, commit=True):
|
|
1125
|
-
# TODO: after inclusion it was not assigned to proper colonel!
|
|
1126
1146
|
obj = super(ColonelComponentForm, self).save(commit)
|
|
1147
|
+
if commit:
|
|
1148
|
+
self.cleaned_data['colonel'].components.add(obj)
|
|
1127
1149
|
if commit and 'door_sensor' in self.cleaned_data:
|
|
1128
1150
|
GatewayObjectCommand(
|
|
1129
1151
|
self.instance.gateway, self.cleaned_data['door_sensor'],
|
|
Binary file
|
|
Binary file
|
simo/generic/controllers.py
CHANGED
|
@@ -199,6 +199,14 @@ class PresenceLighting(Script):
|
|
|
199
199
|
comp.send(self.light_org_values.get(comp.id, 0))
|
|
200
200
|
|
|
201
201
|
|
|
202
|
+
# TODO: Night lighting
|
|
203
|
+
#
|
|
204
|
+
# Lights: components (switches, dimmers)
|
|
205
|
+
# On value: 40
|
|
206
|
+
# Sunset offset (mins): negative = earlier, positive = later
|
|
207
|
+
# Save energy at night: 1 - 6 turn the lights completely off at night.
|
|
208
|
+
|
|
209
|
+
|
|
202
210
|
class Thermostat(ControllerBase):
|
|
203
211
|
name = _("Thermostat")
|
|
204
212
|
base_type = 'thermostat'
|
|
@@ -1435,7 +1443,7 @@ class StateSelect(ControllerBase):
|
|
|
1435
1443
|
config_form = StateSelectForm
|
|
1436
1444
|
|
|
1437
1445
|
default_config = {'states': []}
|
|
1438
|
-
default_value =
|
|
1446
|
+
default_value = ''
|
|
1439
1447
|
|
|
1440
1448
|
def _validate_val(self, value, occasion=None):
|
|
1441
1449
|
available_options = [s.get('slug') for s in self.component.config.get('states', [])]
|
simo/generic/forms.py
CHANGED
|
@@ -132,7 +132,7 @@ class ConditionForm(forms.Form):
|
|
|
132
132
|
|
|
133
133
|
if self.cleaned_data['op'] == 'in':
|
|
134
134
|
self.cleaned_data['value'] = ', '.join(str(v) for v in final_values)
|
|
135
|
-
|
|
135
|
+
elif final_values:
|
|
136
136
|
self.cleaned_data['value'] = final_values[0]
|
|
137
137
|
|
|
138
138
|
return self.cleaned_data
|
|
@@ -190,6 +190,14 @@ class PresenceLightingConfigForm(BaseComponentForm):
|
|
|
190
190
|
ConditionForm, can_delete=True, can_order=True, extra=0
|
|
191
191
|
), label='Additional conditions'
|
|
192
192
|
)
|
|
193
|
+
autostart = forms.BooleanField(
|
|
194
|
+
initial=True, required=False,
|
|
195
|
+
help_text="Start automatically on system boot."
|
|
196
|
+
)
|
|
197
|
+
keep_alive = forms.BooleanField(
|
|
198
|
+
initial=True, required=False,
|
|
199
|
+
help_text="Restart the script if it fails. "
|
|
200
|
+
)
|
|
193
201
|
log = forms.CharField(
|
|
194
202
|
widget=forms.HiddenInput, required=False
|
|
195
203
|
)
|
|
Binary file
|
simo/users/models.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import datetime
|
|
2
2
|
import requests
|
|
3
3
|
import subprocess
|
|
4
|
+
from django.utils.functional import cached_property
|
|
4
5
|
from django.urls import reverse
|
|
5
6
|
from django.utils.translation import gettext_lazy as _
|
|
6
7
|
from django.db import models
|
|
@@ -165,6 +166,7 @@ class User(AbstractBaseUser, SimoAdminMixin):
|
|
|
165
166
|
|
|
166
167
|
_instances = None
|
|
167
168
|
_instance = None
|
|
169
|
+
_instance_roles = {}
|
|
168
170
|
|
|
169
171
|
class Meta:
|
|
170
172
|
verbose_name = _('user')
|
|
@@ -215,7 +217,13 @@ class User(AbstractBaseUser, SimoAdminMixin):
|
|
|
215
217
|
return self.is_active and self.ssh_key and self.is_master
|
|
216
218
|
|
|
217
219
|
def get_role(self, instance):
|
|
218
|
-
|
|
220
|
+
if instance.id not in self._instance_roles:
|
|
221
|
+
self._instance_roles[instance.id] = self.roles.filter(
|
|
222
|
+
instance=instance
|
|
223
|
+
).prefetch_related(
|
|
224
|
+
'component_permissions', 'component_permissions__component'
|
|
225
|
+
).first()
|
|
226
|
+
return self._instance_roles[instance.id]
|
|
219
227
|
|
|
220
228
|
def set_instance(self, instance):
|
|
221
229
|
self._instance = instance
|
|
@@ -26,7 +26,7 @@ simo/_hub_template/hub/supervisor.conf,sha256=IY3fdK0fDD2eAothB0n54xhjQj8LYoXIR9
|
|
|
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
28
|
simo/core/admin.py,sha256=xVMFl1MvQ-THwrnAVSvIkhbfbIIc4r_dDGEkpkRoSBk,17751
|
|
29
|
-
simo/core/api.py,sha256=
|
|
29
|
+
simo/core/api.py,sha256=xRsKR_ZiQOVDhBHnGnraDrhmWWI3wX3el7q8XmNKshc,25063
|
|
30
30
|
simo/core/api_auth.py,sha256=_3hG4e1eLKrcRnSAOB_xTL6cwtOJ2_7JS7GZU_iqTgA,1251
|
|
31
31
|
simo/core/api_meta.py,sha256=ySmmhtVrWatI3yqnYPuP5ipapmJfyfEbl32w-7_W5O4,3551
|
|
32
32
|
simo/core/app_widgets.py,sha256=EEQOto3fGR0syDqpJE38tQrx8DoTTyg26nF5kYzHY38,2018
|
|
@@ -44,7 +44,7 @@ simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
|
|
|
44
44
|
simo/core/managers.py,sha256=Qdg2-Qh4dLbW0A5Dmtnpct6CUhEuuvdbIskBijQxopU,2360
|
|
45
45
|
simo/core/middleware.py,sha256=pO52hQOJV_JRmNyUe7zfufSnJFlRITOWX6jwkoPWJhk,2052
|
|
46
46
|
simo/core/models.py,sha256=W5rShDy8l6GQzTRFiBZFAuibe_fg_LRwSNk973mv_m8,20134
|
|
47
|
-
simo/core/permissions.py,sha256=
|
|
47
|
+
simo/core/permissions.py,sha256=3YoYMyfGnfCtqe39L8FW2lb6M7VHkQpYk1_j8gC8tD0,2726
|
|
48
48
|
simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
|
|
49
49
|
simo/core/serializers.py,sha256=7iE5_ke56GpcQ_cV6LgQIsfG3pAQXPc3t4e60HwogUs,18277
|
|
50
50
|
simo/core/signal_receivers.py,sha256=C6Jk7wVEtyo4hwcrU7L0ijtpK0wce2MNwpyBgSfSJ-U,5467
|
|
@@ -57,7 +57,7 @@ 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
59
|
simo/core/__pycache__/admin.cpython-38.pyc,sha256=1OisxqtyWMbzpgeeu5vtBW3gp3Nts4Ei4ff1P-SPpq4,13545
|
|
60
|
-
simo/core/__pycache__/api.cpython-38.pyc,sha256=
|
|
60
|
+
simo/core/__pycache__/api.cpython-38.pyc,sha256=DE7_vjXbIZk3nV2MlLcze6dj_l-iUvHnuwGWDL5mCAM,19903
|
|
61
61
|
simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=5UTBr3rDMERAfc0OuOVDwGeQkt6Q7GLBtZJAMBse1sg,1712
|
|
62
62
|
simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=94T3_rybn2T1_bkaDQnQRyjy21LBaGOnz-mmkJ6T0N8,2840
|
|
63
63
|
simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=9Es2wZNduzUJv-jZ_HX0-L3vqwpXWBbseEwoC5K6b-w,3465
|
|
@@ -75,7 +75,7 @@ simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NME
|
|
|
75
75
|
simo/core/__pycache__/managers.cpython-38.pyc,sha256=ObkzRjSOs2UQmjwFWDvZHreNzc_P5k7dVA_f7L7S7Q4,2529
|
|
76
76
|
simo/core/__pycache__/middleware.cpython-38.pyc,sha256=ESR5JPtITo9flczO0672sfzYUxrc_cQU0e0w5DFL-60,2038
|
|
77
77
|
simo/core/__pycache__/models.cpython-38.pyc,sha256=UNX6Btm5ZnpLzSCWgevQnSYzAyDWttA2Ivy7CGPu8DU,17288
|
|
78
|
-
simo/core/__pycache__/permissions.cpython-38.pyc,sha256=
|
|
78
|
+
simo/core/__pycache__/permissions.cpython-38.pyc,sha256=04mfHwG2sjgTnCgRXqku7rlLDsDWHb3nkoqsNE-PN8E,2819
|
|
79
79
|
simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
|
|
80
80
|
simo/core/__pycache__/serializers.cpython-38.pyc,sha256=8QlBSWOtgmhTpFbMMgGoXtMoTMETSnpA37z2LBgRzNQ,17178
|
|
81
81
|
simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=UcKT8RK_14CI-JEWfplnIxskmWec_w5-gqKUXITLDA4,4323
|
|
@@ -10151,7 +10151,7 @@ simo/core/utils/form_fields.py,sha256=UOzYdPd71qgCw1H3qH01u85YjrOlETPJAHOJrZKhyD
|
|
|
10151
10151
|
simo/core/utils/form_widgets.py,sha256=Zxn9jJqPle9Q_BKNJnyTDn7MosYwNp1TFu5LoKs0bfc,408
|
|
10152
10152
|
simo/core/utils/formsets.py,sha256=ZpExLsnDihnrlsPfYQrwy5qx54IowEmL8hnlO7KlyqE,6924
|
|
10153
10153
|
simo/core/utils/helpers.py,sha256=TOWy3slspaEYEhe9zDcb0RgzHUYslF6LZDlrWPGSqUI,3791
|
|
10154
|
-
simo/core/utils/json.py,sha256=
|
|
10154
|
+
simo/core/utils/json.py,sha256=eJtr3hSMh0hI10BTfzeUSmhbe_d8wO9hOh5HpLEwqh0,548
|
|
10155
10155
|
simo/core/utils/logs.py,sha256=Zn9JQxqCH9Odx2J1BWT84nFCfkJ4Z4p5X8psdll7hNc,2366
|
|
10156
10156
|
simo/core/utils/mixins.py,sha256=X6kUPKAi_F-uw7tgm8LEaYalBXpvDA-yrLNFCGr2rks,259
|
|
10157
10157
|
simo/core/utils/model_helpers.py,sha256=3IzJeOvBoYdUJVXCJkY20npOZXPjNPAiEFvuT0OPhwA,884
|
|
@@ -10169,7 +10169,7 @@ simo/core/utils/__pycache__/form_fields.cpython-38.pyc,sha256=nBk6k9aj6BpWwdkpce
|
|
|
10169
10169
|
simo/core/utils/__pycache__/form_widgets.cpython-38.pyc,sha256=MYAYEq0I4P0WErG9FamTJYWue7-cPartAWbFAiSSg5w,908
|
|
10170
10170
|
simo/core/utils/__pycache__/formsets.cpython-38.pyc,sha256=vwlFLdQ2bpZgXNUpekhtapwfouNPCIRo-SMrgOdAIMA,4813
|
|
10171
10171
|
simo/core/utils/__pycache__/helpers.cpython-38.pyc,sha256=jTGaN7kSJRwouP0EuYSaiJeMylo_RzJwSm-DKRwceHA,4291
|
|
10172
|
-
simo/core/utils/__pycache__/json.cpython-38.pyc,sha256=
|
|
10172
|
+
simo/core/utils/__pycache__/json.cpython-38.pyc,sha256=TKc88VpPKgimeaozhgx34WWJ1mwTWFWN6B9-VAH8qT0,532
|
|
10173
10173
|
simo/core/utils/__pycache__/logs.cpython-38.pyc,sha256=BVVeQoOhfRHm3SHnCoE1d5G84kTpJZFmr_btc3jDYTU,2156
|
|
10174
10174
|
simo/core/utils/__pycache__/mixins.cpython-38.pyc,sha256=8Js2T7jVQ7hugRUIRu3rdxW86dJW4KeUUWqKqSkIGb0,615
|
|
10175
10175
|
simo/core/utils/__pycache__/model_helpers.cpython-38.pyc,sha256=QzO0rh1NuQePHDCSLmUCRrAZEnV4o8jh9CF_jp7IoUo,1351
|
|
@@ -10185,7 +10185,7 @@ simo/fleet/auto_urls.py,sha256=X04oKJWA48wFW5iXg3PPROY2KDdHn_a99orQSE28QC4,518
|
|
|
10185
10185
|
simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
|
|
10186
10186
|
simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
|
|
10187
10187
|
simo/fleet/controllers.py,sha256=WCqOA5Qrn9RavdfcB8X06WwaTE-9TGUprTQHZ8V8-nA,23172
|
|
10188
|
-
simo/fleet/forms.py,sha256=
|
|
10188
|
+
simo/fleet/forms.py,sha256=dkp7NyP0In4_48k9fuyASLypTiNVwQVZCTJWxv2blFE,49763
|
|
10189
10189
|
simo/fleet/gateways.py,sha256=KV5i5fxXIrlK-k6zyEkk83x11GJt-ELQ0npb4Ac83cM,3693
|
|
10190
10190
|
simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
|
|
10191
10191
|
simo/fleet/models.py,sha256=bD5AebGFCAYGXPYhTA2nK1X9KpMG4WK4zFk9OzBDoHI,15301
|
|
@@ -10202,7 +10202,7 @@ simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=SqyTuaz_kEBvx-bL46SclsZEE
|
|
|
10202
10202
|
simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
|
|
10203
10203
|
simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
|
|
10204
10204
|
simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=TN3yvfZJgS7FwzgP4S1aDoaOqxbKj2oXfXOxqbkIXJU,19856
|
|
10205
|
-
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=
|
|
10205
|
+
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=W-Zwcv-63_a_vhWdl8IHN72maeR9R7zSYluvcDj1-HU,34393
|
|
10206
10206
|
simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=YAcgTOqJbtjGI03lvEcU6keFfrwAHkObVmErYzfRvjk,3569
|
|
10207
10207
|
simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
|
|
10208
10208
|
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=LjcLsSytCQd17xhH-5RrzvnZ6JYI1ilvNdCY2iUCsGc,12935
|
|
@@ -10287,8 +10287,8 @@ simo/fleet/migrations/__pycache__/__init__.cpython-38.pyc,sha256=5k1KW0jeSDzw6Rn
|
|
|
10287
10287
|
simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10288
10288
|
simo/generic/app_widgets.py,sha256=E_pnpA1hxMIhenRCrHoQ5cik06jm2BAHCkl_eo-OudU,1264
|
|
10289
10289
|
simo/generic/base_types.py,sha256=djymox_boXTHX1BTTCLXrCH7ED-uAsV_idhaDOc3OLI,409
|
|
10290
|
-
simo/generic/controllers.py,sha256=
|
|
10291
|
-
simo/generic/forms.py,sha256=
|
|
10290
|
+
simo/generic/controllers.py,sha256=lxMdbNxbvoUPctoLBz8heCOb5aAUx9k3h56Y7ByRKdg,56036
|
|
10291
|
+
simo/generic/forms.py,sha256=sxNl_iAgZJ5cCDcwgK0m4S7fs-O8RJutoiFeC1w_DlQ,29522
|
|
10292
10292
|
simo/generic/gateways.py,sha256=dZQPzO23UbW9q4dEB9fqgt9Meg8mX94euXnRvfwxusY,18004
|
|
10293
10293
|
simo/generic/models.py,sha256=92TACMhJHadAg0TT9GnARO_R3_Sl6i-GGjhG_x7YdFI,7391
|
|
10294
10294
|
simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
|
|
@@ -10296,8 +10296,8 @@ simo/generic/socket_consumers.py,sha256=NfTQGYtVAc864IoogZRxf_0xpDPM0eMCWn0SlKA5
|
|
|
10296
10296
|
simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
|
|
10297
10297
|
simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=0IoKRG9n1tkNRRkrqAeOQwWBPd_33u98JBcVtMVVCio,2374
|
|
10298
10298
|
simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=ptw6axyAqemZA35oa6vzr7EihzvbhW9w7Y-G6kfDedU,555
|
|
10299
|
-
simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=
|
|
10300
|
-
simo/generic/__pycache__/forms.cpython-38.pyc,sha256=
|
|
10299
|
+
simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=HtPEtQfdbHCwO9BejEGPIsJyqyCmo7owteXE09VXZ7Y,35588
|
|
10300
|
+
simo/generic/__pycache__/forms.cpython-38.pyc,sha256=g4N2Zcarce0dMovJZt3TQHAhKWA1W3k2nurBg1NqHaY,21297
|
|
10301
10301
|
simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=B35GiB4wBRzvd91ugL89Z3vYADiLiERP0T-21CnLqKc,13324
|
|
10302
10302
|
simo/generic/__pycache__/models.cpython-38.pyc,sha256=PzlZsM1jxo3FVb7QDm3bny8UFwTsGrMQe4mj4tJ06eQ,5675
|
|
10303
10303
|
simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
|
|
@@ -10379,7 +10379,7 @@ simo/users/auth_backends.py,sha256=I5pnaTa20-Lxfw_dFG8471xDITb0_fQl1PVhJalp5vU,3
|
|
|
10379
10379
|
simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
|
|
10380
10380
|
simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
|
|
10381
10381
|
simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
|
|
10382
|
-
simo/users/models.py,sha256=
|
|
10382
|
+
simo/users/models.py,sha256=CcdxpCCJZXHHaPonNdHdfIwcdXREmOZq2CBYiHx6pFg,19251
|
|
10383
10383
|
simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
|
|
10384
10384
|
simo/users/serializers.py,sha256=DwbFGi4WeTYXOSnfrBfd5rC5OGtevYurn27EaTVa1EU,2553
|
|
10385
10385
|
simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
|
|
@@ -10394,7 +10394,7 @@ simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=MuOieBIXt6lrDx83-UQtd
|
|
|
10394
10394
|
simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
|
|
10395
10395
|
simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
|
|
10396
10396
|
simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
|
|
10397
|
-
simo/users/__pycache__/models.cpython-38.pyc,sha256=
|
|
10397
|
+
simo/users/__pycache__/models.cpython-38.pyc,sha256=ljV7uz49n2MhMpdeZYgA-DwFxx_4y6RvjdprjrIx1u8,17769
|
|
10398
10398
|
simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
|
|
10399
10399
|
simo/users/__pycache__/serializers.cpython-38.pyc,sha256=tZzdmCdSnqekAgRl0kyq-msm7QfUA0J_IipfrysAMRM,3477
|
|
10400
10400
|
simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
|
|
@@ -10468,8 +10468,8 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
10468
10468
|
simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10469
10469
|
simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10470
10470
|
simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10471
|
-
simo-2.0.
|
|
10472
|
-
simo-2.0.
|
|
10473
|
-
simo-2.0.
|
|
10474
|
-
simo-2.0.
|
|
10475
|
-
simo-2.0.
|
|
10471
|
+
simo-2.0.40.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
|
|
10472
|
+
simo-2.0.40.dist-info/METADATA,sha256=FCujXv4zFHR57h_bX2NZr6pPfjkR-iuCn8zEJ4nhI7M,1730
|
|
10473
|
+
simo-2.0.40.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
10474
|
+
simo-2.0.40.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
|
|
10475
|
+
simo-2.0.40.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|