simo 2.5.22__py3-none-any.whl → 2.5.24__py3-none-any.whl

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

Potentially problematic release.


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

Binary file
Binary file
simo/core/context.py CHANGED
@@ -14,10 +14,14 @@ def additional_templates_context(request):
14
14
  instances = Instance.objects.none()
15
15
  else:
16
16
  instances = request.user.instances
17
+ try:
18
+ version = pkg_resources.get_distribution('simo')
19
+ except:
20
+ version = 'dev'
17
21
  ctx = {
18
22
  'hub_ip': get_self_ip(),
19
23
  'dynamic_settings': dynamic_settings,
20
- 'current_version': pkg_resources.get_distribution('simo').version,
24
+ 'current_version': version,
21
25
  'update_available': is_update_available(True),
22
26
  'instances': instances,
23
27
  'current_instance': get_current_instance()
@@ -54,7 +54,10 @@ def maybe_update():
54
54
  if not os.path.exists('/etc/SIMO/_var/auto_update'):
55
55
  print("Auto updates are disabled")
56
56
  else:
57
- current = pkg_resources.get_distribution('simo').version
57
+ try:
58
+ current = pkg_resources.get_distribution('simo')
59
+ except:
60
+ current = 'dev'
58
61
  resp = requests.get("https://pypi.org/pypi/simo/json")
59
62
  if resp.status_code != 200:
60
63
  sys.exit("Bad response from PyPi")
simo/core/tasks.py CHANGED
@@ -119,8 +119,13 @@ def sync_with_remote():
119
119
  except:
120
120
  mac = ''
121
121
 
122
+ try:
123
+ version = pkg_resources.get_distribution('simo').version,
124
+ except:
125
+ version = 'dev'
126
+
122
127
  report_data = {
123
- 'simo_version': pkg_resources.get_distribution('simo').version,
128
+ 'simo_version': version,
124
129
  'local_http': 'https://%s' % get_self_ip(),
125
130
  'mac': mac,
126
131
  'hub_uid': dynamic_settings['core__hub_uid'],
@@ -141,6 +146,7 @@ def sync_with_remote():
141
146
  'users': [],
142
147
  }
143
148
 
149
+ users_included = set()
144
150
  for iuser in instance.instance_users.all().select_related('user', 'role'):
145
151
  instance_data['users'].append({
146
152
  'email': iuser.user.email,
@@ -150,11 +156,16 @@ def sync_with_remote():
150
156
  'is_active': iuser.is_active,
151
157
  'device_token': iuser.user.primary_device_token
152
158
  })
159
+ users_included.add(iuser.user.id)
153
160
 
154
161
  # Include god mode users!
155
162
  for user in User.objects.filter(
156
- roles=None, is_master=True
157
- ).exclude(email__in=('system@simo.io', 'device@simo.io')).distinct():
163
+ is_master=True
164
+ ).exclude(
165
+ email__in=('system@simo.io', 'device@simo.io')
166
+ ).exclude(id__in=users_included).distinct():
167
+ if not user.is_active:
168
+ continue
158
169
  instance_data['users'].append({
159
170
  'email': user.email,
160
171
  'is_hub_master': True,
@@ -456,8 +467,14 @@ def maybe_update_to_latest():
456
467
  return
457
468
  latest = list(resp.json()['releases'].keys())[-1]
458
469
  dynamic_settings['core__latest_version_available'] = latest
459
- if dynamic_settings['core__latest_version_available'] == \
460
- pkg_resources.get_distribution('simo').version:
470
+
471
+ try:
472
+ version = pkg_resources.get_distribution('simo').version
473
+ except:
474
+ # dev environment
475
+ version = dynamic_settings['core__latest_version_available']
476
+
477
+ if dynamic_settings['core__latest_version_available'] == version:
461
478
  print("Up to date!")
462
479
  return
463
480
 
@@ -87,7 +87,6 @@ class FleetConsumer(AsyncWebsocketConsumer):
87
87
  timezone.activate(tz)
88
88
 
89
89
  def get_colonel():
90
- # looks like update_or_create doesn't work in socket/async environment.
91
90
  defaults={
92
91
  'instance': self.instance,
93
92
  'name': headers.get('colonel-name'),
@@ -96,16 +95,22 @@ class FleetConsumer(AsyncWebsocketConsumer):
96
95
  'last_seen': timezone.now(),
97
96
  'enabled': True
98
97
  }
99
- with transaction.atomic():
100
- colonel, new = Colonel.objects.get_or_create(
101
- uid=headers['colonel-uid'], defaults=defaults
98
+ # !!!!! ATETION! !!!!!!!
99
+ # update_or_create and get_or_create doesn't
100
+ # provide reliable operation in socket/async environment.
101
+ new = False
102
+ colonel = Colonel.objects.filter(uid=headers['colonel-uid']).first()
103
+ if not colonel:
104
+ new = True
105
+ colonel = Colonel.objects.create(
106
+ uid=headers['colonel-uid'], **defaults
102
107
  )
103
- if not new:
104
- for key, val in defaults.items():
105
- if key == 'name':
106
- continue
107
- setattr(colonel, key, val)
108
- colonel.save()
108
+ else:
109
+ for key, val in defaults.items():
110
+ if key == 'name':
111
+ continue
112
+ setattr(colonel, key, val)
113
+ colonel.save()
109
114
 
110
115
  return colonel, new
111
116
 
simo/settings.py CHANGED
@@ -207,7 +207,8 @@ CACHES = {
207
207
  "LOCATION": "redis://127.0.0.1:6379/%d" % REDIS_DB['default_cache'],
208
208
  "OPTIONS": {
209
209
  "CLIENT_CLASS": "django_redis.client.DefaultClient",
210
- }
210
+ },
211
+ "TIMEOUT": 300
211
212
  },
212
213
  }
213
214
 
Binary file
simo/users/admin.py CHANGED
@@ -4,6 +4,7 @@ from django.utils.safestring import mark_safe
4
4
  from django.contrib import messages
5
5
  from django.contrib.auth.admin import UserAdmin as OrgUserAdmin
6
6
  from django.contrib import admin
7
+ from simo.core.middleware import get_current_instance
7
8
  from .models import (
8
9
  PermissionsRole, ComponentPermission, User, UserDevice, UserDeviceReportLog,
9
10
  InstanceInvitation, InstanceUser, Fingerprint
@@ -58,6 +59,10 @@ class InstanceUserAdmin(admin.ModelAdmin):
58
59
  'at_home', 'last_seen', 'last_seen_speed_kmh', 'phone_on_charge',
59
60
  )
60
61
 
62
+ def get_queryset(self, request):
63
+ instance = get_current_instance()
64
+ return super().get_queryset(request).filter(instance=instance)
65
+
61
66
 
62
67
  class InstanceUserInline(admin.TabularInline):
63
68
  model = InstanceUser
@@ -99,6 +99,10 @@ class SSOBackend(ModelBackend):
99
99
  user=user, instance=invitation.instance,
100
100
  defaults={'role': invitation.role}
101
101
  )
