simo 2.5.36__py3-none-any.whl → 2.5.38__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 (34) hide show
  1. simo/core/__pycache__/api.cpython-38.pyc +0 -0
  2. simo/core/__pycache__/auto_urls.cpython-38.pyc +0 -0
  3. simo/core/__pycache__/controllers.cpython-38.pyc +0 -0
  4. simo/core/__pycache__/forms.cpython-38.pyc +0 -0
  5. simo/core/__pycache__/permissions.cpython-38.pyc +0 -0
  6. simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
  7. simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
  8. simo/core/__pycache__/views.cpython-38.pyc +0 -0
  9. simo/core/api.py +8 -2
  10. simo/core/auto_urls.py +2 -2
  11. simo/core/serializers.py +5 -5
  12. simo/core/tasks.py +1 -1
  13. simo/core/templates/admin/user_tools.html +3 -3
  14. simo/core/views.py +9 -5
  15. simo/fleet/__pycache__/serializers.cpython-38.pyc +0 -0
  16. simo/fleet/__pycache__/socket_consumers.cpython-38.pyc +0 -0
  17. simo/fleet/serializers.py +9 -3
  18. simo/generic/__pycache__/controllers.cpython-38.pyc +0 -0
  19. simo/generic/controllers.py +12 -0
  20. simo/generic/scripting/helpers.py +18 -0
  21. simo/users/__pycache__/admin.cpython-38.pyc +0 -0
  22. simo/users/__pycache__/api.cpython-38.pyc +0 -0
  23. simo/users/__pycache__/models.cpython-38.pyc +0 -0
  24. simo/users/admin.py +3 -2
  25. simo/users/api.py +22 -9
  26. simo/users/migrations/0043_userdevicereportlog_avg_speed_kmh.py +18 -0
  27. simo/users/migrations/__pycache__/0043_userdevicereportlog_avg_speed_kmh.cpython-38.pyc +0 -0
  28. simo/users/models.py +1 -0
  29. {simo-2.5.36.dist-info → simo-2.5.38.dist-info}/METADATA +1 -1
  30. {simo-2.5.36.dist-info → simo-2.5.38.dist-info}/RECORD +34 -32
  31. {simo-2.5.36.dist-info → simo-2.5.38.dist-info}/LICENSE.md +0 -0
  32. {simo-2.5.36.dist-info → simo-2.5.38.dist-info}/WHEEL +0 -0
  33. {simo-2.5.36.dist-info → simo-2.5.38.dist-info}/entry_points.txt +0 -0
  34. {simo-2.5.36.dist-info → simo-2.5.38.dist-info}/top_level.txt +0 -0
Binary file
Binary file
Binary file
Binary file
simo/core/api.py CHANGED
@@ -2,8 +2,7 @@ import datetime
2
2
  from calendar import monthrange
3
3
  import pytz
4
4
  import time
5
- import json
6
- from django.db.models import Q
5
+ import pkg_resources
7
6
  from django.utils.translation import gettext_lazy as _
8
7
  from django.utils import timezone
9
8
  from django.http import HttpResponse, Http404
@@ -559,6 +558,11 @@ class SettingsViewSet(InstanceMixin, viewsets.GenericViewSet):
559
558
  else:
560
559
  main_state = None
561
560
 
561
+ try:
562
+ version = pkg_resources.get_distribution('simo').version
563
+ except:
564
+ version = 'dev'
565
+
562
566
  return RESTResponse({
563
567
  'hub_uid': dynamic_settings['core__hub_uid'],
564
568
  'instance_name': self.instance.name,
@@ -577,6 +581,8 @@ class SettingsViewSet(InstanceMixin, viewsets.GenericViewSet):
577
581
  'history_days': self.instance.history_days,
578
582
  'device_report_history_days': self.instance.device_report_history_days,
579
583
  'indoor_climate_sensor': self.instance.indoor_climate_sensor_id,
584
+ 'version': version,
585
+ 'new_version_available': dynamic_settings['core__latest_version_available'],
580
586
  })
581
587
 
582
588
  def update(self, request, *args, **kwargs):
simo/core/auto_urls.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from django.urls import path
2
2
  from .views import (
3
- get_timestamp, update, restart, reboot, set_instance
3
+ get_timestamp, upgrade, restart, reboot, set_instance
4
4
  )
5
5
  from .autocomplete_views import (
6
6
  IconModelAutocomplete,
@@ -31,7 +31,7 @@ urlpatterns = [
31
31
  ComponentAutocomplete.as_view(), name='autocomplete-component'
32
32
  ),
33
33
  path('set-instance/<slug:instance_slug>/', set_instance, name='set-instance'),
34
- path('update/', update, name='update'),
34
+ path('upgrade/', upgrade, name='upgrade'),
35
35
  path('restart/', restart, name='restart'),
36
36
  path('reboot/', reboot, name='reboot')
37
37
  ]
simo/core/serializers.py CHANGED
@@ -530,11 +530,11 @@ class ComponentSerializer(FormSerializer):
530
530
  role = user.get_role(instance)
531
531
  if not role:
532
532
  return True
