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

Binary file
@@ -10,9 +10,6 @@ class IconModelAutocomplete(autocomplete.Select2QuerySetView):
10
10
  def get_queryset(self):
11
11
  qs = Icon.objects.all()
12
12
 
13
- if not self.request.user.is_staff:
14
- return qs.none()
15
-
16
13
  if self.forwarded.get("id"):
17
14
  return qs.filter(pk=self.forwarded.get("id"))
18
15
 
@@ -55,10 +52,6 @@ class CategoryAutocomplete(autocomplete.Select2QuerySetView):
55
52
  def get_queryset(self):
56
53
  qs = Category.objects.all()
57
54
 
58
-
59
- if not self.request.user.is_staff:
60
- return qs.none()
61
-
62
55
  if self.forwarded.get("id"):
63
56
  return qs.filter(pk=self.forwarded.get("id"))
64
57
 
@@ -83,9 +76,6 @@ class ZoneAutocomplete(autocomplete.Select2QuerySetView):
83
76
  def get_queryset(self):
84
77
  qs = Zone.objects.all()
85
78
 
86
- if not self.request.user.is_staff:
87
- return qs.none()
88
-
89
79
  if self.forwarded.get("id"):
90
80
  return qs.filter(pk=self.forwarded.get("id"))
91
81
 
@@ -109,9 +99,6 @@ class ComponentAutocomplete(autocomplete.Select2QuerySetView):
109
99
  def get_queryset(self):
110
100
  qs = Component.objects.all()
111
101
 
112
- if not self.request.user.is_staff:
113
- return qs.none()
114
-
115
102
  if self.forwarded.get("id"):
116
103
  if isinstance(self.forwarded['id'], list):
117
104
  return qs.filter(pk__in=self.forwarded["id"])
simo/core/permissions.py CHANGED
@@ -24,7 +24,7 @@ class InstancePermission(BasePermission):
24
24
  if instance not in request.user.instances:
25
25
  return False
26
26
 
27
- introduce_instance(instance)
27
+ introduce_instance(instance, request)
28
28
 
29
29
  return True
30
30
 