102
+ user.is_active = True
103
+
104
+ if not user.is_active:
105
+ return
102
106
 
103
107
  if user_data.get('name'):
104
108
  user.name = user_data['name']
@@ -109,6 +113,7 @@ class SSOBackend(ModelBackend):
109
113
  user.avatar.save(
110
114
  os.path.basename(user.avatar_url), io.BytesIO(resp.content)
111
115
  )
112
- user.save()
116
+ if user.get_dirty_fields():
117
+ user.save()
113
118
 
114
119
  return user
simo/users/managers.py CHANGED
@@ -6,7 +6,4 @@ class ActiveInstanceManager(models.Manager):
6
6
 
7
7
  def get_queryset(self):
8
8
  qs = super().get_queryset()
9
- instance = get_current_instance()
10
- if instance:
11
- return qs.filter(instance=instance)
12
- return qs
9
+ return qs.filter(instance__is_active=True)
simo/users/models.py CHANGED
@@ -154,7 +154,7 @@ def post_instance_user_save(sender, instance, created, **kwargs):
154
154
  dynamic_settings['core__needs_mqtt_acls_rebuild'] = True
155
155
 
156
156
 
157
- class User(AbstractBaseUser, SimoAdminMixin):
157
+ class User(DirtyFieldsMixin, AbstractBaseUser, SimoAdminMixin):
158
158
  name = models.CharField(_('name'), max_length=150)
159
159
  email = models.EmailField(_('email address'), unique=True)