533
- return not bool(
534
- role.component_permissions.filter(
535
- component=obj, write=True
536
- )
537
- )
533
+ for perm in role.component_permissions.all(): # prefetched
534
+ if perm == obj:
535
+ return not perm.write
536
+ return True
537
+
538
538
 
539
539
  def get_app_widget(self, obj):
540
540
  try:
simo/core/tasks.py CHANGED
@@ -460,7 +460,7 @@ def low_battery_notifications():
460
460
  )
461
461
  if iusers:
462
462
  notify_users(
463
- comp.zone.instance, 'warning',
463
+ 'warning',
464
464
  f"Low battery ({comp.battery_level}%) on {comp}",
465
465
  component=comp, instance_users=iusers
466
466
  )
@@ -16,11 +16,11 @@
16
16
  <i class="fas fa-sort-down"></i>
17
17
  </div>
18
18
  <div class="dropdown-content" style="right: 110px">
19
- <a href="{% url 'update' %}" title="Update hub" class="update_link">
20
- <i class="fas fa-angle-double-up"></i> Update
19
+ <a href="{% url 'upgrade' %}" title="Upgrade hub" class="update_link">
20
+ <i class="fas fa-angle-double-up"></i> Upgrade
21
21
  </a>
22
22
  <a href="{% url 'restart' %}" title="Restart main processes">
23
- <i class="far fa-power-off" ></i> Restart
23
+ <i class="far fa-power-off" ></i> Restart processes
24
24
  </a>
25
25
  <a href="{% url 'reboot' %}" title="Reboot hub" id="reboot_link">
26
26
  <i class="fad fa-power-off"></i> Reboot
simo/core/views.py CHANGED
@@ -3,6 +3,7 @@ import re
3
3
  from django.contrib.auth.decorators import login_required
4
4
  from django.urls import reverse
5
5
  from django.shortcuts import redirect
6
+ from django.views.decorators.csrf import csrf_exempt
6
7
  from django.http import HttpResponse, Http404, JsonResponse
7
8
  from django.contrib import messages
8
9
  from simo.conf import dynamic_settings
@@ -15,10 +16,11 @@ def get_timestamp(request):
15
16
  return HttpResponse(time.time())
16
17
 
17
18
  @login_required
18
- def update(request):
19
- if not request.user.is_superuser:
19
+ @csrf_exempt
20
+ def upgrade(request):
21
+ if not request.user.is_master:
20
22
  raise Http404()
21
- messages.warning(request, "Hub update initiated. ")
23
+ messages.warning(request, "Hub upgrade initiated. ")
22
24
  update_task.delay()
23
25
  if request.META.get('HTTP_REFERER'):
24
26
  return redirect(request.META.get('HTTP_REFERER'))
@@ -26,8 +28,9 @@ def update(request):
26
28
 
27
29
 
28
30
  @login_required
31
+ @csrf_exempt
29
32
  def restart(request):
30
- if not request.user.is_superuser:
33
+ if not request.user.is_master:
31
34
  raise Http404()
