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.
- simo/core/__pycache__/admin.cpython-38.pyc +0 -0
- simo/core/__pycache__/autocomplete_views.cpython-38.pyc +0 -0
- simo/core/__pycache__/controllers.cpython-38.pyc +0 -0
- simo/core/__pycache__/models.cpython-38.pyc +0 -0
- simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
- simo/core/admin.py +12 -0
- simo/core/autocomplete_views.py +1 -1
- simo/core/controllers.py +1 -2
- simo/core/migrations/0045_alter_instance_device_report_history_days_and_more.py +36 -0
- simo/core/migrations/__pycache__/0045_alter_instance_device_report_history_days_and_more.cpython-38.pyc +0 -0
- simo/core/models.py +7 -4
- simo/core/tasks.py +16 -1
- simo/core/utils/__pycache__/helpers.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/socket_consumers.cpython-38.pyc +0 -0
- simo/fleet/forms.py +4 -1
- simo/fleet/socket_consumers.py +1 -0
- simo/fleet/tasks.py +2 -0
- simo/generic/scripting/helpers.py +23 -1
- simo/users/__pycache__/admin.cpython-38.pyc +0 -0
- simo/users/__pycache__/api.cpython-38.pyc +0 -0
- simo/users/__pycache__/models.cpython-38.pyc +0 -0
- simo/users/__pycache__/utils.cpython-38.pyc +0 -0
- simo/users/admin.py +10 -3
- simo/users/api.py +21 -22
- simo/users/migrations/0040_userdevicereportlog_location_smoothed_and_more.py +29 -0
- simo/users/migrations/0041_userdevicereportlog_speed_kmh_received.py +18 -0
- simo/users/migrations/0042_remove_userdevicereportlog_location_smoothed_and_more.py +21 -0
- simo/users/migrations/__pycache__/0040_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc +0 -0
- simo/users/migrations/__pycache__/0041_userdevicereportlog_speed_kmh_received.cpython-38.pyc +0 -0
- simo/users/migrations/__pycache__/0042_remove_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc +0 -0
- simo/users/models.py +1 -1
- simo/users/tasks.py +5 -1
- simo/users/utils.py +6 -0
- {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/METADATA +1 -1
- {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/RECORD +40 -32
- {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/LICENSE.md +0 -0
- {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/WHEEL +0 -0
- {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/entry_points.txt +0 -0
- {simo-2.5.30.dist-info → simo-2.5.33.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
|
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'
|
simo/core/autocomplete_views.py
CHANGED
|
@@ -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
|
-
|
|
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
|
+
]
|
|
Binary file
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
Binary file
|
|
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.
|
|
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):
|
simo/fleet/socket_consumers.py
CHANGED
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
|
|
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
|
-
'
|
|
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
|
-
'
|
|
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
|
-
|
|
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
|
-
|
|
219
|
+
|
|
225
220
|
|
|
226
221
|
at_home = False
|
|
227
222
|
if not relay:
|
|
228
223
|
at_home = True
|
|
229
|
-
elif
|
|
224
|
+
elif location:
|
|
230
225
|
at_home = haversine_distance(
|
|
231
|
-
self.instance.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,
|
|
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 =
|
|
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=
|
|
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/migrations/__pycache__/0040_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
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(
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
10236
|
-
simo/fleet/tasks.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
10448
|
-
simo/users/api.py,sha256=
|
|
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=
|
|
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=
|
|
10461
|
-
simo/users/utils.py,sha256
|
|
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
|
|
10465
|
-
simo/users/__pycache__/api.cpython-38.pyc,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
10571
|
-
simo-2.5.
|
|
10572
|
-
simo-2.5.
|
|
10573
|
-
simo-2.5.
|
|
10574
|
-
simo-2.5.
|
|
10575
|
-
simo-2.5.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|