simo 2.0.18__py3-none-any.whl → 2.0.19__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
@@ -210,14 +210,7 @@ class ComponentViewSet(InstanceMixin, viewsets.ModelViewSet):
210
210
  @action(detail=True, methods=['post'])
211
211
  def subcomponent(self, request, pk=None, *args, **kwargs):
212
212
  component = self.get_object()
213
- if not request.user.is_superuser \
214
- and not request.get_role(self.instance).component_permissions.filter(
215
- write=True, component=component
216
- ):
217
- raise APIValidationError(
218
- _('You do not have permission to write to this component.'),
219
- code=403
220
- )
213
+ self.check_object_permissions(request, component)
221
214
  json_data = request.data
222
215
  subcomponent_id = json_data.pop('id', -1)
223
216
  try:
@@ -232,28 +225,35 @@ class ComponentViewSet(InstanceMixin, viewsets.ModelViewSet):
232
225
  _('Subcomponent has no controller assigned.'),
233
226
  code=400
234
227
  )
228
+ self.check_object_permissions(self.request, subcomponent)
235
229
  return self.perform_controller_method(json_data, subcomponent)
236
230
 
237
231
 
238
232
  def check_object_permissions(self, request, component):
239
233
  super().check_object_permissions(request, component)
240
- if not request.user.is_superuser\
241
- and not request.user.get_role(self.instance).component_permissions.filter(
242
- write=True, component=component
243
- ):
244
- raise APIValidationError(
245
- _('You do not have permission to write to this component.'),
246
- code=403
247
- )
234
+
248
235
  if not component.controller:
249
236
  raise APIValidationError(
250
237
  _('Component has no controller assigned.'),
251
238
  code=400
252
239
  )
240
+ if request.user.is_master:
241
+ return
242
+ user_role = request.user.get_role(self.instance)
243
+ if user_role.is_superuser:
244
+ return
245
+ if not user_role.component_permissions.filter(
246
+ write=True, component=component
247
+ ).count():
248
+ raise APIValidationError(
249
+ _('You do not have permission to write to this component.'),
250
+ code=403
251
+ )
253
252
 
254
253
  @action(detail=True, methods=['post'])
255
254
  def controller(self, request, pk=None, *args, **kwargs):
256
255
  component = self.get_object()
256
+ self.check_object_permissions(self.request, component)
257
257
  return self.perform_controller_method(request.data, component)
258
258
 
259
259
  @action(detail=False, methods=['post'])
simo/generic/models.py CHANGED
@@ -148,28 +148,29 @@ def bind_alarm_groups(sender, instance, created, *args, **kwargs):
148
148
  return
149
149
  users_at_home = InstanceUser.objects.filter(
150
150
  instance=instance.instance, at_home=True
151
- ).exclude(is_active=False).exclude(instance.id)
152
- if not users_at_home.count():
153
- for ag in Component.objects.filter(
154
- zone__instance=instance.instance,
155
- base_type=AlarmGroup.base_type,
156
- config__has_key='arm_on_away'
157
- ).exclude(config__arm_on_away=None):
158
- if ag.config.get('arm_on_away') == 'on_away':
159
- ag.arm()
160
- elif ag.config.get('arm_on_away').startswith('on_away_and_locked'):
161
- locked_states = [
162
- True if l['value'] == 'locked' else False
163
- for l in Component.objects.filter(
164
- base_type='lock', id__in=ag.config.get('arming_locks', []),
165
- ).values('value')
166
- ]
167
- if not any(locked_states):
168
- continue
169
- if ag.config['arm_on_away'] == 'on_away_and_locked':
170
- ag.arm()
171
- continue
172
- if ag.config['arm_on_away'] == 'on_away_and_locked_all' \
173
- and all(locked_states):
174
- ag.arm()
175
- continue
151
+ ).exclude(is_active=False).exclude(id=instance.id)
152
+ if users_at_home.count():
153
+ return
154
+ for ag in Component.objects.filter(
155
+ zone__instance=instance.instance,
156
+ base_type=AlarmGroup.base_type,
157
+ config__arm_on_away__startswith='on_away_and_locked'
158
+ ):
159
+ locked_states = [
160
+ True if l['value'] == 'locked' else False
161
+ for l in Component.objects.filter(
162
+ base_type='lock', id__in=ag.config.get('arming_locks', []),
163
+ ).values('value')
164
+ ]
165
+ if not any(locked_states):
166
+ print("Not a single lock is locked. Continue.")
167
+ continue
168
+ if ag.config['arm_on_away'] == 'on_away_and_locked':
169
+ print(f"Everybody is away, single lock is locked, arm {ag}!")
170
+ ag.arm()
171
+ continue
172
+ if ag.config['arm_on_away'] == 'on_away_and_locked_all' \
173
+ and all(locked_states):
174
+ print(f"Everybody is away, all locks are locked, arm {ag}!")
175
+ ag.arm()
176
+ continue
@@ -1,6 +1,4 @@
1
1
  from django.utils.translation import gettext_lazy as _