32
35
  messages.warning(
33
36
  request, "Hub restart initiated. "
@@ -41,8 +44,9 @@ def restart(request):
41
44
 
42
45
 
43
46
  @login_required
47
+ @csrf_exempt
44
48
  def reboot(request):
45
- if not request.user.is_superuser:
49
+ if not request.user.is_master:
46
50
  raise Http404()
47
51
  messages.error(
48
52
  request,
simo/fleet/serializers.py CHANGED
@@ -42,16 +42,19 @@ class ColonelInterfaceSerializer(serializers.ModelSerializer):
42
42
  class ColonelSerializer(serializers.ModelSerializer):
43
43
  pins = serializers.SerializerMethodField()
44
44
  interfaces = serializers.SerializerMethodField()
45
+ newer_firmware_available = serializers.SerializerMethodField()
45
46
 
46
47
  class Meta:
47
48
  model = Colonel
48
49
  fields = (
49
- 'id', 'uid', 'name', 'type', 'firmware_version', 'firmware_auto_update',
50
+ 'id', 'uid', 'name', 'type',
51
+ 'firmware_version', 'firmware_auto_update',
52
+ 'newer_firmware_available',
50
53
  'socket_connected', 'last_seen', 'pins', 'interfaces',
51
54
  )
52
55
  read_only_fields = [
53
- 'uid', 'type', 'firmware_version', 'socket_connected',
54
- 'last_seen', 'pins', 'interfaces',
56
+ 'uid', 'type', 'firmware_version', 'newer_firmware_available',
57
+ 'socket_connected', 'last_seen', 'pins', 'interfaces'
55
58
  ]
56
59
 
57
60
  def get_pins(self, obj):
@@ -66,6 +69,9 @@ class ColonelSerializer(serializers.ModelSerializer):
66
69
  result.append(ColonelInterfaceSerializer(interface).data)
67
70
  return result
68
71
 
72
+ def get_newer_firmware_available(self, obj):
73
+ return obj.newer_firmware_available()
74
+
69
75
  def update(self, instance, validated_data):
70
76
  instance = super().update(instance, validated_data)
71
77
  instance.update_config()
@@ -169,6 +169,13 @@ class PresenceLighting(Script):
169
169
  sensor.on_change(self._on_sensor)
170
170
  self.sensors[id] = sensor
171
171
 
172
+ if self.component.config['off_value'] != 0:
173
+ for id in self.component.config['lights']:
174
+ light = Component.objects.filter(id=id).first()
175
+ if not light or not light.controller:
176
+ continue
177
+ light.on_change(self._on_light_change)
178
+
172
179
  for condition in self.component.config.get('conditions', []):
173
180
  comp = Component.objects.filter(
174
181
  id=condition.get('component', 0)
@@ -196,6 +203,11 @@ class PresenceLighting(Script):
196
203
  self._regulate()
197
204
 
198
205
 
206
+ def _on_light_change(self, light):
207
+ if self.is_on:
208
+ self.light_org_values[light.id] = light.value
209
+
210
+
199
211
  def _regulate(self, on_val_change=True):
200
212
  presence_values = [s.value for id, s in self.sensors.items()]
201
213
  if self.component.config.get('act_on', 0) == 0:
@@ -61,6 +61,24 @@ class LocalSun(Sun):
61
61
  return (self.get_sunrise_time(utc_datetime) - utc_datetime).total_seconds()
62
62
 
63
63
 
64
+ def get_day_evening_night_morning(sun, localtime):
65
+
66
+ # It is daytime if the sun is up!
67
+ if not sun.is_night():
68
+ return 'day'
69
+
70
+ # it is evening if the sun is down at the evening
71
+ if sun.get_sunset_time(localtime) < localtime:
72
+ return 'evening'
73
+
74
+ # if it's past 6 AM but still dark - we consider this as morning
75
+ if localtime.hour >= 6:
76
+ return 'morning'
77
+
78
+ # 0 - 6AM and still dark
79
+ return 'night'
80
+
81
+
64
82
  def haversine_distance(location1, location2, units_of_measure='metric'):
65
83
  # Radius of Earth in meters
66
84
  R = 6371000
Binary file
Binary file
simo/users/admin.py CHANGED
@@ -132,11 +132,12 @@ class UserDeviceLog(admin.ModelAdmin):
132
132
  model = UserDeviceReportLog
133
133
  readonly_fields = (
134
134
  'timestamp', 'app_open', 'relay', 'at_home',
135
- 'location', 'users', 'speed_kmh', 'phone_on_charge'
135
+ 'location', 'users', 'speed_kmh', 'avg_speed_kmh',
136
+ 'phone_on_charge'
136
137
  )
137
138
  list_display = (
138
139
  'timestamp', 'app_open', 'relay', 'at_home',
139
- 'location', 'speed_kmh',
140
+ 'location', 'speed_kmh', 'avg_speed_kmh',
140
141
  'phone_on_charge', 'users'
141
142
  )
142
143
  fields = readonly_fields
simo/users/api.py CHANGED
@@ -192,6 +192,12 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
192
192
  )
193
193
  user_device.users.add(request.user)
194
194
 
195
+ log_datetime = timezone.now()
196
+ if request.data.get('timestamp'):
197
+ log_datetime = datetime.datetime.utcfromtimestamp(
198
+ int(float(request.GET['start_from']))
199
+ ).replace(tzinfo=pytz.utc)
200
+
195
201
  relay = None
196
202
  if request.META.get('HTTP_HOST', '').endswith('.simo.io'):
197
203
  relay = request.META.get('HTTP_HOST')
@@ -201,10 +207,23 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
201
207
  except:
202
208
  speed_kmh = 0
203
209
 
210
+ avg_speed_kmh = 0
211
+
204
212
  if relay:
205
213
  location = request.data.get('location')
206
214
  if 'null' in location:
207
215
  location = None
216
+ prev_log = UserDeviceReportLog.objects.filter(
217
+ user_device=user_device, instance=self.instance,
218
+ datetime__lt=log_datetime - datetime.timedelta(seconds=3),
219
+ datetime__gt=log_datetime - datetime.timedelta(seconds=10),
220
+ at_home=False, location__isnull=False
221
+ ).last()
222
+ if prev_log:
223
+ from simo.generic.scripting.helpers import haversine_distance
224
+ meters_traveled = haversine_distance(location, prev_log.location)
225
+ seconds_passed = (log_datetime - prev_log.datetime).total_seconds()
226
+ avg_speed_kmh = round(meters_traveled / seconds_passed * 3.6, 0)
208
227
  else:
209
228
  location = self.instance.location
210
229
 
@@ -221,7 +240,6 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
221
240
  if request.data.get('is_charging') == True:
222
241
  phone_on_charge = True
223
242
 
224
-
225
243
  at_home = False
226
244
  if not relay:
227
245
  at_home = True
@@ -239,22 +257,17 @@ class UserDeviceReport(InstanceMixin, viewsets.GenericViewSet):
239
257
  ) < dynamic_settings['users__at_home_radius']
240
258
 
241
259
  iu.last_seen = user_device.last_seen
242
- iu.last_seen_location = location
260
+ if location:
261
+ iu.last_seen_location = location
243
262
  iu.last_seen_speed_kmh = speed_kmh
244
263
  iu.phone_on_charge = phone_on_charge
245
264
  iu.save()
246
265
 
247
- log_datetime = timezone.now()
248
- if request.data.get('timestamp'):
249
- log_datetime = datetime.datetime.utcfromtimestamp(
250
- int(float(request.GET['start_from']))
251
- ).replace(tzinfo=pytz.utc)
252
-
253
266
  UserDeviceReportLog.objects.create(
254
267
  user_device=user_device, instance=self.instance,
255
268
  app_open=request.data.get('app_open', False),
256
269
  location=location, datetime=log_datetime,
257
- relay=relay, speed_kmh=speed_kmh,
270
+ relay=relay, speed_kmh=speed_kmh, avg_speed_kmh=avg_speed_kmh,
258
271
  phone_on_charge=phone_on_charge, at_home=at_home
259
272
  )
260
273
 
@@ -0,0 +1,18 @@
1
+ # Generated by Django 4.2.10 on 2024-11-23 09:02
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('users', '0042_remove_userdevicereportlog_location_smoothed_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='userdevicereportlog',
15
+ name='avg_speed_kmh',
16
+ field=models.FloatField(default=0),
17
+ ),
18
+ ]
simo/users/models.py CHANGED
@@ -448,6 +448,7 @@ class UserDeviceReportLog(models.Model):
448
448
  )
