simo 2.0.22__py3-none-any.whl → 2.0.24__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__/settings.cpython-38.pyc +0 -0
- simo/core/__pycache__/api.cpython-38.pyc +0 -0
- simo/core/__pycache__/models.cpython-38.pyc +0 -0
- simo/core/__pycache__/permissions.cpython-38.pyc +0 -0
- simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
- simo/core/api.py +14 -33
- simo/core/models.py +7 -2
- simo/core/permissions.py +33 -5
- simo/core/serializers.py +1 -1
- simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/models.cpython-38.pyc +0 -0
- simo/fleet/forms.py +11 -9
- simo/fleet/models.py +14 -4
- simo/settings.py +0 -1
- {simo-2.0.22.dist-info → simo-2.0.24.dist-info}/METADATA +1 -1
- {simo-2.0.22.dist-info → simo-2.0.24.dist-info}/RECORD +19 -19
- {simo-2.0.22.dist-info → simo-2.0.24.dist-info}/LICENSE.md +0 -0
- {simo-2.0.22.dist-info → simo-2.0.24.dist-info}/WHEEL +0 -0
- {simo-2.0.22.dist-info → simo-2.0.24.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/core/api.py
CHANGED
|
@@ -5,7 +5,7 @@ import time
|
|
|
5
5
|
from django.db.models import Q, Prefetch
|
|
6
6
|
from django.utils.translation import gettext_lazy as _
|
|
7
7
|
from django.utils import timezone
|
|
8
|
-
from django.
|
|
8
|
+
from django.http import HttpResponse, Http404
|
|
9
9
|
from simo.core.utils.helpers import get_self_ip, search_queryset
|
|
10
10
|
from rest_framework.pagination import PageNumberPagination
|
|
11
11
|
from rest_framework import viewsets
|
|
@@ -14,7 +14,6 @@ from rest_framework.decorators import action
|
|
|
14
14
|
from rest_framework.response import Response as RESTResponse
|
|
15
15
|
from rest_framework.exceptions import ValidationError as APIValidationError
|
|
16
16
|
from simo.core.utils.config_values import ConfigException
|
|
17
|
-
from simo.users.middleware import introduce as introduce_user
|
|
18
17
|
from .models import (
|
|
19
18
|
Instance, Category, Zone, Component, Icon, ComponentHistory,
|
|
20
19
|
HistoryAggregate, Gateway
|
|
@@ -23,7 +22,9 @@ from .serializers import (
|
|
|
23
22
|
IconSerializer, CategorySerializer, ZoneSerializer,
|
|
24
23
|
ComponentSerializer, ComponentHistorySerializer
|
|
25
24
|
)
|
|
26
|
-
from .permissions import
|
|
25
|
+
from .permissions import (
|
|
26
|
+
IsInstanceSuperuser, InstanceSuperuserCanEdit, ComponentPermission
|
|
27
|
+
)
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
class InstanceMixin:
|
|
@@ -34,10 +35,10 @@ class InstanceMixin:
|
|
|
34
35
|
slug=self.request.resolver_match.kwargs.get('instance_slug')
|
|
35
36
|
)
|
|
36
37
|
except Instance.DoesNotExist:
|
|
37
|
-
|
|
38
|
+
return HttpResponse(
|
|
38
39
|
f"Instance {self.request.resolver_match.kwargs.get('instance_slug')} "
|
|
39
40
|
"is not found on this SIMO.io hub!",
|
|
40
|
-
|
|
41
|
+
status=400
|
|
41
42
|
)
|
|
42
43
|
return super().dispatch(request, *args, **kwargs)
|
|
43
44
|
|
|
@@ -165,6 +166,7 @@ class ComponentViewSet(InstanceMixin, viewsets.ModelViewSet):
|
|
|
165
166
|
|
|
166
167
|
def get_permissions(self):
|
|
167
168
|
permissions = super().get_permissions()
|
|
169
|
+
permissions.append(ComponentPermission())
|
|
168
170
|
permissions.append(InstanceSuperuserCanEdit())
|
|
169
171
|
return permissions
|
|
170
172
|
|
|
@@ -207,10 +209,10 @@ class ComponentViewSet(InstanceMixin, viewsets.ModelViewSet):
|
|
|
207
209
|
|
|
208
210
|
return RESTResponse(result)
|
|
209
211
|
|
|
210
|
-
|
|
212
|
+
# TODO: remove post when app is updated for all users
|
|
213
|
+
@action(detail=True, methods=['post', 'put'])
|
|
211
214
|
def subcomponent(self, request, pk=None, *args, **kwargs):
|
|
212
215
|
component = self.get_object()
|
|
213
|
-
self.check_object_permissions(request, component)
|
|
214
216
|
json_data = request.data
|
|
215
217
|
subcomponent_id = json_data.pop('id', -1)
|
|
216
218
|
try:
|
|
@@ -228,37 +230,16 @@ class ComponentViewSet(InstanceMixin, viewsets.ModelViewSet):
|
|
|
228
230
|
self.check_object_permissions(self.request, subcomponent)
|
|
229
231
|
return self.perform_controller_method(json_data, subcomponent)
|
|
230
232
|
|
|
231
|
-
|
|
232
|
-
def check_object_permissions(self, request, component):
|
|
233
|
-
super().check_object_permissions(request, component)
|
|
234
|
-
|
|
235
|
-
if not component.controller:
|
|
236
|
-
raise APIValidationError(
|
|
237
|
-
_('Component has no controller assigned.'),
|
|
238
|
-
code=400
|
|
239
|
-
)
|
|
240
|
-
if request.user.is_master:
|
|
241
|
-
return
|
|
242
|
-
user_role = request.user.get_role(self.instance)
|
|
243
|
-
if user_role.is_superuser:
|
|
244
|
-
return
|
|
245
|
-
if not user_role.component_permissions.filter(
|
|
246
|
-
write=True, component=component
|
|
247
|
-
).count():
|
|
248
|
-
raise APIValidationError(
|
|
249
|
-
_('You do not have permission to write to this component.'),
|
|
250
|
-
code=403
|
|
251
|
-
)
|
|
252
|
-
|
|
253
|
-
@action(detail=True, methods=['post'])
|
|
233
|
+
@action(detail=True, methods=['post', 'put'])
|
|
254
234
|
def controller(self, request, pk=None, *args, **kwargs):
|
|
255
235
|
component = self.get_object()
|
|
256
|
-
self.check_object_permissions(self.request, component)
|
|
257
236
|
return self.perform_controller_method(request.data, component)
|
|
258
237
|
|
|
259
|
-
@action(detail=False, methods=['post'])
|
|
238
|
+
@action(detail=False, methods=['post', 'put'])
|
|
260
239
|
def control(self, request, *args, **kwargs):
|
|
261
|
-
component =
|
|
240
|
+
component = self.get_queryset().filter(id=request.data.pop('id', 0))
|
|
241
|
+
if not component:
|
|
242
|
+
raise Http404()
|
|
262
243
|
self.check_object_permissions(self.request, component)
|
|
263
244
|
return self.perform_controller_method(request.data, component)
|
|
264
245
|
|
simo/core/models.py
CHANGED
|
@@ -163,7 +163,7 @@ class Category(DirtyFieldsMixin, models.Model, SimoAdminMixin):
|
|
|
163
163
|
help_text=_("All components automatically belongs to this category")
|
|
164
164
|
)
|
|
165
165
|
order = models.PositiveIntegerField(
|
|
166
|
-
|
|
166
|
+
blank=False, null=False, db_index=True
|
|
167
167
|
)
|
|
168
168
|
objects = CategoriesManager()
|
|
169
169
|
|
|
@@ -175,8 +175,13 @@ class Category(DirtyFieldsMixin, models.Model, SimoAdminMixin):
|
|
|
175
175
|
def __str__(self):
|
|
176
176
|
return self.name
|
|
177
177
|
|
|
178
|
-
|
|
179
178
|
def save(self, *args, **kwargs):
|
|
179
|
+
if self.order is None:
|
|
180
|
+
last_cat = Category.objects.filter(instance=self.instance).last()
|
|
181
|
+
if last_cat:
|
|
182
|
+
self.order = last_cat.order + 1
|
|
183
|
+
else:
|
|
184
|
+
self.order = 0
|
|
180
185
|
dirty_fields = self.get_dirty_fields()
|
|
181
186
|
if 'all' in dirty_fields:
|
|
182
187
|
if self.all:
|
simo/core/permissions.py
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
from rest_framework.permissions import BasePermission, SAFE_METHODS
|
|
1
|
+
from rest_framework.permissions import BasePermission, SAFE_METHODS, IsAuthenticated
|
|
2
2
|
from .models import Instance, Category, Zone
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
class InstancePermission(BasePermission):
|
|
6
|
-
""
|
|
7
|
-
Allows access only to user instances
|
|
8
|
-
"""
|
|
6
|
+
message = "You have no role in this SIMO.io instance."
|
|
9
7
|
|
|
10
8
|
def has_permission(self, request, view):
|
|
11
9
|
if not request.user.is_active:
|
|
@@ -24,6 +22,7 @@ class InstancePermission(BasePermission):
|
|
|
24
22
|
|
|
25
23
|
|
|
26
24
|
class IsInstanceSuperuser(BasePermission):
|
|
25
|
+
message = "Only superusers are allowed to do this."
|
|
27
26
|
|
|
28
27
|
def has_permission(self, request, view):
|
|
29
28
|
if request.user.is_master:
|
|
@@ -33,8 +32,18 @@ class IsInstanceSuperuser(BasePermission):
|
|
|
33
32
|
|
|
34
33
|
|
|
35
34
|
class InstanceSuperuserCanEdit(BasePermission):
|
|
35
|
+
message = "Only superusers are allowed to perform this action."
|
|
36
36
|
|
|
37
37
|
def has_object_permission(self, request, view, obj):
|
|
38
|
+
'''
|
|
39
|
+
in this permission we only care about:
|
|
40
|
+
POST - create new object
|
|
41
|
+
PATCH - modify an object
|
|
42
|
+
DELETE - delete an oject
|
|
43
|
+
'''
|
|
44
|
+
|
|
45
|
+
if request.method in SAFE_METHODS + ('PUT', 'POST', ): # TODO: remove POST
|
|
46
|
+
return True
|
|
38
47
|
|
|
39
48
|
# allow deleting only empty categories and zones
|
|
40
49
|
if type(obj) in (Zone, Category) and request.method == 'DELETE'\
|
|
@@ -46,4 +55,23 @@ class InstanceSuperuserCanEdit(BasePermission):
|
|
|
46
55
|
user_role = request.user.get_role(view.instance)
|
|
47
56
|
if user_role.is_superuser:
|
|
48
57
|
return True
|
|
49
|
-
|
|
58
|
+
|
|
59
|
+
return False
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class ComponentPermission(BasePermission):
|
|
63
|
+
message = "You do not have permission to do this on this component."
|
|
64
|
+
|
|
65
|
+
def has_object_permission(self, request, view, obj):
|
|
66
|
+
if request.method in SAFE_METHODS:
|
|
67
|
+
return True
|
|
68
|
+
if request.user.is_master:
|
|
69
|
+
return True
|
|
70
|
+
user_role = request.user.get_role(view.instance)
|
|
71
|
+
if user_role.is_superuser:
|
|
72
|
+
return True
|
|
73
|
+
if request.method == 'POST' and user_role.component_permissions.filter(
|
|
74
|
+
write=True, component=obj
|
|
75
|
+
).count():
|
|
76
|
+
return True
|
|
77
|
+
return False
|
simo/core/serializers.py
CHANGED
|
@@ -243,6 +243,7 @@ class ComponentSerializer(FormSerializer):
|
|
|
243
243
|
meta = ObjectSerializerMethodField()
|
|
244
244
|
arm_status = ObjectSerializerMethodField()
|
|
245
245
|
battery_level = ObjectSerializerMethodField()
|
|
246
|
+
controller_methods = serializers.SerializerMethodField()
|
|
246
247
|
|
|
247
248
|
class Meta:
|
|
248
249
|
form = ComponentAdminForm
|
|
@@ -287,7 +288,6 @@ class ComponentSerializer(FormSerializer):
|
|
|
287
288
|
cls = form_field.field.__class__
|
|
288
289
|
if field_name == 'notes':
|
|
289
290
|
serializer_field_class = TextAreaSerializerField
|
|
290
|
-
print("TEXTAREA!~!!!")
|
|
291
291
|
else:
|
|
292
292
|
try:
|
|
293
293
|
serializer_field_class = field_mapping[cls]
|
|
Binary file
|
|
Binary file
|
simo/fleet/forms.py
CHANGED
|
@@ -573,12 +573,6 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
|
|
|
573
573
|
]
|
|
574
574
|
)
|
|
575
575
|
)
|
|
576
|
-
frequency = forms.IntegerField(
|
|
577
|
-
min_value=30, max_value=100000, required=True, initial=3000,
|
|
578
|
-
help_text="PWM signal frequency in Hz. Works only with GPIO ports."
|
|
579
|
-
"3000 Hz offers great performance in most use cases."
|
|
580
|
-
|
|
581
|
-
)
|
|
582
576
|
min = forms.FloatField(
|
|
583
577
|
required=True, initial=0,
|
|
584
578
|
help_text="Minimum component value"
|
|
@@ -707,6 +701,14 @@ class ColonelRGBLightConfigForm(ColonelComponentForm):
|
|
|
707
701
|
help_text="Custom addressable led strip timing (T0H, T0L, T1H, T1L). <br>"
|
|
708
702
|
"For example SK6812 is: (300, 900, 600, 600)"
|
|
709
703
|
)
|
|
704
|
+
sustain_color = forms.BooleanField(
|
|
705
|
+
initial=True, required=False,
|
|
706
|
+
help_text="Recommended to leave this enabled. <br>"
|
|
707
|
+
"Addressible signal wire might pick up electrical "
|
|
708
|
+
"noise from it's surroundings which might cause color change "
|
|
709
|
+
"on random pixels. Colonel will send color update every 20s "
|
|
710
|
+
"to sustain last set color if this is enabled. "
|
|
711
|
+
)
|
|
710
712
|
controls = FormsetField(
|
|
711
713
|
formset_factory(
|
|
712
714
|
ControlPinForm, can_delete=True, can_order=True, extra=0, max_num=2
|
|
@@ -723,9 +725,9 @@ class ColonelRGBLightConfigForm(ColonelComponentForm):
|
|
|
723
725
|
return custom_timing
|
|
724
726
|
custom_timing = custom_timing.strip().\
|
|
725
727
|
strip('(').strip('[').rstrip(')').rstrip(']').split(',')
|
|
726
|
-
if len(custom_timing
|
|
728
|
+
if len(custom_timing) != 4:
|
|
727
729
|
raise forms.ValidationError("Tuple of 4 integers please.")
|
|
728
|
-
for t in custom_timing
|
|
730
|
+
for t in custom_timing:
|
|
729
731
|
try:
|
|
730
732
|
t = int(t)
|
|
731
733
|
except:
|
|
@@ -734,7 +736,7 @@ class ColonelRGBLightConfigForm(ColonelComponentForm):
|
|
|
734
736
|
raise forms.ValidationError(f"Intervals must be greater than 0.")
|
|
735
737
|
if t > 100000:
|
|
736
738
|
raise forms.ValidationError(f"{t} seems way to much!")
|
|
737
|
-
return f"({custom_timing})"
|
|
739
|
+
return f"({','.join(custom_timing)})"
|
|
738
740
|
|
|
739
741
|
def clean(self):
|
|
740
742
|
super().clean()
|
simo/fleet/models.py
CHANGED
|
@@ -327,10 +327,20 @@ def post_i2c_interface_delete(sender, instance, *args, **kwargs):
|
|
|
327
327
|
pin.occupied_by_content_type = None
|
|
328
328
|
pin.occupied_by_content_id = None
|
|
329
329
|
pin.save()
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
330
|
+
|
|
331
|
+
# In an event of colonel deletion these pin no longer exist
|
|
332
|
+
# at this point, therefore this trhows irrelevant exceptions
|
|
333
|
+
# that we want to fail silenty
|
|
334
|
+
try:
|
|
335
|
+
instance.scl_pin.occupied_by = instance
|
|
336
|
+
instance.scl_pin.save()
|
|
337
|
+
except ColonelPin.DoesNotExist:
|
|
338
|
+
pass
|
|
339
|
+
try:
|
|
340
|
+
instance.sda_pin.occupied_by = instance
|
|
341
|
+
instance.sda_pin.save()
|
|
342
|
+
except ColonelPin.DoesNotExist:
|
|
343
|
+
pass
|
|
334
344
|
|
|
335
345
|
|
|
336
346
|
class Interface(models.Model):
|
simo/settings.py
CHANGED
|
@@ -176,7 +176,6 @@ REST_FRAMEWORK = {
|
|
|
176
176
|
'simo.core.api_auth.IsAuthenticated',
|
|
177
177
|
],
|
|
178
178
|
'DEFAULT_PERMISSION_CLASSES': [
|
|
179
|
-
'rest_framework.permissions.IsAuthenticated',
|
|
180
179
|
'simo.users.permissions.IsActivePermission',
|
|
181
180
|
'simo.core.permissions.InstancePermission'
|
|
182
181
|
],
|
|
@@ -6,7 +6,7 @@ simo/cli.py,sha256=kB1dhZ30Pnq7mDawWGbX5WnCuoZ6qNMcnWH-c8XxcaU,2233
|
|
|
6
6
|
simo/conf.py,sha256=H2BhXAV8MEDVXF8AbkaLSfR4ULd-9_bS4bnhE5sE5fg,112
|
|
7
7
|
simo/on_http_start.py,sha256=PJQlKYeZbtGCxRjDV6zcCqyA5Ns9d5NND30Tb6vIav4,2358
|
|
8
8
|
simo/scripting.py,sha256=PVIkGsiMDWj4CNTbOM3rq7pJ6ruavuns-ZMU7VudLa4,923
|
|
9
|
-
simo/settings.py,sha256=
|
|
9
|
+
simo/settings.py,sha256=yezM7QleJv73IFWMsPyGxqoI_c3JV21R1RsDcgweIfU,6840
|
|
10
10
|
simo/urls.py,sha256=PgKGCZON3SAL3Hh9vVDWVJ9zDQO5ZPsRQLz_s5GWSV0,2328
|
|
11
11
|
simo/wsgi.py,sha256=ci7BK1zCuqTwCUQi29su7xKeGEJHk0N3Oc8jGJRO6EY,165
|
|
12
12
|
simo/__pycache__/__init__.cpython-38.pyc,sha256=j81de0BqHMr6bs0C7cuYrXl7HwtK_vv8hDEtAdSwDJc,153
|
|
@@ -14,7 +14,7 @@ simo/__pycache__/asgi.cpython-38.pyc,sha256=OemZ2InNbZCiJtD3MWSO8IiDSqp-LUyTLFjM
|
|
|
14
14
|
simo/__pycache__/celeryc.cpython-38.pyc,sha256=eSRoaKwfYlxVaxAiwqpQ2ndEcx7W-VpZtbxRFSV8UYg,1653
|
|
15
15
|
simo/__pycache__/conf.cpython-38.pyc,sha256=MYP2yk3ULxiYwZsZR6tCLjKnU-z03A3avzQzIn66y3k,273
|
|
16
16
|
simo/__pycache__/on_http_start.cpython-38.pyc,sha256=cjgntuqsmandjyNtJoqch0LpxA-BNF3UR8vUxufYn9g,2067
|
|
17
|
-
simo/__pycache__/settings.cpython-38.pyc,sha256=
|
|
17
|
+
simo/__pycache__/settings.cpython-38.pyc,sha256=m9O2hfu1sVkYxi9-MzM2D4DzOHL7ea9LOt1AJlV4LdI,6084
|
|
18
18
|
simo/__pycache__/urls.cpython-38.pyc,sha256=sqfstQthcjXtv31Tad0RAlWWI2A0HH6HN0fW0VmmWQw,2050
|
|
19
19
|
simo/__pycache__/wsgi.cpython-38.pyc,sha256=Wt9kKkH2Sg5LRL4NrVQQDYPIoDyTvnXwm6jZjnG3kIc,322
|
|
20
20
|
simo/_hub_template/hub/asgi.py,sha256=ElN_fdeSkf0Ysa7pS9rJVmZ1HmLhFxb8jFaMLqe1220,126
|
|
@@ -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=cPOC2x45Gjf0T8MKtmE2wJZk7DAuHMsvvy5Nk3YUIG8,17675
|
|
29
|
-
simo/core/api.py,sha256=
|
|
29
|
+
simo/core/api.py,sha256=uMbczzV6gLIOJWRe6sHJGwvZrDhzOPU-zePSihi3MqE,23048
|
|
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
|
|
@@ -43,10 +43,10 @@ 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=
|
|
47
|
-
simo/core/permissions.py,sha256=
|
|
46
|
+
simo/core/models.py,sha256=zqbPDYLHOsavrBzw5uOmUgcWBnBbjGLvezgETX-pD_E,19672
|
|
47
|
+
simo/core/permissions.py,sha256=3PEmEVoRXSN6HjQKoRq7ONU6Yt2mv8c_Ya5KZH815RA,2372
|
|
48
48
|
simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
|
|
49
|
-
simo/core/serializers.py,sha256=
|
|
49
|
+
simo/core/serializers.py,sha256=kmja52o-BUOcUTX2ZsKWixvKRZSXB7lGe866Q1ajlmo,17563
|
|
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
|
|
@@ -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=EqwHQhU8qQrjfSChyCZXN6J-1Eira9alYIqR45-3OnE,13475
|
|
60
|
-
simo/core/__pycache__/api.cpython-38.pyc,sha256=
|
|
60
|
+
simo/core/__pycache__/api.cpython-38.pyc,sha256=wyjCPKUQtjiQ9xg9kOVhycu8Jm_2ZE1HPPqCRyLRyLE,18383
|
|
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
|
|
@@ -74,10 +74,10 @@ simo/core/__pycache__/gateways.cpython-38.pyc,sha256=XBiwMfBkjoQ2re6jvADJOwK0_0A
|
|
|
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=
|
|
78
|
-
simo/core/__pycache__/permissions.cpython-38.pyc,sha256=
|
|
77
|
+
simo/core/__pycache__/models.cpython-38.pyc,sha256=meQeK2mVoSDP9cTMSZDW-Ofi53QzwjfHSUlAGlnhyfs,17127
|
|
78
|
+
simo/core/__pycache__/permissions.cpython-38.pyc,sha256=das7lo0PAfQsiRgkqOxP-rd1p2EElyk4wE8XUhVccuA,2635
|
|
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=x-obnrdPnoYRhriP_51_Jy_0saCsasWdFQSH1kalVqo,16869
|
|
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
|
|
@@ -10171,10 +10171,10 @@ simo/fleet/auto_urls.py,sha256=X04oKJWA48wFW5iXg3PPROY2KDdHn_a99orQSE28QC4,518
|
|
|
10171
10171
|
simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
|
|
10172
10172
|
simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
|
|
10173
10173
|
simo/fleet/controllers.py,sha256=rTxRFf-LKWAZxzixrsLZHHm51BmMx9a1PLdgf6inlNM,20533
|
|
10174
|
-
simo/fleet/forms.py,sha256=
|
|
10174
|
+
simo/fleet/forms.py,sha256=7qe-Izd3yMc43BFdpfgqtz_9dkVxhp4krB-iKsTA5_I,38407
|
|
10175
10175
|
simo/fleet/gateways.py,sha256=KV5i5fxXIrlK-k6zyEkk83x11GJt-ELQ0npb4Ac83cM,3693
|
|
10176
10176
|
simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
|
|
10177
|
-
simo/fleet/models.py,sha256=
|
|
10177
|
+
simo/fleet/models.py,sha256=ve-97F1cwGt-AmwfSJK0d-57pP3NyZpeu0XlHu2oK28,14494
|
|
10178
10178
|
simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
|
|
10179
10179
|
simo/fleet/serializers.py,sha256=LgSTnSI_sUhFXmW9-669keM6gmaSI_teaqMHEab4aL4,1972
|
|
10180
10180
|
simo/fleet/socket_consumers.py,sha256=Z-MooNN2HQccdhkynADJks5slbK9mGsnEpMLuA51H3I,18534
|
|
@@ -10188,10 +10188,10 @@ simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=SqyTuaz_kEBvx-bL46SclsZEE
|
|
|
10188
10188
|
simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
|
|
10189
10189
|
simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
|
|
10190
10190
|
simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=l9bz18Qp33C12TJOKPSn9vIXnlBKnBusODNk7Fg64qA,18103
|
|
10191
|
-
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=
|
|
10191
|
+
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=3MAf9dL-HZjMiOhaLmMjMh_KR0so_9Rq4XYS4htX-zQ,27711
|
|
10192
10192
|
simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=YAcgTOqJbtjGI03lvEcU6keFfrwAHkObVmErYzfRvjk,3569
|
|
10193
10193
|
simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
|
|
10194
|
-
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=
|
|
10194
|
+
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=pHNRUiPRjH0SLp14pzbSIxHi_-27SpZFgSh_7lzA8Wo,12359
|
|
10195
10195
|
simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
|
|
10196
10196
|
simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=gwLIoLQJwkFoDCjKC_ikksNCYea3-mF8hVHFeKlOkbc,3098
|
|
10197
10197
|
simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=RjzPD580096fby0HYLzZorm61zdZNOq5AHXmNAC4Yd8,13764
|
|
@@ -10448,8 +10448,8 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
10448
10448
|
simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10449
10449
|
simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10450
10450
|
simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10451
|
-
simo-2.0.
|
|
10452
|
-
simo-2.0.
|
|
10453
|
-
simo-2.0.
|
|
10454
|
-
simo-2.0.
|
|
10455
|
-
simo-2.0.
|
|
10451
|
+
simo-2.0.24.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
|
|
10452
|
+
simo-2.0.24.dist-info/METADATA,sha256=iakv_6SOidRd-FQnFU6PzDNjrtBwjGUHzd-7LK3mW3k,1730
|
|
10453
|
+
simo-2.0.24.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
10454
|
+
simo-2.0.24.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
|
|
10455
|
+
simo-2.0.24.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|