simo 2.0.39__py3-none-any.whl → 2.0.40__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
simo/core/api.py CHANGED
@@ -147,6 +147,8 @@ def get_components_queryset(instance, user):
147
147
  if user.is_superuser:
148
148
  return qs
149
149
 
150
+ c_ids = set()
151
+
150
152
  from simo.generic.controllers import WeatherForecast
151
153
  general_components = []
152
154
  if instance.indoor_climate_sensor:
@@ -156,22 +158,21 @@ def get_components_queryset(instance, user):
156
158
  controller_uid=WeatherForecast.uid, config__is_main=True
157
159
  ).values('id').first()
158
160
  if wf_c:
159
- general_components.append(wf_c['id'])
161
+ c_ids.add(wf_c['id'])
160
162
  main_alarm_group = Component.objects.filter(
161
163
  zone__instance=instance,
162
164
  base_type='alarm-group', config__is_main=True
163
165
  ).values('id').first()
164
166
  if main_alarm_group:
165
- general_components.append(main_alarm_group['id'])
167
+ c_ids.add(main_alarm_group['id'])
168
+
169
+ user_role = user.get_role(instance)
166
170
 
167
- c_ids = [
168
- cp.component.id for cp in
169
- user.get_role(instance).component_permissions.filter(
170
- read=True
171
- ).select_related('component')
172
- ]
173
- qs = qs.filter(Q(id__in=c_ids) | Q(id__in=general_components))
174
- return qs
171
+ for cp in user_role.component_permissions.all():
172
+ if cp.read:
173
+ c_ids.add(cp.id)
174
+
175
+ return qs.filter(id__in=c_ids)
175
176
 
176
177
 
