simo 2.3.3__py3-none-any.whl → 2.3.4__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.

Files changed (45) hide show
  1. simo/__pycache__/asgi.cpython-38.pyc +0 -0
  2. simo/__pycache__/settings.cpython-38.pyc +0 -0
  3. simo/backups/__init__.py +0 -0
  4. simo/backups/__pycache__/__init__.cpython-38.pyc +0 -0
  5. simo/backups/__pycache__/admin.cpython-38.pyc +0 -0
  6. simo/backups/__pycache__/dynamic_settings.cpython-38.pyc +0 -0
  7. simo/backups/__pycache__/models.cpython-38.pyc +0 -0
  8. simo/backups/admin.py +19 -0
  9. simo/backups/dynamic_settings.py +21 -0
  10. simo/backups/migrations/0001_initial.py +27 -0
  11. simo/backups/migrations/__init__.py +0 -0
  12. simo/backups/migrations/__pycache__/0001_initial.cpython-38.pyc +0 -0
  13. simo/backups/migrations/__pycache__/__init__.cpython-38.pyc +0 -0
  14. simo/backups/models.py +18 -0
  15. simo/backups/tasks.py +272 -0
  16. simo/core/__pycache__/context.cpython-38.pyc +0 -0
  17. simo/core/__pycache__/dynamic_settings.cpython-38.pyc +0 -0
  18. simo/core/__pycache__/middleware.cpython-38.pyc +0 -0
  19. simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
  20. simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
  21. simo/core/context.py +2 -2
  22. simo/core/middleware.py +16 -0
  23. simo/core/serializers.py +3 -1
  24. simo/core/tasks.py +0 -2
  25. simo/fleet/__pycache__/controllers.cpython-38.pyc +0 -0
  26. simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
  27. simo/fleet/controllers.py +1 -2
  28. simo/fleet/forms.py +6 -0
  29. simo/generic/__pycache__/forms.cpython-38.pyc +0 -0
  30. simo/generic/__pycache__/socket_consumers.cpython-38.pyc +0 -0
  31. simo/generic/forms.py +4 -2
  32. simo/settings.py +1 -0
  33. simo/users/__pycache__/admin.cpython-38.pyc +0 -0
  34. simo/users/__pycache__/models.cpython-38.pyc +0 -0
  35. simo/users/admin.py +14 -15
  36. simo/users/models.py +22 -20
  37. {simo-2.3.3.dist-info → simo-2.3.4.dist-info}/METADATA +1 -1
  38. {simo-2.3.3.dist-info → simo-2.3.4.dist-info}/RECORD +42 -32
  39. simo/core/templates/admin/formset_widget_old.html +0 -122
  40. simo/core/templates/setup_wizard/clearable_easy_thumbnails_widget.html +0 -15
  41. simo/core/templates/setup_wizard/form.html +0 -225
  42. {simo-2.3.3.dist-info → simo-2.3.4.dist-info}/LICENSE.md +0 -0
  43. {simo-2.3.3.dist-info → simo-2.3.4.dist-info}/WHEEL +0 -0
  44. {simo-2.3.3.dist-info → simo-2.3.4.dist-info}/entry_points.txt +0 -0
  45. {simo-2.3.3.dist-info → simo-2.3.4.dist-info}/top_level.txt +0 -0
simo/users/models.py CHANGED
@@ -1,13 +1,13 @@
1
1
  import datetime
2
2
  import requests
3
3
  import subprocess
4
- from django.utils.functional import cached_property
5
4
  from django.urls import reverse
6
5
  from django.utils.translation import gettext_lazy as _
7
6
  from django.db import models
8
7
  from django.db import transaction
9
8
  from django.db.models.signals import post_save, post_delete, m2m_changed
10
9
  from django.dispatch import receiver
10
+ from django.core.cache import cache
11
11
  from dirtyfields import DirtyFieldsMixin
12
12
  from django.contrib.gis.geos import Point
13
13
  from geopy.distance import distance
@@ -182,9 +182,7 @@ class User(AbstractBaseUser, SimoAdminMixin):
182
182
  USERNAME_FIELD = 'email'
183
183
  REQUIRED_FIELDS = ['name']
184
184
 
185
- _instances = None
186
185
  _instance = None
187
- _instance_roles = {}
188
186
 
189
187
  class Meta:
190
188
  verbose_name = _('user')
@@ -235,13 +233,16 @@ class User(AbstractBaseUser, SimoAdminMixin):
235
233
  return self.is_active and self.ssh_key and self.is_master
236
234
 
237
235
  def get_role(self, instance):
