simo 2.5.20__py3-none-any.whl → 2.5.22__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
 
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
@@ -204,10 +204,10 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
204
204
  if request.META.get('HTTP_HOST', '').endswith('.simo.io'):
205
205
  relay = request.META.get('HTTP_HOST')
206
206
 
207
-
207
+ last_seen_location = None
208
208
  user_device.last_seen = timezone.now()
209
209
  if location:
210
- user_device.last_seen_location = ','.join(
210
+ last_seen_location = ','.join(
211
211
  [str(i) for i in location]
212
212
  ) if location else None
213
213
 
@@ -218,24 +218,24 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
218
218
  ).exclude(id=user_device.id).update(is_primary=False)
219
219
  user_device.save()
220
220
 
221
+ phone_on_charge = False
222
+ if request.data.get('is_charging'):
223
+ phone_on_charge = True
221
224
  speed_kmh = request.data.get('speed', 0) * 3.6
222
225
  for iu in request.user.instance_roles.filter(is_active=True):
223
226
  if location:
224
227
  iu.at_home = haversine_distance(
225
- iu.instance.location, user_device.last_seen_location
228
+ iu.instance.location, last_seen_location
226
229
  ) < dynamic_settings['users__at_home_radius']
227
230
  elif not relay:
228
231
  iu.at_home = True
229
232
 
230
233
  iu.last_seen = user_device.last_seen
231
- iu.last_seen_location = user_device.last_seen_location
234
+ iu.last_seen_location = last_seen_location
232
235
  iu.last_seen_speed_kmh = speed_kmh
233
- iu.phone_on_charge = request.data.get('is_charging', False)
236
+ iu.phone_on_charge = phone_on_charge
234
237
  iu.save()
235
238
 
236
- phone_on_charge = False
237
- if request.data.get('is_charging'):
238
- phone_on_charge = True
239
239
  UserDeviceReportLog.objects.create(
240
240
  user_device=user_device, instance=self.instance,
241
241
  app_open=request.data.get('app_open', False),
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,14 +287,14 @@ 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:
296
295
  instances = Instance.objects.filter(id__in=[
297
296
  r.instance.id for r in self.instance_roles.filter(
298
- is_active=True, instance__isnull=False
297
+ is_active=True
299
298
  )
300
299
  ], is_active=True)
301
300
  cache.set(cache_key, instances, 10)
@@ -307,28 +306,42 @@ class User(AbstractBaseUser, SimoAdminMixin):
307
306
  role__in=self.roles.all()
308
307
  )
309
308
 
309
+
310
310
  @property
311
311
  def is_active(self):
312
+ # Things are getting messed up when no
312
313
  instance = get_current_instance()
313
314
  if not instance:
314
315
  cache_key = f'user-{self.id}_is_active'
315
316
  else:
316
317
  cache_key = f'user-{self.id}_is_active_instance-{instance.id}'
317
- cached_value = cache.get(cache_key, 'expired')
318
- if cached_value == 'expired':
319
- if self.is_master and not self.instance_roles.all():
320
- # Master who have no roles on any instance are in GOD mode!
321
- # It can not be disabled by anybody, nor it is seen by anybody. :)
322
- cached_value = True
318
+ cached_value = cache.get(cache_key)
319
+ if cached_value is None:
320
+ if self.is_master:
321
+ if not self.instance_roles.all():
322
+ # Master who have no roles on any instance are in GOD mode!
323
+ # It can not be disabled by anybody, nor it is seen by anybody. :)
324
+ cached_value = True
325
+ else:
326
+ # Masters who have roles on instances but are all disabled
327
+ # on all instances are then fully disabled
328
+ # Common scenario is - installer made smart home installation
329
+ # owner disabled installer once everything is done, so that
330
+ # installer no longer has any access to his home, however
331
+ # home owner can enable back installer at any time so that
332
+ # he could make any additional necessary changes.
333
+ cached_value = bool(
334
+ self.instance_roles.filter(is_active=True).count()
335
+ )
323
336
  elif instance:
324
337
  cached_value = bool(
325
338
  self.instance_roles.filter(
326
339
  instance=instance, is_active=True
327
- ).first()
340
+ ).count()
328
341
  )
329
342
  else:
330
- cached_value = any(
331
- [ir.is_active for ir in self.instance_roles.all()]
343
+ cached_value = bool(
344
+ self.instance_roles.filter(is_active=True).count()
332
345
  )
333
346
  cache.set(cache_key, cached_value, 20)
334
347
  return cached_value
@@ -356,9 +369,6 @@ class User(AbstractBaseUser, SimoAdminMixin):
356
369
  def is_superuser(self):
357
370
  if self.is_master:
358
371
  return True
359
- # for role in self.roles.all():
360
- # if role.is_superuser:
361
- # return True
362
372
  return False
363
373
 
364
374
  @property
@@ -368,9 +378,6 @@ class User(AbstractBaseUser, SimoAdminMixin):
368
378
  return False
369
379
  if self.is_master:
370
380
  return True
371
- # for role in self.roles.all():
372
- # if role.is_superuser:
373
- # return True
374
381
  return False
375
382
 
376
383
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.20
3
+ Version: 2.5.22
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
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
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,14 +10443,14 @@ 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=wMX7zknPSgEe4Rd-N6313SVFrx7QMwZXKZ1lX3qtMjI,12153
10446
+ simo/users/api.py,sha256=xe__HFxzOaKgrh75PFpP4nkSs5DvmJp8QvMDNhP5kLU,12127
10447
10447
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10448
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=u0coEe4ZoXcePyI0qZpeIW-rDVEvxXVfUkfGlZfSPKE,19293
10453
+ simo/users/models.py,sha256=Ds7WOUVLxljsK_73qGcfnnyJO4EIBXY9GS9FcJGx1bs,19716
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
@@ -10460,14 +10460,14 @@ 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=2BBBoY8SwvTTL6-bCGjY-Dm8ao5NHRGyJ8WB7EPR9cw,10223
10463
+ simo/users/__pycache__/api.cpython-38.pyc,sha256=laiJ17ZN-Bj8fL-AjKpcjPm0hOVEd83vYkOqxfmHa7c,10218
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=2FpY14z17h6x7lJI08uiu4dONVadYf7j5ZZtqKQkWdc,17767
10470
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=E8JT94NAdffXhAWvuK2RG0kPO9YBtX4Cy7Ofs-wIFNw,17577
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
@@ -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.20.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10565
- simo-2.5.20.dist-info/METADATA,sha256=3zff-kYLC7lJl0QQHx0CxBTHJuxFpkh4AnxXAWb0XSw,1924
10566
- simo-2.5.20.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10567
- simo-2.5.20.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10568
- simo-2.5.20.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10569
- simo-2.5.20.dist-info/RECORD,,
10564
+ simo-2.5.22.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10565
+ simo-2.5.22.dist-info/METADATA,sha256=KaAMA15RMBlsmAnbx_HODBYLnPYZXG66HDn17nQ_gE4,1924
10566
+ simo-2.5.22.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10567
+ simo-2.5.22.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10568
+ simo-2.5.22.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10569
+ simo-2.5.22.dist-info/RECORD,,
File without changes