449
449
  location = PlainLocationField(zoom=7, null=True, blank=True)
450
450
  speed_kmh = models.FloatField(default=0)
451
+ avg_speed_kmh = models.FloatField(default=0)
451
452
  phone_on_charge = models.BooleanField(default=False, db_index=True)
452
453
  at_home = models.BooleanField(default=True)
453
454
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.36
3
+ Version: 2.5.38
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
@@ -33,12 +33,12 @@ simo/backups/migrations/__pycache__/0004_alter_backup_options_alter_backuplog_op
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
35
  simo/core/admin.py,sha256=T-NjMq1OxtCt-LjWL-YuuGtAi4JcvtjWhcGrLb8G5D4,18434
36
- simo/core/api.py,sha256=id8RCZ7r9IKqpcV6ajqF87k9yKqcFmSc8YfWIP99tQE,28276
36
+ simo/core/api.py,sha256=jFSuknrIiFhuf_Hx07GeTQ_prOG0cBJhtbcTImPVmqI,28502
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
- simo/core/auto_urls.py,sha256=nNXEgLAAAQAhRWQDA9AbDtw-zcPKmu_pufJaSa8g818,1102
41
+ simo/core/auto_urls.py,sha256=FBDclIeRp5UVWomIUbRzUgY-AoMk-r2qC2htlwKD4Lo,1106
42
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
@@ -55,46 +55,46 @@ simo/core/middleware.py,sha256=eUFf6iP-Snx_0TE3MoXsSwqrd5IjlukqZk2GQGStRCo,3385
55
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
- simo/core/serializers.py,sha256=tY0pQWe_EtUHOOsYPqg89NH-0-Me76_mG1ppvxsMTHY,21816
58
+ simo/core/serializers.py,sha256=LguXTsiGiIkLbBES4lHakvpRlYii7P6JVPALazo_cRU,21832
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=MnyEFDzdIGpE0nvR8BOksSybcKYKj2j8QpyzmX4TXd8,16931
62
+ simo/core/tasks.py,sha256=ridh-22XWY3v9DCWrGYaXrOM0w4XOebkjkkZT9NtnP4,16911
63
63
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
64
64
  simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
65
- simo/core/views.py,sha256=3SRZr00fyLQf8ja3U-9eekKt-ld5TvU1WQqUWprXfQ4,2390
65
+ simo/core/views.py,sha256=yx9I0byeVUa-LAOnklpWIYwpNNOf5m9fyjKBvj4YCh4,2475
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
68
  simo/core/__pycache__/admin.cpython-38.pyc,sha256=mXU-u9Bl5RCa0K4Y9wJAkYns33XCByME3sb_FsMC2DI,14090
69
- simo/core/__pycache__/api.cpython-38.pyc,sha256=z5IT2AoH_Y7iXJELeGlgaxJ2RNe-Wwk8YIt_rJcOGMw,21851
69
+ simo/core/__pycache__/api.cpython-38.pyc,sha256=u4qCGX0I_IEvdVf4vzQWnGkUsNRBa7Bx2PqWCyX7aHs,21980
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
- simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=Tyf8PYHq5YqSwTp25Joy-eura_Fm86fpX9zKLSklhvo,872
74
+ simo/core/__pycache__/auto_urls.cpython-38.pyc,sha256=ib_ns5Ko8ybfrdJJWYVV1jevihxOFs39aBF4bez6Lzs,874
75
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=brd76tiiaoOV_DPKKMA6ZBGD-GBg4wc3VKpuxunvwBk,30698
78
+ simo/core/__pycache__/controllers.cpython-38.pyc,sha256=Lt9JDheLB3qgaZZ9NACAEeg43IY9XxZHN3Y0c5JavMo,30710
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
82
82
  simo/core/__pycache__/form_fields.cpython-38.pyc,sha256=phMdhDFRmaFDhJSnasAg8VKNP6PxkPjFqkLwEuWicIs,3465
