simo 2.7.7__py3-none-any.whl → 2.7.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of simo might be problematic. Click here for more details.

Binary file
Binary file
simo/fleet/forms.py CHANGED
@@ -782,8 +782,9 @@ class ColonelPWMOutputConfigForm(ColonelComponentForm):
782
782
  help_text="easeOutSine - offers most naturally looking effect."
783
783
  )
784
784
  on_value = forms.FloatField(
785
- required=True, initial=100,
786
- help_text="ON value when used with toggle switch"
785
+ required=False,
786
+ help_text="Static ON value used to turn the light on with physical controls. <br>"
787
+ "Leaving this field empty turns the light on to the last used value."
787
788
  )
788
789
 
789
790
  slaves = Select2ModelMultipleChoiceField(
@@ -0,0 +1,31 @@
1
+ # Generated by Django 4.2.10 on 2024-12-03 09:30
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ def forwards_func(apps, schema_editor):
7
+ Component = apps.get_model("core", "Component")
8
+
9
+ for comp in Component.objects.filter(
10
+ controller_uid='simo.fleet.controllers.PWMOutput'
11
+ ):
12
+ for ctrl in comp.config.get('controls'):
13
+ if ctrl.get('method') == 'momentary':
14
+ comp.config['on_value'] = None
15
+ comp.save()
16
+ break
17
+
18
+
19
+ def reverse_func(apps, schema_editor):
20
+ pass
21
+
22
+
23
+ class Migration(migrations.Migration):
24
+
25
+ dependencies = [
26
+ ('fleet', '0043_auto_20241203_0930'),
27
+ ]
28
+
29
+ operations = [
30
+ migrations.RunPython(forwards_func, reverse_func, elidable=True),
31
+ ]
simo/fleet/views.py CHANGED
@@ -41,6 +41,12 @@ class PinsSelectAutocomplete(autocomplete.Select2QuerySetView):
41
41
  if not instance:
42
42
  return ColonelPin.objects.none()
43
43
 
44
+ if self.request.GET.get('value'):
45
+ return ColonelPin.objects.filter(
46
+ pk__in=self.request.GET['value'].split(','),
47
+ colonel__instance=instance
48
+ )
49
+
44
50
  try:
45
51
  colonel = Colonel.objects.get(
46
52
  pk=self.forwarded.get("colonel"), instance=instance
@@ -62,11 +68,7 @@ class PinsSelectAutocomplete(autocomplete.Select2QuerySetView):
62
68
  if self.forwarded.get('filters'):
63
69
  qs = qs.filter(**self.forwarded.get('filters'))
64
70
 
65
-
66
- if self.request.GET.get('value'):
67
- qs = qs.filter(pk__in=self.request.GET['value'].split(','))
68
- elif self.q:
69
- qs = search_queryset(qs, self.q, ('label', ))
71
+ qs = search_queryset(qs, self.q, ('label', ))
70
72
 
71
73
  return qs
72
74
 
@@ -1161,7 +1161,7 @@ class MainState(StateSelect):
1161
1161
  return False
1162
1162
 
1163
1163
 
1164
- def owner_phones_on_sleep(self):
1164
+ def owner_phones_on_sleep(self, all_phones=False):
1165
1165
  sleeping_phones_hour = self.component.config.get('sleeping_phones_hour')
1166
1166
  if sleeping_phones_hour is None:
1167
1167
  return False
@@ -1171,6 +1171,7 @@ class MainState(StateSelect):
1171
1171
 
1172
1172
  from simo.users.models import InstanceUser
1173
1173
 
1174
+ phones_on_charge = []
1174
1175
  for iuser in InstanceUser.objects.filter(
1175
1176
  is_active=True, role__is_owner=True,
1176
1177
  instance=self.component.zone.instance
@@ -1178,11 +1179,13 @@ class MainState(StateSelect):
1178
1179
  # skipping users that are not at home
1179
1180
  if not iuser.at_home:
1180
1181
  continue
1181
- if not iuser.phone_on_charge:
1182
- # at least one user's phone is not yet on charge
1183
- return False
1182
+ phones_on_charge.append(iuser.phone_on_charge)
1184
1183
 
1185
- return True
1184
+
1185
+ if all:
1186
+ return all(phones_on_charge)
1187
+ else:
1188
+ return any(phones_on_charge)
1186
1189
 
1187
1190
 
1188
1191
  # ----------- Dummy controllers -----------------------------
simo/generic/gateways.py CHANGED
@@ -379,18 +379,19 @@ class GenericGatewayHandler(BaseObjectCommandsGatewayHandler):
379
379
  state.send(new_state)
380
380
 
381
381
  if state.config.get('sleeping_phones_hour') is not None:
382
- sleep_time = state.owner_phones_on_sleep()
383
- if sleep_time and state.value != 'sleep':
384
- print(f"New main state of {state.zone.instance} - sleep")
385
- state.send('sleep')
386
- elif state.value == 'sleep':
387
- try:
388
- new_state = state.get_day_evening_night_morning()
389
- except:
390
- new_state = 'day'
391
- print(f"New main state of "
392
- f"{state.zone.instance} - {new_state}")
393
- state.send(new_state)
382
+ if state.value != 'sleep':
383
+ if state.owner_phones_on_sleep(True):
384
+ print(f"New main state of {state.zone.instance} - sleep")
385
+ state.send('sleep')
386
+ else:
387
+ if not state.owner_phones_on_sleep(False):
388
+ try:
389
+ new_state = state.get_day_evening_night_morning()
390
+ except:
391
+ new_state = 'day'
392
+ print(f"New main state of "
393
+ f"{state.zone.instance} - {new_state}")
394
+ state.send(new_state)
394
395
 
395
396
 
396
397
  def watch_main_states(self):
@@ -4,6 +4,7 @@ from .app_widgets import AudioPlayerWidget, VideoPlayerWidget
4
4
 
5
5
 
6
6
  class BasePlayer(Switch):
7
+ admin_widget_template = 'admin/controller_widgets/player.html'
7
8
  default_config = {
8
9
  'has_volume_control': True,
9
10
  }
@@ -50,19 +51,54 @@ class BasePlayer(Switch):
50
51
 
51
52
  def set_volume(self, val):
52
53
  assert 0 <= val <= 100
54
+ self.component.meta['volume'] = val
55
+ self.component.save()
53
56
  self.send({'set_volume': val})
54
57
 
55
58
  def get_volume(self):
56
59
  return self.component.meta['volume']
57
60
 
58
61
  def set_shuffle_play(self, val):
62
+ self.component.meta['shuffle'] = bool(val)
63
+ self.component.save()
59
64
  self.send({'shuffle': bool(val)})
60
65
 
61
66
  def set_loop_play(self, val):
67
+ self.component.meta['loop'] = bool(val)
68
+ self.component.save()
62
69
  self.send({'loop': bool(val)})
63
70
 
64
- def play_library_item(self, val):
65
- self.send({'play_from_library': val})
71
+ def play_library_item(self, id, volume=None, fade_in=None):
72
+ '''
73
+ :param id: Library item ID
74
+ :param volume: Volume to play at. Current volume will be used if not provided
75
+ :param fade_in: number of seconds to fade in
76
+ :return:
77
+ '''
78
+ self.send({'play_from_library': id, 'volume': volume, 'fade_in': fade_in})
79
+
80
+ def play_uri(self, uri, volume=None):
81
+ '''
82
+ Replace que with this single uri and play it immediately
83
+ :param uri: playable uri or url
84
+ :param volume: volume at which to play
85
+ :return:
86
+ '''
87
+ if volume:
88
+ assert 0 <= volume <= 100
89
+ self.send({"play_uri": uri, 'volume': volume})
90
+
91
+ def play_alert(self, val, volume=None):
92
+ '''
93
+ Plays alert and goes back to whatever was playing initially
94
+ :param val: Sound.id or uri
95
+ :param volume: volume at which to play
96
+ :return:
97
+ '''
98
+ assert type(val) in (int, str)
99
+ if volume:
100
+ assert 0 <= volume <= 100
101
+ self.send({"alert": val, 'volume': volume})
66
102
 
67
103
  def toggle(self):
68
104
  if self.component.value == 'playing':
@@ -0,0 +1,11 @@
1
+ <div class="component-controller" data-ws_url="{{ obj.get_socket_url|default_if_none:"" }}">
2
+ {% if obj.value == 'playing' %}
3
+ <i class="fas fa-toggle-on fa-2x component_switch action"
4
+ data-method="pause"
5
+ ></i>
6
+ {% else %}
7
+ <i class="fas fa-toggle-off fa-2x component_switch action"
8
+ data-method="play"
9
+ ></i>
10
+ {% endif %}
11
+ </div>
@@ -1,4 +1,6 @@
1
- from simo.core.middleware import get_current_instance
1
+ from simo.core.middleware import (
2
+ get_current_instance, drop_current_instance, introduce_instance
3
+ )
2
4
  from .models import Notification, UserNotification
3
5
 
4
6
 
@@ -12,6 +14,7 @@ def notify_users(severity, title, body=None, component=None, instance_users=None
12
14
  :param instance_users: List of instance users to receive this notification. All active instance users will receive the message if not specified.
13
15
  :return:
14
16
  '''
17
+ current_instance = get_current_instance()
15
18
  if not instance:
16
19
  if component:
17
20
  instance = component.zone.instance
@@ -19,6 +22,7 @@ def notify_users(severity, title, body=None, component=None, instance_users=None
19
22
  instance = get_current_instance()
20
23
  if not instance:
21
24
  return
25
+ drop_current_instance()
22
26
  if component and component.zone.instance != instance:
23
27
  # something is completely wrong!
24
28
  return
@@ -45,3 +49,6 @@ def notify_users(severity, title, body=None, component=None, instance_users=None
45
49
  user=iuser.user, notification=notification,
46
50
  )
47
51
  notification.dispatch()
52
+ if current_instance:
53
+ introduce_instance(current_instance)
54
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.7.7
3
+ Version: 2.7.9
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
@@ -22,7 +22,7 @@ simo/automation/serializers.py,sha256=PjyFrjdPK1mBsgbNhyqMi9SWzcymqTa742ipy0LhAN
22
22
  simo/automation/state.py,sha256=aZZvNBae7unnux_zGHCIWCV2z47hVJc-DIL72Hqfkeo,600
23
23
  simo/automation/__pycache__/__init__.cpython-38.pyc,sha256=YmP0xAD-mxpQHgdTZeC64sXChA8TriMZD1jckNYi3xg,164
24
24
  simo/automation/__pycache__/app_widgets.cpython-38.pyc,sha256=7DfUA9V_1MiwrOe_ta-ts8dYY8xXb9UMg2_9A3XoRcs,523
25
- simo/automation/__pycache__/controllers.cpython-38.pyc,sha256=m-c96x4Pl4uui7VyE34NrWYQFay2L9o7IYWWbCK1LSs,8391
25
+ simo/automation/__pycache__/controllers.cpython-38.pyc,sha256=CL-0Tq9B4-E36fYfWT1XEBTq1dkq1W8003f6MrBnQU0,8391
26
26
  simo/automation/__pycache__/forms.cpython-38.pyc,sha256=cpA5hA2Iz3JsPC0Dq01ki1I7S9c5DKRcXveHApI1dJo,7772
27
27
  simo/automation/__pycache__/gateways.cpython-38.pyc,sha256=K8y3DNQFfcEQiLTgHl5p0Uk58R5QCuqFCluvbQ6I_9g,10652
28
28
  simo/automation/__pycache__/helpers.cpython-38.pyc,sha256=4VSSarOFnUk_KExWwvDlx5dEhv8aHUCHMZDtGG--pUY,3627
@@ -120,7 +120,7 @@ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=xegjaPbTp71RK9pfle_vgbHi
120
120
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=v-qSKC9KX--aw9-vSNX8z8HXNFr0yOII0Aw8JxrYM0U,4920
121
121
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=KqbO1cOewodVPcy0-htVefyUjCuELKV0o7fOfYqfgPc,8490
122
122
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=9R1Xu0FJDflfRXUPsqEgt0SpwiP7FGk7HaR8s8XRyI8,721
123
- simo/core/__pycache__/tasks.cpython-38.pyc,sha256=GFIC8IsQ_bK4rgNRl_oGbMCQHhbcgGS7dx-rjPcLy08,11220
123
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=-J2is-l5XsfhamreN2TPQDTK-Jw6XGYL81bcVfjXsU8,11213
124
124
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
125
125
  simo/core/__pycache__/views.cpython-38.pyc,sha256=IRjbX3MwKkAb10sMIJ3esKZH8W-tHwnuzm-mLIT_NWc,2584
126
126
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
@@ -10259,7 +10259,7 @@ simo/fleet/auto_urls.py,sha256=vrfrooPyY4pDuQjya-eLxCgZldfhwbEeEiXa7diO_CY,847
10259
10259
  simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
10260
10260
  simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
10261
10261
  simo/fleet/controllers.py,sha256=PezfOT-1N_UONSsbyTXEIyGO6Po57KdEBRv4yzk_sw0,28605
10262
- simo/fleet/forms.py,sha256=cA0iqixII5k9LUqbMPWzTyvfu9SNH23ChH_Mt6C6Ggk,66913
10262
+ simo/fleet/forms.py,sha256=CHSmIz9bsdyukyTQnU5t554ggriWJjjwoBQe68l4FKI,67022
10263
10263
  simo/fleet/gateways.py,sha256=C7dyapWDlJ5erYPNLkSoH50I8kj0lIXicSno0_CrdXc,5783
10264
10264
  simo/fleet/managers.py,sha256=ZNeHFSkF5kzsl9E1DCBevOW6kXJlD6kw0LU4B-JMOG8,828
10265
10265
  simo/fleet/models.py,sha256=zPplx_v64nfKBmb-nCb74aCVtEeY3m3SjEy-VhbnydU,17511
@@ -10268,7 +10268,7 @@ simo/fleet/serializers.py,sha256=PQnjp7LaEpMts-om2OPV5XOU9ut6KFWiePPDCXK0M98,267
10268
10268
  simo/fleet/socket_consumers.py,sha256=3Ayry0PJgP5K2V7c-4a11QFOxfM8lOSXfIVhaBB8wTM,18820
10269
10269
  simo/fleet/tasks.py,sha256=NX_opj-rbkK9eeQMeRNwHj_ZJ0LC4rYOZovMg9_r0kA,904
10270
10270
  simo/fleet/utils.py,sha256=wNJvURzLP3-aho3D3rfg07N9kWCaMIw5gOsmeeO9Nlg,4740
10271
- simo/fleet/views.py,sha256=ao1e5ZAkQDZ2AuGiPYTbfgxgH_9efRwnTkk-ZjwnpPc,5122
10271
+ simo/fleet/views.py,sha256=3F8im6BsSOaK3KEuBNESE4sDbS_dWHYaOdhTR4cCLjE,5189
10272
10272
  simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
10273
10273
  simo/fleet/__pycache__/admin.cpython-38.pyc,sha256=iweeu5AkaggBhQntP6-VF_eEodkNc6E7zKy0VjfwC2o,6652
10274
10274
  simo/fleet/__pycache__/api.cpython-38.pyc,sha256=rZ1mkfkaMBEXhi9sw_jTKdk2CPJhBNxoImtjQ3Rf1VY,4016
@@ -10276,7 +10276,7 @@ simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=jHsvfwAumiBusr91QK1-qC-nm
10276
10276
  simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
10277
10277
  simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
10278
10278
  simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=vH7mK1K4JBcLU9eKtqTJwbgB0SFMJ-s7WvO0qOsWjrg,24739
10279
- simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=lNb_jc66-aO1NkYIJs4TWOX7uS8H2a8oCP-HCLJZoNY,45169
10279
+ simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=NkchZIvx79WswYepd8IgWwI7Pu3hd4sPkhsWt79YOII,45304
10280
10280
  simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=MIpXuGWitGNdsxJ99fWvMXJ6sVE96ac7iR4K4aM4Sds,5148
10281
10281
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=Vmm23zoQnS3-uS5_WJt2n3wtjhLiEhLWaYxXJCU6Gts,1339
10282
10282
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=AXk1Q_nnHDXirHYgM3EW5pLsrR2CaPWk4EuvGCuDUpI,14131
@@ -10329,6 +10329,7 @@ simo/fleet/migrations/0040_alter_colonel_pwm_frequency.py,sha256=AiiYeLXEmBAFj1O
10329
10329
  simo/fleet/migrations/0041_alter_colonel_instance_and_more.py,sha256=r3PzZERt4kM0ul_TFl-i7qS7n0ht0G8jS83nucMxZfQ,1181
10330
10330
  simo/fleet/migrations/0042_auto_20241120_1028.py,sha256=nXyOXyTqhYfR2IDpIX0E3oIhKI7ShI7TGZ0Uf1CzR1U,715
10331
10331
  simo/fleet/migrations/0043_auto_20241203_0930.py,sha256=wYfYEBurHB5pGOgL6M-z9EoOZGhW9glhT3BpNiMDoH4,651
10332
+ simo/fleet/migrations/0044_auto_20241210_0707.py,sha256=HJDLZWX84rlCN5vO3VGr8-TQLFIDT3pWmWwc-2BG67Q,746
10332
10333
  simo/fleet/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10333
10334
  simo/fleet/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=9kc1UyMEYkRNVnZ7iwZbiW1t3qWXROvWrI2G1BdzIaA,1250
10334
10335
  simo/fleet/migrations/__pycache__/0002_auto_20220422_0743.cpython-38.pyc,sha256=8oxhGb7rL8QYKlBLU3pOYcd8aHeQWDB9I8awkK04mXg,841
@@ -10379,18 +10380,18 @@ simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LS
10379
10380
  simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10380
10381
  simo/generic/app_widgets.py,sha256=y8W3jR76Hh26O9pPQyg2SophMbYIOtAWD33MPKbB8Mg,856
10381
10382
  simo/generic/base_types.py,sha256=u3SlfpNYaCwkVBwomWgso4ODzL71ay9MhiAW-bxgnDU,341
10382
- simo/generic/controllers.py,sha256=B4C6vEk1lzAqjxZ7s7uoM4_qQgomEqy_STCrOoSninM,46059
10383
+ simo/generic/controllers.py,sha256=Y-juxa7OSz24XYysFe785DCHPlbGeEurGTkK471S3iI,46123
10383
10384
  simo/generic/forms.py,sha256=ikSwn6hg6m4XoaWyZNydw9e5aoFRHxbeM8tWsyYlen4,22993
10384
- simo/generic/gateways.py,sha256=ZlxBKbsjcKXDrQk3MsoNLsHBUUmgqP8KUVuBKtfG784,15809
10385
+ simo/generic/gateways.py,sha256=SBQPlcU2oNCWzRQ1H1XWQ11O2E3zWDNImXlWNDzKg-Y,15865
10385
10386
  simo/generic/models.py,sha256=Adq7ipWK-renxJlNW-SZnAq2oGEOwKx8EdUWaKnfcVQ,7597
10386
10387
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10387
10388
  simo/generic/socket_consumers.py,sha256=K2OjphIhKJH48BvfFfoCOyCQZ1NmXb_phs6y1IP-qaQ,1757
10388
10389
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
10389
10390
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=D9b13pbMlirgHmjDnQhfLIDGSVINoSouHb4SWOeCRrs,1642
10390
10391
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
10391
- simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=ccYZ7AknZbPK_fTHO5lUO-steSeZeudQIynMkh1Gm7M,30116
10392
- simo/generic/__pycache__/forms.cpython-38.pyc,sha256=2rmamwhD9wdrW2zO73oAAbeAMZiJqGKB1lizwTRuGZs,17258
10393
- simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=QtQhcRm_UNBEyLyGfb_bxmS6JZ9S0aeOhEVzAAAWXds,11356
10392
+ simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=tRYKQsZuWBBKXbfd32BGz3AsV4Jz4y-KsEkumoRP_T4,30195
10393
+ simo/generic/__pycache__/forms.cpython-38.pyc,sha256=at1PQBgwr11YzSiTP92v3nyz1G59oKhu7vTa0sK0zUE,17289
10394
+ simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=7Y190Iylo2X2AykcKrKzVllfDmW02B5suRMlcS0y6KQ,11712
10394
10395
  simo/generic/__pycache__/models.cpython-38.pyc,sha256=MZpum7syAFxuulf47K7gtUlJJ7xRD-IBUBAwUM1ZRnw,5825
10395
10396
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10396
10397
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=qJO5kvQLWhsQDOr1AtAtsAybuRWioxSkQei3Pc7rdP0,1737
@@ -10430,7 +10431,7 @@ simo/multimedia/admin.py,sha256=GgXiKTLfi3omjBurU-bKgneJRK-tAeiR8o2jo3zD7zs,1002
10430
10431
  simo/multimedia/api.py,sha256=mZ5BTggWdc_kL8P70JGC3rTCiZKPnxWYoyNcAQkFnX4,285
10431
10432
  simo/multimedia/app_widgets.py,sha256=g_IPx5bNmIS6JbaXXDCzYZYV2KVKAiYvWjH4oI30lWM,331
10432
10433
  simo/multimedia/base_types.py,sha256=dAP7_uh_b3A03yXBJZyQdRFucKIro4_RkIZ5yOaWXVE,151
10433
- simo/multimedia/controllers.py,sha256=kaoi-nv9b6O87k1eijgk-6ub0-E2KdTN1lL99OPGpo8,1993
10434
+ simo/multimedia/controllers.py,sha256=U8AuSW-jXYBwFm9960L9bYDlgmHswP7HKxcNd1Mt5NI,3304
10434
10435
  simo/multimedia/forms.py,sha256=oMCVUXRNiESrY3w_uBLRRgjMjx8BrmNeVglzorA9QtY,239
10435
10436
  simo/multimedia/models.py,sha256=5aWGLWDdCkekGAOGZIdanvX1l6ULnhgJN4JAvDZT4nQ,734
10436
10437
  simo/multimedia/requirements.txt,sha256=QeIhjf1RfNGCYn_WZm3VuinPI2wK31WEJPbCxRWxssY,28
@@ -10454,12 +10455,13 @@ simo/multimedia/migrations/__pycache__/0002_sound_length.cpython-38.pyc,sha256=5
10454
10455
  simo/multimedia/migrations/__pycache__/0003_alter_sound_length.cpython-38.pyc,sha256=dkdqLx_cWLAxxVCUxuuAX39iTv7G5kG-PhJ40HsPzx8,669
10455
10456
  simo/multimedia/migrations/__pycache__/0004_auto_20231023_1055.cpython-38.pyc,sha256=tX6x1gNeVcUHcCFvisP9Z2jPBE029TJG632fvtvUjV8,892
10456
10457
  simo/multimedia/migrations/__pycache__/__init__.cpython-38.pyc,sha256=mCgSiQBphL85imdWyTi9-4zBDYF6HfXbhB0ycSPVVuA,175
10458
+ simo/multimedia/templates/admin/controller_widgets/player.html,sha256=v4PFoL37-C7L6ILZI6yF5ff9iO3EnEs5kXbRayaHy0s,358
10457
10459
  simo/notifications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10458
10460
  simo/notifications/admin.py,sha256=WQbN_bd2KRxVjbOajeworNrV9QlDNSadQT58La0Nn2M,1174
10459
10461
  simo/notifications/api.py,sha256=QrfFn5kBU0vlqi8X368w1-0iTmDGu_hmMxLW2R0OTTg,1765
10460
10462
  simo/notifications/models.py,sha256=QGDLGAi5gk8OTcvd7ho5WNdctDymWGmGF1ZqN4-G_ZA,2443
10461
10463
  simo/notifications/serializers.py,sha256=altDEAPWwOhxRcEzE9-34jL8EFpyf3vPoEdAPoVLfGc,523
10462
- simo/notifications/utils.py,sha256=uBl-Y7WGu00iaGM5rrdogcq0OMRVtyVfJF39-mdB3_k,1853
10464
+ simo/notifications/utils.py,sha256=RnvwKFGZ6e34ishUWHfZq4m3H6XFxFbRF4NQCi2LT-E,2049
10463
10465
  simo/notifications/__pycache__/__init__.cpython-38.pyc,sha256=YvucUfu98XFvEEg1LYFMlOZJpo_jSGxTVrM-ylAFLOg,167
10464
10466
  simo/notifications/__pycache__/admin.cpython-38.pyc,sha256=MScNrtVM1wavefsPfxy0A7LVyXKcbvEkLH9GJkgNOl8,1945
10465
10467
  simo/notifications/__pycache__/api.cpython-38.pyc,sha256=eQmCHwTnr4zQ3ZY_SKZVCryiSEnzmyIjHQM13pZ5LT0,2071
@@ -10606,9 +10608,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10606
10608
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10607
10609
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10608
10610
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10609
- simo-2.7.7.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10610
- simo-2.7.7.dist-info/METADATA,sha256=W1qgQXe6c87xWycPgFJRemCSruU2t0BpDNpZSk-duok,1952
10611
- simo-2.7.7.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10612
- simo-2.7.7.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10613
- simo-2.7.7.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10614
- simo-2.7.7.dist-info/RECORD,,
10611
+ simo-2.7.9.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10612
+ simo-2.7.9.dist-info/METADATA,sha256=jHAhp_0GQNyZhG5GjyR2Y60aZaxf0qFH5aFlP-qatmo,1952
10613
+ simo-2.7.9.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10614
+ simo-2.7.9.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10615
+ simo-2.7.9.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10616
+ simo-2.7.9.dist-info/RECORD,,
File without changes