@@ -110,7 +110,7 @@ def create_instance_defaults(sender, instance, created, **kwargs):
110
110
  Component.objects.create(
111
111
  name='Auto state', icon=Icon.objects.get(slug='bolt'),
112
112
  zone=other_zone,
113
- category=other_category,
113
+ category=other_category, show_in_app=False,
114
114
  gateway=generic, base_type='script',
115
115
  controller_uid='simo.generic.controllers.Script',
116
116
  config={
simo/core/tasks.py CHANGED
@@ -141,21 +141,26 @@ def sync_with_remote():
141
141
  'users': [],
142
142
  }
143
143
 
144
+ for iuser in instance.instance_users.all().select_related('user', 'role'):
145
+ instance_data['users'].append({
146
+ 'email': iuser.user.email,
147
+ 'is_hub_master': iuser.user.is_master,
148
+ 'is_superuser': iuser.role.is_superuser,
149
+ 'is_owner': iuser.role.is_owner,
150
+ 'is_active': iuser.is_active,
151
+ 'device_token': iuser.user.primary_device_token
152
+ })
153
+
154
+ # Include god mode users!
144
155
  for user in User.objects.filter(
145
- Q(roles__instance=instance) | Q(is_master=True)
156
+ roles=None, is_master=True
146
157
  ).exclude(email__in=('system@simo.io', 'device@simo.io')).distinct():
147
- is_superuser = False
148
- user_role = user.get_role(instance)
149
- if user_role and user_role.is_superuser:
150
- is_superuser = True
151
- is_owner = False
152
- if user_role and user_role.is_owner:
153
- is_owner = True
154
158
  instance_data['users'].append({
155
159
  'email': user.email,
156
- 'is_hub_master': user.is_master,
157
- 'is_superuser': is_superuser,
158
- 'is_owner': is_owner,
160
+ 'is_hub_master': True,
161
+ 'is_superuser': False,
162
+ 'is_owner': False,
163
+ 'is_active': True,
159
164
  'device_token': user.primary_device_token
160
165
  })
161
166
 
Binary file
Binary file
simo/fleet/utils.py CHANGED
@@ -139,6 +139,7 @@ def get_all_control_input_choices():
139
139
  This is called multiple times by component form,
140
140
  so we cache the data to speed things up!
141
141
  '''
142
+ # TODO: filter by instance!
142
143
  def get_control_input_choices():
143
144
  from .models import ColonelPin
144
145
  from simo.core.models import Component
simo/fleet/views.py CHANGED
@@ -3,6 +3,7 @@ from django.db.models import Q
3
3
  from dal import autocomplete
4
4
  from simo.core.utils.helpers import search_queryset
5
5
  from simo.core.models import Component
6
+ from simo.core.middleware import get_current_instance
6
7
  from .models import Colonel, ColonelPin, Interface
7
8
 
8
9
 
@@ -13,12 +14,14 @@ def colonels_ping(request):
13
14
  class PinsSelectAutocomplete(autocomplete.Select2QuerySetView):
14
15
 
15
16
  def get_queryset(self):
16
- if not self.request.user.is_staff:
17
+
18
+ instance = get_current_instance()
19
+ if not instance:
17
20
  return ColonelPin.objects.none()
18
21
 
19
22
  try:
20
23
  colonel = Colonel.objects.get(
21
- pk=self.forwarded.get("colonel")
24
+ pk=self.forwarded.get("colonel"), instance=instance
22
25
  )
23
26
  except:
24
27
  return ColonelPin.objects.none()
@@ -46,8 +49,6 @@ class PinsSelectAutocomplete(autocomplete.Select2QuerySetView):
46
49
  class InterfaceSelectAutocomplete(autocomplete.Select2QuerySetView):
47
50
 
48
51
  def get_queryset(self):
49
- if not self.request.user.is_staff:
50
- return Interface.objects.none()
51
52
 
52
53
  try:
53
54
  colonel = Colonel.objects.get(
Binary file
simo/users/api.py CHANGED
@@ -65,7 +65,6 @@ class UsersViewSet(mixins.RetrieveModelMixin,
65
65
  if key not in ('role', 'is_active'):
66
66
  request.data.pop(key)
67
67
 
68
-
69
68
  serializer = self.get_serializer(
70
69
  target_user, data=request.data, partial=partial
71
70
  )
@@ -43,7 +43,7 @@ class SIMOUserBackend(ModelBackend):
43
43
 
44
44
  user_q = Exists(Permission.objects.filter(permission_q))
45
45
  if include_superusers:
46
- user_q |= Q(is_superuser=True)
46
+ user_q |= Q(is_master=True)
47
47
  if is_active is not None:
48
48
  user_q &= Q(instance_roles__is_active=is_active).distinct()
49
49
 
@@ -111,5 +111,4 @@ class SSOBackend(ModelBackend):
111
111
  )
112
112
  user.save()
113
113
 
114
- if user.is_active:
115
- return user
114
+ return user
simo/users/models.py CHANGED
@@ -43,8 +43,7 @@ class PermissionsRole(models.Model):
43
43
  can_manage_users = models.BooleanField(default=False)
44
44
  is_superuser = models.BooleanField(
45
45
  default=False,
46
- help_text="Can log in to admin interface and has all "
47
- "possible permissions everywhere."
46
+ help_text="Has 100% management control of an instance via mobile app."
48
47
  )
49
48
  is_default = models.BooleanField(
50
49
  default=False, help_text="Default new user role."
@@ -237,8 +236,8 @@ class User(AbstractBaseUser, SimoAdminMixin):
237
236
 
238
237
  def get_role(self, instance):
239
238
  cache_key = f'user-{self.id}_instance-{instance.id}_role'
240
- role = cache.get(cache_key, 'expired')
241
- if role in ('expired', None):
239
+ role = cache.get(cache_key)
240
+ if role is None:
242
241
  role = self.roles.filter(
243
242
  instance=instance
244
243
  ).prefetch_related(
@@ -255,8 +254,8 @@ class User(AbstractBaseUser, SimoAdminMixin):
255
254
  if not instance:
256
255
  return None
257
256
  cache_key = f'user-{self.id}_instance-{instance.id}-role-id'
258
- cached_val = cache.get(cache_key, 'expired')
259
- if cached_val == 'expired':
257
+ cached_val = cache.get(cache_key)
258
+ if cached_val is None:
260
259
  cached_val = None
261
260
  for role in self.roles.all().select_related('instance'):
262
261
  if role.instance == instance:
@@ -288,8 +287,8 @@ class User(AbstractBaseUser, SimoAdminMixin):
288
287
  if not self.is_active:
289
288
  return Instance.objects.none()
290
289
  cache_key = f'user-{self.id}_instances'
291
- instances = cache.get(cache_key, 'expired')
292
- if instances == 'expired':
290
+ instances = cache.get(cache_key)
291
+ if instances is None:
293
292
  if self.is_master:
294
293
  instances = Instance.objects.filter(is_active=True)
295
294
  else:
@@ -314,8 +313,8 @@ class User(AbstractBaseUser, SimoAdminMixin):
314
313
  cache_key = f'user-{self.id}_is_active'
315
314
  else:
316
315
  cache_key = f'user-{self.id}_is_active_instance-{instance.id}'
317
- cached_value = cache.get(cache_key, 'expired')
318
- if cached_value == 'expired':
316
+ cached_value = cache.get(cache_key)
317
+ if cached_value is None:
319
318
  if self.is_master and not self.instance_roles.all():
320
319
  # Master who have no roles on any instance are in GOD mode!
321
320
  # It can not be disabled by anybody, nor it is seen by anybody. :)
@@ -327,8 +326,8 @@ class User(AbstractBaseUser, SimoAdminMixin):
327
326
  ).first()
328
327
  )
329
328
  else:
330
- cached_value = any(
331
- [ir.is_active for ir in self.instance_roles.all()]
329
+ cached_value = bool(
330
+ self.instance_roles.filter(is_active=True).count()
332
331
  )
333
332
  cache.set(cache_key, cached_value, 20)
334
333
  return cached_value
@@ -356,9 +355,6 @@ class User(AbstractBaseUser, SimoAdminMixin):
356
355
  def is_superuser(self):
357
356
  if self.is_master:
358
357
  return True
359
- for role in self.roles.all():
360
- if role.is_superuser:
361
- return True
362
358
  return False
363
359
 
364
360
  @property
@@ -368,9 +364,6 @@ class User(AbstractBaseUser, SimoAdminMixin):
368
364
  return False
369
365
  if self.is_master:
370
366
  return True
371
- for role in self.roles.all():
372
- if role.is_superuser:
373
- return True
374
367
  return False
375
368
 
376
369
  @property
simo/users/sso_views.py CHANGED
@@ -72,7 +72,6 @@ class LoginView(View):
72
72
  return self.consumer.consume(url, data)['request_token']
73
73
 
74
74
 
75
-
76
75
  class AuthenticateView(LoginView):
77
76
 
78
77
  def get(self, request):
@@ -82,12 +81,7 @@ class AuthenticateView(LoginView):
82
81
  ).loads(raw_access_token)
83
82
  user_data = self.consumer.consume('/verify/', {'access_token': access_token})
84
83
 
85
- # This is a very fist time when new hub makes a connection to the master cloud
86
- # so we take the chance to pull down all initial configs.
87
- # TURNS OUT IT IS COMMING IN ON EVERY AUTHENTICATION REQUEST
88
- # if user_data.get('extra_data'):
89
- # from simo.core.tasks import save_config
90
- # save_config(user_data['extra_data'])
84
+ print("Authenticate with USER DATA: ", user_data)
91
85
 
92
86
  user = authenticate(request, user_data=user_data)
93
87
  if not user:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.19
3
+ Version: 2.5.21
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
@@ -39,7 +39,7 @@ simo/core/api_meta.py,sha256=EaiY-dCADP__9MvLpoHvhjytFT92IrxPZDv95xgqasU,4955
39
39
  simo/core/app_widgets.py,sha256=VxZzapuc-a29wBH7JzpvNF2SK1ECrgNUySId5ke1ffc,2509
40
40
  simo/core/apps.py,sha256=CsqpiQerhmrMsH-wGiG-gQgXd9qEkIi-LUaA9cXpKSw,425
41
41
  simo/core/auto_urls.py,sha256=nNXEgLAAAQAhRWQDA9AbDtw-zcPKmu_pufJaSa8g818,1102
42
- simo/core/autocomplete_views.py,sha256=NEzZ27h5VRWqipwYdKrxlGl7GCaA_i8ho2nibpS6FiQ,4139
42
+ simo/core/autocomplete_views.py,sha256=l7DmpoeXcwjmBda--tT6zFQTNcyfYpgTaryWP-ghETU,3846
43
43
  simo/core/base_types.py,sha256=WypW8hTfzveuTQtruGjLYAGQZIuczxTlW-SdRk3iQug,666
44
44
  simo/core/context.py,sha256=snfPIGcZQTrx8iiZc5PI91A0dRQH6y5kH4uG_lfhU6Q,1486
45
45
  simo/core/controllers.py,sha256=JvXdwXD7iotA7fIjZmBVshKLQGSt9Na48FMAyHRDh84,35615
@@ -53,13 +53,13 @@ simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
53
53
  simo/core/managers.py,sha256=n-b3I4uXzfHKTeB1VMjSaMsDUxp8FegFJwnbV1IsWQ4,3019
54
54
  simo/core/middleware.py,sha256=hExD7Vmw7eitk0vAjOwKzkwrtuw8YxpflF92j_CA2YY,3193
55
55
  simo/core/models.py,sha256=DXJXTtNdpn9yC4VArHp0yrhpRb7vGpwH2c-JvqLE56M,22784
56
- simo/core/permissions.py,sha256=v0iJM4LOeYoEfMiw3OLPYio272G1aUEAg_z9Wd1q5m0,2993
56
+ simo/core/permissions.py,sha256=INQPrUAIM3WXCvd7e6cmYytKaak8fMEn7VooX-fIds0,3002
57
57
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
58
58
  simo/core/serializers.py,sha256=WgksN1Ombv240nfQR_UtmKslTWM9vz9Y0yTdN5usiHU,21892
59
- simo/core/signal_receivers.py,sha256=YZZVg0MHIqfJ4RxG_KH5G5pkVz97SLXsMkMxpo-ec2I,8842
59
+ simo/core/signal_receivers.py,sha256=WYBRCFJhP83Ukd-Ipc1HlNyTXdTHD1rl0tV3uOKnYWY,8861
60
60
  simo/core/socket_consumers.py,sha256=trRZvBGTJ7xIbfdmVvn7zoiWp_qssSkMZykDrI5YQyE,9783
61
61
  simo/core/storage.py,sha256=_5igjaoWZAiExGWFEJMElxUw55DzJG1jqFty33xe8BE,342
62
- simo/core/tasks.py,sha256=M0GHGZvRSik_CDWufcDRwbDQju_88q-yHK_Nnp0N4IA,15923
62
+ simo/core/tasks.py,sha256=0DUXplfS25DxbzVXgomo_q73rQjddo3kS5J-S04cJkk,16128
63
63
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
64
64
  simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
65
65
  simo/core/views.py,sha256=3SRZr00fyLQf8ja3U-9eekKt-ld5TvU1WQqUWprXfQ4,2390
@@ -67,12 +67,12 @@ simo/core/widgets.py,sha256=J9e06C6I22F6xKic3VMgG7WeX07glAcl-4bF2Mg180A,2827
67
67
  simo/core/__pycache__/__init__.cpython-38.pyc,sha256=ZJFM_XN0RmJMULQulgA_wFiOnEtsMoedcOWnXjH-Y8o,208
68
68
  simo/core/__pycache__/admin.cpython-38.pyc,sha256=uM58xiBAbbstmKZ0CoxLSk_RRu5TDVuHJNOveXUhFqM,13723
69
69
  simo/core/__pycache__/api.cpython-38.pyc,sha256=z5IT2AoH_Y7iXJELeGlgaxJ2RNe-Wwk8YIt_rJcOGMw,21851
70
- simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=6M9Cl_ha4y_Vf8Rv4GMYL8dcBCmp0KzYi6jn3SQTgys,1712
70
+ simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=mi3mu5qEKio_PvfQEvr3Q6AhdPLAHxzxAxrMbAz_pKU,1712
71
71
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=VYx5ZeDyNBI4B_CBEIhV5B3GnLsMOx9s3rNZTSMODco,3703
72
72
  simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=oN657XMMZ6GYN9nblv7fX3kdnTEzSP9XV6PXM6Z0wl4,4358
73
73
  simo/core/__pycache__/apps.cpython-38.pyc,sha256=JL0BEqgXcSQvMlcK48PBpPfyDEkPMdO1Y0teqMRGirs,713
74
74
  simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=Tyf8PYHq5YqSwTp25Joy-eura_Fm86fpX9zKLSklhvo,872
75
- simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=wDak1gJYUF5oXSlDz1Dtn-Rhy5CxYEY-v1sPkJhQDpk,4128
75
+ simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=YoF9mTXfQtZ0ZC4wIVvYe4RUUnfV8OlCkIDTVT0LwBw,3953
76
76
  simo/core/__pycache__/base_types.cpython-38.pyc,sha256=CX-qlF7CefRi_mCE954wYa9rUFR88mOl6g7fybDRu7g,803
77
77
  simo/core/__pycache__/context.cpython-38.pyc,sha256=ck1FcBljLB4__5F6poS2tEEn8IDDgK7pU3FcXDPc_mI,1329
78
78
  simo/core/__pycache__/controllers.cpython-38.pyc,sha256=6Ts1BeGND9Uy5eeqC5dNeme1yYilEV_emRnjTjJ9WNw,30701
@@ -86,13 +86,13 @@ simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NME
86
86
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=6RTIxyjOgpQGtAqcUyE2vFPS09w1V5Wmd_vOV7rHRRI,3370
87
87
  simo/core/__pycache__/middleware.cpython-38.pyc,sha256=iOSTXSQl3sEsa-9kx_6w5zbEByRtfzJHT6XkUIYMGdE,2469
88
88
  simo/core/__pycache__/models.cpython-38.pyc,sha256=HGL3TiaMy-0oobgCGGxH2nvDhh4RnOBeD00rwQsuklU,18591
89
- simo/core/__pycache__/permissions.cpython-38.pyc,sha256=fH4iyqd9DdzRLEu2b621-FeM-napR0M7hzBUTHo9Q3g,2972
89
+ simo/core/__pycache__/permissions.cpython-38.pyc,sha256=bO13B8uGCv4AiWNBoU2Gxt3mNuQ3gCxb7eKFihwFb5o,2974
90
90
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
91
91
  simo/core/__pycache__/serializers.cpython-38.pyc,sha256=d4wpUjFuo8GxaNWbin9GdHKik06IZN32uZL1SnXiL_s,19616
92
- simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=bBnV6L69VVH46nrWDHi4VGBEMcxusfEsXN7aZoQRzDI,6729
92
+ simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=ZxsQUC_bijcKs2A9BifeqdI5JVS0RCsZpdcBTRoT8o8,6733
93
93
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=KqbO1cOewodVPcy0-htVefyUjCuELKV0o7fOfYqfgPc,8490
94
94
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=9R1Xu0FJDflfRXUPsqEgt0SpwiP7FGk7HaR8s8XRyI8,721
95
- simo/core/__pycache__/tasks.cpython-38.pyc,sha256=mLvFf_G9SCINI2aQYV7rIuGkMj5qe6orc2L359Mz6CY,10766
95
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=AkLMqXd-wW2sEI1A3RgSE0iF1s0S3nh9bAq9d4kW7bw,10790
96
96
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
97
97
  simo/core/__pycache__/views.cpython-38.pyc,sha256=K_QM967bIJeU02DJu0Dm7j8RiFDKn_TLzX77YzNkA7c,2495
98
98
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
@@ -10232,8 +10232,8 @@ simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10232
10232
  simo/fleet/serializers.py,sha256=X2M0DFKVaxM6JFGDsdg3S2nJlLIcBvbujidZdfxD88w,2169
10233
10233
  simo/fleet/socket_consumers.py,sha256=8RLEmKQ0Q7nVgJJ6IrU4ioocsWBJrgBVH_AUpVas1no,18095
10234
10234
  simo/fleet/tasks.py,sha256=AGq9BXFNAqkhOANsPvId8yjEbDtVCB3MRsi_AKDpgIM,821
10235
- simo/fleet/utils.py,sha256=4RaoxyOByh3_Svb-WgTdQjG6R6ZGRN4Zf7-daFc4H80,4708
10236
- simo/fleet/views.py,sha256=OzsumjMjjt2WEXuThBzSAHcTNLU2dyBtvz4IyeHoAaA,3226
10235
+ simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
10236
+ simo/fleet/views.py,sha256=jT3GcGv_JEj3dqyfHH2whCnGqwT8YEAuFxRgIX4Dk9w,3237
10237
10237
  simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
10238
10238
  simo/fleet/__pycache__/admin.cpython-38.pyc,sha256=IqVvpyyOnHChnEc07GubvtH6Tk1PA0rcYGYrJDg0hm4,6503
10239
10239
  simo/fleet/__pycache__/api.cpython-38.pyc,sha256=Ntc1sYKZMygW2eNTxVUgoeCF3StoUZcZA7ST7iYKrlg,3846
@@ -10249,8 +10249,8 @@ simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7
10249
10249
  simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=gIWHJaSUbTe9H_xerD29Fz7BxIqXNzBI60GsIVXbNdY,3134
10250
10250
  simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=phXtf8df1cToGMuJLSj0rnxeLs3NIgEmFy3BqpWvtsE,13893
10251
10251
  simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
10252
- simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=J2N68RzYUnzFeqKH50x9Vtrwd3nrkMKBWOfD99IvfIs,3344
10253
- simo/fleet/__pycache__/views.cpython-38.pyc,sha256=qwW2t_SNX7lLBS1RvYuxYBk9XRkeUcir5O5VYcrjMLY,3136
10252
+ simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=obUd-X2Y-ybx4icqUWq_qwIxrP9yyarJjexWAfO4MTI,3344
10253
+ simo/fleet/__pycache__/views.cpython-38.pyc,sha256=wilxSvZliSKQ5qC7JjWneYBSdbeZeTsF5uDrOQVmvms,3181
10254
10254
  simo/fleet/migrations/0001_initial.py,sha256=lce8nkD8Sz6pYr-XJSpDm4CMDuB6TA__WtnHpIp-eA4,1326
10255
10255
  simo/fleet/migrations/0002_auto_20220422_0743.py,sha256=sFOfAjnQOzcJjE8lHrrHgTaGilJNYswMdXphgVzUZqY,825
10256
10256
  simo/fleet/migrations/0003_auto_20220422_0752.py,sha256=VcH7DyMAniEwT76hDVofS8FTNpM3nxz_J9AC2zKHDSA,543
@@ -10443,35 +10443,35 @@ simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpyth
10443
10443
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10444
10444
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10445
10445
  simo/users/admin.py,sha256=WDRJJtEkbYBQFtLg_5VOIlBV0eeJhgmrsFL51ttme0w,6760
10446
- simo/users/api.py,sha256=WSFUqBf6PMZNjZeqyppXfALs-la0rV-TVZUjuqDbeHA,12154
10446
+ simo/users/api.py,sha256=wMX7zknPSgEe4Rd-N6313SVFrx7QMwZXKZ1lX3qtMjI,12153
10447
10447
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10448
- simo/users/auth_backends.py,sha256=bBSNXQJ88TRXaQxyh1aETfmOIfiDr08Jnj8rSY9sHDk,4074
10448
+ simo/users/auth_backends.py,sha256=1gy1-R1U8AOixJ3Ou2LTILjKOHTUxavm_zDiQtCAA9Q,4040
10449
10449
  simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10450
10450
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10451
10451
  simo/users/managers.py,sha256=Dm21Avmu38-h8MsZ5ljtpgKihMGUBU4hHGpiPvp4NtM,323
10452
10452
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10453
- simo/users/models.py,sha256=8P-nldx9cm17GxRM9p0Vkfc-MSzOK0jXpkuOD3Y46yI,19281
10453
+ simo/users/models.py,sha256=rWjhWDh7PdUTHIg8E7zZHeArxNCHdcrA4RwHkCaZgV0,18973
10454
10454
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10455
10455
  simo/users/serializers.py,sha256=zzw1KONTnaTNBaU0r4rNVxJ827KzD6Z5LuQt27ZsQ98,2516
10456
10456
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
10457
- simo/users/sso_views.py,sha256=-XI67TvQ7SN3goU4OuAHyn84u_1vtusvpn7Pu0K97zo,4648
10457
+ simo/users/sso_views.py,sha256=5J0D4qUFQDvd-Fcqx_xLJWLJgPdqtVD5DDiPJyPsT2Q,4336
10458
10458
  simo/users/tasks.py,sha256=HJAqiyWGsaN3wSfquU0UyQ20jL-njXeaaTOdDT3TQ3s,979
10459
10459
  simo/users/utils.py,sha256=1HGSZyHRqQvdJ4RtAiZDg1juvgG8aOlrGXR7CcvsyQc,1886
10460
10460
  simo/users/views.py,sha256=dOQVvmlHG7ihWKJLFUBcqKOA0UDctlMKR0pTc36JZqg,3487
10461
10461
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=VFoDJE_SKKaPqqYaaBYd1Ndb1hjakkTo_u0EG_XJ1GM,211
10462
10462
  simo/users/__pycache__/admin.cpython-38.pyc,sha256=5LEDivt0AydPmqk9PCKvlKRRtc3QBxA6hZgcy_8bEQU,7680
10463
- simo/users/__pycache__/api.cpython-38.pyc,sha256=BCee2Qk_VJLtXGb13VyHasDo2HmGW1ZVE6WiuTi2ijA,10223
10463
+ simo/users/__pycache__/api.cpython-38.pyc,sha256=2BBBoY8SwvTTL6-bCGjY-Dm8ao5NHRGyJ8WB7EPR9cw,10223
10464
10464
  simo/users/__pycache__/apps.cpython-38.pyc,sha256=dgbWL8CxzzISJQTmq_4IztPJ2UzykNVdqA2Ae1PmeGk,605
10465
10465
  simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=n5nx2QSXNj2idzRcGE6bAagMN-8qxoCs580H1EFZXls,3105
10466
10466
  simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
10467
10467
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10468
10468
  simo/users/__pycache__/managers.cpython-38.pyc,sha256=oAy5mRBI-FQWgx9xgQsHmCiknKqojuVY363mfEVK0i8,697
10469
10469
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10470
- simo/users/__pycache__/models.cpython-38.pyc,sha256=gETn4dAfZAkIpclgbmegAxWzFeq6KjZ0GPeEIP0Un54,17879
10470
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=LJqRXBisLbNPzXU19iIZ81Zd6DQQGi-5woHjQlXvdXM,17578
10471
10471
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10472
10472
  simo/users/__pycache__/serializers.cpython-38.pyc,sha256=Dy8RAcwNkNSXoJHvLp8fozURyHCtucqpSPyqZtbnMZc,3732
10473
10473
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
10474
- simo/users/__pycache__/sso_views.cpython-38.pyc,sha256=sHEoxLOac3U3Epmhm197huFnW_J3gGCDZSji57itijU,3969
10474
+ simo/users/__pycache__/sso_views.cpython-38.pyc,sha256=PLRF6FYCxRhnmgnN_gUS-pdQlH7lofLU1Xhgw3vDO_Y,4019
10475
10475
  simo/users/__pycache__/tasks.cpython-38.pyc,sha256=XLMKt3suT7BlcXrJZoH9ZIhhtBuqyiW4lsOB9IbBkko,1225
10476
10476
  simo/users/__pycache__/utils.cpython-38.pyc,sha256=S-2i_Y11eTcUpmn-RkX1B4_tDvZJdqkZqqoewpkcsUM,1739
10477
10477
  simo/users/__pycache__/views.cpython-38.pyc,sha256=AXuUnVYRD0ai4FSFDp4qJwryukujAoN6LD3oIj-Cv3o,2426
@@ -10561,9 +10561,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10561
10561
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10562
10562
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10563
10563
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10564
- simo-2.5.19.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10565
- simo-2.5.19.dist-info/METADATA,sha256=NsP9qv6SZr9uYMDMweh18wvAxLc5WRGqCiu0-apto0U,1924
10566
- simo-2.5.19.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10567
- simo-2.5.19.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10568
- simo-2.5.19.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10569
- simo-2.5.19.dist-info/RECORD,,
10564
+ simo-2.5.21.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10565
+ simo-2.5.21.dist-info/METADATA,sha256=kpfxTB9swlXMBR86cbL_O3uyNJIOU0IB_1hn-RixSvA,1924
10566
+ simo-2.5.21.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10567
+ simo-2.5.21.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10568
+ simo-2.5.21.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10569
+ simo-2.5.21.dist-info/RECORD,,
File without changes