177
178
  class ComponentViewSet(
@@ -188,9 +189,7 @@ class ComponentViewSet(
188
189
  return permissions
189
190
 
190
191
  def get_queryset(self):
191
- return get_components_queryset(self.instance, self.request.user).filter(
192
- zone__instance=self.instance
193
- )
192
+ return get_components_queryset(self.instance, self.request.user)
194
193
 
195
194
  def get_view_name(self):
196
195
  singular = "Component"
@@ -209,7 +208,7 @@ class ComponentViewSet(
209
208
  _('"%s" method not found on controller') % method_name,
210
209
  code=400
211
210
  )
212
- print("VARYSIM: ", method_name, param, type(param))
211
+
213
212
  call = getattr(component, method_name)
214
213
 
215
214
  if not isinstance(param, list) and not isinstance(param, dict):
@@ -255,14 +254,16 @@ class ComponentViewSet(
255
254
 
256
255
  @action(detail=True, methods=['post'])
257
256
  def controller(self, request, pk=None, *args, **kwargs):
257
+ start = time.time()
258
258
  component = self.get_object()
259
+ print(f"Component retrieved in : {time.time() - start}s")
259
260
  data = request.data
260
261
  if not isinstance(request.data, dict):
261
262
  data = data.dict()
262
263
  request_data = restore_json(data)
263
- return self.perform_controller_method(
264
- restore_json(request_data), component
265
- )
264
+ resp = self.perform_controller_method(request_data, component)
265
+ print(f"Command executed in : {time.time() - start}s")
266
+ return resp
266
267
 
267
268
  @action(detail=False, methods=['post'])
268
269
  def control(self, request, *args, **kwargs):
simo/core/permissions.py CHANGED
@@ -78,8 +78,8 @@ class ComponentPermission(BasePermission):
78
78
  return True
79
79
  if user_role.is_owner and request.method != 'DELETE':
80
80
  return True
81
- if request.method == 'POST' and user_role.component_permissions.filter(
82
- write=True, component=obj
83
- ).count():
84
- return True
81
+ if request.method == 'POST':
82
+ for perm in user_role.component_permissions.all():
83
+ if perm.component == obj:
84
+ return perm.write
85
85
  return False
simo/core/utils/json.py CHANGED
@@ -1,20 +1,22 @@
1
1
 
2
2
  def restore_json(data):
3
+ clean_data = {}
3
4
  for key, val in data.items():
4
5
  if not isinstance(val, str):
6
+ clean_data[key] = val
5
7
  continue
6
8
  try:
7
- data[key] = int(val)
9
+ clean_data[key] = int(val)
8
10
  continue
9
11
  except:
10
12
  pass
11
13
  try:
12
- data[key] = float(val)
14
+ clean_data[key] = float(val)
13
15
  continue
14
16
  except:
15
17
  pass
16
18
  if val.lower() == 'true':
17
- data[key] = True
19
+ clean_data[key] = True
18
20
  elif val.lower() == 'false':
19
- data[key] = False
20
- return data
21
+ clean_data[key] = False
22
+ return clean_data
Binary file
simo/fleet/forms.py CHANGED
@@ -159,9 +159,9 @@ class ColonelComponentForm(BaseComponentForm):
159
159
  if 'controls' in self.cleaned_data:
160
160
  del self.cleaned_data['controls']
161
161
 
162
- def save(self, commit=True):
162
+ def save(self, commit=True, update_colonel=True):
163
163
  obj = super().save(commit)
164
- if commit and 'colonel' in self.cleaned_data:
164
+ if commit and 'colonel' in self.cleaned_data and update_colonel:
165
165
  self.cleaned_data['colonel'].components.add(obj)
166
166
  self.cleaned_data['colonel'].rebuild_occupied_pins()
167
167
  self.cleaned_data['colonel'].save()
@@ -649,7 +649,7 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
649
649
  help_text="Minumum PWM signal output duty (0 - 1023)"
650
650
  )
651
651
  duty_max = forms.IntegerField(
652
- min_value=0, max_value=1023, required=True, initial=1023,
652
+ min_value=0, max_value=1023, required=True, initial=900,
653
653
  help_text="Maximum PWM signal output duty (0 - 1023)"
654
654
  )
655
655
  turn_on_time = forms.IntegerField(
@@ -692,7 +692,8 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
692
692
 
693
693
  def __init__(self, *args, **kwargs):
694
694
  super().__init__(*args, **kwargs)
695
- self.fields['value_units'].initial = self.controller.default_value_units
695
+ if 'value_units' in self.fields:
696
+ self.fields['value_units'].initial = self.controller.default_value_units
696
697
  self.basic_fields.extend(
697
698
  ['value_units', 'turn_on_time', 'turn_off_time', 'skew']
698
699
  )
@@ -723,9 +724,29 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
723
724
  def save(self, commit=True):
724
725
  if 'output_pin' in self.cleaned_data:
725
726
  self.instance.config['output_pin_no'] = self.cleaned_data['output_pin'].no
726
- obj = super().save(commit=commit)
727
+
728
+ update_colonel = False
729
+ if not self.instance.pk:
730
+ update_colonel = True
731
+ elif 'output_pin' in self.changed_data:
732
+ update_colonel = True
733
+ elif 'slaves' in self.changed_data:
734
+ update_colonel = True
735
+ if not update_colonel:
736
+ old = Component.objects.get(id=self.instance.id)
737
+ if old.config.get('controls') != self.cleaned_data.get('controls'):
738
+ update_colonel = True
739
+
740
+ obj = super().save(commit=commit, update_colonel=update_colonel)
727
741
  if commit and 'slaves' in self.cleaned_data:
728
742
  obj.slaves.set(self.cleaned_data['slaves'])
743
+ if not update_colonel:
744
+ GatewayObjectCommand(
745
+ obj.gateway, self.cleaned_data['colonel'], id=obj.id,
746
+ command='call', method='update_config', args=[
747
+ obj.controller._get_colonel_config()
748
+ ]
749
+ ).publish()
729
750
  return obj
730
751
 
731
752
 
@@ -1122,8 +1143,9 @@ class TTLockConfigForm(ColonelComponentForm):
1122
1143
  return self.cleaned_data
1123
1144
 
1124
1145
  def save(self, commit=True):
1125
- # TODO: after inclusion it was not assigned to proper colonel!
1126
1146
  obj = super(ColonelComponentForm, self).save(commit)
1147
+ if commit:
1148
+ self.cleaned_data['colonel'].components.add(obj)
1127
1149
  if commit and 'door_sensor' in self.cleaned_data:
1128
1150
  GatewayObjectCommand(
1129
1151
  self.instance.gateway, self.cleaned_data['door_sensor'],
simo/users/models.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import datetime
2
2
  import requests
3
3
  import subprocess
4
+ from django.utils.functional import cached_property
4
5
  from django.urls import reverse
5
6
  from django.utils.translation import gettext_lazy as _
6
7
  from django.db import models
@@ -165,6 +166,7 @@ class User(AbstractBaseUser, SimoAdminMixin):
165
166
 
166
167
  _instances = None
167
168
  _instance = None
169
+ _instance_roles = {}
168
170
 
169
171
  class Meta:
170
172
  verbose_name = _('user')
@@ -215,7 +217,13 @@ class User(AbstractBaseUser, SimoAdminMixin):
215
217
  return self.is_active and self.ssh_key and self.is_master
216
218
 
217
219
  def get_role(self, instance):
218
- return self.roles.filter(instance=instance).first()
220
+ if instance.id not in self._instance_roles:
221
+ self._instance_roles[instance.id] = self.roles.filter(
222
+ instance=instance
223
+ ).prefetch_related(
224
+ 'component_permissions', 'component_permissions__component'
225
+ ).first()
226
+ return self._instance_roles[instance.id]
219
227
 
220
228
  def set_instance(self, instance):
221
229
  self._instance = instance
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.0.39
3
+ Version: 2.0.40
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
@@ -26,7 +26,7 @@ simo/_hub_template/hub/supervisor.conf,sha256=IY3fdK0fDD2eAothB0n54xhjQj8LYoXIR9
26
26
  simo/_hub_template/hub/urls.py,sha256=Ydm-1BkYAzWeEF-MKSDIFf-7aE4qNLPm48-SA51XgJQ,25
27
27
  simo/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  simo/core/admin.py,sha256=xVMFl1MvQ-THwrnAVSvIkhbfbIIc4r_dDGEkpkRoSBk,17751
29
- simo/core/api.py,sha256=HmuMTAo9vLWMBV8K6r-86IrmaCKHY94hjbyoyIPPXTM,25135
29
+ simo/core/api.py,sha256=xRsKR_ZiQOVDhBHnGnraDrhmWWI3wX3el7q8XmNKshc,25063
30
30
  simo/core/api_auth.py,sha256=_3hG4e1eLKrcRnSAOB_xTL6cwtOJ2_7JS7GZU_iqTgA,1251
31
31
  simo/core/api_meta.py,sha256=ySmmhtVrWatI3yqnYPuP5ipapmJfyfEbl32w-7_W5O4,3551
32
32
  simo/core/app_widgets.py,sha256=EEQOto3fGR0syDqpJE38tQrx8DoTTyg26nF5kYzHY38,2018
@@ -44,7 +44,7 @@ simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
44
44
  simo/core/managers.py,sha256=Qdg2-Qh4dLbW0A5Dmtnpct6CUhEuuvdbIskBijQxopU,2360
45
45
  simo/core/middleware.py,sha256=pO52hQOJV_JRmNyUe7zfufSnJFlRITOWX6jwkoPWJhk,2052
46
46
  simo/core/models.py,sha256=W5rShDy8l6GQzTRFiBZFAuibe_fg_LRwSNk973mv_m8,20134
47
- simo/core/permissions.py,sha256=yqVXq6SNZccSKcOoGdb0oh-WHsyTTtI9ovJdJyhjv28,2707
47
+ simo/core/permissions.py,sha256=3YoYMyfGnfCtqe39L8FW2lb6M7VHkQpYk1_j8gC8tD0,2726
48
48
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
49
49
  simo/core/serializers.py,sha256=7iE5_ke56GpcQ_cV6LgQIsfG3pAQXPc3t4e60HwogUs,18277
50
50
  simo/core/signal_receivers.py,sha256=C6Jk7wVEtyo4hwcrU7L0ijtpK0wce2MNwpyBgSfSJ-U,5467
@@ -57,7 +57,7 @@ simo/core/views.py,sha256=hlAKpAbCbqI3a-uL5tDp532T2oLFiF0MBzKUJ_SNzo0,5833
57
57
  simo/core/widgets.py,sha256=J9e06C6I22F6xKic3VMgG7WeX07glAcl-4bF2Mg180A,2827
58
58
  simo/core/__pycache__/__init__.cpython-38.pyc,sha256=y0IW37wBUIGa3Eh_ZG28pRqHKoLiPyTgUX2OnbkEPlc,158
59
59
  simo/core/__pycache__/admin.cpython-38.pyc,sha256=1OisxqtyWMbzpgeeu5vtBW3gp3Nts4Ei4ff1P-SPpq4,13545
60
- simo/core/__pycache__/api.cpython-38.pyc,sha256=YBk4BVAMxAkShEyWgeTkHtTpr4P-tMwrTQI5TTP7vFE,19968
60
+ simo/core/__pycache__/api.cpython-38.pyc,sha256=DE7_vjXbIZk3nV2MlLcze6dj_l-iUvHnuwGWDL5mCAM,19903
61
61
  simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=5UTBr3rDMERAfc0OuOVDwGeQkt6Q7GLBtZJAMBse1sg,1712
62
62
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=94T3_rybn2T1_bkaDQnQRyjy21LBaGOnz-mmkJ6T0N8,2840
63
63
  simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=9Es2wZNduzUJv-jZ_HX0-L3vqwpXWBbseEwoC5K6b-w,3465
@@ -75,7 +75,7 @@ simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NME
75
75
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=ObkzRjSOs2UQmjwFWDvZHreNzc_P5k7dVA_f7L7S7Q4,2529
76
76
  simo/core/__pycache__/middleware.cpython-38.pyc,sha256=ESR5JPtITo9flczO0672sfzYUxrc_cQU0e0w5DFL-60,2038
77
77
  simo/core/__pycache__/models.cpython-38.pyc,sha256=UNX6Btm5ZnpLzSCWgevQnSYzAyDWttA2Ivy7CGPu8DU,17288
78
- simo/core/__pycache__/permissions.cpython-38.pyc,sha256=flJOCh94U8mFhE0XWzUD0sGR6Xe1HlfG4hQtNSnAGZ4,2788
78
+ simo/core/__pycache__/permissions.cpython-38.pyc,sha256=04mfHwG2sjgTnCgRXqku7rlLDsDWHb3nkoqsNE-PN8E,2819
79
79
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
80
80
  simo/core/__pycache__/serializers.cpython-38.pyc,sha256=8QlBSWOtgmhTpFbMMgGoXtMoTMETSnpA37z2LBgRzNQ,17178
81
81
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=UcKT8RK_14CI-JEWfplnIxskmWec_w5-gqKUXITLDA4,4323
@@ -10151,7 +10151,7 @@ simo/core/utils/form_fields.py,sha256=UOzYdPd71qgCw1H3qH01u85YjrOlETPJAHOJrZKhyD
10151
10151
  simo/core/utils/form_widgets.py,sha256=Zxn9jJqPle9Q_BKNJnyTDn7MosYwNp1TFu5LoKs0bfc,408
10152
10152
  simo/core/utils/formsets.py,sha256=ZpExLsnDihnrlsPfYQrwy5qx54IowEmL8hnlO7KlyqE,6924
10153
10153
  simo/core/utils/helpers.py,sha256=TOWy3slspaEYEhe9zDcb0RgzHUYslF6LZDlrWPGSqUI,3791
10154
- simo/core/utils/json.py,sha256=x3kMiiK30vuyWSYfghLVsDKo0N2JlCxZ5n8cwel85Vk,464
10154
+ simo/core/utils/json.py,sha256=eJtr3hSMh0hI10BTfzeUSmhbe_d8wO9hOh5HpLEwqh0,548
10155
10155
  simo/core/utils/logs.py,sha256=Zn9JQxqCH9Odx2J1BWT84nFCfkJ4Z4p5X8psdll7hNc,2366
10156
10156
  simo/core/utils/mixins.py,sha256=X6kUPKAi_F-uw7tgm8LEaYalBXpvDA-yrLNFCGr2rks,259
10157
10157
  simo/core/utils/model_helpers.py,sha256=3IzJeOvBoYdUJVXCJkY20npOZXPjNPAiEFvuT0OPhwA,884
@@ -10169,7 +10169,7 @@ simo/core/utils/__pycache__/form_fields.cpython-38.pyc,sha256=nBk6k9aj6BpWwdkpce
10169
10169
  simo/core/utils/__pycache__/form_widgets.cpython-38.pyc,sha256=MYAYEq0I4P0WErG9FamTJYWue7-cPartAWbFAiSSg5w,908
10170
10170
  simo/core/utils/__pycache__/formsets.cpython-38.pyc,sha256=vwlFLdQ2bpZgXNUpekhtapwfouNPCIRo-SMrgOdAIMA,4813
10171
10171
  simo/core/utils/__pycache__/helpers.cpython-38.pyc,sha256=jTGaN7kSJRwouP0EuYSaiJeMylo_RzJwSm-DKRwceHA,4291
10172
- simo/core/utils/__pycache__/json.cpython-38.pyc,sha256=akSSiSUOnza4N15GAH399gTz-X8x-5gijxZdjZoPz5Q,504
10172
+ simo/core/utils/__pycache__/json.cpython-38.pyc,sha256=TKc88VpPKgimeaozhgx34WWJ1mwTWFWN6B9-VAH8qT0,532
10173
10173
  simo/core/utils/__pycache__/logs.cpython-38.pyc,sha256=BVVeQoOhfRHm3SHnCoE1d5G84kTpJZFmr_btc3jDYTU,2156
10174
10174
  simo/core/utils/__pycache__/mixins.cpython-38.pyc,sha256=8Js2T7jVQ7hugRUIRu3rdxW86dJW4KeUUWqKqSkIGb0,615
10175
10175
  simo/core/utils/__pycache__/model_helpers.cpython-38.pyc,sha256=QzO0rh1NuQePHDCSLmUCRrAZEnV4o8jh9CF_jp7IoUo,1351
@@ -10185,7 +10185,7 @@ simo/fleet/auto_urls.py,sha256=X04oKJWA48wFW5iXg3PPROY2KDdHn_a99orQSE28QC4,518
10185
10185
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10186
10186
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10187
10187
  simo/fleet/controllers.py,sha256=WCqOA5Qrn9RavdfcB8X06WwaTE-9TGUprTQHZ8V8-nA,23172
10188
- simo/fleet/forms.py,sha256=EwqFVVabGGDgtHaBAUo_n0Mu-F3vMXzr4IirMPKAYFg,48872
10188
+ simo/fleet/forms.py,sha256=dkp7NyP0In4_48k9fuyASLypTiNVwQVZCTJWxv2blFE,49763
10189
10189
  simo/fleet/gateways.py,sha256=KV5i5fxXIrlK-k6zyEkk83x11GJt-ELQ0npb4Ac83cM,3693
10190
10190
  simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10191
10191
  simo/fleet/models.py,sha256=bD5AebGFCAYGXPYhTA2nK1X9KpMG4WK4zFk9OzBDoHI,15301
@@ -10202,7 +10202,7 @@ simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=SqyTuaz_kEBvx-bL46SclsZEE
10202
10202
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10203
10203
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10204
10204
  simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=TN3yvfZJgS7FwzgP4S1aDoaOqxbKj2oXfXOxqbkIXJU,19856
10205
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=1kYMcS0G_nPp3h6-MjHyTPNwcJHUiAGfGZIAX1db2rE,33943
10205
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=W-Zwcv-63_a_vhWdl8IHN72maeR9R7zSYluvcDj1-HU,34393
10206
10206
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=YAcgTOqJbtjGI03lvEcU6keFfrwAHkObVmErYzfRvjk,3569
10207
10207
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10208
10208
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=LjcLsSytCQd17xhH-5RrzvnZ6JYI1ilvNdCY2iUCsGc,12935
@@ -10379,7 +10379,7 @@ simo/users/auth_backends.py,sha256=I5pnaTa20-Lxfw_dFG8471xDITb0_fQl1PVhJalp5vU,3
10379
10379
  simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10380
10380
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10381
10381
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10382
- simo/users/models.py,sha256=I_iAa-6CLORshmGszSl021zl97oaXNIEOZYMSq5Wn5M,18902
10382
+ simo/users/models.py,sha256=CcdxpCCJZXHHaPonNdHdfIwcdXREmOZq2CBYiHx6pFg,19251
10383
10383
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10384
10384
  simo/users/serializers.py,sha256=DwbFGi4WeTYXOSnfrBfd5rC5OGtevYurn27EaTVa1EU,2553
10385
10385
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
@@ -10394,7 +10394,7 @@ simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=MuOieBIXt6lrDx83-UQtd
10394
10394
  simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
10395
10395
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10396
10396
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10397
- simo/users/__pycache__/models.cpython-38.pyc,sha256=D5N0lYn3U9jt0M8-Xiz94DbiPuJefZQ9AUFJqKrYmsg,17562
10397
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=ljV7uz49n2MhMpdeZYgA-DwFxx_4y6RvjdprjrIx1u8,17769
10398
10398
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10399
10399
  simo/users/__pycache__/serializers.cpython-38.pyc,sha256=tZzdmCdSnqekAgRl0kyq-msm7QfUA0J_IipfrysAMRM,3477
10400
10400
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
@@ -10468,8 +10468,8 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10468
10468
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10469
10469
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10470
10470
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10471
- simo-2.0.39.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10472
- simo-2.0.39.dist-info/METADATA,sha256=OzMAb8fubyYGVoM40_4IcFpY-tK3Rw8oX7ZEN3G9niw,1730
10473
- simo-2.0.39.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10474
- simo-2.0.39.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10475
- simo-2.0.39.dist-info/RECORD,,
10471
+ simo-2.0.40.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10472
+ simo-2.0.40.dist-info/METADATA,sha256=FCujXv4zFHR57h_bX2NZr6pPfjkR-iuCn8zEJ4nhI7M,1730
10473
+ simo-2.0.40.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10474
+ simo-2.0.40.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10475
+ simo-2.0.40.dist-info/RECORD,,
File without changes