2
- from django.core.exceptions import ValidationError
3
- from simo.core.controllers import BEFORE_SEND, BEFORE_SET
4
2
  from simo.core.controllers import Switch, TimerMixin
5
3
  from .app_widgets import AudioPlayerWidget, VideoPlayerWidget
6
4
 
Binary file
simo/users/api.py CHANGED
@@ -38,25 +38,34 @@ class UsersViewSet(mixins.RetrieveModelMixin,
38
38
  return queryset.filter(roles__instance=self.instance)
39
39
 
40
40
 
41
+ def check_permission_to_change(self, request, target_user):
42
+ user_role = request.user.get_role(self.instance)
43
+ if request.user.is_master:
44
+ return user_role
45
+ if user_role.is_superuser:
46
+ return user_role
47
+ if user_role.can_manage_users:
48
+ return user_role
49
+ msg = 'You are not allowed to change this!'
50
+ print(msg, file=sys.stderr)
51
+ raise ValidationError(msg, code=403)
52
+
53
+
41
54
  def update(self, request, *args, **kwargs):
42
55
  partial = kwargs.pop('partial', False)
56
+ target_user = self.get_object()
57
+ user_role = self.check_permission_to_change(request, target_user)
43
58
 
44
59
  for key, val in request.data.items():
45
60
  if key not in ('role', 'is_active'):
46
61
  request.data.pop(key)
47
62
 
48
- user = self.get_object()
49
- user.set_instance(self.instance)
50
63
 
51
- user_role = request.user.get_role(self.instance)
52
- if not request.user.is_superuser:
53
- if not user_role or not user_role.can_manage_users:
54
- msg = 'You are not allowed to change this!'
55
- print(msg, file=sys.stderr)
56
- raise ValidationError(msg, code=403)
64
+ target_user.set_instance(self.instance)
65
+
57
66
 
58
67
  serializer = self.get_serializer(
59
- user, data=request.data, partial=partial
68
+ target_user, data=request.data, partial=partial
60
69
  )
61
70
  try:
62
71
  serializer.is_valid(raise_exception=True)
@@ -71,14 +80,15 @@ class UsersViewSet(mixins.RetrieveModelMixin,
71
80
  except:
72
81
  pass
73
82
  else:
74
- if set_role_to != user.get_role(self.instance) and set_role_to.is_superuser \
83
+ if set_role_to != target_user.get_role(self.instance) \
84
+ and set_role_to.is_superuser \
75
85
  and not user_role.is_superuser:
76
86
  msg = "You are not allowed to grant superuser roles to others " \
77
87
  "if you are not a superuser yourself."
78
88
  print(msg, file=sys.stderr)
79
89
  raise ValidationError(msg, code=403)
80
90
 
81
- if user == request.user \
91
+ if target_user == request.user \
82
92
  and user_role and user_role.is_superuser \
83
93
  and not set_role_to.is_superuser:
84
94
  # User is trying to downgrade his own role from
@@ -86,7 +96,7 @@ class UsersViewSet(mixins.RetrieveModelMixin,
86
96
  # there is at least one user left that has superuser role on this instance.
87
97
  if not User.objects.filter(
88
98
  roles__instance=self.instance, roles__is_superuser=True
89
- ).exclude(id=user.id).values('id').first():
99
+ ).exclude(id=target_user.id).values('id').first():
90
100
  msg = "You are the only one superuser on this instance, " \
91
101
  "therefore you are not alowed to downgrade your role."
92
102
  print(msg, file=sys.stderr)
@@ -94,10 +104,10 @@ class UsersViewSet(mixins.RetrieveModelMixin,
94
104
 
95
105
  self.perform_update(serializer)
96
106
 
97
- if getattr(user, '_prefetched_objects_cache', None):
107
+ if getattr(target_user, '_prefetched_objects_cache', None):
98
108
  # If 'prefetch_related' has been applied to a queryset, we need to
99
109
  # forcibly invalidate the prefetch cache on the instance.
100
- user._prefetched_objects_cache = {}
110
+ target_user._prefetched_objects_cache = {}
101
111
 
102
112
  return RESTResponse(serializer.data)
103
113
 
simo/users/models.py CHANGED
@@ -277,7 +277,7 @@ class User(AbstractBaseUser, SimoAdminMixin):
277
277
  @property
278
278
  def is_active(self):
279
279
  if self.is_master and not self.instance_roles.all():
280
- # Master that has no roles on any instance is in GOD mode!
280
+ # Master who have no roles on any instance are in GOD mode!
281
281
  # It can not be disabled by anybody, nor it is seen by anybody. :)
282
282
  return True
283
283
  if self._instance:
@@ -411,6 +411,7 @@ def set_user_at_home(sender, instance, created, **kwargs):
411
411
  from simo.core.models import Instance
412
412
  if not created:
413
413
  return
414
+
414
415
  if not instance.relay:
415
416
  for item in InstanceUser.objects.filter(user=instance.user_device.user):
416
417
  item.at_home = True
@@ -419,6 +420,12 @@ def set_user_at_home(sender, instance, created, **kwargs):
419
420
  if not instance.location:
420
421
  return
421
422
 
423
+ instance.user_device.last_seen_location = instance.location
424
+ instance.user_device.save()
425
+ instance.user_device.user.last_seen_location = instance.location
426
+ instance.user_device.user.last_seen_location_datetime = timezone.now()
427
+ instance.user_device.user.save()
428
+
422
429
  for hub_instance in Instance.objects.all():
423
430
  try:
424
431
  instance_location = Point(
simo/users/serializers.py CHANGED
@@ -35,16 +35,20 @@ class UserSerializer(serializers.ModelSerializer):
35
35
  return obj.is_active
36
36
 
37
37
  def get_avatar(self, obj):
38
- if obj.avatar:
38
+ if not obj.avatar:
39
+ return
40
+ try:
39
41
  url = obj.avatar['avatar'].url
40
- request = get_current_request()
41
- if request:
42
- url = request.build_absolute_uri(url)
43
- return {
44
- 'url': url,
45
- 'last_change': obj.avatar_last_change.timestamp()
46
- }
47
- return None
42
+ except:
43
+ return
44
+ request = get_current_request()
45
+ if request:
46
+ url = request.build_absolute_uri(url)
47
+ return {
48
+ 'url': url,
49
+ 'last_change': obj.avatar_last_change.timestamp()
50
+ }
51
+
48
52
 
49
53
  def get_at_home(self, obj):
50
54
  iu = InstanceUser.objects.filter(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.0.18
3
+ Version: 2.0.19
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
@@ -44,4 +44,5 @@ Requires-Dist: slugify ==0.0.1
44
44
  Requires-Dist: django-countries ==7.5.1
45
45
  Requires-Dist: librosa ==0.10.1
46
46
  Requires-Dist: daphne ==4.1.0
47
+ Requires-Dist: Pillow ==9.5.0
47
48
 
@@ -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=5QFmf7ZOqkSEba2Fo-UfJp5dVe-vhKUtOUlAnfQGhno,17634
29
- simo/core/api.py,sha256=OVvv3a7KYJGbuUgSOfWzPg8hoCCRhdDejQ2kVs0H2p8,23803
29
+ simo/core/api.py,sha256=H4KJBiU377zEj8dJGSnBUKgyeyA2512WmSh9I0nH4WM,23760
30
30
  simo/core/api_auth.py,sha256=_3hG4e1eLKrcRnSAOB_xTL6cwtOJ2_7JS7GZU_iqTgA,1251
31
31
  simo/core/api_meta.py,sha256=dZkz7z-7GaMPVAsfQxOYCvpYaMPx_v2zynbY6JM8oD8,3477
32
32
  simo/core/app_widgets.py,sha256=EEQOto3fGR0syDqpJE38tQrx8DoTTyg26nF5kYzHY38,2018
@@ -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=D9Hu5xMkclP6xFjEOLB-mBOe0ZMuCF10uilsROKkvmM,13446
60
- simo/core/__pycache__/api.cpython-38.pyc,sha256=W-CdACWTu_ebqH52riswadzT7z2mNRZJU8HngqbYXzw,18874
60
+ simo/core/__pycache__/api.cpython-38.pyc,sha256=kH2ORVfI8xtwe7M1wdOEtaqJR_SqKR8V1wrCdhazVhc,18883
61
61
  simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=5UTBr3rDMERAfc0OuOVDwGeQkt6Q7GLBtZJAMBse1sg,1712
62
62
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=7dDi_Aay7T4eSNYmEItMlb7yU91-5_pzEVg8GXXf4Qc,2783
63
63
  simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=9Es2wZNduzUJv-jZ_HX0-L3vqwpXWBbseEwoC5K6b-w,3465
@@ -10272,7 +10272,7 @@ simo/generic/base_types.py,sha256=djymox_boXTHX1BTTCLXrCH7ED-uAsV_idhaDOc3OLI,40
10272
10272
  simo/generic/controllers.py,sha256=WYuOUzDWvkYRaTvlbdGy_qmwp1o_ohqKDfV7OrOq2QU,52218
10273
10273
  simo/generic/forms.py,sha256=U6MIS5U7jLG6XabqCZvrfSoiNCQiWZYE8VZPnyN3SJw,23757
10274
10274
  simo/generic/gateways.py,sha256=b3tQ2bAkDVYXCF5iZi2yi-6nZAM8WmHE9ICwxMyR0to,17034
10275
- simo/generic/models.py,sha256=iUE1-PVyAPvOkxczU6sXZKUwWVQxkljtx2E4g9WstnU,6711
10275
+ simo/generic/models.py,sha256=ni1cgqVZ8ttk1snW26EB-2dqsHRZkLg6463my_Cu3EU,6618
10276
10276
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10277
10277
  simo/generic/socket_consumers.py,sha256=NfTQGYtVAc864IoogZRxf_0xpDPM0eMCWn0SlKA5P7Y,1751
10278
10278
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
@@ -10281,7 +10281,7 @@ simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=ptw6axyAqemZA35oa6vzr7
10281
10281
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=e0bvgyePgJbIs1omBq0TRPlVSKar2sK_JbUKqDRj7mY,33235
10282
10282
  simo/generic/__pycache__/forms.cpython-38.pyc,sha256=lqpRTX5rnrkyJZ5Dga4e9y2WJ81r394AW5DV4KkvxXQ,17856
10283
10283
  simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=a4lLIMPyxm9tNzIqorXHIPZFVTcXlPsM1ycJMghxcHA,12673
10284
- simo/generic/__pycache__/models.cpython-38.pyc,sha256=GQeX2Y6diAiDKwd43RvSjRF3jGpkvXSu3ja7daEfQSA,5006
10284
+ simo/generic/__pycache__/models.cpython-38.pyc,sha256=yr64EX5n9u9uaOHNbPhNIBoBJo4Y3V_lvDj1ggMAZCQ,5123
10285
10285
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10286
10286
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=piFHces0J9QuXu_CNBCQCYjoZEeoaxyVjLfJ9KaR8C8,1898
10287
10287
  simo/generic/static/weather_icons/01d@2x.png,sha256=TZfWi6Rfddb2P-oldWWcjUiuCHiU9Yrc5hyrQAhF26I,948
@@ -10313,7 +10313,7 @@ simo/multimedia/admin.py,sha256=GgXiKTLfi3omjBurU-bKgneJRK-tAeiR8o2jo3zD7zs,1002
10313
10313
  simo/multimedia/api.py,sha256=mZ5BTggWdc_kL8P70JGC3rTCiZKPnxWYoyNcAQkFnX4,285
10314
10314
  simo/multimedia/app_widgets.py,sha256=g_IPx5bNmIS6JbaXXDCzYZYV2KVKAiYvWjH4oI30lWM,331
10315
10315
  simo/multimedia/base_types.py,sha256=dAP7_uh_b3A03yXBJZyQdRFucKIro4_RkIZ5yOaWXVE,151
10316
- simo/multimedia/controllers.py,sha256=BlOFwIheGI9eh1i6st0NIFv_96a0WwskgxhYP57wTuA,2108
10316
+ simo/multimedia/controllers.py,sha256=lwBWzy_hFFHV7dZQgNwHNAWogOnfLzNwkZ2S38_vu48,1999
10317
10317
  simo/multimedia/forms.py,sha256=oMCVUXRNiESrY3w_uBLRRgjMjx8BrmNeVglzorA9QtY,239
10318
10318
  simo/multimedia/models.py,sha256=5aWGLWDdCkekGAOGZIdanvX1l6ULnhgJN4JAvDZT4nQ,734
10319
10319
  simo/multimedia/requirements.txt,sha256=QeIhjf1RfNGCYn_WZm3VuinPI2wK31WEJPbCxRWxssY,28
@@ -10323,7 +10323,7 @@ simo/multimedia/__pycache__/admin.cpython-38.pyc,sha256=kIVA9sfSgBYNMC64CaSDXLl4
10323
10323
  simo/multimedia/__pycache__/api.cpython-38.pyc,sha256=lFGEB74vgyEM98B42wwcN9WvH8FAupIiSY0SwEBd5Dw,605
10324
10324
  simo/multimedia/__pycache__/app_widgets.cpython-38.pyc,sha256=6pr3fz21tQ5ReC9SJ8VzheUZ0hpxDIClB0SA8YCwcPk,730
10325
10325
  simo/multimedia/__pycache__/base_types.cpython-38.pyc,sha256=c4nmNziLs4RB3MAnxltn3W5XNW6PM5_vK_mm3Yvy42Y,324
10326
- simo/multimedia/__pycache__/controllers.cpython-38.pyc,sha256=yZbXZyLDxvM50fl8uTveqveUmrw5j35zg74zAPi60JY,3590
10326
+ simo/multimedia/__pycache__/controllers.cpython-38.pyc,sha256=aDFKmyduOm4hMf-CqVhQKQ8r8ERBNFkVgsOGg8J6DOg,3473
10327
10327
  simo/multimedia/__pycache__/forms.cpython-38.pyc,sha256=99h7Yj2jim3QOrqej00wiPufrCF3F--RoYvwa6lzhPI,697
10328
10328
  simo/multimedia/__pycache__/models.cpython-38.pyc,sha256=2LViRCOULb9g_k3wZvrODVIuj-iFgfwoWXyg-mAx8Ys,1195
10329
10329
  simo/multimedia/__pycache__/serializers.cpython-38.pyc,sha256=n86txYSrkmN0Xlrr8dMwKSY7rEzMc1iovepCZi_Fcw8,886
@@ -10356,14 +10356,14 @@ simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.
10356
10356
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10357
10357
  simo/users/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10358
10358
  simo/users/admin.py,sha256=IY501Ewbn8KkBJ3ryBPelHU37ac2--dd6NNGsmYQ6FE,6887
10359
- simo/users/api.py,sha256=w5nmU-to1-ULnPcRKDpa6uaOUwWfbHMTQKfmSJx3qPg,9185
10359
+ simo/users/api.py,sha256=FVo2bHkGA9VKavyjQm8_wfvI5rQ5KcMZliRiTJjixmI,9462
10360
10360
  simo/users/auth_backends.py,sha256=I5pnaTa20-Lxfw_dFG8471xDITb0_fQl1PVhJalp5vU,3992
10361
10361
  simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10362
10362
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10363
10363
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10364
- simo/users/models.py,sha256=Sr2T0GaN8l4iXIRR_ZXdaJO088nn5REyhwQju1S3X2g,18585
10364
+ simo/users/models.py,sha256=32Qv3d1gBqagX67irTmUzMY_svOhJA5ECK1TvXshRWw,18865
10365
10365
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10366
- simo/users/serializers.py,sha256=Gay16bdHinjhbn1Ly2KBwnomwK2d4jclO-OqAVeWbZI,2491
10366
+ simo/users/serializers.py,sha256=e6yIUsO7BfvrZ4IQHBn-FdpAUMgic5clmGQdTtRlGRY,2515
10367
10367
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
10368
10368
  simo/users/sso_views.py,sha256=-XI67TvQ7SN3goU4OuAHyn84u_1vtusvpn7Pu0K97zo,4648
10369
10369
  simo/users/tasks.py,sha256=v9J7t4diB0VnqUDVZAQ8H-rlr4ZR14bgEUuEGpODyOI,854
@@ -10371,14 +10371,14 @@ simo/users/utils.py,sha256=uOyCNHQJ_tpn054L89keuQwKAzFd0Y2VSUmDVPq6oaY,1335
10371
10371
  simo/users/views.py,sha256=dOQVvmlHG7ihWKJLFUBcqKOA0UDctlMKR0pTc36JZqg,3487
10372
10372
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=9otuYxq331c4lGy0DR8pigaPpzq0lQ4nrNLhlYiFAF0,159
10373
10373
  simo/users/__pycache__/admin.cpython-38.pyc,sha256=T7gzc4xv2JIh3nkJEr4aRZAzyaaweX4m9JXJ-xzwsd0,7705
10374
- simo/users/__pycache__/api.cpython-38.pyc,sha256=rFjlT4o4Ossop70GlljQPTm1-_TH-omnr8aDvOnMgH8,7981
10374
+ simo/users/__pycache__/api.cpython-38.pyc,sha256=4Fmi4fvgQqc8bM1lyQFVN3nKyWol9RgnUvy7YSNhwuE,8256
10375
10375
  simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=MuOieBIXt6lrDx83-UQtdDyI_U8kE3pU9XR4yFLKBnE,3007
10376
10376
  simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
10377
10377
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10378
10378
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10379
- simo/users/__pycache__/models.cpython-38.pyc,sha256=xgieyXEO74tyeN2rTUaPb0ciRgqx6XNGerGre4BYj9E,17526
10379
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=cyTY-fgeERHebof7-MSxJXfwlWkrwWZyqKT9fl198z0,17614
10380
10380
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10381
- simo/users/__pycache__/serializers.cpython-38.pyc,sha256=RfyHFuPrIhPJ62h5RHy3h17S-5DX41hL5cLhmcDIaXo,3435
10381
+ simo/users/__pycache__/serializers.cpython-38.pyc,sha256=ylapsfu5qbSzbfX2lG3uc4wV6hhndFbIvI109lhhKOo,3461
10382
10382
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
10383
10383
  simo/users/__pycache__/sso_views.cpython-38.pyc,sha256=sHEoxLOac3U3Epmhm197huFnW_J3gGCDZSji57itijU,3969
10384
10384
  simo/users/__pycache__/tasks.cpython-38.pyc,sha256=xq-XaJ5gzkpVVZRWe0bvGdA31Eh_WS2rKSY62p4eY5E,1111
@@ -10446,8 +10446,8 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10446
10446
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10447
10447
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10448
10448
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10449
- simo-2.0.18.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10450
- simo-2.0.18.dist-info/METADATA,sha256=8siQqkBY_YIe8F8ZRhHunOOfyQmw3CZ9U2mZRLwXokk,1700
10451
- simo-2.0.18.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10452
- simo-2.0.18.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10453
- simo-2.0.18.dist-info/RECORD,,
10449
+ simo-2.0.19.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10450
+ simo-2.0.19.dist-info/METADATA,sha256=99iDIvtxoVQKfKPPXy9OCCiDBFzGsmjlNfaouPPRze4,1730
10451
+ simo-2.0.19.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10452
+ simo-2.0.19.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10453
+ simo-2.0.19.dist-info/RECORD,,
File without changes