simo 2.1.12__py3-none-any.whl → 2.1.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of simo might be problematic. Click here for more details.

simo/core/managers.py CHANGED
@@ -25,7 +25,7 @@ class InstanceManager(models.Manager):
25
25
  class ZonesManager(models.Manager):
26
26
 
27
27
  def get_queryset(self):
28
- qs = super().get_queryset()
28
+ qs = super().get_queryset().filter(instance__is_active=True)
29
29
  instance = get_current_instance()
30
30
  if instance:
31
31
  qs = qs.filter(instance=instance)
@@ -35,7 +35,7 @@ class ZonesManager(models.Manager):
35
35
  class CategoriesManager(models.Manager):
36
36
 
37
37
  def get_queryset(self):
38
- qs = super().get_queryset()
38
+ qs = super().get_queryset().filter(instance__is_active=True)
39
39
  instance = get_current_instance()
40
40
  if instance:
41
41
  qs = qs.filter(instance=instance)
@@ -45,7 +45,7 @@ class CategoriesManager(models.Manager):
45
45
  class ComponentsManager(models.Manager):
46
46
 
47
47
  def get_queryset(self):
48
- qs = super().get_queryset()
48
+ qs = super().get_queryset().filter(zone__instance__is_active=True)
49
49
  instance = get_current_instance()
50
50
  if instance:
51
51
  qs = qs.filter(zone__instance=instance)
simo/fleet/models.py CHANGED
@@ -11,7 +11,6 @@ from dirtyfields import DirtyFieldsMixin
11
11
  from simo.core.models import Instance, Gateway, Component
12
12
  from simo.core.utils.helpers import get_random_string
13
13
  from simo.core.events import GatewayObjectCommand
14
- from .gateways import FleetGatewayHandler
15
14
  from .managers import ColonelsManager, ColonelPinsManager, InterfacesManager
16
15
  from .utils import GPIO_PINS, INTERFACES_PINS_MAP
17
16
 
@@ -146,6 +145,7 @@ class Colonel(DirtyFieldsMixin, models.Model):
146
145
  return resp.json()
147
146
 
148
147
  def update_firmware(self, to_version):
148
+ from .gateways import FleetGatewayHandler
149
149
  for gateway in Gateway.objects.filter(type=FleetGatewayHandler.uid):
150
150
  GatewayObjectCommand(
151
151
  gateway, self,
@@ -153,12 +153,14 @@ class Colonel(DirtyFieldsMixin, models.Model):
153
153
  ).publish()
154
154
 
155
155
  def restart(self):
156
+ from .gateways import FleetGatewayHandler
156
157
  for gateway in Gateway.objects.filter(type=FleetGatewayHandler.uid):
157
158
  GatewayObjectCommand(
158
159
  gateway, self, command='restart'
159
160
  ).publish()
160
161
 
161
162
  def update_config(self):
163
+ from .gateways import FleetGatewayHandler
162
164
  for gateway in Gateway.objects.filter(type=FleetGatewayHandler.uid):