83
- simo/core/__pycache__/forms.cpython-38.pyc,sha256=vqU3No0S56V1q1RrY7y5otT-o0p-5qAiffvqECG2Gg8,17525
83
+ simo/core/__pycache__/forms.cpython-38.pyc,sha256=9ogrGIBTmPWXUD3qgICo2oA-pBlgO2Bqg9hRv_-IUdE,17571
84
84
  simo/core/__pycache__/gateways.cpython-38.pyc,sha256=D1ooHL-iSpQrxnD8uAl4xWFJmm-QWZfbkLiLlFOMtdU,4553
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
88
  simo/core/__pycache__/models.cpython-38.pyc,sha256=m2KdO5zWXwHT3pIDyGW9SQgnesSAGPPcttOXoKCArzM,18610
89
- simo/core/__pycache__/permissions.cpython-38.pyc,sha256=bO13B8uGCv4AiWNBoU2Gxt3mNuQ3gCxb7eKFihwFb5o,2974
89
+ simo/core/__pycache__/permissions.cpython-38.pyc,sha256=LXfbPrLm81oquflywAdK-a53-g7N1tkUuiePIdvk0ek,2974
90
90
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
91
- simo/core/__pycache__/serializers.cpython-38.pyc,sha256=d4wpUjFuo8GxaNWbin9GdHKik06IZN32uZL1SnXiL_s,19616
91
+ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=iMxzjjGq4OiUjyRNRb3z7bV2y1DVZf7kwLNAnmyItxg,19561
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=2LjlK_AA7b8_X-bnmAtdtxBqblyOCS8iytjwx_q8dt4,11228
95
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=A2qCdGJtaM1vpiM7LmzAMsuPkt5EG4vLzW2s0-WnklE,11220
96
96
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
97
- simo/core/__pycache__/views.cpython-38.pyc,sha256=K_QM967bIJeU02DJu0Dm7j8RiFDKn_TLzX77YzNkA7c,2495
97
+ simo/core/__pycache__/views.cpython-38.pyc,sha256=IRjbX3MwKkAb10sMIJ3esKZH8W-tHwnuzm-mLIT_NWc,2584
98
98
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
99
99
  simo/core/db_backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
100
  simo/core/db_backend/base.py,sha256=wY5jsZ8hQpwot3o-7JNtDe33xy-vlfMLXa011htDojI,601
@@ -10155,7 +10155,7 @@ simo/core/templates/admin/index.html,sha256=AJpt1FA4g6IAFQA99-3glJ88RmoWJ0YXBIz_
10155
10155
  simo/core/templates/admin/item_name_display.html,sha256=Y3zk-rc-y8_6dC6_WrSy6tx6Z-6IZzZ5w3a1hMxlpz4,357
10156
10156
  simo/core/templates/admin/msg_page.html,sha256=C1T9fniV7cIiSBQXRFcSAsbt5Y_fshf6T6ZAE1e8hNw,738
10157
10157
  simo/core/templates/admin/svg_file_widget.html,sha256=1QOz2RzwWn2FAnn44Zbg8v4EVgzBmmLA2bzyomm6ohk,202
10158
- simo/core/templates/admin/user_tools.html,sha256=VMEFNF8mMREW8wg525Wkgz8kP2PEw9jvlzK_WRgCEso,1595
10158
+ simo/core/templates/admin/user_tools.html,sha256=zkHNnrqvQduy3fNGQ6EmZvRNGTIUc9HW5Fqkh0sIZlc,1608
10159
10159
  simo/core/templates/admin/zone_table_row.html,sha256=4XCgDsnrvn6s9ac0_e74pPsjDFdVdtoSLTV3Y5oklis,119
10160
10160
  simo/core/templates/admin/controller_widgets/binary_sensor.html,sha256=PTwoLyppBIH8VL3-PKXCT4SWFQOeWqrzfsriWyROnzU,277
10161
10161
  simo/core/templates/admin/controller_widgets/button.html,sha256=PXlZ1KpSPeB77AOXZu_0yh_bA9M0OWyg5KO-KKHLzvg,289
@@ -10233,7 +10233,7 @@ simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
10233
10233
  simo/fleet/managers.py,sha256=ZNeHFSkF5kzsl9E1DCBevOW6kXJlD6kw0LU4B-JMOG8,828
10234
10234
  simo/fleet/models.py,sha256=zPplx_v64nfKBmb-nCb74aCVtEeY3m3SjEy-VhbnydU,17511
10235
10235
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10236
- simo/fleet/serializers.py,sha256=X2M0DFKVaxM6JFGDsdg3S2nJlLIcBvbujidZdfxD88w,2169
10236
+ simo/fleet/serializers.py,sha256=wY6q5zq6sIWPVnnyHT2Vhu3nxHJLWfYrSCcIKXJu_Ac,2411
10237
10237
  simo/fleet/socket_consumers.py,sha256=4hVSvFNq9Hi44R7JmaujFoEtgmH5YBST2cFYtIiMDRA,18840
10238
10238
  simo/fleet/tasks.py,sha256=NX_opj-rbkK9eeQMeRNwHj_ZJ0LC4rYOZovMg9_r0kA,904
10239
10239
  simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
