simo 2.7.21__py3-none-any.whl → 2.8.2__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.

Files changed (47) hide show
  1. simo/automation/__pycache__/controllers.cpython-312.pyc +0 -0
  2. simo/automation/controllers.py +5 -4
  3. simo/core/__pycache__/api_auth.cpython-312.pyc +0 -0
  4. simo/core/__pycache__/controllers.cpython-312.pyc +0 -0
  5. simo/core/__pycache__/forms.cpython-312.pyc +0 -0
  6. simo/core/__pycache__/managers.cpython-312.pyc +0 -0
  7. simo/core/__pycache__/middleware.cpython-312.pyc +0 -0
  8. simo/core/__pycache__/models.cpython-312.pyc +0 -0
  9. simo/core/__pycache__/permissions.cpython-312.pyc +0 -0
  10. simo/core/__pycache__/serializers.cpython-312.pyc +0 -0
  11. simo/core/__pycache__/signal_receivers.cpython-312.pyc +0 -0
  12. simo/core/__pycache__/socket_consumers.cpython-312.pyc +0 -0
  13. simo/core/__pycache__/tasks.cpython-312.pyc +0 -0
  14. simo/core/api_auth.py +1 -1
  15. simo/core/controllers.py +2 -7
  16. simo/core/forms.py +1 -1
  17. simo/core/managers.py +1 -1
  18. simo/core/middleware.py +6 -13
  19. simo/core/models.py +1 -1
  20. simo/core/serializers.py +1 -2
  21. simo/core/signal_receivers.py +2 -2
  22. simo/core/socket_consumers.py +4 -5
  23. simo/generic/__pycache__/controllers.cpython-312.pyc +0 -0
  24. simo/generic/__pycache__/forms.cpython-312.pyc +0 -0
  25. simo/generic/__pycache__/gateways.cpython-312.pyc +0 -0
  26. simo/generic/__pycache__/socket_consumers.cpython-312.pyc +0 -0
  27. simo/generic/controllers.py +0 -7
  28. simo/generic/forms.py +2 -2
  29. simo/generic/gateways.py +1 -1
  30. simo/generic/socket_consumers.py +2 -2
  31. simo/users/__pycache__/middleware.cpython-312.pyc +0 -0
  32. simo/users/__pycache__/models.cpython-312.pyc +0 -0
  33. simo/users/__pycache__/serializers.cpython-312.pyc +0 -0
  34. simo/users/__pycache__/utils.cpython-312.pyc +0 -0
  35. simo/users/__pycache__/views.cpython-312.pyc +0 -0
  36. simo/users/api.py +4 -4
  37. simo/users/middleware.py +4 -30
  38. simo/users/models.py +1 -2
  39. simo/users/serializers.py +2 -2
  40. simo/users/utils.py +18 -1
  41. simo/users/views.py +2 -0
  42. {simo-2.7.21.dist-info → simo-2.8.2.dist-info}/METADATA +2 -2
  43. {simo-2.7.21.dist-info → simo-2.8.2.dist-info}/RECORD +47 -47
  44. {simo-2.7.21.dist-info → simo-2.8.2.dist-info}/WHEEL +1 -1
  45. {simo-2.7.21.dist-info → simo-2.8.2.dist-info}/LICENSE.md +0 -0
  46. {simo-2.7.21.dist-info → simo-2.8.2.dist-info}/entry_points.txt +0 -0
  47. {simo-2.7.21.dist-info → simo-2.8.2.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,7 @@ from bs4 import BeautifulSoup
8
8
  from django.core.exceptions import ValidationError
9
9
  from django.utils.translation import gettext_lazy as _
10
10
  from simo.conf import dynamic_settings
11
- from simo.users.middleware import get_current_user
11
+ from simo.users.utils import get_current_user
12
12
  from simo.core.models import RUN_STATUS_CHOICES_MAP, Component
13
13
  from simo.core.utils.operations import OPERATIONS
14
14
  from simo.core.middleware import get_current_instance
@@ -297,10 +297,11 @@ class PresenceLighting(Script):
297
297
  ).first()
298
298
  if not comp or not comp.controller:
299
299
  continue
300
-
301
- if not light_params.get('off_value', 0):
300
+ try:
301
+ off_val = int(light_params.get('off_value', 0))
302
+ except:
302
303
  off_val = 0
303
- else:
304
+ if off_val != 0:
304
305
  off_val = self.light_org_values.get(comp.id, 0)
305
306
  print(f"Send {off_val} to {comp}!")
306
307
  if comp.value != off_val:
Binary file
Binary file
simo/core/api_auth.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from rest_framework.authentication import SessionAuthentication, BasicAuthentication
2
2
  from rest_framework import HTTP_HEADER_ENCODING, exceptions
3
3
  from simo.users.models import User
4
- from simo.users.middleware import introduce as introduce_user
4
+ from simo.users.utils import introduce_user
5
5
 
6
6
 
7
7
  class SecretKeyAuth(BasicAuthentication):
simo/core/controllers.py CHANGED
@@ -10,8 +10,7 @@ from django.core.exceptions import ValidationError
10
10
  from django.utils import timezone
11
11
  from django.template.loader import render_to_string
12
12
  from django.utils.translation import gettext_lazy as _
13
- from simo.users.middleware import introduce, get_current_user
14
- from simo.users.utils import get_device_user
13
+ from simo.users.utils import introduce_user, get_current_user, get_device_user
15
14
  from .utils.helpers import is_hex_color, classproperty
16
15
  # from django.utils.functional import classproperty
17
16
  from .gateways import BaseGatewayHandler
@@ -291,10 +290,6 @@ class ControllerBase(ABC):
291
290
  if not actor:
292
291
  actor = get_current_user()
293
292
 
294
- # Introducing user to this thread for changes that might happen to other components
295
- # in relation to the change of this component
296
- introduce(actor)
297
-
298
293
  self.component.refresh_from_db()
299
294
  if value != self.component.value:
300
295
  self.component.value_previous = self.component.value
@@ -319,7 +314,7 @@ class ControllerBase(ABC):
319
314
 
320
315
  # Introducing user to this thread for changes that might happen to other components
321
316
  # in relation to the change of this component
322
- introduce(actor)
317
+ introduce_user(actor)
323
318
  self.component.alive = is_alive
324
319
  if error_msg != None:
325
320
  self.component.error_msg = error_msg if error_msg.strip() else None
simo/core/forms.py CHANGED
@@ -124,7 +124,7 @@ class ConfigFieldsMixin:
124
124
  continue
125
125
 
126
126
  if commit:
127
- from simo.users.middleware import get_current_user
127
+ from simo.users.utils import get_current_user
128
128
  actor = get_current_user()
129
129
  if self.instance.pk:
130
130
  verb = 'modified'