163
165
  GatewayObjectCommand(
164
166
  gateway, self, command='update_config'
@@ -371,6 +373,7 @@ class Interface(models.Model):
371
373
 
372
374
 
373
375
  def broadcast_reset(self):
376
+ from .gateways import FleetGatewayHandler
374
377
  gw = Gateway.objects.filter(type=FleetGatewayHandler.uid).first()
375
378
  if not gw:
376
379
  return
simo/generic/models.py CHANGED
@@ -6,8 +6,6 @@ from django.db.models.signals import pre_save, post_save, post_delete
6
6
  from django.dispatch import receiver
7
7
  from simo.core.models import Instance, Component
8
8
  from simo.users.models import InstanceUser
9
- from .controllers import AlarmGroup
10
-
11
9
 
12
10
 
13
11
  @receiver(post_save, sender=Component)
@@ -20,6 +18,8 @@ def handle_alarm_groups(sender, instance, *args, **kwargs):
20
18
  if 'arm_status' not in dirty_fields:
21
19
  return
22
20
 
21
+ from .controllers import AlarmGroup
22
+
23
23
  for alarm_group in Component.objects.filter(
24
24
  controller_uid=AlarmGroup.uid,
25
25
  config__components__contains=instance.id,
@@ -76,6 +76,8 @@ def handle_alarm_groups(sender, instance, *args, **kwargs):
76
76
 
77
77
  @receiver(pre_save, sender=Component)
78
78
  def manage_alarm_groups(sender, instance, *args, **kwargs):
79
+ from .controllers import AlarmGroup
80
+
79
81
  if instance.controller_uid != AlarmGroup.uid:
80
82
  return
81
83
 
@@ -104,6 +106,8 @@ def manage_alarm_groups(sender, instance, *args, **kwargs):
104
106
  def clear_alarm_group_config_on_component_delete(
105
107
  sender, instance, *args, **kwargs
106
108
  ):
109
+ from .controllers import AlarmGroup
110
+
107
111
  for ag in Component.objects.filter(
108
112
  base_type=AlarmGroup.base_type,
109
113
  config__components__contains=instance.id
@@ -120,17 +124,16 @@ def bind_controlling_locks_to_alarm_groups(sender, instance, *args, **kwargs):
120
124
  return
121
125
  if 'value' not in instance.get_dirty_fields():
122
126
  return
127
+
128
+ from .controllers import AlarmGroup
129
+
123
130
  if instance.value == 'locked':
124
131
  for ag in Component.objects.filter(
125
132
  base_type=AlarmGroup.base_type,
126
133
  config__arming_locks__contains=instance.id
127
134
  ):
128
- if ag.config.get('arm_on_away') in (None, 'on_away'):
129
- for ag in Component.objects.filter(
130
- base_type=AlarmGroup.base_type,
131
- config__arming_locks__contains=instance.id
132
- ):
133
- ag.arm()
135
+ if ag.config.get('arm_on_away') in (None, '', 'on_away'):
136
+ ag.controller.arm()
134
137
  continue
135
138
 
136
139
  users_at_home = InstanceUser.objects.filter(
@@ -140,7 +143,7 @@ def bind_controlling_locks_to_alarm_groups(sender, instance, *args, **kwargs):
140
143
  continue
141
144
  if ag.config.get('arm_on_away') == 'on_away_and_locked':
142
145
  print(f"Nobody is at home, lock was locked. Arm {ag}!")
143
- ag.arm()
146
+ ag.controller.arm()
144
147
  continue
145
148
  locked_states = [
146
149
  True if l['value'] == 'locked' else False
@@ -150,14 +153,14 @@ def bind_controlling_locks_to_alarm_groups(sender, instance, *args, **kwargs):
150
153
  ]
151
154
  if all(locked_states):
152
155
  print(f"Nobody is at home, all locks are now locked. Arm {ag}!")
153
- ag.arm()
156
+ ag.controller.arm()
154
157
 
155
158
  elif instance.value == 'unlocked':
156
159
  for ag in Component.objects.filter(
157
160
  base_type=AlarmGroup.base_type,
158
161
  config__arming_locks__contains=instance.id
159
162
  ):
160
- ag.disarm()
163
+ ag.controller.disarm()
161
164
 
162
165
 
163
166
  @receiver(post_save, sender=InstanceUser)
@@ -173,6 +176,9 @@ def bind_alarm_groups(sender, instance, created, *args, **kwargs):
173
176
  ).exclude(is_active=False).exclude(id=instance.id).count()
174
177
  if users_at_home:
175
178
  return
179
+
180
+ from .controllers import AlarmGroup
181
+
176
182
  for ag in Component.objects.filter(
177
183
  zone__instance=instance.instance,
178
184
  base_type=AlarmGroup.base_type,
@@ -189,10 +195,10 @@ def bind_alarm_groups(sender, instance, created, *args, **kwargs):
189
195
  continue
190
196
  if ag.config['arm_on_away'] == 'on_away_and_locked':
191
197
  print(f"Everybody is away, single lock is locked, arm {ag}!")
192
- ag.arm()
198
+ ag.controller.arm()
193
199
  continue
194
200
  if ag.config['arm_on_away'] == 'on_away_and_locked_all' \
195
201
  and all(locked_states):
196
202
  print(f"Everybody is away, all locks are locked, arm {ag}!")
197
- ag.arm()
203
+ ag.controller.arm()
198
204
  continue
Binary file
simo/users/api.py CHANGED
@@ -211,9 +211,22 @@ class InvitationsViewSet(InstanceMixin, viewsets.ModelViewSet):
211
211
  return InstanceInvitation.objects.none()
212
212
  return InstanceInvitation.objects.filter(instance=self.instance)
213
213
 
214
- def perform_create(self, serializer):
215
- serializer.save(
216
- from_user=self.request.user, instance=self.instance
214
+ def create(self, request, *args, **kwargs):
215
+ role = PermissionsRole.objects.filter(
216
+ instance=self.instance, is_default=True
217
+ ).first()
218
+ if not role:
219
+ role = PermissionsRole.objects.filter(
220
+ instance=self.instance
221
+ ).first()
222
+ if role:
223
+ request.data['role'] = role.id
224
+ serializer = self.get_serializer(data=request.data)
225
+ serializer.is_valid(raise_exception=True)
226
+ serializer.save(instance=self.instance, from_user=self.request.user)
227
+ headers = self.get_success_headers(serializer.data)
228
+ return RESTResponse(
229
+ serializer.data, status=status.HTTP_201_CREATED, headers=headers
217
230
  )
218
231
 
219
232
  @action(detail=True, methods=['post'])
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  import io
3
3
  import requests
4
+ from django.db import transaction
4
5
  from django.utils import timezone
5
6
  from django.contrib.auth import get_user_model
6
7
  from django.contrib.auth.models import Permission
@@ -54,6 +55,7 @@ class SIMOUserBackend(ModelBackend):
54
55
 
55
56
  class SSOBackend(ModelBackend):
56
57
 
58
+ @transaction.atomic
57
59
  def authenticate(self, request, user_data=None, **kwargs):
58
60
  system_user_emails = ('system@simo.io', 'device@simo.io')
59
61
  if not user_data:
@@ -93,9 +95,9 @@ class SSOBackend(ModelBackend):
93
95
  if invitation:
94
96
  invitation.taken_by = user
95
97
  invitation.save()
96
- InstanceUser.objects.create(
97
- user=user, role=invitation.role,
98
- instance=invitation.instance
98
+ InstanceUser.objects.update_or_create(
99
+ user=user, instance=invitation.instance,
100
+ defaults={'role': invitation.role}
99
101
  )
100
102
 
101
103
  if user_data.get('name'):
simo/users/managers.py ADDED
@@ -0,0 +1,7 @@
1
+ from django.db import models
2
+
3
+
4
+ class ActiveInstanceManager(models.Manager):
5
+
6
+ def get_queryset(self):
7
+ return super().get_queryset().filter(instance__is_active=True)
@@ -103,7 +103,7 @@ class Migration(migrations.Migration):
103
103
  ('last_sent', models.DateTimeField(blank=True, null=True)),
104
104
  ('taken_date', models.DateTimeField(blank=True, null=True)),
105
105
  ('from_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='issued_hub_invitations', to=settings.AUTH_USER_MODEL)),
106
- ('role', models.ForeignKey(default=simo.users.models.get_default_invitation_role, on_delete=django.db.models.deletion.CASCADE, to='users.permissionsrole')),
106
+ ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.permissionsrole')),
107
107
  ('taken_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='accepted_hub_invitations', to=settings.AUTH_USER_MODEL)),
108
108
  ],
109
109
  options={
simo/users/models.py CHANGED
@@ -24,7 +24,7 @@ from simo.core.utils.helpers import get_random_string
24
24
  from simo.core.events import OnChangeMixin
25
25
  from .middleware import get_current_user
26
26
  from .utils import rebuild_authorized_keys
27
- from .tasks import rebuild_mqtt_acls
27
+ from .managers import ActiveInstanceManager
28
28
 
29
29
 
30
30
  class PermissionsRole(models.Model):
@@ -49,6 +49,8 @@ class PermissionsRole(models.Model):
49
49
  default=False, help_text="Default new user role."
50
50
  )
51
51
 
52
+ objects = ActiveInstanceManager()
53
+
52
54
  class Meta:
53
55
  verbose_name = "role"
54
56
  verbose_name_plural = "roles"
@@ -97,6 +99,8 @@ class InstanceUser(DirtyFieldsMixin, models.Model, OnChangeMixin):
97
99
  at_home = models.BooleanField(default=False, db_index=True)
98
100
  is_active = models.BooleanField(default=True, db_index=True)
99
101
 
102
+ objects = ActiveInstanceManager()
103
+
100
104
  class Meta:
101
105
  unique_together = 'user', 'instance'
102
106
 
@@ -529,12 +533,6 @@ def get_default_inviation_expire_date():
529
533
  return timezone.now() + datetime.timedelta(days=14)
530
534
 
531
535
 
532
- def get_default_invitation_role():
533
- role = PermissionsRole.objects.filter(is_default=True).first()
534
- if not role:
535
- return PermissionsRole.objects.all().first().id
536
- return role.id
537
-
538
536
 
539
537
  class InstanceInvitation(models.Model):
540
538
  instance = models.ForeignKey('core.Instance', on_delete=models.CASCADE)
@@ -542,8 +540,7 @@ class InstanceInvitation(models.Model):
542
540
  max_length=50, default=get_random_string, db_index=True
543
541
  )
544
542
  role = models.ForeignKey(
545
- PermissionsRole, on_delete=models.CASCADE,
546
- default=get_default_invitation_role
543
+ PermissionsRole, on_delete=models.CASCADE
547
544
  )
548
545
  issue_date = models.DateTimeField(auto_now_add=True)
549
546
  expire_date = models.DateTimeField(
@@ -561,6 +558,8 @@ class InstanceInvitation(models.Model):
561
558
  )
562
559
  taken_date = models.DateTimeField(null=True, blank=True)
563
560
 
561
+ objects = ActiveInstanceManager()
562
+
564
563
 
565
564
  class Meta:
566
565
  verbose_name = "invitation"
simo/users/serializers.py CHANGED
@@ -77,7 +77,6 @@ class InstanceInvitationSerializer(serializers.ModelSerializer):
77
77
  'instance', 'token', 'from_user', 'taken_by',
78
78
  )
79
79
 
80
-
81
80
  class FingerprintSerializer(serializers.ModelSerializer):
82
81
  type = serializers.SerializerMethodField()
83
82
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.1.12
3
+ Version: 2.1.14
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
@@ -31,7 +31,7 @@ simo/core/form_fields.py,sha256=9tIjiEN3IE55GPyB4tOlfkd51JDne3-h8pKhpL3tLFE,2220
31
31
  simo/core/forms.py,sha256=QTPEe7nxzhg8NNCQFsVJpoO1LQW6MNNTHkEhBs7keYw,21386
32
32
  simo/core/gateways.py,sha256=m0eS3XjVe34Dge6xtoCq16kFWCKJcdQrT0JW0REqoq8,3715
33
33
  simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
34
- simo/core/managers.py,sha256=sCo9R7ctGepYK-uspl7cR-KFBrJxSy3TZkbWbOP0YHs,2914
34
+ simo/core/managers.py,sha256=n-b3I4uXzfHKTeB1VMjSaMsDUxp8FegFJwnbV1IsWQ4,3019
35
35
  simo/core/middleware.py,sha256=Go4DAdnXWd7i0ZEbftwfcZI5YGjZ31aQqDzWE4s676c,1970
36
36
  simo/core/models.py,sha256=Mg6UjGQjA5WtxO2kq9fO-iW2f9UzDh58etcZ9-X5RSU,21570
37
37
  simo/core/permissions.py,sha256=D8JA3gdsbSfA1Lz6-AIP5ILsYYZ59_Rw4csLqVpuKuE,2928
@@ -64,7 +64,7 @@ simo/core/__pycache__/form_fields.cpython-38.pyc,sha256=u0voKXkA64xbH6LY_-jMBHQS
64
64
  simo/core/__pycache__/forms.cpython-38.pyc,sha256=gDYKULuBTMLxrKfzWXaLDbxuCJvhi2rwR5rIMC_IIVI,17672
65
65
  simo/core/__pycache__/gateways.cpython-38.pyc,sha256=D1ooHL-iSpQrxnD8uAl4xWFJmm-QWZfbkLiLlFOMtdU,4553
66
66
  simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NMEdPAiHK0cFaIL7I8,1623
67
- simo/core/__pycache__/managers.cpython-38.pyc,sha256=wuZuRuyf_mZwM0DJeA83mewOLunfz4-miA2YEQphE60,3292
67
+ simo/core/__pycache__/managers.cpython-38.pyc,sha256=6RTIxyjOgpQGtAqcUyE2vFPS09w1V5Wmd_vOV7rHRRI,3370
68
68
  simo/core/__pycache__/middleware.cpython-38.pyc,sha256=94jRByEYOhsIuiMgPq_oHrRKrvD8rgQw8plS0n1Mrz8,1933
69
69
  simo/core/__pycache__/models.cpython-38.pyc,sha256=rKg-_vQ-3L3_NKbCd0HIij7Nyev1t7SOz32-6PS4Rds,17907
70
70
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=pg11ulzmKh4IeWGPIDJ-KYG-S0dKyY5lHh-S3iljb0E,2930
@@ -10195,7 +10195,7 @@ simo/fleet/controllers.py,sha256=ounEUw51X6EYA8xDcGNIik1bDbw4JR3DOGr1FKo4hHs,288
10195
10195
  simo/fleet/forms.py,sha256=CbrLN_gMCTo8u6fg0ovztkhdYEjHZmSr_3gzsDRMP84,54425
10196
10196
  simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
10197
10197
  simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10198
- simo/fleet/models.py,sha256=U4q813VZmYUpgu7Iw4-z80LfHlkZziIqBKqkQzBA9WI,16304
10198
+ simo/fleet/models.py,sha256=t_oi6EYSkg8Y5p3trJPv4MqW6AyUcylge9Bfw83mWCg,16462
10199
10199
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10200
10200
  simo/fleet/serializers.py,sha256=-16BjY_bp9VbDOYuD0V54h7r_RHpuLNkJX0SydWL9aU,2247
10201
10201
  simo/fleet/socket_consumers.py,sha256=aBNTxvYIw5a5l2ns9x0LnjVJvp4NValEJG4MT4hGAT0,17903
@@ -10212,7 +10212,7 @@ simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=61dvQDl2nIuB4iaCzdBMwQn
10212
10212
  simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=7B6NZnY6yS8qrmv5zlTa07iUYmdv4nW7PTpOVfRn3OY,37436
10213
10213
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnRrsQ_W7yeVeBkRLfIk,5058
10214
10214
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10215
- simo/fleet/__pycache__/models.cpython-38.pyc,sha256=xmzziQxCWL7TLNhOsHWeIvlJJ4ondGq1Td6cmmDVyvg,13664
10215
+ simo/fleet/__pycache__/models.cpython-38.pyc,sha256=GZ01BjdvTn6_XJBfV8VrSldJ67X06ne-xW4CsQ6N6Wc,13756
10216
10216
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10217
10217
  simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=9ljhwoHkolcVrJwOVbYCbGPAUKgALRwor_M3W_K0adE,3173
10218
10218
  simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=oAnUJbrKjhC3-G-o4F-bx3ZztQf7JhmHi-Sh3cm4-4s,13549
@@ -10302,7 +10302,7 @@ simo/generic/base_types.py,sha256=djymox_boXTHX1BTTCLXrCH7ED-uAsV_idhaDOc3OLI,40
10302
10302
  simo/generic/controllers.py,sha256=gojeCP_vSyLTaP4h56LqqLDykny5lEG-nLclieyVrRg,58292
10303
10303
  simo/generic/forms.py,sha256=IAfDtmEk1-CP0JBoetOD_ahLm64nK41GOUXjmbUzNtY,29550
10304
10304
  simo/generic/gateways.py,sha256=cc_q_g2HsI2_rWmr8yZ3spnMPwsgoYS5ApWRimc11wU,18831
10305
- simo/generic/models.py,sha256=jKlNOzpGrjIZt7zL5tKM4AzcD6cAQgqF2AwsIb7anVo,7607
10305
+ simo/generic/models.py,sha256=flpK2jsBFghrvRHzl6IKT-t3WZ-hNOj4ZP2vmBzx0K8,7657
10306
10306
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10307
10307
  simo/generic/socket_consumers.py,sha256=NfTQGYtVAc864IoogZRxf_0xpDPM0eMCWn0SlKA5P7Y,1751
10308
10308
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
@@ -10311,7 +10311,7 @@ simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=ptw6axyAqemZA35oa6vzr7
10311
10311
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=9ZnI6Z084og6Q-9fmhT-PZEM5w_yOC1rwMAHHA6af_Q,36460
10312
10312
  simo/generic/__pycache__/forms.cpython-38.pyc,sha256=v85YEQR9l0QyUgYW_uTKr5qFCjp8TYOAAnfYQvYActI,21227
10313
10313
  simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=8NbsLVDww3Ov5DKF--LKgyrgnrn8yVcKrY21cdvV5aA,13979
10314
- simo/generic/__pycache__/models.cpython-38.pyc,sha256=PzlZsM1jxo3FVb7QDm3bny8UFwTsGrMQe4mj4tJ06eQ,5675
10314
+ simo/generic/__pycache__/models.cpython-38.pyc,sha256=n3FeTMJYh4B6nCPiPKeXiWsUOOWkLHca7qTvfTK6Iik,5844
10315
10315
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10316
10316
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=piFHces0J9QuXu_CNBCQCYjoZEeoaxyVjLfJ9KaR8C8,1898
10317
10317
  simo/generic/static/weather_icons/01d@2x.png,sha256=TZfWi6Rfddb2P-oldWWcjUiuCHiU9Yrc5hyrQAhF26I,948
@@ -10402,15 +10402,16 @@ simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.
10402
10402
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10403
10403
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10404
10404
  simo/users/admin.py,sha256=6RKGnwcrmewJFPzpqnxYn8rxjHO4tJPVFJvA3eMum2s,6746
10405
- simo/users/api.py,sha256=vf11fV8ZCao3Q2TdUO8mDTF3n0N3JYad7CUhz7_ZrZQ,9516
10405
+ simo/users/api.py,sha256=HUY4H9kK_HZKeN4VFERcbNDp6Mmp6p2LdDKBDFvWGUE,10096
10406
10406
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10407
- simo/users/auth_backends.py,sha256=I5pnaTa20-Lxfw_dFG8471xDITb0_fQl1PVhJalp5vU,3992
10407
+ simo/users/auth_backends.py,sha256=bBSNXQJ88TRXaQxyh1aETfmOIfiDr08Jnj8rSY9sHDk,4074
10408
10408
  simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10409
10409
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10410
+ simo/users/managers.py,sha256=M_51bk9z4jn8e2Ci3pJfIqbf6cRNqfQNSOAg0vPl6Vo,175
10410
10411
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10411
- simo/users/models.py,sha256=Y3dkwIvkSbTGWQmAUeK-7ADMsTUU3IqQKOXwtWWzxqY,19824
10412
+ simo/users/models.py,sha256=ud-OOiFuDn8yJK2xrae3Qx-ku9vYBljIHNd3BCHAhM4,19708
10412
10413
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10413
- simo/users/serializers.py,sha256=DwbFGi4WeTYXOSnfrBfd5rC5OGtevYurn27EaTVa1EU,2553
10414
+ simo/users/serializers.py,sha256=a4R408ZgWVbF7OFw4bBfN33Wnn8ljqS8iFcsqmllkWU,2552
10414
10415
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
10415
10416
  simo/users/sso_views.py,sha256=-XI67TvQ7SN3goU4OuAHyn84u_1vtusvpn7Pu0K97zo,4648
10416
10417
  simo/users/tasks.py,sha256=HJAqiyWGsaN3wSfquU0UyQ20jL-njXeaaTOdDT3TQ3s,979
@@ -10418,21 +10419,22 @@ simo/users/utils.py,sha256=7gU_TDnAOsDYqJM0CFo8efPah2bTXfGpXxRqzD5RiSs,1270
10418
10419
  simo/users/views.py,sha256=dOQVvmlHG7ihWKJLFUBcqKOA0UDctlMKR0pTc36JZqg,3487
10419
10420
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=VFoDJE_SKKaPqqYaaBYd1Ndb1hjakkTo_u0EG_XJ1GM,211
10420
10421
  simo/users/__pycache__/admin.cpython-38.pyc,sha256=paoWxwJgOyDF7RT7LIviDqggdELG9-fbydc9UfqHV10,7500
10421
- simo/users/__pycache__/api.cpython-38.pyc,sha256=GcGFVxv0GUcH-TVdvj3v3hty1snKJw3O3-f4PM8DIyM,8305
10422
+ simo/users/__pycache__/api.cpython-38.pyc,sha256=QqQL0MyG8-_7HkqPvqwINuYoco-pJEQ8zT8Crr7t3Rc,8602
10422
10423
  simo/users/__pycache__/apps.cpython-38.pyc,sha256=dgbWL8CxzzISJQTmq_4IztPJ2UzykNVdqA2Ae1PmeGk,605
10423
- simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=MuOieBIXt6lrDx83-UQtdDyI_U8kE3pU9XR4yFLKBnE,3007
10424
+ simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=n5nx2QSXNj2idzRcGE6bAagMN-8qxoCs580H1EFZXls,3105
10424
10425
  simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
10425
10426
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10427
+ simo/users/__pycache__/managers.cpython-38.pyc,sha256=C5-diljm874RAFMTkZdcfzPhkHzlUGPAhz2gTvqkDy8,604
10426
10428
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10427
- simo/users/__pycache__/models.cpython-38.pyc,sha256=uZ_rkg8_aQsX94HPssGrtZsuxjIrklPnyD46-uPYjFA,18342
10429
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=RiBi5YNHt38s4uUd8Xliswnv7s--v72mjUrBvpal_is,18179
10428
10430
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10429
- simo/users/__pycache__/serializers.cpython-38.pyc,sha256=tZzdmCdSnqekAgRl0kyq-msm7QfUA0J_IipfrysAMRM,3477
10431
+ simo/users/__pycache__/serializers.cpython-38.pyc,sha256=PuMy6H0PhEhq89RFmdnFH4pMHB0N3w7opJEFS90JUCY,3477
10430
10432
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
10431
10433
  simo/users/__pycache__/sso_views.cpython-38.pyc,sha256=sHEoxLOac3U3Epmhm197huFnW_J3gGCDZSji57itijU,3969
10432
10434
  simo/users/__pycache__/tasks.cpython-38.pyc,sha256=XLMKt3suT7BlcXrJZoH9ZIhhtBuqyiW4lsOB9IbBkko,1225
10433
10435
  simo/users/__pycache__/utils.cpython-38.pyc,sha256=CGaRBk-y9A-8lWWY4bYkI9faAziO0pVYdr5BJNmqbUg,1600
10434
10436
  simo/users/__pycache__/views.cpython-38.pyc,sha256=AXuUnVYRD0ai4FSFDp4qJwryukujAoN6LD3oIj-Cv3o,2426
10435
- simo/users/migrations/0001_initial.py,sha256=5ojkoyTndS2kW5guKK9G9WntXOqbJMyyT_8s_fcJogc,7072
10437
+ simo/users/migrations/0001_initial.py,sha256=_SnJemhNOs8Jjj-PjyvTVCBoxfs5V3lR_4ypUHUdLUg,7017
10436
10438
  simo/users/migrations/0002_componentpermission.py,sha256=rH9pC9HERf_5WWn3LCsNiu03BiHqURTF62pSNfswStI,918
10437
10439
  simo/users/migrations/0003_create_roles_and_system_user.py,sha256=24kNpyPF_DzCRJbx5wi9pvR78YNNNKRJg6TGI8kQiUY,1141
10438
10440
  simo/users/migrations/0004_user_secret_key.py,sha256=ptNOxBVOkkqoowvu_Y9z8uScDzIoq9yokBxIAkG6P5w,491
@@ -10462,7 +10464,7 @@ simo/users/migrations/0027_permissionsrole_can_manage_components.py,sha256=VcGZE
10462
10464
  simo/users/migrations/0028_auto_20240506_1146.py,sha256=7RUFF2rJH-bnPeHwc77p8Q4kEAc3owyG4qp9Kc4aKhU,716
10463
10465
  simo/users/migrations/0029_alter_instanceuser_instance.py,sha256=5ebO0vX9lCnTXBMkWg8633sBCBLNtMLfbocVY-uyQhE,588
10464
10466
  simo/users/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10465
- simo/users/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=ngXA1QR-Qc2VS-BTTZWybVXiEfifIgKaVS6bADiN8nU,4269
10467
+ simo/users/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=e4XOKaYRb7l0P7cBnHHi5FQQJMlwjK0g7iqgM-xKmNI,4215
10466
10468
  simo/users/migrations/__pycache__/0002_componentpermission.cpython-38.pyc,sha256=pknJnpic8p6Vdx9DX41FfODXNnvexDswJtUCmC5w1tg,995
10467
10469
  simo/users/migrations/__pycache__/0003_create_roles_and_system_user.cpython-38.pyc,sha256=jcxB_WItrY8APyG_ZiCs3sBvaIVQonm8GSakK82Dc7s,750
10468
10470
  simo/users/migrations/__pycache__/0004_user_secret_key.cpython-38.pyc,sha256=fPLGDwNli7BAThDaXhNWOjJzAzF1wB45hQugim1dcWc,733
@@ -10502,9 +10504,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10502
10504
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10503
10505
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10504
10506
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10505
- simo-2.1.12.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10506
- simo-2.1.12.dist-info/METADATA,sha256=9gW_akGr2kphJi5Aj9G3FQJfEtSPVIykU8ugLkZrAXE,1848
10507
- simo-2.1.12.dist-info/WHEEL,sha256=-oYQCr74JF3a37z2nRlQays_SX2MqOANoqVjBBAP2yE,91
10508
- simo-2.1.12.dist-info/entry_points.txt,sha256=SJBxiDpH7noO0STxVI_eRIsGR-nLgdXXeqCDe8cXlbM,65
10509
- simo-2.1.12.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10510
- simo-2.1.12.dist-info/RECORD,,
10507
+ simo-2.1.14.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10508
+ simo-2.1.14.dist-info/METADATA,sha256=ciR_wlaOnCRk7dYaoHrnRJHcDnBiH7rv14fZdxxT3A8,1848
10509
+ simo-2.1.14.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
10510
+ simo-2.1.14.dist-info/entry_points.txt,sha256=SJBxiDpH7noO0STxVI_eRIsGR-nLgdXXeqCDe8cXlbM,65
10511
+ simo-2.1.14.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10512
+ simo-2.1.14.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.0.3)
2
+ Generator: setuptools (72.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5