@@ -10250,8 +10250,8 @@ simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnR
10250
10250
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=Vmm23zoQnS3-uS5_WJt2n3wtjhLiEhLWaYxXJCU6Gts,1339
10251
10251
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=WUahZgETWlem5rVXlJ_vINFRM7OZWp5xpWXGMoeBXsM,14131
10252
10252
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10253
- simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=gIWHJaSUbTe9H_xerD29Fz7BxIqXNzBI60GsIVXbNdY,3134
10254
- simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=Hk0RlHcHDwVbKA_U1UVlZ3dWclR4N9fptUp3ZrgdGRs,14025
10253
+ simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=YcEokBqi_5MXkIxhHmTmcqW0o8li5qntPfwwH2oa63A,3358
10254
+ simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=m8sJWln-uyjeTD-alyoNikEJcHCxZGTe2vXnMGVNZog,14170
10255
10255
  simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
10256
10256
  simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=obUd-X2Y-ybx4icqUWq_qwIxrP9yyarJjexWAfO4MTI,3344
10257
10257
  simo/fleet/__pycache__/views.cpython-38.pyc,sha256=wilxSvZliSKQ5qC7JjWneYBSdbeZeTsF5uDrOQVmvms,3181
@@ -10346,7 +10346,7 @@ simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LS
10346
10346
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10347
10347
  simo/generic/app_widgets.py,sha256=TPRLj4hri2hBuY6mrdwBiv-01z2hDxZmsup-GDD9LrM,953
10348
10348
  simo/generic/base_types.py,sha256=u3SlfpNYaCwkVBwomWgso4ODzL71ay9MhiAW-bxgnDU,341
10349
- simo/generic/controllers.py,sha256=i-xKQ5PrNKwCuO0dFaHHUaD5rF9lDnq18ziVSNBENao,50134
10349
+ simo/generic/controllers.py,sha256=QwmVXC3phIDYXAP98MtKbzHuamWPc1kVg9FQfjkP22g,50566
10350
10350
  simo/generic/forms.py,sha256=tCbIZtbruBHjZRzulGXJQOjmxaGJ2uoKqjT1scScdDQ,29004
10351
10351
  simo/generic/gateways.py,sha256=0gDjWSCAt6MABR6k8xV7N1zXutDLCileGtAm6pSl4Q4,16165
10352
10352
  simo/generic/models.py,sha256=Adq7ipWK-renxJlNW-SZnAq2oGEOwKx8EdUWaKnfcVQ,7597
@@ -10355,7 +10355,7 @@ simo/generic/socket_consumers.py,sha256=K2OjphIhKJH48BvfFfoCOyCQZ1NmXb_phs6y1IP-
10355
10355
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
10356
10356
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=YZ5db6-FPynBi6ooPW5crK9lZ6ymRh2DlGN6FwxfX4M,1820
10357
10357
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
10358
- simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=-Y3fV0gbkye9WgWpdNY7qG9VvMWpFUT7Spl1eukztgQ,33352
10358
+ simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=f0nzxm3U7pgmn7TbUOM3KfIWk50II2XeGbkCyFDix_w,33658
10359
10359
  simo/generic/__pycache__/forms.cpython-38.pyc,sha256=Dd-hgbRNdIFzUDjSZ4yQp7wwR-ILBYQFI8MCob_ZYwQ,21232
10360
10360
  simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=uubZtp-UgEmKU4vG9ophnCZFEDqmKkeY1yyWUXzdmdY,12015
10361
10361
  simo/generic/__pycache__/models.cpython-38.pyc,sha256=MZpum7syAFxuulf47K7gtUlJJ7xRD-IBUBAwUM1ZRnw,5825
@@ -10367,7 +10367,7 @@ simo/generic/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=xy_fN8vne
10367
10367
  simo/generic/migrations/__pycache__/__init__.cpython-38.pyc,sha256=nJV0NkIT8MuONj1hUX-V6aCU2lX3BXHyPjisapnBsPA,172
10368
10368
  simo/generic/scripting/__init__.py,sha256=aZZvNBae7unnux_zGHCIWCV2z47hVJc-DIL72Hqfkeo,600
10369
10369
  simo/generic/scripting/example.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10370
- simo/generic/scripting/helpers.py,sha256=JtGkx_ta5ZQSTsE7xgsyV3R-nM-jgcTKf3FHThLw82c,3887
10370
+ simo/generic/scripting/helpers.py,sha256=iP-fxxB8HsFQy3k2CjFubu86aMqvWgmh-p24DiyOrek,4330
10371
10371
  simo/generic/scripting/serializers.py,sha256=PjyFrjdPK1mBsgbNhyqMi9SWzcymqTa742ipy0LhAN4,1996
10372
10372
  simo/generic/scripting/__pycache__/__init__.cpython-38.pyc,sha256=eHncoNpv5dy35IO1_htWd8CK0sHFBnU_WJ0hl5TKOHQ,794
10373
10373
  simo/generic/scripting/__pycache__/helpers.cpython-38.pyc,sha256=34sa3L2cK1Aw636PCaoCYIWUBIE1h6XmbgDIto9cLeo,2757
@@ -10448,15 +10448,15 @@ simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.
10448
10448
  simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpython-38.pyc,sha256=awhD1F9RyK_706zVNM5io3WT_konFkKQgL7D5MkONwk,851