simo/core/managers.py CHANGED
@@ -58,7 +58,7 @@ class ComponentsManager(models.Manager):
58
58
  """
59
59
  from .models import Component
60
60
  from .controllers import BEFORE_SEND
61
- from simo.users.middleware import get_current_user
61
+ from simo.users.utils import get_current_user
62
62
  from .events import GatewayObjectCommand
63
63
 
64
64
  for component, value in data.items():
simo/core/middleware.py CHANGED
@@ -1,25 +1,19 @@
1
1
  import pytz
2
- import threading
3
- import re
4
2
  from django.utils import timezone
5
3
  from django.shortcuts import render
6
4
 
7
5
 
8
- _thread_locals = threading.local()
6
+ class InstanceCarrier:
7
+ instance = None
9
8
 
10
-
11
- def get_current_request():
12
- try:
13
- return _thread_locals.request
14
- except:
15
- pass
9
+ _instance_carrier = InstanceCarrier()
16
10
 
17
11
 
18
12
  def introduce_instance(instance, request=None):
19
13
  if request and request.user.is_authenticated \
20
14
  and instance not in request.user.instances:
21
15
  return
22
- _thread_locals.instance = instance
16
+ _instance_carrier.instance = instance
23
17
  if request:
24
18
  request.session['instance_id'] = instance.id
25
19
  request.instance = instance
@@ -28,7 +22,7 @@ def introduce_instance(instance, request=None):
28
22
  def drop_current_instance(request=None):
29
23
  if request and 'instance_id' in request.session:
30
24
  request.session.pop('instance_id')
31
- _thread_locals.instance = None
25
+ _instance_carrier.instance = None
32
26
 
33
27
 
34
28
  def get_current_instance(request=None):
@@ -42,7 +36,7 @@ def get_current_instance(request=None):
42
36
  else:
43
37
  introduce_instance(instance, request)
44
38
 
45
- instance = getattr(_thread_locals, 'instance', None)
39
+ instance = getattr(_instance_carrier, 'instance', None)
46
40
 
47
41
  # NEVER FORCE THIS! IT's A very BAD IDEA!
48
42
  # For example gateways run on an instance neutral environment!
@@ -57,7 +51,6 @@ def get_current_instance(request=None):
57
51
  def simo_router_middleware(get_response):
58
52
 
59
53
  def middleware(request):
60
- _thread_locals.request = request
61
54
 
62
55
  request.relay = None
63
56
 
simo/core/models.py CHANGED
@@ -494,7 +494,7 @@ def is_in_alarm(self):
494
494
  )
495
495
 
496
496
  def save(self, *args, **kwargs):
497
- from simo.users.middleware import get_current_user
497
+ from simo.users.utils import get_current_user
498
498
  if self.alarm_category is not None:
499
499
  if self.arm_status == 'pending-arm':
500
500
  if not self.is_in_alarm():
simo/core/serializers.py CHANGED
@@ -8,7 +8,6 @@ from django.conf import settings
8
8
  from django.forms.utils import pretty_name
9
9
  from collections.abc import Iterable
10
10
  from easy_thumbnails.files import get_thumbnailer
11
- from simo.core.middleware import get_current_request
12
11
  from rest_framework import serializers
13
12
  from rest_framework.fields import SkipField
14
13
  from rest_framework.relations import Hyperlink, PKOnlyObject
@@ -81,7 +80,7 @@ class CategorySerializer(serializers.ModelSerializer):
81
80
  {'size': (830, 430), 'crop': True}
82
81
  )
83
82
  url = '/' + thumb.path.strip(settings.VAR_DIR)
84
- request = get_current_request()
83
+ request = self.context['request']
85
84
  if request:
86
85
  url = request.build_absolute_uri(url)
87
86
  return url
@@ -18,7 +18,7 @@ def create_instance_defaults(sender, instance, created, **kwargs):
18
18
  if not created:
19
19
  return
20
20
 
21
- from simo.users.middleware import get_current_user
21
+ from simo.users.utils import get_current_user
22
22
  actor = get_current_user()
23
23
  action.send(
24
24
  actor, target=instance, verb="instance created",
@@ -121,7 +121,7 @@ def create_instance_defaults(sender, instance, created, **kwargs):
121
121
  @receiver(post_save, sender=Zone)
122
122
  @receiver(post_save, sender=Category)
123
123
  def post_save_actions_dispatcher(sender, instance, created, **kwargs):
124
- from simo.users.middleware import get_current_user
124
+ from simo.users.utils import get_current_user
125
125
  actor = get_current_user()
126
126
  if created:
127
127
  verb = 'created'
@@ -9,7 +9,7 @@ from channels.generic.websocket import AsyncWebsocketConsumer, WebsocketConsumer
9
9
  from simo.core.events import ObjectChangeEvent, get_event_obj
10
10
  from simo.core.utils.logs import capture_socket_errors
11
11
  import paho.mqtt.client as mqtt
12
- from simo.users.middleware import introduce
12
+ from simo.users.utils import introduce_user
13
13
  from simo.core.models import Component, Gateway
14
14
  from simo.core.utils.model_helpers import get_log_file_path
15
15
  from simo.core.middleware import introduce_instance
@@ -41,7 +41,6 @@ class LogConsumer(AsyncWebsocketConsumer):
41
41
  )(
42
42
  pk=self.scope['url_route']['kwargs']['object_pk'],
43
43
  )
44
- introduce(self.scope['user'])
45
44
  await self.accept()
46
45
 
47
46
  if not self.scope['user'].is_authenticated:
@@ -137,7 +136,7 @@ class GatewayController(SIMOWebsocketConsumer):
137
136
 
138
137
  def connect(self):
139
138
 
140
- introduce(self.scope['user'])
139
+ introduce_user(self.scope['user'])
141
140
 
142
141
  self.gateway = Gateway.objects.get(
143
142
  pk=self.scope['url_route']['kwargs']['gateway_id']
@@ -194,7 +193,7 @@ class ComponentController(SIMOWebsocketConsumer):
194
193
 
195
194
  def connect(self):
196
195
 
197
- introduce(self.scope['user'])
196
+ introduce_user(self.scope['user'])
198
197
  self.accept()
199
198
 
200
199
  try:
@@ -249,7 +248,7 @@ class ComponentController(SIMOWebsocketConsumer):
249
248
  ))
250
249
 
251
250
  def receive(self, text_data=None, bytes_data=None, **kwargs):
252
- introduce(self.scope['user'])
251
+ introduce_user(self.scope['user'])
253
252
  json_data = json.loads(text_data)
254
253
  self.send_value = json_data.pop('send_value', False)
255
254
  for method, param in json_data.items():
@@ -8,8 +8,6 @@ from django.utils.functional import cached_property
8
8
  from django.utils.translation import gettext_lazy as _
9
9
  from django.conf import settings
10
10
  from django.urls import reverse_lazy
11
- from simo.users.middleware import get_current_user, introduce
12
- from simo.users.utils import get_system_user
13
11
  from simo.core.models import Component
14
12
  from simo.core.utils.helpers import get_random_string
15
13
  from simo.core.middleware import get_current_instance
@@ -197,9 +195,6 @@ class Thermostat(ControllerBase):
197
195
  low = target_temp - self.component.config['reaction_difference'] / 2
198
196
  high = target_temp + self.component.config['reaction_difference'] / 2
199
197
 
200
- if not get_current_user():
201
- introduce(get_system_user())
202
-
203
198
  if mode in ('auto', 'heater'):
204
199
  if (not heater or not heater.alive) and mode == 'heater':
205
200
  self.component.error_msg = "No heater"
@@ -671,7 +666,6 @@ class Watering(ControllerBase):
671
666
  minute_to_start -= 24*60
672
667
 
673
668
  if minute_to_start <= local_minute < minute_to_start + gap:
674
- introduce(get_system_user())
675
669
  self.reset()
676
670
  self.start()
677
671
 
@@ -929,7 +923,6 @@ class AlarmClock(ControllerBase):
929
923
  continue
930
924
  if event['uid'] in current_value['events_triggered']:
931
925
  continue
932
- introduce(get_system_user())
933
926
  self._execute_event(event)
934
927
  current_value['events_triggered'].append(event['uid'])
935
928
 
simo/generic/forms.py CHANGED
@@ -689,8 +689,8 @@ class AudioAlertConfigForm(BaseComponentForm):
689
689
  ).delete()
690
690
  self.instance.config['sound_id'] = sound.id
691
691
  self.instance.config['duration'] = self.cleaned_data['sound'].duration
692
- self.instance.config['stream_url'] = sound.stream_url()
693
- self.instance.config['file_url'] = sound.get_absolute_url()
692
+ self.instance.config['stream_url'] = sound.stream_url() # DENON Heos
693
+ self.instance.config['file_url'] = sound.get_absolute_url() # SONOS
694
694
  self.instance.config['sound'] = self.cleaned_data['sound'].name
695
695
  self.instance.save()
696
696
  return obj
simo/generic/gateways.py CHANGED
@@ -9,7 +9,7 @@ from django.utils import timezone
9
9
  import paho.mqtt.client as mqtt
10
10
  from simo.core.utils.helpers import get_self_ip
11
11
  from simo.core.models import Component, PublicFile
12
- from simo.core.middleware import introduce_instance, drop_current_instance
12
+ from simo.core.middleware import drop_current_instance
13
13
  from simo.core.gateways import BaseObjectCommandsGatewayHandler
14
14
  from simo.core.forms import BaseGatewayForm
15
15
  from simo.core.events import GatewayObjectCommand, get_event_obj
@@ -4,7 +4,7 @@ import base64
4
4
  import time
5
5
  from asgiref.sync import sync_to_async
6
6
  from channels.generic.websocket import AsyncWebsocketConsumer
7
- from simo.users.middleware import introduce
7
+ from simo.users.utils import introduce_user
8
8
  from simo.core.models import Component
9
9
 
10
10
 
@@ -22,7 +22,7 @@ class CamStreamConsumer(AsyncWebsocketConsumer):
22
22
  if not self.scope['user'].is_active:
23
23
  return self.close()
24
24
 
25
- introduce(self.scope['user'])
25
+ introduce_user(self.scope['user'])
26
26
 
27
27
  try:
28
28
  self.component = await sync_to_async(
simo/users/api.py CHANGED
@@ -194,10 +194,10 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
194
194
  user_device.users.add(request.user)
195
195
 
196
196
  log_datetime = timezone.now()
197
- if request.data.get('timestamp'):
198
- log_datetime = datetime.datetime.utcfromtimestamp(
199
- int(float(request.GET['start_from']))
200
- ).replace(tzinfo=pytz.utc)
197
+ # if request.data.get('timestamp'):
198
+ # log_datetime = datetime.datetime.fromtimestamp(
199
+ # int(float(request.GET['timestamp'])), pytz.utc
200
+ # )
201
201
 
202
202
  relay = None
203
203
  if request.META.get('HTTP_HOST', '').endswith('.simo.io'):
simo/users/middleware.py CHANGED
@@ -1,43 +1,17 @@
1
1
  # -*- coding: utf-8 -*-
2
- import threading
3
2
 
4
- # This is only ment for logging component history actions.
5
- # Do not use this for anything permissions related!
3
+ from .utils import introduce_user, get_current_user # legacy support for older third party apps
6
4
 
7
- # This technique can only be used with asgi/wsgi runners that
8
- # are not performing thread swapping for handling simultaneous requests.
9
- # For example gunicorn does that when configured with more than one worker,
10
- # which eventually messes up this system.
11
-
12
- # We use daphne for asgi, which seems to be working fine for what we have already
13
- # observed. However, this is a good candidate for reworking it in to something
14
- # more robust.
15
-
16
-
17
- _thread_locals = threading.local()
18
-
19
-
20
- def get_current_user():
21
- try:
22
- return getattr(_thread_locals, 'user')
23
- except:
24
- from .utils import get_system_user
25
- user = get_system_user()
26
- introduce(user)
27
- return user
28
-
29
-
30
- def introduce(user):
31
- _thread_locals.user = user
5
+ # legacy support
6
+ introduce = introduce_user
32
7
 
33
8
 
34
9
  class IntroduceUser:
35
- '''Middleware which stores user object to local threading'''
36
10
 
37
11
  def __init__(self, get_response):
38
12
  self.get_response = get_response
39
13
 
40
14
  def __call__(self, request):
41
15
  if request.user.is_authenticated:
42
- introduce(request.user)
16
+ introduce_user(request.user)
43
17
  return self.get_response(request)
simo/users/models.py CHANGED
@@ -24,8 +24,7 @@ from simo.core.utils.mixins import SimoAdminMixin
24
24
  from simo.core.utils.helpers import get_random_string
25
25
  from simo.core.events import OnChangeMixin
26
26
  from simo.core.middleware import get_current_instance
27
- from .middleware import get_current_user
28
- from .utils import rebuild_authorized_keys
27
+ from .utils import get_current_user, rebuild_authorized_keys
29
28
  from .managers import ActiveInstanceManager
30
29
 
31
30
 
simo/users/serializers.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from rest_framework import serializers
2
2
  from collections.abc import Iterable
3
- from simo.core.middleware import get_current_request, get_current_instance
3
+ from simo.core.middleware import get_current_instance
4
4
  from simo.core.utils.api import ReadWriteSerializerMethodField
5
5
  from .models import (
6
6
  User, PermissionsRole, ComponentPermission,
@@ -38,7 +38,7 @@ class UserSerializer(serializers.ModelSerializer):
38
38
  url = obj.avatar['avatar'].url
39
39
  except:
40
40
  return
41
- request = get_current_request()
41
+ request = self.context['request']
42
42
  if request:
43
43
  url = request.build_absolute_uri(url)
44
44
  return {
simo/users/utils.py CHANGED
@@ -64,4 +64,21 @@ def update_mqtt_acls():
64
64
  )
65
65
  subprocess.run(
66
66
  ['service', 'mosquitto', 'reload'], stdout=subprocess.PIPE
67
- )
67
+ )
68
+
69
+
70
+ class _CurrentUerStore:
71
+ user = None
72
+
73
+
74
+ _current_user_store = _CurrentUerStore()
75
+
76
+
77
+ def introduce_user(user):
78
+ _current_user_store.user = user
79
+
80
+
81
+ def get_current_user():
82
+ if not _current_user_store.user:
83
+ _current_user_store.user = get_system_user()
84
+ return _current_user_store.user
simo/users/views.py CHANGED
@@ -123,3 +123,5 @@ class RolesAutocomplete(autocomplete.Select2QuerySetView):
123
123
  qs = search_queryset(qs, self.q, ('name',))
124
124
 
125
125
  return qs.distinct()
126
+
127
+
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: simo
3
- Version: 2.7.21
3
+ Version: 2.8.2
4
4
  Summary: Smart Home on Steroids!
5
5
  Author-email: Simanas Venčkauskas <simanas@simo.io>
6
6
  Project-URL: Homepage, https://simo.io
@@ -19,7 +19,7 @@ simo/__pycache__/urls.cpython-38.pyc,sha256=u0x6EqT8S1YfDOSPgbI8Kf-RDlveY9OV-EDX
19
19
  simo/__pycache__/wsgi.cpython-38.pyc,sha256=TpRxO7VM_ql31hbKphVdanydC5RI1nHB4l0QA2pdWxo,322
20
20
  simo/automation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  simo/automation/app_widgets.py,sha256=gaqImMZjuMHm7nIb9a4D-Y3qipz_WhSPAHXcwGx4Uzs,199
22
- simo/automation/controllers.py,sha256=Ow8xG9hkdyMRZbrNPX5uZloYM9jZqa9mgCh4k6FeoJw,11492
22
+ simo/automation/controllers.py,sha256=66aGjlfgigcePXiLmDkbVrxbm-Z26klMKIiOvaMH71k,11545
23
23
  simo/automation/forms.py,sha256=UWnkxw8pILPK0smRPTo4SLgsZl78zOySx7JIc30Bgtk,10228
24
24
  simo/automation/gateways.py,sha256=MAzv-i8BemhqfNY2NTYYlyCGPfctyNh4_dXyIZYJRSE,15848
25
25
  simo/automation/helpers.py,sha256=iP-fxxB8HsFQy3k2CjFubu86aMqvWgmh-p24DiyOrek,4330
@@ -30,7 +30,7 @@ simo/automation/__pycache__/__init__.cpython-312.pyc,sha256=rIs1rkBbUhjXjbUffmq2
30
30
  simo/automation/__pycache__/__init__.cpython-38.pyc,sha256=YmP0xAD-mxpQHgdTZeC64sXChA8TriMZD1jckNYi3xg,164
31
31
  simo/automation/__pycache__/app_widgets.cpython-312.pyc,sha256=6u8LsTpf32yn0L49eI4A0sVHlSwl6gOyPlReUwQKoOM,577
32
32
  simo/automation/__pycache__/app_widgets.cpython-38.pyc,sha256=7DfUA9V_1MiwrOe_ta-ts8dYY8xXb9UMg2_9A3XoRcs,523
33
- simo/automation/__pycache__/controllers.cpython-312.pyc,sha256=w2yAFvk-Fh1MZha7JdBp9U_DLkPPPKqmuA2mWsWV-fs,14970
33
+ simo/automation/__pycache__/controllers.cpython-312.pyc,sha256=VvHAmaxfOKpyr9Dd256KXd_qxPCj_-hJYpRnpjXIAzk,14965
34
34
  simo/automation/__pycache__/controllers.cpython-38.pyc,sha256=CL-0Tq9B4-E36fYfWT1XEBTq1dkq1W8003f6MrBnQU0,8391
35
35
  simo/automation/__pycache__/forms.cpython-312.pyc,sha256=63rU0rWZk-Rz5qoMZiXl743WPc9NVm5d8bSd8w52T4E,12347
36
36
  simo/automation/__pycache__/forms.cpython-38.pyc,sha256=cpA5hA2Iz3JsPC0Dq01ki1I7S9c5DKRcXveHApI1dJo,7772
@@ -89,7 +89,7 @@ simo/backups/migrations/__pycache__/__init__.cpython-38.pyc,sha256=Lz1fs6V05h2Ao
89
89
  simo/core/__init__.py,sha256=_s2TjJfQImsMrTIxqLAx9AZie1Ojmm6sCHASdl3WLGU,50
90
90
  simo/core/admin.py,sha256=j07Dy3IsW7SRRsAJ2XXGzE0MTxmfY87CEEbT22kLlS4,18550
91
91
  simo/core/api.py,sha256=vqh4jOE4Y2LtykXVGLUiyoNdhcbiItSAzLJILlV5Y7k,29964
92
- simo/core/api_auth.py,sha256=vCxvczA8aWNcW0VyKs5WlC_ytlqeGP_H_hkKUNVkCwM,1247
92
+ simo/core/api_auth.py,sha256=I9bALko_L7M2dodUkVLRHPctdwR-KPbyZ-r1HygDyEU,1229
93
93
  simo/core/api_meta.py,sha256=Y-kq5lLwjymARnKOx0jHCS4OOH9PhyWNwIUxLUJMny8,5350
94
94
  simo/core/app_widgets.py,sha256=VxZzapuc-a29wBH7JzpvNF2SK1ECrgNUySId5ke1ffc,2509
95
95
  simo/core/apps.py,sha256=CsqpiQerhmrMsH-wGiG-gQgXd9qEkIi-LUaA9cXpKSw,425
@@ -97,22 +97,22 @@ simo/core/auto_urls.py,sha256=FqKhH0fF7cGO6P2YrjblwG4JA2UkVXj3lreJUOB2Jq4,1194
97
97
  simo/core/autocomplete_views.py,sha256=x3MKOZvXYS3xVQ-V1S7Liv_U5bxr-uc0gePa85wv5nA,4561
98
98
  simo/core/base_types.py,sha256=WypW8hTfzveuTQtruGjLYAGQZIuczxTlW-SdRk3iQug,666
99
99
  simo/core/context.py,sha256=LKw1I4iIRnlnzoTCuSLLqDX7crHdBnMo3hjqYvVmzFc,1557
100
- simo/core/controllers.py,sha256=nJZNjltis0DIlwb0Yn84MllXsPxo2CMhcAmtGPKnhBg,37550
100
+ simo/core/controllers.py,sha256=Cy0-F4QEo-RbVkRpdfvl0sah9cUs4InP1T8shojaiKY,37355
101
101
  simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ,1872
102
102
  simo/core/events.py,sha256=1_KIk5pJqdLPRQlCQ9xSyALst2Cn0b2lAEAJ3QjwIjE,4801
103
103
  simo/core/filters.py,sha256=6wbn8C2WvKTTjtfMwwLBp2Fib1V0-DMpS4iqJd6jJQo,2540
104
104
  simo/core/form_fields.py,sha256=b4wZ4n7OO0m0_BPPS9ILVrwBvhhjUB079YrroveFUWA,5222
105
- simo/core/forms.py,sha256=osrwzw1nV-ObvFx7OMJaolqGU4xeZAOuhQRtirFjq6Q,22016
105
+ simo/core/forms.py,sha256=D56T38VIdqWXHJ3fW4_jQdxX40YOR8l7ynfWSm8Q1W0,22011
106
106
  simo/core/gateways.py,sha256=Y2BME6zSyeUq_e-hzEUF6gErCUCP6nFxedkLZKiLVOo,4141
107
107
  simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
108
- simo/core/managers.py,sha256=n-b3I4uXzfHKTeB1VMjSaMsDUxp8FegFJwnbV1IsWQ4,3019
109
- simo/core/middleware.py,sha256=eUFf6iP-Snx_0TE3MoXsSwqrd5IjlukqZk2GQGStRCo,3385
110
- simo/core/models.py,sha256=f4f_ows94pAGfAZmFuAeYsv_1IzV60xn7jNqR9QZndk,23701
108
+ simo/core/managers.py,sha256=Ampwe5K7gfE6IJULNCV35V8ysmMOdS_wz7mRzfaLZUw,3014
109
+ simo/core/middleware.py,sha256=zX6N4P_KR7gG8N2-NcR7jKtuCEhCGRh51g4EktAhP7w,3272
110
+ simo/core/models.py,sha256=YjcTcBzesXwR5akdRXjM7wI2e1pYn379loBSaDWdDJM,23696
111
111
  simo/core/permissions.py,sha256=Ef4NO7QwwDd3Z-v61R0BeCBXxTOJz9qBvzRTIB5tHwI,2943
112
112
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
113
- simo/core/serializers.py,sha256=jimqPhL2mq5_dJWtv6P1qErFMaNMizsAS2E_aYkAiQU,23208
114
- simo/core/signal_receivers.py,sha256=5qp607PdNlRHyw88YOXu7rSznHm3upEpWLxB0lmEa0s,6527
115
- simo/core/socket_consumers.py,sha256=Es_NmacQGZjsncBXDTEXR2yZbRs7mf2FKOBJjbZRGac,9607
113
+ simo/core/serializers.py,sha256=adqe8oYP5f7hGFXcxa-Zmce2KOwy3hZOaWE3MaAFtpM,23157
114
+ simo/core/signal_receivers.py,sha256=tSHKGEFbGqfD-WNKnbDjOQRoABII4akB2oj7l_gLRWk,6517
115
+ simo/core/socket_consumers.py,sha256=UlxV9OvTUUXaoKKYT3-qf1TyGxyOPxIpFH5cPFepH1o,9584
116
116
  simo/core/storage.py,sha256=_5igjaoWZAiExGWFEJMElxUw55DzJG1jqFty33xe8BE,342
117
117
  simo/core/tasks.py,sha256=-yBjOPILEnKRga-6MK-hBpEINQcY5mpwZwUWiDpqISs,17091
118
118
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
@@ -125,7 +125,7 @@ simo/core/__pycache__/admin.cpython-312.pyc,sha256=P8TOAzWJ96D4krjOvfGvRBE6Vo97g
125
125
  simo/core/__pycache__/admin.cpython-38.pyc,sha256=zdegA3IsH3QhT7Hm6Aj08F2sv-3h1X7VBcwN05fhVis,14155
126
126
  simo/core/__pycache__/api.cpython-312.pyc,sha256=nEmBSNxFuYGTBbY5sVS8k2iF4u8j8R4lhJdBrsN7tvU,41475
127
127
  simo/core/__pycache__/api.cpython-38.pyc,sha256=TOa0p4h-zWzYdLpscveY4mY1NSYAVM4fDPvRkIDuSOQ,22905
128
- simo/core/__pycache__/api_auth.cpython-312.pyc,sha256=85yNWW3sxVleh9hNURAshujZulNYd_SEBBawg2JzI4A,2148
128
+ simo/core/__pycache__/api_auth.cpython-312.pyc,sha256=OreF9SvNrzUKgFBJ42ZA8MJjaC2XAOj04njdEk6-scw,2132
129
129
  simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=mi3mu5qEKio_PvfQEvr3Q6AhdPLAHxzxAxrMbAz_pKU,1712
130
130
  simo/core/__pycache__/api_meta.cpython-312.pyc,sha256=gb-wJopybROmiFc4ioqIqyQfTXNWPNAHKeohw_LKKgI,6719
131
131
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=w4wGMK39fB2UjNIZOGcyd7J2EFymlEeNWNQRmF5ozP0,3958
@@ -141,7 +141,7 @@ simo/core/__pycache__/base_types.cpython-312.pyc,sha256=Lnq2NL9B5hfwJARJYC447Rdv
141
141
  simo/core/__pycache__/base_types.cpython-38.pyc,sha256=CX-qlF7CefRi_mCE954wYa9rUFR88mOl6g7fybDRu7g,803
142
142
  simo/core/__pycache__/context.cpython-312.pyc,sha256=8rsN2Er-Sx3rrVmO0Gk4cem3euGh0kTELXj667GGZ5E,2193
143
143
  simo/core/__pycache__/context.cpython-38.pyc,sha256=NlTHt2GvXxA21AhBkeyOLfRFUuXw7wmwqyNhhcDl2cw,1373
144
- simo/core/__pycache__/controllers.cpython-312.pyc,sha256=z7zxtaI-nD3F94qct1_j7PiIJZEs1gGdv_nRn3D8iRM,52921
144
+ simo/core/__pycache__/controllers.cpython-312.pyc,sha256=4QDs4cfrxPLcSnJLZFNn0XsGyvAy4GzNCVMr-qljNbM,52855
145
145
  simo/core/__pycache__/controllers.cpython-38.pyc,sha256=LtrQQ8egOIOuQbAckeM-z8OfbzS4W8VQ3vBnryAm3iU,32086
146
146
  simo/core/__pycache__/dynamic_settings.cpython-312.pyc,sha256=WUZ6XF4kZb6zPf541PkKmiQaBIw-r5C6F3EUUZiTEnE,3331
147
147
  simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=wGpnscX1DxFpRl54MQURhjz2aD3NJohSzw9JCFnzh2Y,2384
@@ -151,31 +151,31 @@ simo/core/__pycache__/filters.cpython-312.pyc,sha256=-vgZ2km1A2q4Un1i30fgHT-6rRO
151
151
  simo/core/__pycache__/filters.cpython-38.pyc,sha256=WBBDwcDQwOmgbrRhyUxenSN80rU4Eq9jQ6RcrRGCP_o,2440
152
152
  simo/core/__pycache__/form_fields.cpython-312.pyc,sha256=sWeR1PaM7w41FmvBeYZcJyjjziDh10ysyjd2hXKS4mo,8933
153
153
  simo/core/__pycache__/form_fields.cpython-38.pyc,sha256=NJf1tKaZjgY-inTLDgbN2y6NTH798RWJnzvKkZaFz_k,6204
154
- simo/core/__pycache__/forms.cpython-312.pyc,sha256=pnhYyvosUJM0R28xVAB-H5LPossFyUJo-mDJMfP5PEk,30950
154
+ simo/core/__pycache__/forms.cpython-312.pyc,sha256=UqqX4uE_r6PepR4InBxSfNg5OQ0BALw8zTvbxXUELqc,30945
155
155
  simo/core/__pycache__/forms.cpython-38.pyc,sha256=frvM1b9KRqsjh4YbUlV1CW8yupUyXJTb2R4sVgwy2K0,17827
156
156
  simo/core/__pycache__/gateways.cpython-312.pyc,sha256=VLLQZGJFmSszJRecatQOtMYrsVaYPEM-ZK8f2ARl-po,7574
157
157
  simo/core/__pycache__/gateways.cpython-38.pyc,sha256=-_ugqnUOA1Cl6VfMqpV96n7ekVOEwYg_jNvoaZEcx9I,4815
158
158
  simo/core/__pycache__/loggers.cpython-312.pyc,sha256=FSKGpAli3SJfBy0ne5qqNhG4Aui4Bx_z-5IBPWE3-Zk,2407
159
159
  simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NMEdPAiHK0cFaIL7I8,1623
160
- simo/core/__pycache__/managers.cpython-312.pyc,sha256=KRP1g-XgdnIGcmRmTpeK5Rl4Szvb26IxYWOyz6PaBb4,5067
160
+ simo/core/__pycache__/managers.cpython-312.pyc,sha256=RpeR1Z0GtSZht4_a4iDfTU_E8Px963UO7YGAvweFHgA,5062
161
161
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=6RTIxyjOgpQGtAqcUyE2vFPS09w1V5Wmd_vOV7rHRRI,3370
162
- simo/core/__pycache__/middleware.cpython-312.pyc,sha256=h_htVrz5jy97I2Hprak3GN9gZXpOp_7St6JEK-rTkPc,4308
162
+ simo/core/__pycache__/middleware.cpython-312.pyc,sha256=2VhHTVY-rdPNqNX0wst2ioVbHD5uMqHkY-tpujLdpH0,4195
163
163
  simo/core/__pycache__/middleware.cpython-38.pyc,sha256=SgTLFNkKxvJ62hevSAVNZHgHdG_u2p7AZBhrj-jfFPs,2649
164
- simo/core/__pycache__/models.cpython-312.pyc,sha256=U8USMSKhP4FIYx9Fog0_lLsNFtgVn6qTxWI554Tjpfg,31937
164
+ simo/core/__pycache__/models.cpython-312.pyc,sha256=CVESJOD2imhwbhZ6i0KIs3M4equBtHT-TApdqZ10uoE,31932
165
165
  simo/core/__pycache__/models.cpython-38.pyc,sha256=A4JsWsDMBaQ_U5sV5cX0c_Uox9mP5fAqn_712EjfNS4,19605
166
- simo/core/__pycache__/permissions.cpython-312.pyc,sha256=gDc4qjT5U2WUtrR9ZbqmacZ1Adrd0wx3eH0bU0dkS9I,4568
166
+ simo/core/__pycache__/permissions.cpython-312.pyc,sha256=yqG6t9NZZtL30Hr7razjiG6JDGKiz0Qjcjxgv1C93vM,4450
167
167
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=UdtxCTXPEbe99vgZOfRz9wfKSYvUn9hSRbpIV9CJSyI,2988
168
168
  simo/core/__pycache__/routing.cpython-312.pyc,sha256=bDvF5HTZ8POSOHKwREyhSPO7oh90s48iSul_4camf3I,790
169
169
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
170
- simo/core/__pycache__/serializers.cpython-312.pyc,sha256=UPMki-Lysf-KFIklY5FNx2wq8wleriyev0RnzqGzkM4,33041
170
+ simo/core/__pycache__/serializers.cpython-312.pyc,sha256=LW6xmjKG5Ex5y8kslVd2xGy9eRqjNP2E29GxdJaAq48,32997
171
171
  simo/core/__pycache__/serializers.cpython-38.pyc,sha256=H3K_retN44wOj-ew0cvoxUSXqrUOhHCMV_oJabNF0Xg,20431
172
- simo/core/__pycache__/signal_receivers.cpython-312.pyc,sha256=yUjwrhWYPhSa-kyTr1LJmnweSyG7U7zjmi2NvYA3Th8,8947
172
+ simo/core/__pycache__/signal_receivers.cpython-312.pyc,sha256=aSU_K0X2heDJL7DM8zGrjj4JqcNBgkwY_dIMiMWJI2I,8942
173
173
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=R_h1GHkoZXR-nrwiRJWQ9xE69JB1R_mP_fNYIBX4lrE,5165
174
- simo/core/__pycache__/socket_consumers.cpython-312.pyc,sha256=AZm48gxenbm1Ghnzf8eOBK794n2XqcK6m96kxSUEH_c,15392
174
+ simo/core/__pycache__/socket_consumers.cpython-312.pyc,sha256=Yph9SQTj6c3xr2HXKnSm7r2M7dp1ks2lp8Q6v8TJ7cM,15322
175
175
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=Mr1-x-vGjBNffbz0S6AKpJCuzHJgRm8kXefv3qVVY_E,8397
176
176
  simo/core/__pycache__/storage.cpython-312.pyc,sha256=VOD9via7BtpTbXe2jWsRovCIkeJofoX7Ts_Eyl9I_a4,934
177
177
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=9R1Xu0FJDflfRXUPsqEgt0SpwiP7FGk7HaR8s8XRyI8,721
178
- simo/core/__pycache__/tasks.cpython-312.pyc,sha256=fKCJCPd0B2AuhYjsbD8DO4UNvC9TdouX2cV0rrEimpc,21936
178
+ simo/core/__pycache__/tasks.cpython-312.pyc,sha256=RCYzywZ6ZgKfUhm3MAO_I7nbm4dcHqKPLHGMCMpf62g,22382
179
179
  simo/core/__pycache__/tasks.cpython-38.pyc,sha256=-J2is-l5XsfhamreN2TPQDTK-Jw6XGYL81bcVfjXsU8,11213
180
180
  simo/core/__pycache__/todos.cpython-312.pyc,sha256=bqguSv-oCCdlvzbMsm-7jAB-g0AvMFux1GL97XNJjyk,263
181
181
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
@@ -10591,29 +10591,29 @@ simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LS
10591
10591
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10592
10592
  simo/generic/app_widgets.py,sha256=y8W3jR76Hh26O9pPQyg2SophMbYIOtAWD33MPKbB8Mg,856
10593
10593
  simo/generic/base_types.py,sha256=u3SlfpNYaCwkVBwomWgso4ODzL71ay9MhiAW-bxgnDU,341
10594
- simo/generic/controllers.py,sha256=C3bwn7kSpOz0Gs0fL5VQFYi8pL8VV57mo-9PfLTBBQA,46542
10595
- simo/generic/forms.py,sha256=ynf-u9RE-VU0xQgCYovUVEZO3ZJ_pCsem91KSeQdHbs,26033
10596
- simo/generic/gateways.py,sha256=6mu6bSjn-UmeiFLWpskyCGO8MR8KpesruHspEUeOvDo,17609
10594
+ simo/generic/controllers.py,sha256=NZmrJ1BYzAwHJ1vN-OMvqnH13ihvjUhZqdxq-l__1Jk,46268
10595
+ simo/generic/forms.py,sha256=yCEmOy6Sm5moCh-9UTzqLDiI5xmzfm5LwEhZ2r9KRbw,26054
10596
+ simo/generic/gateways.py,sha256=d7sbt_GeeGGwp2hoD-FZNuyM6fNvEU51kiZyznZYcxg,17589
10597
10597
  simo/generic/models.py,sha256=Adq7ipWK-renxJlNW-SZnAq2oGEOwKx8EdUWaKnfcVQ,7597
10598
10598
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10599
- simo/generic/socket_consumers.py,sha256=pyiqzfGxSKBNqfrfEJ_kCU0UbSC28XnvDn6QjKkbqyY,1767
10599
+ simo/generic/socket_consumers.py,sha256=qesKZVhI56Kh7vdIUDD3hzDUi0FcXwIfcmE_a3YS6JQ,1772
10600
10600
  simo/generic/__pycache__/__init__.cpython-312.pyc,sha256=-34GwswSg1zc1becA8lPwUpnd4ek2IoduCsIUr0KTNo,167
10601
10601
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
10602
10602
  simo/generic/__pycache__/app_widgets.cpython-312.pyc,sha256=ywoKk91YSEZxpyt9haG509_c0G9DMJVpae_y1iiZxJU,1937
10603
10603
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=D9b13pbMlirgHmjDnQhfLIDGSVINoSouHb4SWOeCRrs,1642
10604
10604
  simo/generic/__pycache__/base_types.cpython-312.pyc,sha256=h8Mwu49i-zmwTbL33JaLJfRDGOgkQh2_VqrfzEc4UQ4,616
10605
10605
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
10606
- simo/generic/__pycache__/controllers.cpython-312.pyc,sha256=Ti6xqlOVIA_DYAo4HS72j-2g20xuvAaiEsZl4eIEPfs,53085
10606
+ simo/generic/__pycache__/controllers.cpython-312.pyc,sha256=TgHV-dNMJqYuFOgeJTxeh4Mihb4lHnfhid0CmdhZCR4,52737
10607
10607
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=jJjwKVaDYyazrRGNjUFoY74nr_jX_DEnsC9KjyxZCgc,30427
10608
- simo/generic/__pycache__/forms.cpython-312.pyc,sha256=naGe-9nY5GFqM_bNpg52acV8s5j9PFILS7l0UTuWbQQ,34681
10608
+ simo/generic/__pycache__/forms.cpython-312.pyc,sha256=duBW82wI9zfyzPnIk4hLs_vx5Rfk4vSCh9n7cSNbgcc,34681
10609
10609
  simo/generic/__pycache__/forms.cpython-38.pyc,sha256=k8lz3taXdWAg5P9jcnw66mWH51pCc4SOsg32kVEtBCg,19416
10610
- simo/generic/__pycache__/gateways.cpython-312.pyc,sha256=o2Ijs-IXKmytSXRkVs-MChscxuGv97_if13tN2piwY4,21787
10610
+ simo/generic/__pycache__/gateways.cpython-312.pyc,sha256=-ifxm5kYUvp6tRw3xr1EO7jCEXQ9_aQG3OdxAQvxHBg,21758
10611
10611
  simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=GIeMT51oZU2OCFD4eUDFdSRRYE0Qf14AcOr_gdUqG94,12705
10612
10612
  simo/generic/__pycache__/models.cpython-312.pyc,sha256=xriUzjkaM2Y4mT3jo2OPK-XGBroBBSFJfLqK0jMA4MA,10200
10613
10613
  simo/generic/__pycache__/models.cpython-38.pyc,sha256=MZpum7syAFxuulf47K7gtUlJJ7xRD-IBUBAwUM1ZRnw,5825
10614
10614
  simo/generic/__pycache__/routing.cpython-312.pyc,sha256=_wQPZeAgwlGtnafw9VcabgqjyJxzDFywHBIFbGhzYRE,452
10615
10615
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10616
- simo/generic/__pycache__/socket_consumers.cpython-312.pyc,sha256=H3SIGJjv026BP0Qz7BMMVEweg2VIED3Fc_KMfyQZKuQ,2814
10616
+ simo/generic/__pycache__/socket_consumers.cpython-312.pyc,sha256=zERTr2bHXLKSXCoIov6MaFRrgfeS1A0IHCXbaPfVvK4,2814
10617
10617
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=FaVCf_uJI2uwj1Zz-jwsOXou65oV9gFCIB8e-YKquRk,1662
10618
10618
  simo/generic/migrations/0001_initial.py,sha256=7FpPcfpRU5ya0b8s2KbxR5a3npf92YruvZltUybjzys,676
10619
10619
  simo/generic/migrations/0002_auto_20241126_0726.py,sha256=SX38JwP732QooOm5HM1Xo7Th_Mv_6YZloT3eozULOhs,922
@@ -10734,21 +10734,21 @@ simo/notifications/migrations/__pycache__/__init__.cpython-312.pyc,sha256=YMFc4Q
10734
10734
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10735
10735
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10736
10736
  simo/users/admin.py,sha256=2J_ZwrwAPw03Stb6msx5GvRpGCsDSC39RPpYBLGf8UY,7441
10737
- simo/users/api.py,sha256=EOASuKP_jvu15jihkjogrSsDCK7_-h0zeioNrjPVXpc,13229
10737
+ simo/users/api.py,sha256=hOLwJhA5Ik8UbW0Qmp2Vl7tB8_uDHnP4EZq-OSaknyw,13218
10738
10738
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10739
10739
  simo/users/auth_backends.py,sha256=KIw2AdjCUKfm_7Lql6aC4qdE6JznP0ECIMA5MVMLeiM,4251
10740
10740
  simo/users/auto_urls.py,sha256=RSUW3ai5LbMTknS8M7M5aOnG_YlFOVQrnNVNH-fkwlg,357
10741
10741
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10742
10742
  simo/users/managers.py,sha256=OHgEP85MBtdkdYxdstBd8RavTBT8F_2WyDxUJ9aCqqM,246
10743
- simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10744
- simo/users/models.py,sha256=GFTMfs7dC6XXmvot7WLcjyH0WqowNU9zbLD9oE0_3Yg,20092
10743
+ simo/users/middleware.py,sha256=tNPmnzo0eTrJ25SLHP7NotqYKI2cKnmv8hf6v5DLOWo,427
10744
+ simo/users/models.py,sha256=6Y05Z5IiARr-Dti_xRjQTxi2ji62M387mN-VVzxMGSY,20069
10745
10745
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10746
- simo/users/serializers.py,sha256=zzw1KONTnaTNBaU0r4rNVxJ827KzD6Z5LuQt27ZsQ98,2516
10746
+ simo/users/serializers.py,sha256=REgXD9Af6nTRu_wUm1dt5YoCB6C_KNDaPqHZj726zZ0,2497
10747
10747
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
10748
10748
  simo/users/sso_views.py,sha256=5J0D4qUFQDvd-Fcqx_xLJWLJgPdqtVD5DDiPJyPsT2Q,4336
10749
10749
  simo/users/tasks.py,sha256=FhbczWFHRFI6To4xqkx4gUX4p0vCwwTT297GWBPAoIg,1162
10750
- simo/users/utils.py,sha256=-Lu7C_sz8JJauLaIwgEa6umArqzNL7JJTY-ZcuF4irA,2004
10751
- simo/users/views.py,sha256=CVhNczY7FjtpFxzQSwRZj39HIBTHsA_2wtkTFUfzKRA,4134
10750
+ simo/users/utils.py,sha256=vR5SlWdMKkMgNZdJXUI14pASVue8WMqJSQpVKruX25I,2305
10751
+ simo/users/views.py,sha256=iIfv8DqNztzBB3fiZcnHOyzp4eFtjrC-gCv5rBX3XsQ,4136
10752
10752
  simo/users/__pycache__/__init__.cpython-312.pyc,sha256=n0GE5zxjujBUkv1t1CswZ9GbybW478_oY8d_wQJ44N8,223
10753
10753
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=VFoDJE_SKKaPqqYaaBYd1Ndb1hjakkTo_u0EG_XJ1GM,211
10754
10754
  simo/users/__pycache__/admin.cpython-312.pyc,sha256=lTVuZQwkuw1bzSn0A0kt-8H6ruKas_YPb_61AxSYSoo,11465
@@ -10765,22 +10765,22 @@ simo/users/__pycache__/dynamic_settings.cpython-312.pyc,sha256=lRVrJzyYRU2CVOKc_
10765
10765
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10766
10766
  simo/users/__pycache__/managers.cpython-312.pyc,sha256=A9-yF1dilDc1H_-BtrIw9USpH6MYwkUI02gVmDOxsOA,821
10767
10767
  simo/users/__pycache__/managers.cpython-38.pyc,sha256=O0Y8ABp42RAosrbODmYsPMaj9AyOPyJ-aqzuO0Qpi2s,679
10768
- simo/users/__pycache__/middleware.cpython-312.pyc,sha256=RsRR-PHAajvA7-JGa2ZKvohlJUPYTpGQJdf-lIrIWho,1469
10768
+ simo/users/__pycache__/middleware.cpython-312.pyc,sha256=9pkiIkMriu0ExLK479hyPfaN-DOfp6WErqQlrZY1Mvk,927
10769
10769
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10770
- simo/users/__pycache__/models.cpython-312.pyc,sha256=SWynxRaZhyBIEPGdbsOKgw1qm5d24WtoPBAp9n9Y6Tc,29637
10770
+ simo/users/__pycache__/models.cpython-312.pyc,sha256=j4-HII44-P4ExB7UVZGtOT8IYz6jbRa4hnDsCRglbUU,29020
10771
10771
  simo/users/__pycache__/models.cpython-38.pyc,sha256=qNtAn_eWVmRTWhTxN8GtCc549dcJsTdaF7Uk19yNMgg,18330
10772
10772
  simo/users/__pycache__/permissions.cpython-312.pyc,sha256=NCaxeIz4qmG_mF18lKTYXqOSUvJkFLnUZjfYIQFUCkU,718
10773
10773
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10774
- simo/users/__pycache__/serializers.cpython-312.pyc,sha256=3AOvQgjSmyi_WSCbucrYxTZVX4HZoYzol-IoCJaV6YI,4756
10774
+ simo/users/__pycache__/serializers.cpython-312.pyc,sha256=2xqTf8TIqmt7mKNEPfc6Aiy1iVShNShKugNGMIyttCQ,4751
10775
10775
  simo/users/__pycache__/serializers.cpython-38.pyc,sha256=Dy8RAcwNkNSXoJHvLp8fozURyHCtucqpSPyqZtbnMZc,3732
10776
10776
  simo/users/__pycache__/sso_urls.cpython-312.pyc,sha256=FQLOFu310j7pOhTNlg2wyUybqts1anZnLTLbYaSpi7U,534
10777
10777
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
10778
10778
  simo/users/__pycache__/sso_views.cpython-312.pyc,sha256=FZGDRdt7pb8qROe8ZAEGSTfeZtLCGNBvQiXpDtrc4dE,6011
10779
10779
  simo/users/__pycache__/sso_views.cpython-38.pyc,sha256=PLRF6FYCxRhnmgnN_gUS-pdQlH7lofLU1Xhgw3vDO_Y,4019
10780
10780
  simo/users/__pycache__/tasks.cpython-38.pyc,sha256=XLMKt3suT7BlcXrJZoH9ZIhhtBuqyiW4lsOB9IbBkko,1225
10781
- simo/users/__pycache__/utils.cpython-312.pyc,sha256=MhpuWErDEVgIEdHhZtAuF9XKFjWsjOUYOOicRODefDQ,2875
10781
+ simo/users/__pycache__/utils.cpython-312.pyc,sha256=dJtfFncpI2QtTSZoUUNCfUsDoofOOfVtMRXNm5ZXC20,3515
10782
10782
  simo/users/__pycache__/utils.cpython-38.pyc,sha256=cgxUwEaBgxT360mw4E03J7u4vi3dhw6K3n7-8WNvyFU,1888
10783
- simo/users/__pycache__/views.cpython-312.pyc,sha256=0KgPpvLqhtlCGuv6kXAOpNRmIQXA-1E4b9PHhIoJakw,4883
10783
+ simo/users/__pycache__/views.cpython-312.pyc,sha256=2m58jFyV2LDVC5VogOr_BEKkyFXuLe5DOo5YxOlN-dw,4883
10784
10784
  simo/users/__pycache__/views.cpython-38.pyc,sha256=RiCyUbBqNzszsfyOfcu_lNExms7LFViNCx2vRQuBaw0,3206
10785
10785
  simo/users/migrations/0001_initial.py,sha256=_SnJemhNOs8Jjj-PjyvTVCBoxfs5V3lR_4ypUHUdLUg,7017
10786
10786
  simo/users/migrations/0002_componentpermission.py,sha256=rH9pC9HERf_5WWn3LCsNiu03BiHqURTF62pSNfswStI,918
@@ -10924,9 +10924,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10924
10924
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10925
10925
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10926
10926
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10927
- simo-2.7.21.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10928
- simo-2.7.21.dist-info/METADATA,sha256=UKr6l5SamIZIGzDDFDNEOEr4zVM3iVWZJhNg97dJitA,2009
10929
- simo-2.7.21.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
10930
- simo-2.7.21.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10931
- simo-2.7.21.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10932
- simo-2.7.21.dist-info/RECORD,,
10927
+ simo-2.8.2.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10928
+ simo-2.8.2.dist-info/METADATA,sha256=AhDqWH1SoeS6j6V0KlUk-QMeuzbVjZouP_a_fJRr_ZI,2008
10929
+ simo-2.8.2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
10930
+ simo-2.8.2.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10931
+ simo-2.8.2.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10932
+ simo-2.8.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.7.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5