160
160
  avatar = ThumbnailerImageField(
@@ -309,16 +309,11 @@ class User(AbstractBaseUser, SimoAdminMixin):
309
309
 
310
310
  @property
311
311
  def is_active(self):
312
- # Things are getting messed up when no
313
- instance = get_current_instance()
314
- if not instance:
315
- cache_key = f'user-{self.id}_is_active'
316
- else:
317
- cache_key = f'user-{self.id}_is_active_instance-{instance.id}'
312
+ cache_key = f'user-{self.id}_is_active'
318
313
  cached_value = cache.get(cache_key)
319
314
  if cached_value is None:
320
315
  if self.is_master:
321
- if not self.instance_roles.all():
316
+ if not self.instance_roles.all().count():
322
317
  # Master who have no roles on any instance are in GOD mode!
323
318
  # It can not be disabled by anybody, nor it is seen by anybody. :)
324
319
  cached_value = True
@@ -333,13 +328,8 @@ class User(AbstractBaseUser, SimoAdminMixin):
333
328
  cached_value = bool(
334
329
  self.instance_roles.filter(is_active=True).count()
335
330
  )
336
- elif instance:
337
- cached_value = bool(
338
- self.instance_roles.filter(
339
- instance=instance, is_active=True
340
- ).count()
341
- )
342
331
  else:
332
+ # user is considered active if he is active on at least one instance
343
333
  cached_value = bool(
344
334
  self.instance_roles.filter(is_active=True).count()
345
335
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.22
3
+ Version: 2.5.24
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
@@ -2,13 +2,13 @@ simo/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
2
2
  simo/asgi.py,sha256=L8CUVZLM32IMzWDZ4IShdDN-m69t7oxAUeHods4-xNM,822
3
3
  simo/celeryc.py,sha256=eab7_e9rw0c__DCeoUFUh_tjAGVlulxVrk75BaJf57Q,1512
4
4
  simo/conf.py,sha256=H2BhXAV8MEDVXF8AbkaLSfR4ULd-9_bS4bnhE5sE5fg,112
5
- simo/settings.py,sha256=BcirAAKau1KiJ5qKTD0ni8hTk3jHAASBcUCBNZPGNCk,6962
5
+ simo/settings.py,sha256=tB7rqHA1QHyb4c_nNNnGD_JkqCWmz7XbS_N3Qq5YacY,6986
6
6
  simo/urls.py,sha256=fRmAsNQ_pzFloimLmxNeDcR6hHRJ3rOoZ3kGy8zOQ_A,2402
7
7
  simo/__pycache__/__init__.cpython-38.pyc,sha256=j81de0BqHMr6bs0C7cuYrXl7HwtK_vv8hDEtAdSwDJc,153
8
8
  simo/__pycache__/asgi.cpython-38.pyc,sha256=5W_YSKOIrRd6NQQuJDuA3Yuj688GzirXVVOyLe8wJIQ,845
9
9
  simo/__pycache__/celeryc.cpython-38.pyc,sha256=eSRoaKwfYlxVaxAiwqpQ2ndEcx7W-VpZtbxRFSV8UYg,1653
10
10
  simo/__pycache__/conf.cpython-38.pyc,sha256=MYP2yk3ULxiYwZsZR6tCLjKnU-z03A3avzQzIn66y3k,273
11
- simo/__pycache__/settings.cpython-38.pyc,sha256=Mi9iweMgAZ16ppKmiK0eFSDYsrY6XRHFpXXHK8is-Pc,6110
11
+ simo/__pycache__/settings.cpython-38.pyc,sha256=KxcUZqNnr1y6QxvcBLoLm_sk-vwbLsJHPvSD6XadAMs,6128
12
12
  simo/__pycache__/urls.cpython-38.pyc,sha256=u0x6EqT8S1YfDOSPgbI8Kf-RDlveY9OV-EDXMYKAQ7w,2125
13
13
  simo/__pycache__/wsgi.cpython-38.pyc,sha256=TpRxO7VM_ql31hbKphVdanydC5RI1nHB4l0QA2pdWxo,322
14
14
  simo/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -41,7 +41,7 @@ simo/core/apps.py,sha256=CsqpiQerhmrMsH-wGiG-gQgXd9qEkIi-LUaA9cXpKSw,425
41
41
  simo/core/auto_urls.py,sha256=nNXEgLAAAQAhRWQDA9AbDtw-zcPKmu_pufJaSa8g818,1102
42
42
  simo/core/autocomplete_views.py,sha256=l7DmpoeXcwjmBda--tT6zFQTNcyfYpgTaryWP-ghETU,3846
43
43
  simo/core/base_types.py,sha256=WypW8hTfzveuTQtruGjLYAGQZIuczxTlW-SdRk3iQug,666
44
- simo/core/context.py,sha256=snfPIGcZQTrx8iiZc5PI91A0dRQH6y5kH4uG_lfhU6Q,1486
44
+ simo/core/context.py,sha256=xH7Fdd2uO7CMm3a1QHnYJTZfEfPfBDFSScKxAx6q69o,1549
45
45
  simo/core/controllers.py,sha256=JvXdwXD7iotA7fIjZmBVshKLQGSt9Na48FMAyHRDh84,35615
46
46
  simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ,1872
47
47
  simo/core/events.py,sha256=fH6d5HcPdDqT3R7CZPdo69qTszJ23j3GJt3IFOso3WA,4757
@@ -59,7 +59,7 @@ simo/core/serializers.py,sha256=WgksN1Ombv240nfQR_UtmKslTWM9vz9Y0yTdN5usiHU,2189
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=0DUXplfS25DxbzVXgomo_q73rQjddo3kS5J-S04cJkk,16128
62
+ simo/core/tasks.py,sha256=KjRx7X948A7j-ZKZNU0LucV-HGRQnd4ai6ikb49yYb0,16517
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
@@ -92,7 +92,7 @@ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=d4wpUjFuo8GxaNWbin9GdHKi
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=AkLMqXd-wW2sEI1A3RgSE0iF1s0S3nh9bAq9d4kW7bw,10790
95
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=PN2_K7yt2lDRYqbkKIozcENhq0gkW5muE0GVKevLM6o,10951
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
@@ -146,7 +146,7 @@ simo/core/drf_braces/tests/serializers/test_enforce_validation_serializer.py,sha
146
146
  simo/core/drf_braces/tests/serializers/test_form_serializer.py,sha256=IE2xQ1SzhSsOy2BFsBYw_Po-ujKBgIuNoTRxCzhyilE,12995
147
147
  simo/core/drf_braces/tests/serializers/test_swapping.py,sha256=o-B5YV5HDxHCVrXYGODeF7lB3rPDGtafNgClx97d6w4,1220
148
148
  simo/core/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
- simo/core/management/update.py,sha256=t-54NN9enr10ldWRemmIHEaSQSOHqTchbZzqucm1P6s,1911
149
+ simo/core/management/update.py,sha256=CDve2OAKBLJpnuhIgOp7riqBm_gl9D0oNKmNOFXGq2E,1964
150
150
  simo/core/management/__pycache__/__init__.cpython-38.pyc,sha256=Ptf1WzljXMt3wP1tzOy6q3JfLERYDs66wSHBVdrzjHg,169
151
151
  simo/core/management/_hub_template/hub/asgi.py,sha256=ElN_fdeSkf0Ysa7pS9rJVmZ1HmLhFxb8jFaMLqe1220,126
152
152
  simo/core/management/_hub_template/hub/celeryc.py,sha256=3ksDXftIZKJ4Cq9WNKJERdZdQlDEnjTQXycweRFmsSQ,27
@@ -10230,7 +10230,7 @@ simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10230
10230
  simo/fleet/models.py,sha256=xAffeAh5hf8NC94B66ZqmYoF7qDN53wEQ1xE2E9D8Xc,17524
10231
10231
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10232
10232
  simo/fleet/serializers.py,sha256=X2M0DFKVaxM6JFGDsdg3S2nJlLIcBvbujidZdfxD88w,2169
10233
- simo/fleet/socket_consumers.py,sha256=8RLEmKQ0Q7nVgJJ6IrU4ioocsWBJrgBVH_AUpVas1no,18095
10233
+ simo/fleet/socket_consumers.py,sha256=LBpdAApNDvUpKIqgbpZxlvIA8GuvB3XEezldZ-Ksi70,18247
10234
10234
  simo/fleet/tasks.py,sha256=AGq9BXFNAqkhOANsPvId8yjEbDtVCB3MRsi_AKDpgIM,821
10235
10235
  simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
10236
10236
  simo/fleet/views.py,sha256=jT3GcGv_JEj3dqyfHH2whCnGqwT8YEAuFxRgIX4Dk9w,3237
@@ -10247,7 +10247,7 @@ simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tj
10247
10247
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=d1Reu7cAryqGuA_Z0eqVsX7SFUo4_jNnyi1JbK7mWuI,14138
10248
10248
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10249
10249
  simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=gIWHJaSUbTe9H_xerD29Fz7BxIqXNzBI60GsIVXbNdY,3134
10250
- simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=phXtf8df1cToGMuJLSj0rnxeLs3NIgEmFy3BqpWvtsE,13893
10250
+ simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=av_7AF6ncsVeWC5x44BANe2TR7f0l660NmJY1jKqZww,13904
10251
10251
  simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
10252
10252
  simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=obUd-X2Y-ybx4icqUWq_qwIxrP9yyarJjexWAfO4MTI,3344
10253
10253
  simo/fleet/__pycache__/views.cpython-38.pyc,sha256=wilxSvZliSKQ5qC7JjWneYBSdbeZeTsF5uDrOQVmvms,3181
@@ -10442,15 +10442,15 @@ simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.
10442
10442
  simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpython-38.pyc,sha256=awhD1F9RyK_706zVNM5io3WT_konFkKQgL7D5MkONwk,851
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
- simo/users/admin.py,sha256=WDRJJtEkbYBQFtLg_5VOIlBV0eeJhgmrsFL51ttme0w,6760
10445
+ simo/users/admin.py,sha256=9P0iIGAep2R1AUvZnROsRULbxwCYK9pCfSJ2X4aLLBg,6965
10446
10446
  simo/users/api.py,sha256=xe__HFxzOaKgrh75PFpP4nkSs5DvmJp8QvMDNhP5kLU,12127
10447
10447
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10448
- simo/users/auth_backends.py,sha256=1gy1-R1U8AOixJ3Ou2LTILjKOHTUxavm_zDiQtCAA9Q,4040
10448
+ simo/users/auth_backends.py,sha256=EErYrGti3TIlYH9Bxj0UFs5EKsbYMV4FP4wGfpdHtts,4165
10449
10449
  simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10450
10450
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10451
- simo/users/managers.py,sha256=Dm21Avmu38-h8MsZ5ljtpgKihMGUBU4hHGpiPvp4NtM,323
10451
+ simo/users/managers.py,sha256=OHgEP85MBtdkdYxdstBd8RavTBT8F_2WyDxUJ9aCqqM,246
10452
10452
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10453
- simo/users/models.py,sha256=Ds7WOUVLxljsK_73qGcfnnyJO4EIBXY9GS9FcJGx1bs,19716
10453
+ simo/users/models.py,sha256=KcIanqB8xvgvTO_jAUJpoN6JSRJha_DhIDSs4lniFXA,19402
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
@@ -10459,15 +10459,15 @@ 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
- simo/users/__pycache__/admin.cpython-38.pyc,sha256=5LEDivt0AydPmqk9PCKvlKRRtc3QBxA6hZgcy_8bEQU,7680
10462
+ simo/users/__pycache__/admin.cpython-38.pyc,sha256=xZ_PgvobRrbqSuNgR2z2ZNm1Ec7MlvswLp7wiUxw5KQ,7937
10463
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
- simo/users/__pycache__/managers.cpython-38.pyc,sha256=oAy5mRBI-FQWgx9xgQsHmCiknKqojuVY363mfEVK0i8,697
10468
+ simo/users/__pycache__/managers.cpython-38.pyc,sha256=O0Y8ABp42RAosrbODmYsPMaj9AyOPyJ-aqzuO0Qpi2s,679
10469
10469
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10470
- simo/users/__pycache__/models.cpython-38.pyc,sha256=E8JT94NAdffXhAWvuK2RG0kPO9YBtX4Cy7Ofs-wIFNw,17577
10470
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=RDZ7bjfjTQV0rJxEVM8dfaxD5oKmoOWViAtIPpQmNQg,17472
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.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,,
10564
+ simo-2.5.24.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10565
+ simo-2.5.24.dist-info/METADATA,sha256=e0f9ASVs2ZfxneQadAVZZXmw3pN-F71v9AgAtUMcZg0,1924
10566
+ simo-2.5.24.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10567
+ simo-2.5.24.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10568
+ simo-2.5.24.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10569
+ simo-2.5.24.dist-info/RECORD,,
File without changes