simo 2.5.30__py3-none-any.whl → 2.5.33__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 (40) hide show
  1. simo/core/__pycache__/admin.cpython-38.pyc +0 -0
  2. simo/core/__pycache__/autocomplete_views.cpython-38.pyc +0 -0
  3. simo/core/__pycache__/controllers.cpython-38.pyc +0 -0
  4. simo/core/__pycache__/models.cpython-38.pyc +0 -0
  5. simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
  6. simo/core/admin.py +12 -0
  7. simo/core/autocomplete_views.py +1 -1
  8. simo/core/controllers.py +1 -2
  9. simo/core/migrations/0045_alter_instance_device_report_history_days_and_more.py +36 -0
  10. simo/core/migrations/__pycache__/0045_alter_instance_device_report_history_days_and_more.cpython-38.pyc +0 -0
  11. simo/core/models.py +7 -4
  12. simo/core/tasks.py +16 -1
  13. simo/core/utils/__pycache__/helpers.cpython-38.pyc +0 -0
  14. simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
  15. simo/fleet/__pycache__/socket_consumers.cpython-38.pyc +0 -0
  16. simo/fleet/forms.py +4 -1
  17. simo/fleet/socket_consumers.py +1 -0
  18. simo/fleet/tasks.py +2 -0
  19. simo/generic/scripting/helpers.py +23 -1
  20. simo/users/__pycache__/admin.cpython-38.pyc +0 -0
  21. simo/users/__pycache__/api.cpython-38.pyc +0 -0
  22. simo/users/__pycache__/models.cpython-38.pyc +0 -0
  23. simo/users/__pycache__/utils.cpython-38.pyc +0 -0
  24. simo/users/admin.py +10 -3
  25. simo/users/api.py +21 -22
  26. simo/users/migrations/0040_userdevicereportlog_location_smoothed_and_more.py +29 -0
  27. simo/users/migrations/0041_userdevicereportlog_speed_kmh_received.py +18 -0
  28. simo/users/migrations/0042_remove_userdevicereportlog_location_smoothed_and_more.py +21 -0
  29. simo/users/migrations/__pycache__/0040_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc +0 -0
  30. simo/users/migrations/__pycache__/0041_userdevicereportlog_speed_kmh_received.cpython-38.pyc +0 -0
  31. simo/users/migrations/__pycache__/0042_remove_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc +0 -0
  32. simo/users/models.py +1 -1
  33. simo/users/tasks.py +5 -1
  34. simo/users/utils.py +6 -0
  35. {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/METADATA +1 -1
  36. {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/RECORD +40 -32
  37. {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/LICENSE.md +0 -0
  38. {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/WHEEL +0 -0
  39. {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/entry_points.txt +0 -0
  40. {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/top_level.txt +0 -0
Binary file
Binary file
Binary file
simo/core/admin.py CHANGED
@@ -60,6 +60,18 @@ class IconAdmin(EasyObjectsDeleteMixin, admin.ModelAdmin):
60
60
 
61
61
 
62
62
 
63
+ @admin.register(Instance)
64
+ class InstanceAdmin(admin.ModelAdmin):
65
+ list_display = 'name', 'slug', 'uid', 'timezone', 'is_active'
66
+ list_filter = 'is_active',
67
+ readonly_fields = 'uid',
68
+
69
+ def has_add_permission(self, request):
70
+ # instances are added via SIMO.io
71
+ return False
72
+
73
+
74
+
63
75
  @admin.register(Zone)
64
76
  class ZoneAdmin(EasyObjectsDeleteMixin, SortableAdminMixin, admin.ModelAdmin):
65
77
  list_display = 'name', 'instance'
@@ -117,7 +117,7 @@ class ComponentAutocomplete(autocomplete.Select2QuerySetView):
117
117
  )
118
118
 
119
119
  if self.q:
120
- qs = search_queryset(qs, self.q, ('name',))
120
+ qs = search_queryset(qs, self.q, ('zone__name', 'name',))
121
121
  return qs.distinct()
122
122
 
123
123
  def get_result_label(self, item):
simo/core/controllers.py CHANGED
@@ -505,8 +505,7 @@ class Button(ControllerBase):
505
505
  def is_held(self):
506
506
  return self.component.value == 'hold'
507
507
 
508
- @cached_property
509
- def bonded_gear(self):
508
+ def get_bonded_gear(self):
510
509
  from simo.core.models import Component
511
510
  gear = []
512
511
  for comp in Component.objects.filter(config__has_key='controls'):
@@ -0,0 +1,36 @@
1
+ # Generated by Django 4.2.10 on 2024-11-18 09:32
2
+
3
+ from django.conf import settings
4
+ from django.db import migrations, models
5
+ import django.db.models.deletion
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12
+ ('core', '0044_alter_gateway_type'),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterField(
17
+ model_name='instance',
18
+ name='device_report_history_days',
19
+ field=models.PositiveIntegerField(default=0, help_text='How many days of user device reports logs to keep? <br>Use 0 if you do not want to keep these logs at all.'),
20
+ ),
21
+ migrations.AlterField(
22
+ model_name='instance',
23
+ name='history_days',
24
+ field=models.PositiveIntegerField(default=90, help_text='How many days of component history to keep?'),
25
+ ),
26
+ migrations.AlterField(
27
+ model_name='instance',
28
+ name='learn_fingerprints',
29
+ field=models.ForeignKey(blank=True, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
30
+ ),
31
+ migrations.AlterField(
32
+ model_name='instance',
33
+ name='learn_fingerprints_start',
34
+ field=models.DateTimeField(blank=True, editable=False, null=True),
35
+ ),
36
+ ]
simo/core/models.py CHANGED
@@ -90,16 +90,19 @@ class Instance(DirtyFieldsMixin, models.Model, SimoAdminMixin):
90
90
  limit_choices_to={'base_type__in': ['numeric-sensor', 'multi-sensor']}
91
91
  )
92
92
  history_days = models.PositiveIntegerField(
93
- default=90, help_text="How many days of component history do we keep?"
93
+ default=90, help_text="How many days of component history to keep?"
94
94
  )
95
95
  device_report_history_days = models.PositiveIntegerField(
96
96
  default=0,
97
- help_text="How many days of user device reports log do we keep? "
97
+ help_text="How many days of user device reports logs to keep? <br>"
98
98
  "Use 0 if you do not want to keep these logs at all."
99
99
  )
100
- learn_fingerprints_start = models.DateTimeField(null=True, blank=True)
100
+ learn_fingerprints_start = models.DateTimeField(
101
+ null=True, blank=True, editable=False
102
+ )
101
103
  learn_fingerprints = models.ForeignKey(
102
- User, null=True, blank=True, on_delete=models.SET_NULL
104
+ User, null=True, blank=True, on_delete=models.SET_NULL,
105
+ editable=False
103
106
  )
104
107
 
105
108
  #objects = InstanceManager()
simo/core/tasks.py CHANGED
@@ -16,6 +16,7 @@ from django.utils import timezone
16
16
  from actstream.models import Action
17
17
  from simo.conf import dynamic_settings
18
18
  from simo.core.utils.helpers import get_self_ip
19
+ from simo.core.middleware import introduce_instance
19
20
  from simo.users.models import PermissionsRole, InstanceUser
20
21
  from .models import Instance, Component, ComponentHistory, HistoryAggregate
21
22
 
@@ -301,6 +302,7 @@ def sync_with_remote():
301
302
  def clear_history():
302
303
  for instance in Instance.objects.all():
303
304
  print(f"Clear history of {instance}")
305
+ introduce_instance(instance)
304
306
  old_times = timezone.now() - datetime.timedelta(
305
307
  days=instance.history_days
306
308
  )
@@ -434,14 +436,25 @@ def restart_postgresql():
434
436
  @celery_app.task
435
437
  def low_battery_notifications():
436
438
  from simo.notifications.utils import notify_users
439
+ from simo.generic.scripting.helpers import be_or_not_to_be
437
440
  for instance in Instance.objects.filter(is_active=True):
438
441
  timezone.activate(instance.timezone)
439
- if timezone.localtime().hour not in (10, 18):
442
+ hour = timezone.localtime().hour
443
+ if hour < 7:
440
444
  continue
445
+ if hour > 21:
446
+ continue
447
+
448
+ introduce_instance(instance)
441
449
  for comp in Component.objects.filter(
442
450
  zone__instance=instance,
443
451
  battery_level__isnull=False, battery_level__lt=20
444
452
  ):
453
+ last_warning = comp.meta.get('last_battery_warning', 0)
454
+ notify = be_or_not_to_be(12 * 60 * 60, 72 * 60 * 60, last_warning)
455
+ if not notify:
456
+ continue
457
+
445
458
  iusers = comp.zone.instance.instance_users.filter(
446
459
  is_active=True, role__is_owner=True
447
460
  )
@@ -451,6 +464,8 @@ def low_battery_notifications():
451
464
  f"Low battery ({comp.battery_level}%) on {comp}",
452
465
  component=comp, instance_users=iusers
453
466
  )
467
+ comp.meta['last_battery_warning'] = time.time()
468
+ comp.save()
454
469
 
455
470
 
456
471
  @celery_app.task
Binary file
simo/fleet/forms.py CHANGED
@@ -1192,7 +1192,10 @@ class BlindsConfigForm(ColonelComponentForm):
1192
1192
  )
1193
1193
 
1194
1194
  def __init__(self, *args, **kwargs):
1195
- self.basic_fields.append('retain_angle')
1195
+ self.basic_fields.extend(
1196
+ ['open_duration', 'close_duration',
1197
+ 'slats_angle_duration', 'retain_angle']
1198
+ )
1196
1199
  return super().__init__(*args, **kwargs)
1197
1200
 
1198
1201
  def clean(self):
@@ -363,6 +363,7 @@ class FleetConsumer(AsyncWebsocketConsumer):
363
363
 
364
364
 
365
365
  async def receive(self, text_data=None, bytes_data=None):
366
+ drop_current_instance()
366
367
  try:
367
368
  if text_data:
368
369
  print(f"{self.colonel}: {text_data}")
simo/fleet/tasks.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import datetime
2
2
  from django.db.models import Prefetch
3
3
  from django.utils import timezone
4
+ from simo.core.middleware import drop_current_instance
4
5
  from celeryc import celery_app
5
6
 
6
7
 
@@ -8,6 +9,7 @@ from celeryc import celery_app
8
9
  def check_colonel_components_alive():
9
10
  from simo.core.models import Component
10
11
  from .models import Colonel
12
+ drop_current_instance()
11
13
  for lost_colonel in Colonel.objects.filter(
12
14
  last_seen__lt=timezone.now() - datetime.timedelta(seconds=60)
13
15
  ).prefetch_related(Prefetch(
@@ -1,5 +1,7 @@
1
1
  import pytz
2
2
  import math
3
+ import time
4
+ import random
3
5
  from django.utils import timezone
4
6
  from suntime import Sun
5
7
  from simo.core.models import Instance
@@ -88,4 +90,24 @@ def haversine_distance(location1, location2, units_of_measure='metric'):
88
90
  else:
89
91
  distance = distance_meters # Keep in meters for 'metric'
90
92
 
91
- return distance
93
+ return distance
94
+
95
+
96
+ def be_or_not_to_be(min_seconds, max_seconds, last_be_timestamp=0):
97
+ '''
98
+ Returns True if max_hours has passed after last_be or last_be is not provided
99
+ Returns False if min_hours not yet passed
100
+ Returns True or False if if last_be is in betwen of min_hours and max_hours
101
+ with rising probability of Trye from 0% (min_hours) to 100% (max_hours)
102
+ '''
103
+ if last_be_timestamp:
104
+ seconds_since_last = time.time() - last_be_timestamp
105
+ else:
106
+ seconds_since_last = max_seconds
107
+
108
+ if seconds_since_last >= max_seconds:
109
+ return True
110
+ if seconds_since_last >= min_seconds: # Calculate probability after min_hours hours
111
+ probability = min((seconds_since_last - min_seconds) / (max_seconds - min_seconds), 1.0)
112
+ return random.random() < probability
113
+ return False
Binary file
Binary file
Binary file
simo/users/admin.py CHANGED
@@ -4,6 +4,7 @@ from django.utils.safestring import mark_safe
4
4
  from django.contrib import messages
5
5
  from django.contrib.auth.admin import UserAdmin as OrgUserAdmin
6
6
  from django.contrib import admin
7
+ from django.utils import timezone
7
8
  from simo.core.middleware import get_current_instance
8
9
  from .models import (
9
10
  PermissionsRole, ComponentPermission, User, UserDevice, UserDeviceReportLog,
@@ -130,11 +131,12 @@ admin.site.unregister(Group)
130
131
  class UserDeviceLog(admin.ModelAdmin):
131
132
  model = UserDeviceReportLog
132
133
  readonly_fields = (
133
- 'datetime', 'app_open', 'at_home', 'location', 'relay', 'users',
134
- 'speed_kmh', 'phone_on_charge'
134
+ 'timestamp', 'app_open', 'relay', 'at_home',
135
+ 'location', 'users', 'speed_kmh', 'phone_on_charge'
135
136
  )
136
137
  list_display = (
137
- 'datetime', 'at_home', 'app_open', 'location', 'relay', 'speed_kmh',
138
+ 'timestamp', 'app_open', 'relay', 'at_home',
139
+ 'location', 'speed_kmh',
138
140
  'phone_on_charge', 'users'
139
141
  )
140
142
  fields = readonly_fields
@@ -143,6 +145,11 @@ class UserDeviceLog(admin.ModelAdmin):
143
145
  def has_add_permission(self, request, obj=None):
144
146
  return False
145
147
 
148
+ def timestamp(self, obj):
149
+ return obj.datetime.astimezone(
150
+ timezone.get_current_timezone()
151
+ ).strftime("%m/%d/%Y, %H:%M:%S")
152
+
146
153
  def users(self, obj):
147
154
  return mark_safe(', '.join([
148
155
  f'<a href="{user.get_admin_url()}">{user}</a>'
simo/users/api.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import sys
2
+ import pytz
2
3
  import datetime
3
4
  from django.db.models import Q
4
5
  from rest_framework import viewsets, mixins, status
@@ -6,7 +7,6 @@ from rest_framework.serializers import Serializer
6
7
  from rest_framework.decorators import action
7
8
  from rest_framework.response import Response as RESTResponse
8
9
  from rest_framework.exceptions import ValidationError, PermissionDenied
9
- from django.contrib.gis.geos import Point
10
10
  from django.utils import timezone
11
11
  from django_filters.rest_framework import DjangoFilterBackend
12
12
  from simo.conf import dynamic_settings
@@ -192,24 +192,19 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
192
192
  )
193
193
  user_device.users.add(request.user)
194
194
 
195
- try:
196
- location = Point(
197
- *[float(c) for c in request.data.get('location').split(',')],
198
- srid=4326
199
- )
200
- except:
201
- location = None
202
-
203
195
  relay = None
204
196
  if request.META.get('HTTP_HOST', '').endswith('.simo.io'):
205
197
  relay = request.META.get('HTTP_HOST')
206
198
 
207
- last_seen_location = None
199
+ speed_kmh = request.data.get('speed', 0) * 3.6
200
+
201
+ if relay:
202
+ location = request.data.get('location')
203
+ else:
204
+ location = self.instance.location
205
+ location_smoothed = location
206
+
208
207
  user_device.last_seen = timezone.now()
209
- if location:
210
- last_seen_location = ','.join(
211
- [str(i) for i in location]
212
- ) if location else None
213
208
 
214
209
  if request.data.get('app_open', False):
215
210
  user_device.is_primary = True
@@ -221,36 +216,40 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
221
216
  phone_on_charge = False
222
217
  if request.data.get('is_charging'):
223
218
  phone_on_charge = True
224
- speed_kmh = request.data.get('speed', 0) * 3.6
219
+
225
220
 
226
221
  at_home = False
227
222
  if not relay:
228
223
  at_home = True
229
- elif last_seen_location:
224
+ elif location:
230
225
  at_home = haversine_distance(
231
- self.instance.location, last_seen_location
226
+ self.instance.location, location
232
227
  ) < dynamic_settings['users__at_home_radius']
233
228
 
234
-
235
229
  for iu in request.user.instance_roles.filter(is_active=True):
236
230
  if not relay:
237
231
  iu.at_home = True
238
232
  elif location:
239
233
  iu.at_home = haversine_distance(
240
- iu.instance.location, last_seen_location
234
+ iu.instance.location, location
241
235
  ) < dynamic_settings['users__at_home_radius']
242
236
 
243
-
244
237
  iu.last_seen = user_device.last_seen
245
- iu.last_seen_location = last_seen_location
238
+ iu.last_seen_location = location
246
239
  iu.last_seen_speed_kmh = speed_kmh
247
240
  iu.phone_on_charge = phone_on_charge
248
241
  iu.save()
249
242
 
243
+ log_datetime = timezone.now()
244
+ if request.data.get('timestamp'):
245
+ log_datetime = datetime.datetime.utcfromtimestamp(
246
+ int(float(request.GET['start_from']))
247
+ ).replace(tzinfo=pytz.utc)
248
+
250
249
  UserDeviceReportLog.objects.create(
251
250
  user_device=user_device, instance=self.instance,
252
251
  app_open=request.data.get('app_open', False),
253
- location=last_seen_location,
252
+ location=location, datetime=log_datetime,
254
253
  relay=relay, speed_kmh=speed_kmh,
255
254
  phone_on_charge=phone_on_charge, at_home=at_home
256
255
  )
@@ -0,0 +1,29 @@
1
+ # Generated by Django 4.2.10 on 2024-11-18 09:32
2
+
3
+ from django.db import migrations, models
4
+ import location_field.models.plain
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('users', '0039_auto_20241117_1039'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='userdevicereportlog',
16
+ name='location_smoothed',
17
+ field=location_field.models.plain.PlainLocationField(blank=True, max_length=63, null=True),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name='userdevicereportlog',
21
+ name='at_home',
22
+ field=models.BooleanField(default=True),
23
+ ),
24
+ migrations.AlterField(
25
+ model_name='userdevicereportlog',
26
+ name='datetime',
27
+ field=models.DateTimeField(auto_now_add=True, db_index=True),
28
+ ),
29
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 4.2.10 on 2024-11-19 07:54
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('users', '0040_userdevicereportlog_location_smoothed_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='userdevicereportlog',
15
+ name='speed_kmh_received',
16
+ field=models.FloatField(default=0),
17
+ ),
18
+ ]
@@ -0,0 +1,21 @@
1
+ # Generated by Django 4.2.10 on 2024-11-19 12:27
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('users', '0041_userdevicereportlog_speed_kmh_received'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name='userdevicereportlog',
15
+ name='location_smoothed',
16
+ ),
17
+ migrations.RemoveField(
18
+ model_name='userdevicereportlog',
19
+ name='speed_kmh_received',
20
+ ),
21
+ ]
simo/users/models.py CHANGED
@@ -438,7 +438,7 @@ class UserDeviceReportLog(models.Model):
438
438
  instance = models.ForeignKey(
439
439
  'core.Instance', null=True, on_delete=models.CASCADE
440
440
  )
441
- datetime = models.DateTimeField(auto_now_add=True)
441
+ datetime = models.DateTimeField(auto_now_add=True, db_index=True)
442
442
  app_open = models.BooleanField(
443
443
  default=False, help_text="Sent while using app or by background process."
444
444
  )
simo/users/tasks.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import datetime
2
2
  from django.utils import timezone
3
+ from simo.core.middleware import introduce_instance
3
4
  from celeryc import celery_app
4
5
 
5
6
 
@@ -8,10 +9,13 @@ def clear_device_report_logs():
8
9
  from simo.core.models import Instance
9
10
  from .models import UserDeviceReportLog
10
11
  for instance in Instance.objects.all():
12
+ introduce_instance(instance)
13
+ # keeping at least 1 hour of logs so that we could evaluate
14
+ # user's current location using Kalman filter
11
15
  UserDeviceReportLog.objects.filter(
12
16
  instance=instance,
13
17
  datetime__lt=timezone.now() - datetime.timedelta(
14
- days=instance.device_report_history_days
18
+ days=instance.device_report_history_days, hours=1
15
19
  )
16
20
  ).delete()
17
21
 
simo/users/utils.py CHANGED
@@ -1,9 +1,15 @@
1
1
  import sys
2
+ import math
2
3
  import traceback
3
4
  import subprocess
5
+ import datetime
6
+ import numpy as np
7
+ from django.core.cache import cache
8
+ from django.utils import timezone
4
9
  from django.template.loader import render_to_string
5
10
 
6
11
 
12
+
7
13
  def get_system_user():
8
14
  from .models import User
9
15
  system, new = User.objects.get_or_create(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.30
3
+ Version: 2.5.33
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
@@ -32,17 +32,17 @@ simo/backups/migrations/__pycache__/0003_alter_backuplog_options_alter_backup_si
32
32
  simo/backups/migrations/__pycache__/0004_alter_backup_options_alter_backuplog_options_and_more.cpython-38.pyc,sha256=f4leTBkOB2kraQYyCkz9B_2pb6aKn7srV2unQA5HV1Q,710
33
33
  simo/backups/migrations/__pycache__/__init__.cpython-38.pyc,sha256=Lz1fs6V05h2AoxTOLNye0do9bEMnyuaXB_hHOjG5-HU,172
34
34
  simo/core/__init__.py,sha256=_s2TjJfQImsMrTIxqLAx9AZie1Ojmm6sCHASdl3WLGU,50
35
- simo/core/admin.py,sha256=5mi0Qe9TM-OILCxbcRfGJvq397QCPxjYX30K3CIZrPs,18133
35
+ simo/core/admin.py,sha256=T-NjMq1OxtCt-LjWL-YuuGtAi4JcvtjWhcGrLb8G5D4,18434
36
36
  simo/core/api.py,sha256=id8RCZ7r9IKqpcV6ajqF87k9yKqcFmSc8YfWIP99tQE,28276
37
37
  simo/core/api_auth.py,sha256=vCxvczA8aWNcW0VyKs5WlC_ytlqeGP_H_hkKUNVkCwM,1247
38
38
  simo/core/api_meta.py,sha256=EaiY-dCADP__9MvLpoHvhjytFT92IrxPZDv95xgqasU,4955
39
39
  simo/core/app_widgets.py,sha256=VxZzapuc-a29wBH7JzpvNF2SK1ECrgNUySId5ke1ffc,2509
40
40
  simo/core/apps.py,sha256=CsqpiQerhmrMsH-wGiG-gQgXd9qEkIi-LUaA9cXpKSw,425
41
41
  simo/core/auto_urls.py,sha256=nNXEgLAAAQAhRWQDA9AbDtw-zcPKmu_pufJaSa8g818,1102
42
- simo/core/autocomplete_views.py,sha256=l7DmpoeXcwjmBda--tT6zFQTNcyfYpgTaryWP-ghETU,3846
42
+ simo/core/autocomplete_views.py,sha256=Nu9sgc0X5OspRkJnpomeO2XdHCOg9ii9v4ZkGecCNjQ,3860
43
43
  simo/core/base_types.py,sha256=WypW8hTfzveuTQtruGjLYAGQZIuczxTlW-SdRk3iQug,666
44
44
  simo/core/context.py,sha256=LKw1I4iIRnlnzoTCuSLLqDX7crHdBnMo3hjqYvVmzFc,1557
45
- simo/core/controllers.py,sha256=JvXdwXD7iotA7fIjZmBVshKLQGSt9Na48FMAyHRDh84,35615
45
+ simo/core/controllers.py,sha256=Oy89sRh11eHlyPyrvmgxhK7kc7Aw9z0ndVMMyHhwRyM,35598
46
46
  simo/core/dynamic_settings.py,sha256=bUs58XEZOCIEhg1TigR3LmYggli13KMryBZ9pC7ugAQ,1872
47
47
  simo/core/events.py,sha256=1_KIk5pJqdLPRQlCQ9xSyALst2Cn0b2lAEAJ3QjwIjE,4801
48
48
  simo/core/filters.py,sha256=ghtOZcrwNAkIyF5_G9Sn73NkiI71mXv0NhwCk4IyMIM,411
@@ -52,30 +52,30 @@ 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=eUFf6iP-Snx_0TE3MoXsSwqrd5IjlukqZk2GQGStRCo,3385
55
- simo/core/models.py,sha256=DXJXTtNdpn9yC4VArHp0yrhpRb7vGpwH2c-JvqLE56M,22784
55
+ simo/core/models.py,sha256=1eJRIxOYtzx7JOGSAyo75QBoTEaigxjsRXIFghDSz9k,22837
56
56
  simo/core/permissions.py,sha256=INQPrUAIM3WXCvd7e6cmYytKaak8fMEn7VooX-fIds0,3002
57
57
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
58
58
  simo/core/serializers.py,sha256=WgksN1Ombv240nfQR_UtmKslTWM9vz9Y0yTdN5usiHU,21892
59
59
  simo/core/signal_receivers.py,sha256=2WfF3FI5ZmJM1S-oT_1w3TdnBUX6fjbI4Rpg-DKsuYA,8696
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=yrZORvMv7imfsyLIPn8TGDwo7oN7SDY1Uxv4C67Unfo,16406
62
+ simo/core/tasks.py,sha256=MnyEFDzdIGpE0nvR8BOksSybcKYKj2j8QpyzmX4TXd8,16931
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
66
66
  simo/core/widgets.py,sha256=J9e06C6I22F6xKic3VMgG7WeX07glAcl-4bF2Mg180A,2827
67
67
  simo/core/__pycache__/__init__.cpython-38.pyc,sha256=ZJFM_XN0RmJMULQulgA_wFiOnEtsMoedcOWnXjH-Y8o,208
68
- simo/core/__pycache__/admin.cpython-38.pyc,sha256=uM58xiBAbbstmKZ0CoxLSk_RRu5TDVuHJNOveXUhFqM,13723
68
+ simo/core/__pycache__/admin.cpython-38.pyc,sha256=mXU-u9Bl5RCa0K4Y9wJAkYns33XCByME3sb_FsMC2DI,14090
69
69
  simo/core/__pycache__/api.cpython-38.pyc,sha256=z5IT2AoH_Y7iXJELeGlgaxJ2RNe-Wwk8YIt_rJcOGMw,21851
70
70
  simo/core/__pycache__/api_auth.cpython-38.pyc,sha256=mi3mu5qEKio_PvfQEvr3Q6AhdPLAHxzxAxrMbAz_pKU,1712
71
71
  simo/core/__pycache__/api_meta.cpython-38.pyc,sha256=VYx5ZeDyNBI4B_CBEIhV5B3GnLsMOx9s3rNZTSMODco,3703
72
72
  simo/core/__pycache__/app_widgets.cpython-38.pyc,sha256=oN657XMMZ6GYN9nblv7fX3kdnTEzSP9XV6PXM6Z0wl4,4358
73
73
  simo/core/__pycache__/apps.cpython-38.pyc,sha256=JL0BEqgXcSQvMlcK48PBpPfyDEkPMdO1Y0teqMRGirs,713
74
74
  simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=Tyf8PYHq5YqSwTp25Joy-eura_Fm86fpX9zKLSklhvo,872
75
- simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=YoF9mTXfQtZ0ZC4wIVvYe4RUUnfV8OlCkIDTVT0LwBw,3953
75
+ simo/core/__pycache__/autocomplete_views.cpython-38.pyc,sha256=Of2ZFdN8XF1I4TmAUwqZonHqZd8O9CpX_DqIQMU_rdc,3967
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=NlTHt2GvXxA21AhBkeyOLfRFUuXw7wmwqyNhhcDl2cw,1373
78
- simo/core/__pycache__/controllers.cpython-38.pyc,sha256=6Ts1BeGND9Uy5eeqC5dNeme1yYilEV_emRnjTjJ9WNw,30701
78
+ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=brd76tiiaoOV_DPKKMA6ZBGD-GBg4wc3VKpuxunvwBk,30698
79
79
  simo/core/__pycache__/dynamic_settings.cpython-38.pyc,sha256=wGpnscX1DxFpRl54MQURhjz2aD3NJohSzw9JCFnzh2Y,2384
80
80
  simo/core/__pycache__/events.cpython-38.pyc,sha256=1y8YaZsiDkBOeIWzH7SQz4holmMG_RLlMWi8kuSZcoE,5280
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=g3d4L2PwxFyRKIPMP9Hkdjk1PL9NarQd4hSHS55I8n8,2649
88
- simo/core/__pycache__/models.cpython-38.pyc,sha256=HGL3TiaMy-0oobgCGGxH2nvDhh4RnOBeD00rwQsuklU,18591
88
+ simo/core/__pycache__/models.cpython-38.pyc,sha256=m2KdO5zWXwHT3pIDyGW9SQgnesSAGPPcttOXoKCArzM,18610
89
89
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=bO13B8uGCv4AiWNBoU2Gxt3mNuQ3gCxb7eKFihwFb5o,2974
90
90
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
91
91
  simo/core/__pycache__/serializers.cpython-38.pyc,sha256=d4wpUjFuo8GxaNWbin9GdHKik06IZN32uZL1SnXiL_s,19616
92
92
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=Od1ejof2nHAFzTAG5vGGVjMA8WUJNVJ9o_KWGqRSR34,6669
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=0cdIMWxwx8qkeseOvZcgIZ_BXrGbkhfijRUfpIa3s8s,10896
95
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=2LjlK_AA7b8_X-bnmAtdtxBqblyOCS8iytjwx_q8dt4,11228
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
@@ -207,6 +207,7 @@ simo/core/migrations/0041_alter_instance_slug.py,sha256=MmuW0n5CCpF7NyKYINDcqChO
207
207
  simo/core/migrations/0042_alter_instance_timezone.py,sha256=5fLprOmoV06y37rh3uJWq8Fy4SjNmu86Imky6t7j13g,23334
208
208
  simo/core/migrations/0043_alter_category_instance_alter_instance_timezone_and_more.py,sha256=TpJRZjwJu1iDYt1cCQr62jLOz14yy7yjrfbyHYgu9pM,23896
209
209
  simo/core/migrations/0044_alter_gateway_type.py,sha256=xoQvOSz_JrWHECAAII83518tmhEEfLUHqxpIjoo4oLY,758
210
+ simo/core/migrations/0045_alter_instance_device_report_history_days_and_more.py,sha256=saR7gEbTDfXTcKnT1R193Aboqlg32HvDRI_JAvZ97TY,1360
210
211
  simo/core/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
212
  simo/core/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=w6GiBXVxWj30Bg4Sn_pFVeA041d-pCrkaq8mR3KuF70,5381
212
213
  simo/core/migrations/__pycache__/0002_load_icons.cpython-38.pyc,sha256=Nb9RrPjVYo_RpZ5PmzoaEIWGCeVt4kicpmGiKlBrpIw,2123
@@ -252,6 +253,7 @@ simo/core/migrations/__pycache__/0041_alter_instance_slug.cpython-38.pyc,sha256=
252
253
  simo/core/migrations/__pycache__/0042_alter_instance_timezone.cpython-38.pyc,sha256=_IdEOLCC0xgeVcKfCk7x0kKxVPu0iWuCxCg8aqkzeSI,16392
253
254
  simo/core/migrations/__pycache__/0043_alter_category_instance_alter_instance_timezone_and_more.cpython-38.pyc,sha256=97_eFPQ_Iy-M1712Nad1w8t3ITBV4BF0eY1e8N-oOE4,16759
254
255
  simo/core/migrations/__pycache__/0044_alter_gateway_type.cpython-38.pyc,sha256=KwqGKoo8C1wH9ZUhagpC3plTwheSMcWtwlCGcSPd5WQ,964
256
+ simo/core/migrations/__pycache__/0045_alter_instance_device_report_history_days_and_more.cpython-38.pyc,sha256=e1_hKjdokggnPndFkoBWrHQ18IkBi2W7WahcSjAbvKo,1278
255
257
  simo/core/migrations/__pycache__/__init__.cpython-38.pyc,sha256=VZmDQ57BTcebuM0KMhjiTOabgWZCBxQmSJzWZos9SO8,169
256
258
  simo/core/static/ansi_styles.css,sha256=4ieJGrjZPKyPSago9FdB_gflHoGE1vxCHi8qVn5tY-Y,37352
257
259
  simo/core/static/admin/Img/plus.svg,sha256=2NpSFPWqGIjpAQGFI7LDQHPKagEhYkJiJX95ufCoZaI,741
@@ -10209,7 +10211,7 @@ simo/core/utils/__pycache__/easing.cpython-38.pyc,sha256=LupxHv19OiBqL0VXmTbMCtA
10209
10211
  simo/core/utils/__pycache__/form_fields.cpython-38.pyc,sha256=nBk6k9aj6BpWwdkpceIXdl5NU0fB6NPFhSBPaA-VtPs,1252
10210
10212
  simo/core/utils/__pycache__/form_widgets.cpython-38.pyc,sha256=MYAYEq0I4P0WErG9FamTJYWue7-cPartAWbFAiSSg5w,908
10211
10213
  simo/core/utils/__pycache__/formsets.cpython-38.pyc,sha256=b0BuoiXFQwNgok0OWuMma8pwTC6s9c-s9yuet_YLlZk,4946
10212
- simo/core/utils/__pycache__/helpers.cpython-38.pyc,sha256=jTGaN7kSJRwouP0EuYSaiJeMylo_RzJwSm-DKRwceHA,4291
10214
+ simo/core/utils/__pycache__/helpers.cpython-38.pyc,sha256=-lTIUJxhV03q8P9ZGcIhy6vftS7s29m_MpKt3bKefMY,4291
10213
10215
  simo/core/utils/__pycache__/json.cpython-38.pyc,sha256=TKc88VpPKgimeaozhgx34WWJ1mwTWFWN6B9-VAH8qT0,532
10214
10216
  simo/core/utils/__pycache__/logs.cpython-38.pyc,sha256=BVVeQoOhfRHm3SHnCoE1d5G84kTpJZFmr_btc3jDYTU,2156
10215
10217
  simo/core/utils/__pycache__/mixins.cpython-38.pyc,sha256=8Js2T7jVQ7hugRUIRu3rdxW86dJW4KeUUWqKqSkIGb0,615
@@ -10226,14 +10228,14 @@ simo/fleet/auto_urls.py,sha256=UX66eR2ykMqFgfIllW-RTdjup5-FieCWl_BVm3CcXKg,702
10226
10228
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10227
10229
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10228
10230
  simo/fleet/controllers.py,sha256=fjri1GtCnflkkDpNqhTwy6i9CK6RDEB0Q_BtADzcG8E,29156
10229
- simo/fleet/forms.py,sha256=dNyM0hAKR93DPeKs6NJnE42prAeCR4MoXjkv5mGeQ4g,62952
10231
+ simo/fleet/forms.py,sha256=bFW9OYxZsnYXEvGUZMZQ1Lef5kf3mW9eH6HYxmJK22A,63048
10230
10232
  simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
10231
10233
  simo/fleet/managers.py,sha256=ZNeHFSkF5kzsl9E1DCBevOW6kXJlD6kw0LU4B-JMOG8,828
10232
10234
  simo/fleet/models.py,sha256=zPplx_v64nfKBmb-nCb74aCVtEeY3m3SjEy-VhbnydU,17511
10233
10235
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10234
10236
  simo/fleet/serializers.py,sha256=X2M0DFKVaxM6JFGDsdg3S2nJlLIcBvbujidZdfxD88w,2169
10235
- simo/fleet/socket_consumers.py,sha256=PwxGOqstI5wzglBHTvxosa9mwg8n3tWDQEPLb1vbxlc,18354
10236
- simo/fleet/tasks.py,sha256=AGq9BXFNAqkhOANsPvId8yjEbDtVCB3MRsi_AKDpgIM,821
10237
+ simo/fleet/socket_consumers.py,sha256=0OU4lQHUBWB8VU2-Iqkjmj4eWqGkGDg0RFQhBIshRKE,18386
10238
+ simo/fleet/tasks.py,sha256=NX_opj-rbkK9eeQMeRNwHj_ZJ0LC4rYOZovMg9_r0kA,904
10237
10239
  simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
10238
10240
  simo/fleet/views.py,sha256=jT3GcGv_JEj3dqyfHH2whCnGqwT8YEAuFxRgIX4Dk9w,3237
10239
10241
  simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
@@ -10243,13 +10245,13 @@ simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=Tc6a6BCXHjijP8U2jE2ghlJwn
10243
10245
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10244
10246
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10245
10247
  simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=jtFHr_uyjCCeuidL-o-hGaf21u0fnxK_O6hTRdY6lpc,24906
10246
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=09TcBfKorvkokHkLRua0gg8sVBamwjEhvCpoANRhPyg,42595
10248
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=P7ajkIjrJTAWqPP2ma7L24jyAXpacHShWDdHva88a6o,42628
10247
10249
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnRrsQ_W7yeVeBkRLfIk,5058
10248
10250
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=Vmm23zoQnS3-uS5_WJt2n3wtjhLiEhLWaYxXJCU6Gts,1339
10249
10251
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=WUahZgETWlem5rVXlJ_vINFRM7OZWp5xpWXGMoeBXsM,14131
10250
10252
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10251
10253
  simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=gIWHJaSUbTe9H_xerD29Fz7BxIqXNzBI60GsIVXbNdY,3134
10252
- simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=Dmy99vvfoB-k-lLvr_BHit6JzbCAXiUUxTSCpdDrElU,14012
10254
+ simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=Hk0RlHcHDwVbKA_U1UVlZ3dWclR4N9fptUp3ZrgdGRs,14025
10253
10255
  simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
10254
10256
  simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=obUd-X2Y-ybx4icqUWq_qwIxrP9yyarJjexWAfO4MTI,3344
10255
10257
  simo/fleet/__pycache__/views.cpython-38.pyc,sha256=wilxSvZliSKQ5qC7JjWneYBSdbeZeTsF5uDrOQVmvms,3181
@@ -10363,7 +10365,7 @@ simo/generic/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=xy_fN8vne
10363
10365
  simo/generic/migrations/__pycache__/__init__.cpython-38.pyc,sha256=nJV0NkIT8MuONj1hUX-V6aCU2lX3BXHyPjisapnBsPA,172
10364
10366
  simo/generic/scripting/__init__.py,sha256=aZZvNBae7unnux_zGHCIWCV2z47hVJc-DIL72Hqfkeo,600
10365
10367
  simo/generic/scripting/example.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10366
- simo/generic/scripting/helpers.py,sha256=Zt8Mx5AXIggzYk0e7jn-xQNR_NOqzolAReLkrmDJzVQ,3042
10368
+ simo/generic/scripting/helpers.py,sha256=JtGkx_ta5ZQSTsE7xgsyV3R-nM-jgcTKf3FHThLw82c,3887
10367
10369
  simo/generic/scripting/serializers.py,sha256=PjyFrjdPK1mBsgbNhyqMi9SWzcymqTa742ipy0LhAN4,1996
10368
10370
  simo/generic/scripting/__pycache__/__init__.cpython-38.pyc,sha256=eHncoNpv5dy35IO1_htWd8CK0sHFBnU_WJ0hl5TKOHQ,794
10369
10371
  simo/generic/scripting/__pycache__/helpers.cpython-38.pyc,sha256=34sa3L2cK1Aw636PCaoCYIWUBIE1h6XmbgDIto9cLeo,2757
@@ -10444,38 +10446,38 @@ simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.
10444
10446
  simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpython-38.pyc,sha256=awhD1F9RyK_706zVNM5io3WT_konFkKQgL7D5MkONwk,851
10445
10447
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10446
10448
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10447
- simo/users/admin.py,sha256=2Ay47b1NWBfdUpMZ8qUFAbwiu7-P3JNxNpM7FKVwrLw,6987
10448
- simo/users/api.py,sha256=pWmP201jyz7_KCC_c8Fsrnh1R0HoCkcHfwu4LYCIRfg,12373
10449
+ simo/users/admin.py,sha256=nmFNHWckp73YZN5MV6ez6ommlj4MSI1Sr8BnQdSKW5g,7187
10450
+ simo/users/api.py,sha256=hU70VoYQtTH5xZ2b6swH8_b8G6bdsl8yztk-FHxbZlA,12342
10449
10451
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10450
10452
  simo/users/auth_backends.py,sha256=KIw2AdjCUKfm_7Lql6aC4qdE6JznP0ECIMA5MVMLeiM,4251
10451
10453
  simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10452
10454
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10453
10455
  simo/users/managers.py,sha256=OHgEP85MBtdkdYxdstBd8RavTBT8F_2WyDxUJ9aCqqM,246
10454
10456
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10455
- simo/users/models.py,sha256=EeIiEPJMS5wibbdYOvNzxTT1eGihFYERlNwERli5Uo8,19671
10457
+ simo/users/models.py,sha256=y27FK7nSUiAwzmOVvRCZz532yMRuuBQR2znRmorQ1d8,19686
10456
10458
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10457
10459
  simo/users/serializers.py,sha256=zzw1KONTnaTNBaU0r4rNVxJ827KzD6Z5LuQt27ZsQ98,2516
10458
10460
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
10459
10461
  simo/users/sso_views.py,sha256=5J0D4qUFQDvd-Fcqx_xLJWLJgPdqtVD5DDiPJyPsT2Q,4336
10460
- simo/users/tasks.py,sha256=HJAqiyWGsaN3wSfquU0UyQ20jL-njXeaaTOdDT3TQ3s,979
10461
- simo/users/utils.py,sha256=1HGSZyHRqQvdJ4RtAiZDg1juvgG8aOlrGXR7CcvsyQc,1886
10462
+ simo/users/tasks.py,sha256=M8MDQ1oR6WXWoOP5SQYui-CsCIV0jUmfI84TbRgGKo8,1199
10463
+ simo/users/utils.py,sha256=-Lu7C_sz8JJauLaIwgEa6umArqzNL7JJTY-ZcuF4irA,2004
10462
10464
  simo/users/views.py,sha256=dOQVvmlHG7ihWKJLFUBcqKOA0UDctlMKR0pTc36JZqg,3487
10463
10465
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=VFoDJE_SKKaPqqYaaBYd1Ndb1hjakkTo_u0EG_XJ1GM,211
10464
- simo/users/__pycache__/admin.cpython-38.pyc,sha256=-TXB5LGoAvCfgNhsqaB-1pgyyfW8lbuGcgD8F4HZojk,7947
10465
- simo/users/__pycache__/api.cpython-38.pyc,sha256=4JQ61L-i0GXtnqlGgZfoHHQX9bd8xJc9kkEmvjHC_-Q,10172
10466
+ simo/users/__pycache__/admin.cpython-38.pyc,sha256=Jcwn0jqueQkmgXPb327-3iUtrSycGzM537JB_-sryOM,8213
10467
+ simo/users/__pycache__/api.cpython-38.pyc,sha256=N6s2wXZiOKXCVekI7U3HbMymoOMsZGlKNHdfjJgLn_8,9947
10466
10468
  simo/users/__pycache__/apps.cpython-38.pyc,sha256=dgbWL8CxzzISJQTmq_4IztPJ2UzykNVdqA2Ae1PmeGk,605
10467
10469
  simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=jYS2hlbTZh_ZtPeWcN50pc0IpyfCSO7_MvIbuVwEp8M,3144
10468
10470
  simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
10469
10471
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10470
10472
  simo/users/__pycache__/managers.cpython-38.pyc,sha256=O0Y8ABp42RAosrbODmYsPMaj9AyOPyJ-aqzuO0Qpi2s,679
10471
10473
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10472
- simo/users/__pycache__/models.cpython-38.pyc,sha256=aFOdFfAu0XLxg4BOSE_Kj3e-Qr3b8dMH8mWiyM9Egew,17672
10474
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=0k1XtvS7y0Wga0FSb1bMSi6TUSzucDLsla_9dpYWg30,17681
10473
10475
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10474
10476
  simo/users/__pycache__/serializers.cpython-38.pyc,sha256=Dy8RAcwNkNSXoJHvLp8fozURyHCtucqpSPyqZtbnMZc,3732
10475
10477
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
10476
10478
  simo/users/__pycache__/sso_views.cpython-38.pyc,sha256=PLRF6FYCxRhnmgnN_gUS-pdQlH7lofLU1Xhgw3vDO_Y,4019
10477
10479
  simo/users/__pycache__/tasks.cpython-38.pyc,sha256=XLMKt3suT7BlcXrJZoH9ZIhhtBuqyiW4lsOB9IbBkko,1225
10478
- simo/users/__pycache__/utils.cpython-38.pyc,sha256=S-2i_Y11eTcUpmn-RkX1B4_tDvZJdqkZqqoewpkcsUM,1739
10480
+ simo/users/__pycache__/utils.cpython-38.pyc,sha256=cgxUwEaBgxT360mw4E03J7u4vi3dhw6K3n7-8WNvyFU,1888
10479
10481
  simo/users/__pycache__/views.cpython-38.pyc,sha256=AXuUnVYRD0ai4FSFDp4qJwryukujAoN6LD3oIj-Cv3o,2426
10480
10482
  simo/users/migrations/0001_initial.py,sha256=_SnJemhNOs8Jjj-PjyvTVCBoxfs5V3lR_4ypUHUdLUg,7017
10481
10483
  simo/users/migrations/0002_componentpermission.py,sha256=rH9pC9HERf_5WWn3LCsNiu03BiHqURTF62pSNfswStI,918
@@ -10516,6 +10518,9 @@ simo/users/migrations/0036_instanceuser_phone_on_charge_user_phone_on_charge.py,
10516
10518
  simo/users/migrations/0037_rename_last_seen_location_datetime_instanceuser_last_seen_and_more.py,sha256=8f_7fC7k0Dm-0gGVHMI9_490BbEC_SfuAPrAADrZ7BA,1543
10517
10519
  simo/users/migrations/0038_userdevicereportlog_at_home_and_more.py,sha256=qL1ZjUJDiSrJat59ToqpNBwnMMPb3Q5mwHq-qd1eFcI,691
10518
10520
  simo/users/migrations/0039_auto_20241117_1039.py,sha256=e64AJM2ZId516Px-gmAxkp2NmSC5Vjo_BBTGbYrFuKY,1310
10521
+ simo/users/migrations/0040_userdevicereportlog_location_smoothed_and_more.py,sha256=umGDjQGpCrQocNxaCvwdTsOmSxcRC61NcUdHGUczoc4,855
10522
+ simo/users/migrations/0041_userdevicereportlog_speed_kmh_received.py,sha256=WoJ-ImX1lNIl7CKO_HMt3jbFjoenFGBUm9HZWidb-eA,433
10523
+ simo/users/migrations/0042_remove_userdevicereportlog_location_smoothed_and_more.py,sha256=p-GFu6qjkxqeA0TI8aaIum0k6fQfc39RIKbfGPSf0Yk,499
10519
10524
  simo/users/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10520
10525
  simo/users/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=e4XOKaYRb7l0P7cBnHHi5FQQJMlwjK0g7iqgM-xKmNI,4215
10521
10526
  simo/users/migrations/__pycache__/0002_componentpermission.cpython-38.pyc,sha256=pknJnpic8p6Vdx9DX41FfODXNnvexDswJtUCmC5w1tg,995
@@ -10558,6 +10563,9 @@ simo/users/migrations/__pycache__/0036_instanceuser_phone_on_charge_user_phone_o
10558
10563
  simo/users/migrations/__pycache__/0037_rename_last_seen_location_datetime_instanceuser_last_seen_and_more.cpython-38.pyc,sha256=W4Rc6SRNNJ_yAYrEyoklD5LFmQPAL9mTDrXHMfP8R4I,1162
10559
10564
  simo/users/migrations/__pycache__/0038_userdevicereportlog_at_home_and_more.cpython-38.pyc,sha256=khDSeTH3-jJ4yO1D6-i3Pm_NekJkVwBSUJ-rAxu0cr4,836
10560
10565
  simo/users/migrations/__pycache__/0039_auto_20241117_1039.cpython-38.pyc,sha256=IEOIfvnUiV-GX9VI4W2UKJugC3nfwKfy7QdmS3pW6Ss,1377
10566
+ simo/users/migrations/__pycache__/0040_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc,sha256=I0W00mt73gjKunnwAyf3kz1FKfgm2HRwCJY_ogATSS0,918
10567
+ simo/users/migrations/__pycache__/0041_userdevicereportlog_speed_kmh_received.cpython-38.pyc,sha256=XWC9Emcc1Bm498UZ-6Lo7-i2Vq77vndjMA9xRdJbdfU,676
10568
+ simo/users/migrations/__pycache__/0042_remove_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc,sha256=sSnWjU7rg5LXlRCxUFb_m2lUIcB4EHgtAnl-C9MMJvE,656
10561
10569
  simo/users/migrations/__pycache__/__init__.cpython-38.pyc,sha256=NKq7WLgktK8WV1oOqCPbAbdkrPV5GRGhYx4VxxI4dcs,170
10562
10570
  simo/users/templates/conf/mosquitto.conf,sha256=1eIGNuRu4Y3hfAU6qiWix648eCRrw0oOT24PnyFI4ys,189
10563
10571
  simo/users/templates/conf/mosquitto_acls.conf,sha256=ga44caTDNQE0CBKw55iM2jOuna6-9fKGwAhjyERZdRE,500
@@ -10567,9 +10575,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10567
10575
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10568
10576
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10569
10577
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10570
- simo-2.5.30.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10571
- simo-2.5.30.dist-info/METADATA,sha256=rnYLYWnVpPGB86Gmr15dmR9wmv--Q42fKSUK_3Uu6iI,1953
10572
- simo-2.5.30.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10573
- simo-2.5.30.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10574
- simo-2.5.30.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10575
- simo-2.5.30.dist-info/RECORD,,
10578
+ simo-2.5.33.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10579
+ simo-2.5.33.dist-info/METADATA,sha256=IorucYL9ZZ7DjoUiKgucRTDPyUlHNQZNu5VY4THxPQw,1953
10580
+ simo-2.5.33.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10581
+ simo-2.5.33.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10582
+ simo-2.5.33.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10583
+ simo-2.5.33.dist-info/RECORD,,
File without changes