simo 2.5.13__py3-none-any.whl → 2.5.15__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
@@ -60,6 +60,7 @@ autostart=true
60
60
  autorestart=true
61
61
  stopwaitsecs=15
62
62
  killasgroup=true
63
+ stopsignal=INT
63
64
 
64
65
 
65
66
  [program:simo-celery-beat]
simo/core/models.py CHANGED
@@ -530,7 +530,6 @@ def is_in_alarm(self):
530
530
  and 'last_change' not in kwargs['update_fields']:
531
531
  kwargs['update_fields'].append('last_change')
532
532
 
533
-
534
533
  modifying_fields = (
535
534
  'name', 'icon', 'zone', 'category', 'config', 'meta',
536
535
  'value_units', 'slaves', 'show_in_app', 'alarm_category'
@@ -539,7 +538,10 @@ def is_in_alarm(self):
539
538
  self.last_modified = timezone.now()
540
539
  if 'update_fields' in kwargs \
541
540
  and 'last_modified' not in kwargs['update_fields']:
542
- kwargs['update_fields'].append('last_modified')
541
+ if isinstance(kwargs['update_fields'], tuple):
542
+ kwargs['update_fields'] += ('last_modified', )
543
+ else:
544
+ kwargs['update_fields'].append('last_modified')
543
545
 
544
546
  obj = super().save(*args, **kwargs)
545
547
 
simo/core/serializers.py CHANGED
@@ -106,7 +106,6 @@ class TextAreaSerializerField(serializers.CharField):
106
106
  class ComponentPrimaryKeyRelatedField(PrimaryKeyRelatedField):
107
107
 
108
108
  def get_attribute(self, instance):
109
- print(f"{instance} SOURCE ATTRIBUTES: ", self.source_attrs)
110
109
  if self.queryset.model in (Icon, Zone, Category):
111
110
  return super().get_attribute(instance)
112
111
  return self.queryset.model.objects.filter(
@@ -445,7 +444,9 @@ class ComponentSerializer(FormSerializer):
445
444
  continue
446
445
  if field_name in form.basic_fields:
447
446
  continue
448
- if self.context['request'].user.is_master or user_role.is_superuser:
447
+ if self.context['request'].user.is_master:
448
+ continue
449
+ if user_role and user_role.is_superuser:
449
450
  continue
450
451
  del form.fields[field_name]
451
452
 
@@ -527,8 +528,11 @@ class ComponentSerializer(FormSerializer):
527
528
  if user.is_superuser:
528
529
  return False
529
530
  instance = self.context.get('instance')
531
+ role = user.get_role(instance)
532
+ if not role:
533
+ return True
530
534
  return not bool(
531
- user.get_role(instance).component_permissions.filter(
535
+ role.component_permissions.filter(
532
536
  component=obj, write=True
533
537
  )
534
538
  )
@@ -147,13 +147,13 @@ Sets State component to "day" state as soon as none of the home owners phones ar
147
147
  # Create default User permission roles
148
148
 
149
149
  PermissionsRole.objects.create(
150
- instance=instance, name="Admin", is_superuser=True
150
+ instance=instance, name="Admin", is_owner=True, is_superuser=True
151
151
  )
152
152
  PermissionsRole.objects.create(
153
153
  instance=instance, name="Owner", is_owner=True, is_default=True
154
154
  )
155
155
  PermissionsRole.objects.create(
156
- instance=instance, name="Guest", is_owner=True
156
+ instance=instance, name="Guest", is_owner=False
157
157
  )
158
158
  generic.start()
159
159
  dummy.start()
simo/core/tasks.py CHANGED
@@ -178,85 +178,86 @@ def sync_with_remote():
178
178
 
179
179
  print("Responded with: ", json.dumps(r_json))
180
180
 
181
- with transaction.atomic():
182
- if 'hub_uid' in r_json:
183
- dynamic_settings['core__hub_uid'] = r_json['hub_uid']
184
-
185
- dynamic_settings['core__remote_http'] = r_json.get('hub_remote_http', '')
186
- if 'new_secret' in r_json:
187
- dynamic_settings['core__hub_secret'] = r_json['new_secret']
188
-
189
- if dynamic_settings['core__remote_conn_version'] < r_json['remote_conn_version']:
190
- save_config(r_json)
191
- dynamic_settings['core__remote_conn_version'] = r_json['remote_conn_version']
192
-
193
- instance_uids = []
194
- for data in r_json['instances']:
195
- users_data = data.pop('users', {})
196
- instance_uid = data.pop('uid')
197
- instance_uids.append(instance_uid)
198
- weather = data.pop('weather', None)
199
- instance, new_instance = Instance.objects.update_or_create(
200
- uid=instance_uid, defaults=data
201
- )
202
- if not instance.is_active:
203
- instance.is_active = True
204
- instance.save()
205
-
206
- if weather:
207
- from simo.generic.controllers import Weather
208
- weather_component = Component.objects.filter(
209
- zone__instance=instance,
210
- controller_uid=Weather.uid
211
- ).first()
212
- if weather_component:
213
- weather_component.track_history = False
214
- weather_component.controller.set(weather)
215
- weather_component.save()
216
-
217
- for email, options in users_data.items():
218
-
219
- if new_instance or not instance.instance_users.count():
220
- # Create user for new instance!
221
- user, new_user = User.objects.update_or_create(
222
- email=email, defaults={
223
- 'name': options.get('name'),
224
- 'is_master': options.get('is_hub_master', False),
225
- })
226
- role = None
227
- if options.get('is_hub_master') or options.get('is_superuser'):
228
- role = PermissionsRole.objects.filter(
229
- instance=instance, is_superuser=True
230
- ).first()
231
- elif options.get('is_owner'):
232
- role = PermissionsRole.objects.filter(
233
- instance=instance, is_owner=True
234
- ).first()
235
- if role:
236
- InstanceUser.objects.update_or_create(
237
- user=user, instance=instance, defaults={
238
- 'is_active': True, 'role': role
239
- }
240
- )
241
- else:
242
- user = User.objects.filter(email=email).first()
243
-
244
- if not user:
245
- continue
246
-
247
- if user.name != options.get('name'):
248
- user.name = options['name']
249
- user.save()
250
-
251
- avatar_url = options.get('avatar_url')
252
- if avatar_url and user.avatar_url != avatar_url:
253
- resp = requests.get(avatar_url)
254
- user.avatar.save(
255
- os.path.basename(avatar_url), io.BytesIO(resp.content)
181
+
182
+ if 'hub_uid' in r_json:
183
+ dynamic_settings['core__hub_uid'] = r_json['hub_uid']
184
+
185
+ dynamic_settings['core__remote_http'] = r_json.get('hub_remote_http', '')
186
+ if 'new_secret' in r_json:
187
+ dynamic_settings['core__hub_secret'] = r_json['new_secret']
188
+
189
+ if dynamic_settings['core__remote_conn_version'] < r_json['remote_conn_version']:
190
+ save_config(r_json)
191
+ dynamic_settings['core__remote_conn_version'] = r_json['remote_conn_version']
192
+
193
+ instance_uids = []
194
+ for data in r_json['instances']:
195
+ users_data = data.pop('users', {})
196
+ instance_uid = data.pop('uid')
197
+ instance_uids.append(instance_uid)
198
+ weather = data.pop('weather', None)
199
+ instance, new_instance = Instance.objects.update_or_create(
200
+ uid=instance_uid, defaults=data
201
+ )
202
+ if not instance.is_active:
203
+ instance.is_active = True
204
+ instance.save()
205
+
206
+ if weather:
207
+ from simo.generic.controllers import Weather
208
+ weather_component = Component.objects.filter(
209
+ zone__instance=instance,
210
+ controller_uid=Weather.uid
211
+ ).first()
212
+ if weather_component:
213
+ weather_component.track_history = False
214
+ weather_component.controller.set(weather)
215
+ weather_component.save()
216
+
217
+ for email, options in users_data.items():
218
+
219
+ if new_instance or not instance.instance_users.count():
220
+ # Create user for new instance!
221
+ user, new_user = User.objects.get_or_create(
222
+ email=email, defaults={
223
+ 'name': options.get('name'),
224
+ 'is_master': options.get('is_hub_master', False),
225
+ })
226
+ role = None
227
+ if options.get('is_hub_master') or options.get('is_superuser'):
228
+ role = PermissionsRole.objects.filter(
229
+ instance=instance, is_superuser=True
230
+ ).first()
231
+ elif options.get('is_owner'):
232
+ role = PermissionsRole.objects.filter(
233
+ instance=instance, is_owner=True
234
+ ).first()
235
+
236
+ if role:
237
+ InstanceUser.objects.update_or_create(
238
+ user=user, instance=instance, defaults={
239
+ 'is_active': True, 'role': role
240
+ }
256
241
  )
257
- user.avatar_url = avatar_url
258
- user.avatar_last_change = timezone.now()
259
- user.save()
242
+ else:
243
+ user = User.objects.filter(email=email).first()
244
+
245
+ if not user:
246
+ continue
247
+
248
+ if user.name != options.get('name'):
249
+ user.name = options['name']
250
+ user.save()
251
+
252
+ avatar_url = options.get('avatar_url')
253
+ if avatar_url and user.avatar_url != avatar_url:
254
+ resp = requests.get(avatar_url)
255
+ user.avatar.save(
256
+ os.path.basename(avatar_url), io.BytesIO(resp.content)
257
+ )
258
+ user.avatar_url = avatar_url
259
+ user.avatar_last_change = timezone.now()
260
+ user.save()
260
261
 
261
262
  Instance.objects.all().exclude(
262
263
  uid__in=instance_uids
Binary file
simo/fleet/forms.py CHANGED
@@ -666,7 +666,7 @@ class ColonelSwitchConfigForm(ColonelComponentForm):
666
666
  url='autocomplete-component',
667
667
  forward=[
668
668
  forward.Const(['dimmer', 'switch', 'blinds', 'script'], 'base_type')
669
- ]
669
+ ], required=False
670
670
  )
671
671
 
672
672
  controls = FormsetField(
simo/generic/gateways.py CHANGED
@@ -246,8 +246,10 @@ class GenericGatewayHandler(BaseObjectCommandsGatewayHandler):
246
246
  Component.objects.get(id=id), 'error'
247
247
  )
248
248
 
249
- while len(script_ids):
250
- time.sleep(0.1)
249
+ time.sleep(0.5)
250
+ while len(self.running_scripts.keys()):
251
+ print("Still running scripts: ", self.running_scripts.keys())
252
+ time.sleep(0.5)
251
253
 
252
254
  def on_mqtt_connect(self, mqtt_client, userdata, flags, rc):
253
255
  command = GatewayObjectCommand(self.gateway_instance)
simo/users/models.py CHANGED
@@ -238,13 +238,14 @@ class User(AbstractBaseUser, SimoAdminMixin):
238
238
  def get_role(self, instance):
239
239
  cache_key = f'user-{self.id}_instance-{instance.id}_role'
240
240
  role = cache.get(cache_key, 'expired')
241
- if role == 'expired':
241
+ if role in ('expired', None):
242
242
  role = self.roles.filter(
243
243
  instance=instance
244
244
  ).prefetch_related(
245
245
  'component_permissions', 'component_permissions__component'
246
246
  ).first()
247
- cache.set(cache_key, role, 20)
247
+ if role:
248
+ cache.set(cache_key, role, 20)
248
249
  return role
249
250
 
250
251
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.13
3
+ Version: 2.5.15
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
@@ -52,14 +52,14 @@ simo/core/gateways.py,sha256=m0eS3XjVe34Dge6xtoCq16kFWCKJcdQrT0JW0REqoq8,3715
52
52
  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
- simo/core/models.py,sha256=Z6WLvU4K-LWIXghCBwTyZAOW5n2hCFNU-pteiPnpOAQ,22617
55
+ simo/core/models.py,sha256=DXJXTtNdpn9yC4VArHp0yrhpRb7vGpwH2c-JvqLE56M,22784
56
56
  simo/core/permissions.py,sha256=v0iJM4LOeYoEfMiw3OLPYio272G1aUEAg_z9Wd1q5m0,2993
57
57
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
58
- simo/core/serializers.py,sha256=HaX5F_wxg_7nX0XMVnfbTsnocFaRTXUPDAkShaTxP4s,21843
59
- simo/core/signal_receivers.py,sha256=nNHuva91n0CUmaaRr81h2W_koTvZgvT8tWThIsWpido,9250
58
+ simo/core/serializers.py,sha256=WgksN1Ombv240nfQR_UtmKslTWM9vz9Y0yTdN5usiHU,21892
59
+ simo/core/signal_receivers.py,sha256=-Lw2Jzvgiznw3wj44ntL9nv3DtT8RCEpz6Tap9ZHEQk,9266
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=ESXKD5rN-3Q4wuuwX7CAwcWSaejY1mjb3gyKCgcaNjI,15449
62
+ simo/core/tasks.py,sha256=EF_wDWeCZDA68xtexPURqJaBwbCP48bxdURWgcOLWjE,15141
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
@@ -75,7 +75,7 @@ simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=Tyf8PYHq5YqSwTp25Joy-eura_
75
75
  simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=wDak1gJYUF5oXSlDz1Dtn-Rhy5CxYEY-v1sPkJhQDpk,4128
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
- simo/core/__pycache__/controllers.cpython-38.pyc,sha256=s7onEMtWmHjvTGvWXIbpvWMWb7aAfOVhFhWuu49kLSg,30701
78
+ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=6Ts1BeGND9Uy5eeqC5dNeme1yYilEV_emRnjTjJ9WNw,30701
79
79
  simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=wGpnscX1DxFpRl54MQURhjz2aD3NJohSzw9JCFnzh2Y,2384
80
80
  simo/core/__pycache__/events.cpython-38.pyc,sha256=yip7WSyX4pUy2wJE820W4fD7iwoIWGhdHfloFb_N0R8,5257
81
81
  simo/core/__pycache__/filters.cpython-38.pyc,sha256=VIMADCBiYhziIyRmxAyUDJluZvuZmiC4bNYWTRsGSao,721
@@ -85,14 +85,14 @@ simo/core/__pycache__/gateways.cpython-38.pyc,sha256=D1ooHL-iSpQrxnD8uAl4xWFJmm-
85
85
  simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NMEdPAiHK0cFaIL7I8,1623
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
- simo/core/__pycache__/models.cpython-38.pyc,sha256=Nw2Fb11EwBdMVTHCpzkY6x0hRNCqRo0RtLNlRxS1VZE,18534
88
+ simo/core/__pycache__/models.cpython-38.pyc,sha256=HGL3TiaMy-0oobgCGGxH2nvDhh4RnOBeD00rwQsuklU,18591
89
89
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=fH4iyqd9DdzRLEu2b621-FeM-napR0M7hzBUTHo9Q3g,2972
90
90
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
91
- simo/core/__pycache__/serializers.cpython-38.pyc,sha256=o8vSdZC2mqKRAMJRpKXade-Jp0g4X6PmilOulvZ92Rk,19625
92
- simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=HBT3dEylVbJsRAUl7AB3m0J7sg1VsXjQYzKp1ONTXvk,7039
91
+ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=d4wpUjFuo8GxaNWbin9GdHKik06IZN32uZL1SnXiL_s,19616
92
+ simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=h6MWIU7U2tNCIp0NiKSEDuFeaxLHYz1OXehzBxAYrYA,7048
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=EKvyYqv-1DkxTLCpRosLpwMWd_zbxPLipzu3Fjfu3IA,10413
95
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=DKhn-7oFN4EINROUgsXj4ihlaS93O1xDGqgxZ7PkFuo,10391
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
@@ -153,7 +153,7 @@ simo/core/management/_hub_template/hub/celeryc.py,sha256=3ksDXftIZKJ4Cq9WNKJERdZ
153
153
  simo/core/management/_hub_template/hub/manage.py,sha256=PNNlw3EVeIJDgkG0l-klqoxsKWfTYWG9jzRG0upmAaI,620
154
154
  simo/core/management/_hub_template/hub/nginx.conf,sha256=40hvXL42MeiqqkLURNcDQsRudv1dNFLJnvb2-Y3RCkk,2394
155
155
  simo/core/management/_hub_template/hub/settings.py,sha256=4QhvhbtLRxHvAntwqG_qeAAtpDUqKvN4jzw9u3vqff8,361
156
- simo/core/management/_hub_template/hub/supervisor.conf,sha256=7oqtr3p8rUervmwdfMNdscpPPCTLCFgrn2W_ak7g0yk,2362
156
+ simo/core/management/_hub_template/hub/supervisor.conf,sha256=sfeitUI6V4MgPDtfj-6AEQSTS_VNvLUdwNYNdSI1zRI,2377
157
157
  simo/core/management/_hub_template/hub/urls.py,sha256=Ydm-1BkYAzWeEF-MKSDIFf-7aE4qNLPm48-SA51XgJQ,25
158
158
  simo/core/management/_hub_template/hub/wsgi.py,sha256=Lo-huLHnMDTxSmMBOodVFMWBls9poddrV2KRzXU0xGo,280
159
159
  simo/core/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -10224,7 +10224,7 @@ simo/fleet/auto_urls.py,sha256=UX66eR2ykMqFgfIllW-RTdjup5-FieCWl_BVm3CcXKg,702
10224
10224
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10225
10225
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10226
10226
  simo/fleet/controllers.py,sha256=fjri1GtCnflkkDpNqhTwy6i9CK6RDEB0Q_BtADzcG8E,29156
10227
- simo/fleet/forms.py,sha256=344V3bLxXQdHiYzZYnwuKlyvc_6tVz8Z6XbBuSRN88s,62598
10227
+ simo/fleet/forms.py,sha256=LbYphCtfpSxK3GwzSrcbMkB_spcspsf5FzYQFE9n-Q4,62614
10228
10228
  simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
10229
10229
  simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10230
10230
  simo/fleet/models.py,sha256=xAffeAh5hf8NC94B66ZqmYoF7qDN53wEQ1xE2E9D8Xc,17524
@@ -10241,7 +10241,7 @@ simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=Tc6a6BCXHjijP8U2jE2ghlJwn
10241
10241
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10242
10242
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10243
10243
  simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=jtFHr_uyjCCeuidL-o-hGaf21u0fnxK_O6hTRdY6lpc,24906
10244
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=vGc539_6e6-Ap-qVPoHd78p2bThdVidhV8XUzW0wQu8,42296
10244
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=tvoi9np3Empg1GYBFTChznEy09M0v6UBRaGz9FZCJxc,42300
10245
10245
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnRrsQ_W7yeVeBkRLfIk,5058
10246
10246
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10247
10247
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=TH2J-7xC1TE9AzOJ2lRhVGxUUYqnoYGWTzH9GktuVV0,14138
@@ -10342,7 +10342,7 @@ simo/generic/app_widgets.py,sha256=TPRLj4hri2hBuY6mrdwBiv-01z2hDxZmsup-GDD9LrM,9
10342
10342
  simo/generic/base_types.py,sha256=u3SlfpNYaCwkVBwomWgso4ODzL71ay9MhiAW-bxgnDU,341
10343
10343
  simo/generic/controllers.py,sha256=Qf54CAeD8DviMV_S19E-7f-w-94Vr90-8xasy-IfG_A,49311
10344
10344
  simo/generic/forms.py,sha256=H841-wbWltnZ2-RXQEM1G8H4kfOcl88Qhg7bxE4VCiQ,28993
10345
- simo/generic/gateways.py,sha256=dUzRBxVDdsx70mrCvxSQwhJr0ydQ5NtoLHoYeVLJmtA,15224
10345
+ simo/generic/gateways.py,sha256=sMedpxIfpxqTx746DdhsIu-pzTrqduOSIb7i7XDX9GU,15339
10346
10346
  simo/generic/models.py,sha256=Adq7ipWK-renxJlNW-SZnAq2oGEOwKx8EdUWaKnfcVQ,7597
10347
10347
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10348
10348
  simo/generic/socket_consumers.py,sha256=K2OjphIhKJH48BvfFfoCOyCQZ1NmXb_phs6y1IP-qaQ,1757
@@ -10351,12 +10351,13 @@ simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=YZ5db6-FPynBi6ooPW5cr
10351
10351
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
10352
10352
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=EwtavDlVJX0b6taQ0moYk11oL9nZL5_esoCXGdtcNNo,32751
10353
10353
  simo/generic/__pycache__/forms.cpython-38.pyc,sha256=w7p-dFYvxtNMlrKVnM2zWa1Jp0zXygP6Lbo6kKg-Ox4,21228
10354
- simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=IazhRBe-YZ9t7_wq1fULoyLnxn3frR967lAN9D7MbKY,11583
10354
+ simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=QGj0mIWyqrVpn9AeGeYzdu6PxcF5SdQOHNzEqcHCy_E,11648
10355
10355
  simo/generic/__pycache__/models.cpython-38.pyc,sha256=MZpum7syAFxuulf47K7gtUlJJ7xRD-IBUBAwUM1ZRnw,5825
10356
10356
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10357
10357
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=qJO5kvQLWhsQDOr1AtAtsAybuRWioxSkQei3Pc7rdP0,1737
10358
10358
  simo/generic/migrations/0001_initial.py,sha256=7FpPcfpRU5ya0b8s2KbxR5a3npf92YruvZltUybjzys,676
10359
10359
  simo/generic/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10360
+ simo/generic/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=xy_fN8vnebC_X8hArqHAOLYHLm3puD_stzJ-LvUOhgk,1009
10360
10361
  simo/generic/migrations/__pycache__/__init__.cpython-38.pyc,sha256=nJV0NkIT8MuONj1hUX-V6aCU2lX3BXHyPjisapnBsPA,172
10361
10362
  simo/generic/scripting/__init__.py,sha256=aZZvNBae7unnux_zGHCIWCV2z47hVJc-DIL72Hqfkeo,600
10362
10363
  simo/generic/scripting/example.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -10449,7 +10450,7 @@ simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10449
10450
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10450
10451
  simo/users/managers.py,sha256=Fajwpm3wdMES73iPqoa_66J8g13bvUhjUtrexLKIcIU,312
10451
10452
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10452
- simo/users/models.py,sha256=jq0045_J846w7aiTA6jqb0jliX_gHZaUuBZYsSUXa9o,19218
10453
+ simo/users/models.py,sha256=YXermRuV6LFndyUMiaYcTxC1kpgG0GLeJCczGJuCy10,19251
10453
10454
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10454
10455
  simo/users/serializers.py,sha256=zzw1KONTnaTNBaU0r4rNVxJ827KzD6Z5LuQt27ZsQ98,2516
10455
10456
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
@@ -10466,7 +10467,7 @@ simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg
10466
10467
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10467
10468
  simo/users/__pycache__/managers.cpython-38.pyc,sha256=8NvEXbI795f-BXs6CvE_Kp0PpWfYmEJIZ8Bh8H6S2PQ,705
10468
10469
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10469
- simo/users/__pycache__/models.cpython-38.pyc,sha256=bEyKyFodxErPeXSPvGHroYl4BKjDgLQY_4Pr_YTwLow,17859
10470
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=oQnLCmCFOJ_L_NzkjokSFKmGO-RZWkOsWEQpwS7k_AA,17873
10470
10471
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10471
10472
  simo/users/__pycache__/serializers.cpython-38.pyc,sha256=Dy8RAcwNkNSXoJHvLp8fozURyHCtucqpSPyqZtbnMZc,3732
10472
10473
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
@@ -10560,9 +10561,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10560
10561
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10561
10562
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10562
10563
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10563
- simo-2.5.13.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10564
- simo-2.5.13.dist-info/METADATA,sha256=-YDiu4BTmBJuCqftPrXwh90exRHxZMoVJ7CBnXEydJE,1924
10565
- simo-2.5.13.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10566
- simo-2.5.13.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10567
- simo-2.5.13.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10568
- simo-2.5.13.dist-info/RECORD,,
10564
+ simo-2.5.15.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10565
+ simo-2.5.15.dist-info/METADATA,sha256=6szMyu5HN5deBkqFoKtgRTTOd8Gyelj1sMscLIToS-A,1924
10566
+ simo-2.5.15.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10567
+ simo-2.5.15.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10568
+ simo-2.5.15.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10569
+ simo-2.5.15.dist-info/RECORD,,
File without changes