10449
10449
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10450
10450
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10451
- simo/users/admin.py,sha256=nmFNHWckp73YZN5MV6ez6ommlj4MSI1Sr8BnQdSKW5g,7187
10452
- simo/users/api.py,sha256=O3PYSk8BSX2hsi22cHSgqKQXViL9b3-xgBU2oJDfQGA,12443
10451
+ simo/users/admin.py,sha256=Vkx1KLHBRN7U5mgriOYolW-itcz0gi6x1qk7UdJP3ko,7229
10452
+ simo/users/api.py,sha256=S0Jmvxo8pWeaJ2fEF3zuMygrINTqwg3e080YMxEhTnU,13227
10453
10453
  simo/users/apps.py,sha256=cq0A8-U1HALEwev0TicgFhr4CAu7Icz8rwq0HfOaL4E,207
10454
10454
  simo/users/auth_backends.py,sha256=KIw2AdjCUKfm_7Lql6aC4qdE6JznP0ECIMA5MVMLeiM,4251
10455
10455
  simo/users/auto_urls.py,sha256=lcJvteBsbHQMJieZpDz-63tDYejLApqsW3CUnDakd7k,272
10456
10456
  simo/users/dynamic_settings.py,sha256=sEIsi4yJw3kH46Jq_aOkSuK7QTfQACGUE-lkyBogCaM,570
10457
10457
  simo/users/managers.py,sha256=OHgEP85MBtdkdYxdstBd8RavTBT8F_2WyDxUJ9aCqqM,246
10458
10458
  simo/users/middleware.py,sha256=GMCrnWSc_2qCleyQIkfQGdL-pU-UTEcSg1wPvIKZ9uk,1210
10459
- simo/users/models.py,sha256=y27FK7nSUiAwzmOVvRCZz532yMRuuBQR2znRmorQ1d8,19686
10459
+ simo/users/models.py,sha256=cmoPzz5e4Mymqf7Dwh8KBoR5D-wumHSj18rvb3LU9E4,19735
10460
10460
  simo/users/permissions.py,sha256=IwtYS8yQdupWbYKR9VimSRDV3qCJ2jXP57Lyjpb2EQM,242
10461
10461
  simo/users/serializers.py,sha256=zzw1KONTnaTNBaU0r4rNVxJ827KzD6Z5LuQt27ZsQ98,2516
10462
10462
  simo/users/sso_urls.py,sha256=gQOaPvGMYFD0NCVSwyoWO-mTEHe5j9sbzV_RK7kdvp0,251
@@ -10465,15 +10465,15 @@ simo/users/tasks.py,sha256=M8MDQ1oR6WXWoOP5SQYui-CsCIV0jUmfI84TbRgGKo8,1199
10465
10465
  simo/users/utils.py,sha256=-Lu7C_sz8JJauLaIwgEa6umArqzNL7JJTY-ZcuF4irA,2004
10466
10466
  simo/users/views.py,sha256=dOQVvmlHG7ihWKJLFUBcqKOA0UDctlMKR0pTc36JZqg,3487
10467
10467
  simo/users/__pycache__/__init__.cpython-38.pyc,sha256=VFoDJE_SKKaPqqYaaBYd1Ndb1hjakkTo_u0EG_XJ1GM,211
10468
- simo/users/__pycache__/admin.cpython-38.pyc,sha256=Jcwn0jqueQkmgXPb327-3iUtrSycGzM537JB_-sryOM,8213
10469
- simo/users/__pycache__/api.cpython-38.pyc,sha256=bwjxYhY4MBPbKLj-wJkTFZxHSqUE0fIC4Pw4lrHw9g4,9980
10468
+ simo/users/__pycache__/admin.cpython-38.pyc,sha256=lQHm_2V104pUoUj0xSEa28b542GO1QNd_jdH1ebxXqM,8233
10469
+ simo/users/__pycache__/api.cpython-38.pyc,sha256=3bN_V5SnBnvR5X5G_PFtLzyO3gFr_UuUVgX5cdVvzWk,10328
10470
10470
  simo/users/__pycache__/apps.cpython-38.pyc,sha256=dgbWL8CxzzISJQTmq_4IztPJ2UzykNVdqA2Ae1PmeGk,605
10471
10471
  simo/users/__pycache__/auth_backends.cpython-38.pyc,sha256=jYS2hlbTZh_ZtPeWcN50pc0IpyfCSO7_MvIbuVwEp8M,3144
10472
10472
  simo/users/__pycache__/auto_urls.cpython-38.pyc,sha256=K-3sz2h-cEitoflSmZk1t0eUg5mQMMGLNZFREVwG7_o,430
10473
10473
  simo/users/__pycache__/dynamic_settings.cpython-38.pyc,sha256=6F8JBjZkHykySnmZjNEzjS0ijbmPdcp9yUAZ5kqq_Fo,864
10474
10474
  simo/users/__pycache__/managers.cpython-38.pyc,sha256=O0Y8ABp42RAosrbODmYsPMaj9AyOPyJ-aqzuO0Qpi2s,679