238
- if instance.id not in self._instance_roles:
239
- self._instance_roles[instance.id] = self.roles.filter(
236
+ cache_key = f'user-{self.id}_instance-{instance.id}_role'
237
+ role = cache.get(cache_key, 'expired')
238
+ if role == 'expired':
239
+ role = self.roles.filter(
240
240
  instance=instance
241
241
  ).prefetch_related(
242
242
  'component_permissions', 'component_permissions__component'
243
243
  ).first()
244
- return self._instance_roles[instance.id]
244
+ cache.set(cache_key, role, 20)
245
+ return role
245
246
 
246
247
  def set_instance(self, instance):
247
248
  self._instance = instance
@@ -274,22 +275,23 @@ class User(AbstractBaseUser, SimoAdminMixin):
274
275
 
275
276
  @property
276
277
  def instances(self):
277
- if self._instances != None:
278
- return self._instances
279
278
  from simo.core.models import Instance
280
-
281
- self._instances = set()
282
279
  if not self.is_active:
283
- return self._instance
284
- if self.is_master:
285
- self._instances = set(Instance.objects.all())
286
- return self._instances
287
-
288
- for instance_role in self.instance_roles.filter(
289
- is_active=True, instance__isnull=False
290
- ):
291
- self._instances.add(instance_role.instance)
292
- return self._instances
280
+ return Instance.objects.none()
281
+ cache_key = f'user-{self.id}_instances'
282
+ instances = cache.get(cache_key, 'expired')
283
+ if instances == 'expired':
284
+ if self.is_master:
285
+ instances = Instance.objects.all()
286
+ else:
287
+ instances = Instance.objects.filter(id__in=[
288
+ r.instance.id for r in self.instance_roles.filter(
289
+ is_active=True, instance__isnull=False
290
+ )
291
+ ])
292
+ cache.set(cache_key, instances, 10)
293
+ print("INSTANCES: ", instances)
294
+ return instances
293
295
 
294
296
  @property
295
297
  def component_permissions(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.3.3
3
+ Version: 2.3.4
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
@@ -3,15 +3,28 @@ 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
5
  simo/scripting.py,sha256=PVIkGsiMDWj4CNTbOM3rq7pJ6ruavuns-ZMU7VudLa4,923
6
- simo/settings.py,sha256=E3hOPNASGnoNvhw_K3GbApsHjCnskJgEyeWYIQlEdxE,6913
6
+ simo/settings.py,sha256=bwri9NuM9wjCacmUxzB1joy79Bu64tO0jEBZlJUeakc,6933
7
7
  simo/urls.py,sha256=fRmAsNQ_pzFloimLmxNeDcR6hHRJ3rOoZ3kGy8zOQ_A,2402
8
8
  simo/__pycache__/__init__.cpython-38.pyc,sha256=j81de0BqHMr6bs0C7cuYrXl7HwtK_vv8hDEtAdSwDJc,153
9
- simo/__pycache__/asgi.cpython-38.pyc,sha256=UI_puPxc6q4otRqtz0IALTwrh00975iGxc0UyQgLreQ,891
9
+ simo/__pycache__/asgi.cpython-38.pyc,sha256=5W_YSKOIrRd6NQQuJDuA3Yuj688GzirXVVOyLe8wJIQ,845
10
10
  simo/__pycache__/celeryc.cpython-38.pyc,sha256=eSRoaKwfYlxVaxAiwqpQ2ndEcx7W-VpZtbxRFSV8UYg,1653
11
11
  simo/__pycache__/conf.cpython-38.pyc,sha256=MYP2yk3ULxiYwZsZR6tCLjKnU-z03A3avzQzIn66y3k,273
12
- simo/__pycache__/settings.cpython-38.pyc,sha256=FOalzITYVDHyqsGfbl8zNws0oBITfcs5XgHPao0QyLg,6065
12
+ simo/__pycache__/settings.cpython-38.pyc,sha256=NdG2wtrRDI5YO1CfMzJuSGRARls5OnNJs7_XpLxGOQI,6083
13
13
  simo/__pycache__/urls.cpython-38.pyc,sha256=u0x6EqT8S1YfDOSPgbI8Kf-RDlveY9OV-EDXMYKAQ7w,2125
14
14
  simo/__pycache__/wsgi.cpython-38.pyc,sha256=TpRxO7VM_ql31hbKphVdanydC5RI1nHB4l0QA2pdWxo,322
15
+ simo/backups/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ simo/backups/admin.py,sha256=doPMTahbMtWHBpYDW2xh3tz2bkb6KqJXfH2cAeHUalM,533
17
+ simo/backups/dynamic_settings.py,sha256=MrXECAxnpQjBf8yWug6qusSAyxRCtzBuQxfhFX8uV-c,560
18
+ simo/backups/models.py,sha256=wjXvb8uXWGk_iqmbMBnX8owp5AYpj1WS0KteW4a0Fbk,463
19
+ simo/backups/tasks.py,sha256=GueIJLZazeUZTfupe24k1m2IiflceSE610bL6KTXuAo,8496
20
+ simo/backups/__pycache__/__init__.cpython-38.pyc,sha256=vzOf-JIMeZ6P85FyvTpYev3mscFosUy-SJTshcQbOHU,161
21
+ simo/backups/__pycache__/admin.cpython-38.pyc,sha256=yT_AJOT6ypJl2iCQqphioMw2h0qm7N8IxDzEVF9RJWw,1027
22
+ simo/backups/__pycache__/dynamic_settings.cpython-38.pyc,sha256=Ko0le9M96_zv4jv4zUsGUZTjEzNFQxr7NNjEwp2FRqU,900
23
+ simo/backups/__pycache__/models.cpython-38.pyc,sha256=ifXK00chQNJZQL9QohBMTwH343Kt_CqVWUkuUQjnUX4,922
24
+ simo/backups/migrations/0001_initial.py,sha256=0LzCusTUyYf61ksiepdnqXIuYYNTNd_djh_Wa484HA0,770
25
+ simo/backups/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ simo/backups/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=jumm0xjwRhiYPOAXi4o-AGpcRi-GVOj5bSJkOTYtT7w,834
27
+ simo/backups/migrations/__pycache__/__init__.cpython-38.pyc,sha256=Lz1fs6V05h2AoxTOLNye0do9bEMnyuaXB_hHOjG5-HU,172
15
28
  simo/core/__init__.py,sha256=_s2TjJfQImsMrTIxqLAx9AZie1Ojmm6sCHASdl3WLGU,50
16
29
  simo/core/admin.py,sha256=hoJ0OhfWL9T0d6JCY6_Gm3GR-nrgtDR2UQM67rMsjiE,18141
17
30
  simo/core/api.py,sha256=laWtqQUL0ngjTtdDGqcUH42WYzWd9WYJwcKL3yCsDk4,27952
@@ -22,7 +35,7 @@ simo/core/apps.py,sha256=CsqpiQerhmrMsH-wGiG-gQgXd9qEkIi-LUaA9cXpKSw,425
22
35
  simo/core/auto_urls.py,sha256=nNXEgLAAAQAhRWQDA9AbDtw-zcPKmu_pufJaSa8g818,1102
23
36
  simo/core/autocomplete_views.py,sha256=JT5LA2_Wtr60XYSAIqaXFKFYPjrmkEf6yunXD9y2zco,4022
24
37
  simo/core/base_types.py,sha256=qVh6MrXZEfN7bFOyFftC7u0yyz0PkvpsjllLBc6SCp4,616
25
- simo/core/context.py,sha256=98PXAMie43faRVBFkOG22uNpvGRNprcGhzjBFkrxaRY,1367
38
+ simo/core/context.py,sha256=x8ejZuyQsCRkbtlAyk2rLZ95RuI_5VPSWLolkfNOAf8,1360
26
39
  simo/core/controllers.py,sha256=rLgJqnEMzRC0GpZnQb0m_Cz43Gp2zaYbODU7UUxE5oA,29602
27
40
  simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ,1872
28
41
  simo/core/events.py,sha256=LvtonJGNyCb6HLozs4EG0WZItnDwNdtnGQ4vTcnKvUs,4438
@@ -32,15 +45,15 @@ simo/core/forms.py,sha256=sFVz8tENhi4QSudORu_e5tlGEC0aXumy6wzJqQNYBPk,21904
32
45
  simo/core/gateways.py,sha256=m0eS3XjVe34Dge6xtoCq16kFWCKJcdQrT0JW0REqoq8,3715
33
46
  simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
34
47
  simo/core/managers.py,sha256=n-b3I4uXzfHKTeB1VMjSaMsDUxp8FegFJwnbV1IsWQ4,3019
35
- simo/core/middleware.py,sha256=LIMpHJDQ4zx9dfmy5z0-rEW2EPO9d-iG1ZJbJ_6t6hc,1927
48
+ simo/core/middleware.py,sha256=v8i_7W_-ozucJXNm8beIhMGqEqMy8Xmtmj4AjdEnkQs,2720
36
49
  simo/core/models.py,sha256=hQA8SeAPtGRSs4gk-bci2Ni3ZANtS62V-IDgCyJh2qE,21563
37
50
  simo/core/permissions.py,sha256=v0iJM4LOeYoEfMiw3OLPYio272G1aUEAg_z9Wd1q5m0,2993
38
51
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
39
- simo/core/serializers.py,sha256=quXznnTKCm57rvRgke0mBnlWmaO8C5scJ8R251wa1jY,20869
52
+ simo/core/serializers.py,sha256=1hcCnLnItw8T3jLWivKBjSAt7kwqjcOYE0vaepw55Z0,20966
40
53
  simo/core/signal_receivers.py,sha256=9-qFCCeSLcMFEMg6QUtKOVgUsoNoqhzGoI98nuNSTEo,6228
41
54
  simo/core/socket_consumers.py,sha256=n7VE2Fvqt4iEAYLTRbTPOcI-7tszMAADu7gimBxB-Fg,9635
42
55
  simo/core/storage.py,sha256=_5igjaoWZAiExGWFEJMElxUw55DzJG1jqFty33xe8BE,342
43
- simo/core/tasks.py,sha256=jMDuutrzPpKc-7hhjEnsw93CaedumPKLJU7LoXhGz6k,14233
56
+ simo/core/tasks.py,sha256=SMrs1vjVgsHO9-QBLg4hTyTrd6gAUMchPXY6zHHkqOs,14205
44
57
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
45
58
  simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
46
59
  simo/core/views.py,sha256=VVqfEPzK0EdbVMMarkG8rd7cODG5QHpXnr3e8UdrTQE,2600
@@ -55,9 +68,9 @@ simo/core/__pycache__/apps.cpython-38.pyc,sha256=JL0BEqgXcSQvMlcK48PBpPfyDEkPMdO
55
68
  simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=Tyf8PYHq5YqSwTp25Joy-eura_Fm86fpX9zKLSklhvo,872
56
69
  simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=hJ6JILI1LqrAtpQMvxnLvljGdW1v1gpvBsD79vFkZ58,3972
57
70
  simo/core/__pycache__/base_types.cpython-38.pyc,sha256=hmq22vvGyCmhbYyuV6bFAOOSIupspgW5yq_VzqWd-vY,759
58
- simo/core/__pycache__/context.cpython-38.pyc,sha256=MSZPDhqMhCpUuBJl3HCIBHZA3BntYeP8RAnQcdqAH9k,1278
71
+ simo/core/__pycache__/context.cpython-38.pyc,sha256=EbjtX2vOdl7-NA02zEwp_iUMKI2SSs-NZ-sHryo0GGY,1278
59
72
  simo/core/__pycache__/controllers.cpython-38.pyc,sha256=LA5Bnzev4kS3S8Ta0nfaVHQMIPfUDPYDL1GvfgHtIWg,26584
60
- simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=9ge2uV4QBKdA4f2pIZp4EIGB9vY2z4IUb-UMc4ZY0I4,2384
73
+ simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=wGpnscX1DxFpRl54MQURhjz2aD3NJohSzw9JCFnzh2Y,2384
61
74
  simo/core/__pycache__/events.cpython-38.pyc,sha256=A1Axx-qftd1r7st7wkO3DkvTdt9-RkcJe5KJhpzJVk8,5109
62
75
  simo/core/__pycache__/filters.cpython-38.pyc,sha256=VIMADCBiYhziIyRmxAyUDJluZvuZmiC4bNYWTRsGSao,721
63
76
  simo/core/__pycache__/form_fields.cpython-38.pyc,sha256=u0voKXkA64xbH6LY_-jMBHQS4mOJZZeuB9WTvtv9JWE,3433
@@ -65,15 +78,15 @@ simo/core/__pycache__/forms.cpython-38.pyc,sha256=JDCNYJQrZHUaMb4qZ6A0f1JptoCHQK
65
78
  simo/core/__pycache__/gateways.cpython-38.pyc,sha256=D1ooHL-iSpQrxnD8uAl4xWFJmm-QWZfbkLiLlFOMtdU,4553
66
79
  simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NMEdPAiHK0cFaIL7I8,1623
67
80
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=6RTIxyjOgpQGtAqcUyE2vFPS09w1V5Wmd_vOV7rHRRI,3370
68
- simo/core/__pycache__/middleware.cpython-38.pyc,sha256=UZTX3tUUHkigr_3GiSLbUX3RbJBg1_JBPiXy6saJ9GA,1911
81
+ simo/core/__pycache__/middleware.cpython-38.pyc,sha256=50q5tTJN_miDAlon_RElJ5dt6A1AlQS0W7CFA35WKKc,2404
69
82
  simo/core/__pycache__/models.cpython-38.pyc,sha256=h_neN4zzReOTuou4NX9RbgVJ8T47z0tLqSr37Fm1iHU,17874
70
83
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=fH4iyqd9DdzRLEu2b621-FeM-napR0M7hzBUTHo9Q3g,2972
71
84
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
72
- simo/core/__pycache__/serializers.cpython-38.pyc,sha256=PzKJTctrfXeTtD1QlRL5vKKIW4YxB5MuEPj_Z2w9Wgc,19495
85
+ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=xsGMcx9ISHmvY_PzWqosUdkWRBNqYKOtVkFDYNEHc1A,19479
73
86
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=3Bt9S47DR_ZFS3O-crElFgLLXPIYyDgPIc2ibwEkaic,4904
74
87
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=NJUr7nRyHFvmAumxxWpsod5wzVVZM99rCEuJs1utHA4,8432
75
88
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=9R1Xu0FJDflfRXUPsqEgt0SpwiP7FGk7HaR8s8XRyI8,721
76
- simo/core/__pycache__/tasks.cpython-38.pyc,sha256=WHUW2vB78F0J-E_JX5SNW8Yieugam8Jqerg88NRJTDE,9533
89
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=arMCRz9NTDmE13KLvE4MCGwknvmmhYjTTqDpjZS93FI,9767
77
90
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
78
91
  simo/core/__pycache__/views.cpython-38.pyc,sha256=D7X_fFxYySe-mKNB4bEnIt9ubYM7CbbRcIpX52Ou4RE,2809
79
92
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
@@ -10124,7 +10137,6 @@ simo/core/templates/admin/clearable_easy_thumbnails_widget.html,sha256=Gh0z_KIEt
10124
10137
  simo/core/templates/admin/component_change_list.html,sha256=N3seVjTkIRXIXKGsleB7oWUnPlMRXDIqOPqfEyq4PNE,3320
10125
10138
  simo/core/templates/admin/component_history.html,sha256=xiACt0w7EPrdmTOsi5XO07O-8LcL_XpCu9pSynmNNpI,541
10126
10139
  simo/core/templates/admin/formset_widget.html,sha256=NAonHNLyicsoE4Iir3My4AlVSz4Q7-1OA19zgsIOjJA,3563
10127
- simo/core/templates/admin/formset_widget_old.html,sha256=rehM_tXl54d93vH0zbIv0QDJZb9rwmBqm5yiiHG31oM,4085
10128
10140
  simo/core/templates/admin/index.html,sha256=AJpt1FA4g6IAFQA99-3glJ88RmoWJ0YXBIz_DUt-R14,4015
10129
10141
  simo/core/templates/admin/item_name_display.html,sha256=Y3zk-rc-y8_6dC6_WrSy6tx6Z-6IZzZ5w3a1hMxlpz4,357
10130
10142
  simo/core/templates/admin/msg_page.html,sha256=C1T9fniV7cIiSBQXRFcSAsbt5Y_fshf6T6ZAE1e8hNw,738
@@ -10151,8 +10163,6 @@ simo/core/templates/core/object_acutocomplete_select_item.html,sha256=pS8APlv1Id
10151
10163
  simo/core/templates/core/openvpn_client.conf,sha256=z1838G8v8vmIiQKyfE8URCCMpLsges5jbX3hDJkztF4,249
10152
10164
  simo/core/templates/gis/my-openlayers-osm.html,sha256=ze4Gcl4fjrkKS1lONZHgpD-ybdI_N4zZcWBsBeyL4-A,1790
10153
10165
  simo/core/templates/gis/js/OLMapWidget.js,sha256=QOOHCR4CyAljFTtXTP_MNKN5RTplp3lvDKxHJj3J4KY,8813
10154
- simo/core/templates/setup_wizard/clearable_easy_thumbnails_widget.html,sha256=DaN-86hqYMgi9j0zNFKEoqKMLsylrsJjj5FfUlhud4M,719
10155
- simo/core/templates/setup_wizard/form.html,sha256=gBPXeB5d4e38iUguyEJi5CIIJWNPeb8tVVLEjuTRb8I,6630
10156
10166
  simo/core/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10157
10167
  simo/core/templatetags/components_list.py,sha256=dcwXEgVrP2xuRpGpv1yQ_DHvmitsuF93PhDa9y69F2M,18540
10158
10168
  simo/core/templatetags/__pycache__/__init__.cpython-38.pyc,sha256=cvoEO0D7kCdN58Rztay2GihwqCVH0-FA8XRoFiQBSmk,171
@@ -10201,8 +10211,8 @@ simo/fleet/api.py,sha256=Hxn84xI-Q77HxjINgRbjSJQOv9jii4OL20LxK0VSrS8,2499
10201
10211
  simo/fleet/auto_urls.py,sha256=UX66eR2ykMqFgfIllW-RTdjup5-FieCWl_BVm3CcXKg,702
10202
10212
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10203
10213
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10204
- simo/fleet/controllers.py,sha256=NOoM7XmMIJfqw92JE5PI6sQo-Vlzb67YDMtebUW7T9k,30507
10205
- simo/fleet/forms.py,sha256=YF34ZCDbLeAKpq4u0KTi8IsyqhDtNUWcal2DELRayuI,57668
10214
+ simo/fleet/controllers.py,sha256=A9Bawj9x9JOjd_u8lmNhnWbGlZgqIIS7kbAuO0cNR6c,30506
10215
+ simo/fleet/forms.py,sha256=EG0QkxCePDMTTD6GPxj1TAwcUYEGyybsitUTx7CPiFM,57917
10206
10216
  simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
10207
10217
  simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10208
10218
  simo/fleet/models.py,sha256=dJYDTHBz1OizzP51G0fdKHSuW98CsqBX-NhgjcVqYHY,16518
@@ -10218,8 +10228,8 @@ simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rL9fb7cCQatyFvXyKmlNOKmxVo8vHYe
10218
10228
  simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=Tc6a6BCXHjijP8U2jE2ghlJwnSNrGm59-hW5t-80wF0,689
10219
10229
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10220
10230
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10221
- simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=Pot0NMkAvOR6YEX0UYVApcGlLzLQWS-zWSa7byDL8Zc,25373
10222
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=LOxl1jynQbd_36Qa8eyTRkHLXiA575Ph29XVqGX0qsU,39066
10231
+ simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=7_GWIGJ2cNjrct6Vu3tSTjvxx6kNJDtTdyTTwsQ1k_8,25373
10232
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=8LoC9PAnEEpQ2cVWT4REYvKcLKh7WPsHrJjNNogYgik,39202
10223
10233
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnRrsQ_W7yeVeBkRLfIk,5058
10224
10234
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10225
10235
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=pEiMWANjJpKXSR60PosKCUQOKpo6tSvCeWX4VP-0Lns,13796
@@ -10311,7 +10321,7 @@ simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10311
10321
  simo/generic/app_widgets.py,sha256=E_pnpA1hxMIhenRCrHoQ5cik06jm2BAHCkl_eo-OudU,1264
10312
10322
  simo/generic/base_types.py,sha256=djymox_boXTHX1BTTCLXrCH7ED-uAsV_idhaDOc3OLI,409
10313
10323
  simo/generic/controllers.py,sha256=tVI0Gz35dcHt3_5xlkAaXOy3fxlmtZ8L7ODQBtBumV0,58275
10314
- simo/generic/forms.py,sha256=VzJJjZEuvpDEa2uObw9SkPmzQ4J_LkJ6UCNCoQImm0g,29427
10324
+ simo/generic/forms.py,sha256=qS7BDI2_w01XsgBKjisGE6XNSMNpmdrdxCEJqorapwA,29481
10315
10325
  simo/generic/gateways.py,sha256=cc_q_g2HsI2_rWmr8yZ3spnMPwsgoYS5ApWRimc11wU,18831
10316
10326
  simo/generic/models.py,sha256=flpK2jsBFghrvRHzl6IKT-t3WZ-hNOj4ZP2vmBzx0K8,7657
10317
10327
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
@@ -10320,11 +10330,11 @@ simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFI
10320
10330
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=0IoKRG9n1tkNRRkrqAeOQwWBPd_33u98JBcVtMVVCio,2374
10321
10331
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=ptw6axyAqemZA35oa6vzr7EihzvbhW9w7Y-G6kfDedU,555
10322
10332
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=I9sGJNnAm9UOnnEoK5KR6IJ9q442El31AiY2hBnx1pI,36480
10323
- simo/generic/__pycache__/forms.cpython-38.pyc,sha256=g-KKlxmRVWVN_mVOoXsuIGTNaVgs76BisphknIyD8vI,21071
10333
+ simo/generic/__pycache__/forms.cpython-38.pyc,sha256=bbuuS_Q7q7232hYrAPu-pn0WrGpKoMZSiGArOkQfHpc,21103
10324
10334
  simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=8NbsLVDww3Ov5DKF--LKgyrgnrn8yVcKrY21cdvV5aA,13979
10325
10335
  simo/generic/__pycache__/models.cpython-38.pyc,sha256=n3FeTMJYh4B6nCPiPKeXiWsUOOWkLHca7qTvfTK6Iik,5844
10326
10336
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10327
- simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=piFHces0J9QuXu_CNBCQCYjoZEeoaxyVjLfJ9KaR8C8,1898
10337
+ simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=qJO5kvQLWhsQDOr1AtAtsAybuRWioxSkQei3Pc7rdP0,1737
10328
10338
  simo/generic/static/weather_icons/01d@2x.png,sha256=TZfWi6Rfddb2P-oldWWcjUiuCHiU9Yrc5hyrQAhF26I,948
10329
10339
  simo/generic/static/weather_icons/01n@2x.png,sha256=e9RleTa0T7To9Wi2wJ-9waeTbfHOsUB_xGwkx-89eEg,945
10330
10340
  simo/generic/static/weather_icons/02d@2x.png,sha256=ex522OxNzNNpSRGGzh7EmsBZi_MOFY-1IkQXTOMLL3I,1628
@@ -10398,7 +10408,7 @@ simo/notifications/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=YnO
10398
10408
  simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.pyc,sha256=Gkb3Qwr_zglGibQg9g5ekIgxtGapS4ENXVWQVHqM56I,794
10399
10409
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10400
10410
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10401
- simo/users/admin.py,sha256=QQgan5_DyX22LdNFSWf2LHnTRO8gdQD4N295R-owuz0,6397
10411
+ simo/users/admin.py,sha256=oaLFTrjDaruKC_l79BB0etru4p8nP8eJFV3F4TSYGp4,6305
10402
10412
  simo/users/api.py,sha256=kUcdHm-WUn6z_AnFEXHnjYu8YX2MW1Z-NlAysRmSdLI,10333
10403
10413
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10404
10414
  simo/users/auth_backends.py,sha256=bBSNXQJ88TRXaQxyh1aETfmOIfiDr08Jnj8rSY9sHDk,4074
@@ -10406,7 +10416,7 @@ simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10406
10416
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10407
10417
  simo/users/managers.py,sha256=M_51bk9z4jn8e2Ci3pJfIqbf6cRNqfQNSOAg0vPl6Vo,175
10408
10418
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10409
- simo/users/models.py,sha256=5ZMXBFExo1oO6vKYn4qOBSbgCp2kiAFNK82hm2k70vA,19195
10419
+ simo/users/models.py,sha256=0KGZZjXdzNHPRuS6uYo8PE3DBZDw6N9TU3zxiLpCQxs,19370
10410
10420
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10411
10421
  simo/users/serializers.py,sha256=a4R408ZgWVbF7OFw4bBfN33Wnn8ljqS8iFcsqmllkWU,2552
10412
10422
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
@@ -10415,7 +10425,7 @@ simo/users/tasks.py,sha256=HJAqiyWGsaN3wSfquU0UyQ20jL-njXeaaTOdDT3TQ3s,979
10415
10425
  simo/users/utils.py,sha256=7gU_TDnAOsDYqJM0CFo8efPah2bTXfGpXxRqzD5RiSs,1270
10416
10426
  simo/users/views.py,sha256=dOQVvmlHG7ihWKJLFUBcqKOA0UDctlMKR0pTc36JZqg,3487
10417
10427
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=VFoDJE_SKKaPqqYaaBYd1Ndb1hjakkTo_u0EG_XJ1GM,211
10418
- simo/users/__pycache__/admin.cpython-38.pyc,sha256=zwD7hbwzZ4VwsQlrtG8j8KOqTRDQmhup-Y_hcbZDXD0,7315
10428
+ simo/users/__pycache__/admin.cpython-38.pyc,sha256=UgkqzfrSQU8Hyqig03Z5Qq29434wU27ttufxtvGEJYw,7433
10419
10429
  simo/users/__pycache__/api.cpython-38.pyc,sha256=25he7r5DHfcLYveXWhn6gQDV2R6YnpKbUVBNInR1q_s,8714
10420
10430
  simo/users/__pycache__/apps.cpython-38.pyc,sha256=dgbWL8CxzzISJQTmq_4IztPJ2UzykNVdqA2Ae1PmeGk,605
10421
10431
  simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=n5nx2QSXNj2idzRcGE6bAagMN-8qxoCs580H1EFZXls,3105
@@ -10423,7 +10433,7 @@ simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg
10423
10433
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10424
10434
  simo/users/__pycache__/managers.cpython-38.pyc,sha256=C5-diljm874RAFMTkZdcfzPhkHzlUGPAhz2gTvqkDy8,604
10425
10435
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10426
- simo/users/__pycache__/models.cpython-38.pyc,sha256=q5ROEWKeXud_MK3olV7aMTstmbl4hAYIjs7H8L_v4Jc,17817
10436
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=MMCLklK0yVxhSsl2m8Z2xnAmnxSSCpFJcnXzx5TdQQM,18096
10427
10437
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10428
10438
  simo/users/__pycache__/serializers.cpython-38.pyc,sha256=PuMy6H0PhEhq89RFmdnFH4pMHB0N3w7opJEFS90JUCY,3477
10429
10439
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
@@ -10507,9 +10517,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10507
10517
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10508
10518
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10509
10519
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10510
- simo-2.3.3.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10511
- simo-2.3.3.dist-info/METADATA,sha256=-X4gtBxN4Ya3_BaNUHV-0rHkW9fxwsMxiLC8le6PaSw,1878
10512
- simo-2.3.3.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
10513
- simo-2.3.3.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10514
- simo-2.3.3.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10515
- simo-2.3.3.dist-info/RECORD,,
10520
+ simo-2.3.4.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10521
+ simo-2.3.4.dist-info/METADATA,sha256=9MnCb5wAiFArxz8ran42PeM_agigRqWcpJ7HYGH3VOY,1878
10522
+ simo-2.3.4.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
10523
+ simo-2.3.4.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10524
+ simo-2.3.4.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10525
+ simo-2.3.4.dist-info/RECORD,,
@@ -1,122 +0,0 @@
1
- {% load i18n admin_urls static admin_modify %}
2
- <style>
3
- .formset-table th, .formset-table th .label{
4
- font-weight: normal;
5
- color: var(--body-quiet-color);
6
- }
7
- .formset-table .label.required{
8
- font-weight: bold;
9
- }
10
- form .aligned .formset-table ul{
11
- margin-left:0;
12
- }
13
- .errors .formset-table input, .errors .formset-table select,
14
- .errors .formset-table textarea{
15
- border: 1px solid var(--border-color);
16
- }
17
- .errors .formset-table .select2-selection{
18
- border-color: #aaa;
19
- }
20
- .formset-table td.errors input, .formset-table td.errors select,
21
- .formset-table td.errors textarea{
22
- border: 1px solid var(--error-fg);
23
- }
24
- .formset-table td.errors .select2-selection{
25
- border-color: var(--error-fg);
26
- }
27
- .formset-table td.drag {
28
- cursor: pointer;
29
- background-image: url(/static/adminsortable2/icons/drag.png);
30
- background-repeat: repeat;
31
- width: 20px;
32
- }
33
- .formset-table .inline-deletelink{
34
- float: left
35
- }
36
- </style>
37
-
38
-
39
- <div class="inline-group sortable" id="{{ formset.prefix }}-group">
40
- <div class="tabular inline-related">
41
- {{ formset.management_form }}
42
- <fieldset class="module">
43
- {{ formset.non_form_errors }}
44
- <table class="formset-table">
45
- <thead><tr>
46
- <th>{% trans "Sort" %}</th>
47
- {% for field in empty_form %}
48
- {% if not field.is_hidden and not field.name == 'DELETE' %}
49
- <th{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }}
50
- {% if field.help_text %}&nbsp;<img src="{% static "admin/img/icon-unknown.svg" %}" class="help help-tooltip" width="10" height="10" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}" />{% endif %}
51
- </th>
52
- {% endif %}
53
- {% endfor %}
54
- {% if formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
55
- </tr></thead>
56
-
57
- <tbody>
58
- {% for form in formset %}
59
- {% if form.non_field_errors %}
60
- <tr><td colspan="{{ total_org_forms }}">{{ form.non_field_errors }}</td></tr>
61
- {% endif %}
62
-
63
- <tr class="form-row has_original" id="{{ formset.prefix }}-{{ forloop.counter0 }}">
64
- <td class="drag">&nbsp;</td>
65
- <td class="original hidden">
66
- {% for field in form %}
67
- {% if field.is_hidden %} {{ field }} {% endif %}
68
- {% endfor %}
69
- </td>
70
-
71
- {% for field in form %}
72
- {% if not field.is_hidden and not field.name == 'DELETE' %}
73
- <td{% if field.name %} class="field-{{ field.name }}"{% endif %}>
74
- {{ field }}
75
- {{ field.errors.as_ul }}
76
- </td>
77
- {% endif %}
78
- {% endfor %}
79
-
80
- {% if formset.can_delete %}
81
- <td class="delete">{% if total_org_forms >= forloop.counter0 %}{{ form.DELETE }}{% endif %}</td>
82
- {% endif %}
83
- </tr>
84
-
85
- {% endfor %}
86
-
87
- <tr class="form-row empty-form" id="{{ formset.prefix }}-empty">
88
- <td class="drag">&nbsp;</td>
89
- <td class="original hidden">
90
- {% for field in empty_form %}
91
- {% if field.is_hidden %} {{ field }} {% endif %}
92
- {% endfor %}
93
- </td>
94
-
95
- {% for field in empty_form %}
96
- {% if not field.is_hidden and not field.name == 'DELETE' %}
97
- <td{% if field.name %} class="field-{{ field.name }}"{% endif %}>
98
- {{ field }}
99
- {{ field.errors.as_ul }}
100
- </td>
101
- {% endif %}
102
- {% endfor %}
103
-
104
- {% if formset.can_delete %}
105
- <td class="delete"></td>
106
- {% endif %}
107
- </tr>
108
-
109
- </tbody>
110
- </table>
111
- </fieldset>
112
- </div>
113
- </div>
114
-
115
- <script type="application/json" class="inline-tabular-config">
116
- {
117
- "prefix": "{{ formset.prefix|escapejs }}",
118
- "addText": "{% filter escapejs %}Add another{% endfilter %}",
119
- "deleteText": "{% filter escapejs %}{% trans 'Remove' %}{% endfilter %}"
120
- }
121
- </script>
122
- <div class="default_order_field" default_order_field="ORDER" default_order_direction=""></div>
@@ -1,15 +0,0 @@
1
- {% if widget.is_initial %}
2
-
3
- <img style="width:100%; max-width:500px; margin-top: -20px; margin-bottom: 20px;" src="{{ widget.value.url }}">
4
- {% if not widget.required %}
5
-
6
-
7
- <input type="checkbox" name="{{ widget.checkbox_name }}" id="{{ widget.checkbox_id }}"{% if widget.attrs.disabled %} disabled{% endif %}>
8
- <span for="{{ widget.checkbox_id }}">{{ widget.clear_checkbox_label }}</span>
9
-
10
- {% endif %}<br><br>
11
-
12
- {% comment %} <span class="text-muted">{{ widget.input_text }}:</span> {% endcomment %}
13
- {% endif %}
14
-
15
- <input style="margin-top: -20px;" class="btn btn-secondary" type="{{ widget.type }}" name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}>