10475
10475
  simo/users/__pycache__/middleware.cpython-38.pyc,sha256=Tj4nVEAvxEW3xA63fBRiJWRJpz_M848ZOqbHioc_IPE,1149
10476
- simo/users/__pycache__/models.cpython-38.pyc,sha256=0k1XtvS7y0Wga0FSb1bMSi6TUSzucDLsla_9dpYWg30,17681
10476
+ simo/users/__pycache__/models.cpython-38.pyc,sha256=XemTxwgZMpnoAXYryfY_H-g_xhVepqOU-ddCKJyPNCE,17710
10477
10477
  simo/users/__pycache__/permissions.cpython-38.pyc,sha256=ez5NxoL_JUeeH6GsKhvFreuA3FCBgGf9floSypdXUtM,633
10478
10478
  simo/users/__pycache__/serializers.cpython-38.pyc,sha256=Dy8RAcwNkNSXoJHvLp8fozURyHCtucqpSPyqZtbnMZc,3732
10479
10479
  simo/users/__pycache__/sso_urls.cpython-38.pyc,sha256=uAwDozpOmrhUald-8tOHANILXkH7-TI8fNYXOtPkSY8,402
@@ -10523,6 +10523,7 @@ simo/users/migrations/0039_auto_20241117_1039.py,sha256=e64AJM2ZId516Px-gmAxkp2N
10523
10523
  simo/users/migrations/0040_userdevicereportlog_location_smoothed_and_more.py,sha256=umGDjQGpCrQocNxaCvwdTsOmSxcRC61NcUdHGUczoc4,855
10524
10524
  simo/users/migrations/0041_userdevicereportlog_speed_kmh_received.py,sha256=WoJ-ImX1lNIl7CKO_HMt3jbFjoenFGBUm9HZWidb-eA,433
10525
10525
  simo/users/migrations/0042_remove_userdevicereportlog_location_smoothed_and_more.py,sha256=p-GFu6qjkxqeA0TI8aaIum0k6fQfc39RIKbfGPSf0Yk,499
10526
+ simo/users/migrations/0043_userdevicereportlog_avg_speed_kmh.py,sha256=DheQR-GsGMwNkya3rWHp6pOrNz7-ljnsbcU4e_7AVuE,435
10526
10527
  simo/users/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10527
10528
  simo/users/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=e4XOKaYRb7l0P7cBnHHi5FQQJMlwjK0g7iqgM-xKmNI,4215
10528
10529
  simo/users/migrations/__pycache__/0002_componentpermission.cpython-38.pyc,sha256=pknJnpic8p6Vdx9DX41FfODXNnvexDswJtUCmC5w1tg,995
@@ -10568,6 +10569,7 @@ simo/users/migrations/__pycache__/0039_auto_20241117_1039.cpython-38.pyc,sha256=
10568
10569
  simo/users/migrations/__pycache__/0040_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc,sha256=I0W00mt73gjKunnwAyf3kz1FKfgm2HRwCJY_ogATSS0,918
10569
10570
  simo/users/migrations/__pycache__/0041_userdevicereportlog_speed_kmh_received.cpython-38.pyc,sha256=XWC9Emcc1Bm498UZ-6Lo7-i2Vq77vndjMA9xRdJbdfU,676
10570
10571
  simo/users/migrations/__pycache__/0042_remove_userdevicereportlog_location_smoothed_and_more.cpython-38.pyc,sha256=sSnWjU7rg5LXlRCxUFb_m2lUIcB4EHgtAnl-C9MMJvE,656
10572
+ simo/users/migrations/__pycache__/0043_userdevicereportlog_avg_speed_kmh.cpython-38.pyc,sha256=ZkXpVQtjfMoX4WF5N8rioCVv77mNNGhu9g50EQEf03w,673
10571
10573
  simo/users/migrations/__pycache__/__init__.cpython-38.pyc,sha256=NKq7WLgktK8WV1oOqCPbAbdkrPV5GRGhYx4VxxI4dcs,170
10572
10574
  simo/users/templates/conf/mosquitto.conf,sha256=1eIGNuRu4Y3hfAU6qiWix648eCRrw0oOT24PnyFI4ys,189
10573
10575
  simo/users/templates/conf/mosquitto_acls.conf,sha256=ga44caTDNQE0CBKw55iM2jOuna6-9fKGwAhjyERZdRE,500
@@ -10577,9 +10579,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10577
10579
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10578
10580
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10579
10581
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10580
- simo-2.5.36.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10581
- simo-2.5.36.dist-info/METADATA,sha256=LHL9P0w6a2-u0ktXQc6PtLQbTfRhmMkGQfuY3NUMP2w,1953
10582
- simo-2.5.36.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10583
- simo-2.5.36.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10584
- simo-2.5.36.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10585
- simo-2.5.36.dist-info/RECORD,,
10582
+ simo-2.5.38.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10583
+ simo-2.5.38.dist-info/METADATA,sha256=zR1Dxup5v9iDYxUK1QuIM09D3UkHfXz4ocAGVhkzXPA,1953
10584
+ simo-2.5.38.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10585
+ simo-2.5.38.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10586
+ simo-2.5.38.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10587
+ simo-2.5.38.dist-info/RECORD,,
File without changes