simo 2.5.11__py3-none-any.whl → 2.5.13__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__/api.cpython-38.pyc +0 -0
- simo/core/__pycache__/autocomplete_views.cpython-38.pyc +0 -0
- simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
- simo/core/__pycache__/signal_receivers.cpython-38.pyc +0 -0
- simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
- simo/core/api.py +5 -5
- simo/core/migrations/0043_alter_category_instance_alter_instance_timezone_and_more.py +29 -0
- simo/core/migrations/__pycache__/0043_alter_category_instance_alter_instance_timezone_and_more.cpython-38.pyc +0 -0
- simo/core/serializers.py +8 -8
- simo/core/signal_receivers.py +2 -2
- simo/core/tasks.py +6 -9
- simo/fleet/__pycache__/api.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/models.cpython-38.pyc +0 -0
- simo/fleet/__pycache__/serializers.cpython-38.pyc +0 -0
- simo/fleet/api.py +22 -3
- simo/fleet/migrations/0041_alter_colonel_instance_and_more.py +31 -0
- simo/fleet/migrations/__pycache__/0041_alter_colonel_instance_and_more.cpython-38.pyc +0 -0
- simo/fleet/models.py +52 -36
- simo/fleet/serializers.py +2 -4
- simo/generic/__pycache__/app_widgets.cpython-38.pyc +0 -0
- simo/generic/__pycache__/base_types.cpython-38.pyc +0 -0
- simo/generic/__pycache__/controllers.cpython-38.pyc +0 -0
- simo/generic/__pycache__/forms.cpython-38.pyc +0 -0
- simo/generic/app_widgets.py +3 -3
- simo/generic/base_types.py +1 -1
- simo/generic/controllers.py +9 -9
- simo/generic/forms.py +9 -9
- simo/generic/migrations/0001_initial.py +29 -0
- simo/generic/migrations/__init__.py +0 -0
- simo/generic/migrations/__pycache__/__init__.cpython-38.pyc +0 -0
- simo/generic/templates/admin/controller_widgets/{weather_forecast.html → weather.html} +1 -1
- simo/notifications/__pycache__/models.cpython-38.pyc +0 -0
- simo/notifications/migrations/0003_alter_notification_instance.py +20 -0
- simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpython-38.pyc +0 -0
- simo/notifications/models.py +3 -5
- {simo-2.5.11.dist-info → simo-2.5.13.dist-info}/METADATA +1 -1
- {simo-2.5.11.dist-info → simo-2.5.13.dist-info}/RECORD +41 -32
- {simo-2.5.11.dist-info → simo-2.5.13.dist-info}/LICENSE.md +0 -0
- {simo-2.5.11.dist-info → simo-2.5.13.dist-info}/WHEEL +0 -0
- {simo-2.5.11.dist-info → simo-2.5.13.dist-info}/entry_points.txt +0 -0
- {simo-2.5.11.dist-info → simo-2.5.13.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/core/api.py
CHANGED
|
@@ -151,13 +151,13 @@ def get_components_queryset(instance, user):
|
|
|
151
151
|
|
|
152
152
|
c_ids = set()
|
|
153
153
|
|
|
154
|
-
from simo.generic.controllers import
|
|
154
|
+
from simo.generic.controllers import Weather
|
|
155
155
|
|
|
156
156
|
if instance.indoor_climate_sensor:
|
|
157
157
|
c_ids.add(instance.indoor_climate_sensor.id)
|
|
158
158
|
wf_c = Component.objects.filter(
|
|
159
159
|
zone__instance=instance,
|
|
160
|
-
controller_uid=
|
|
160
|
+
controller_uid=Weather.uid, config__is_main=True
|
|
161
161
|
).values('id').first()
|
|
162
162
|
if wf_c:
|
|
163
163
|
c_ids.add(wf_c['id'])
|
|
@@ -532,12 +532,12 @@ class SettingsViewSet(InstanceMixin, viewsets.GenericViewSet):
|
|
|
532
532
|
if last_history_event:
|
|
533
533
|
last_event = last_history_event.date.timestamp()
|
|
534
534
|
|
|
535
|
-
from simo.generic.controllers import
|
|
535
|
+
from simo.generic.controllers import Weather
|
|
536
536
|
|
|
537
537
|
wf_comp_id = None
|
|
538
538
|
wf_c = Component.objects.filter(
|
|
539
539
|
zone__instance=self.instance,
|
|
540
|
-
controller_uid=
|
|
540
|
+
controller_uid=Weather.uid, config__is_main=True
|
|
541
541
|
).first()
|
|
542
542
|
if wf_c:
|
|
543
543
|
wf_comp_id = wf_c.id
|
|
@@ -566,7 +566,7 @@ class SettingsViewSet(InstanceMixin, viewsets.GenericViewSet):
|
|
|
566
566
|
'timezone': self.instance.timezone,
|
|
567
567
|
'location': self.instance.location,
|
|
568
568
|
'last_event': last_event,
|
|
569
|
-
'
|
|
569
|
+
'weather': wf_comp_id,
|
|
570
570
|
'main_alarm_group': main_alarm_group_id,
|
|
571
571
|
'main_state': main_state,
|
|
572
572
|
# TODO: Remove these two when the app is updated for everybody.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Generated by Django 4.2.10 on 2024-11-04 10:01
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
import django.db.models.deletion
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('core', '0042_alter_instance_timezone'),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
migrations.AlterField(
|
|
15
|
+
model_name='category',
|
|
16
|
+
name='instance',
|
|
17
|
+
field=models.ForeignKey(limit_choices_to={'is_active': True}, on_delete=django.db.models.deletion.CASCADE, to='core.instance'),
|
|
18
|
+
),
|
|
19
|
+
migrations.AlterField(
|
|
20
|
+
model_name='instance',
|
|
21
|
+
name='timezone',
|
|
22
|
+
field=models.CharField(choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Asmera', 'Africa/Asmera'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Timbuktu', 'Africa/Timbuktu'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/ComodRivadavia', 'America/Argentina/ComodRivadavia'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Atka', 'America/Atka'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Buenos_Aires', 'America/Buenos_Aires'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Catamarca', 'America/Catamarca'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Ciudad_Juarez', 'America/Ciudad_Juarez'), ('America/Coral_Harbour', 'America/Coral_Harbour'), ('America/Cordoba', 'America/Cordoba'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Ensenada', 'America/Ensenada'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fort_Wayne', 'America/Fort_Wayne'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Godthab', 'America/Godthab'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Indianapolis', 'America/Indianapolis'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Jujuy', 'America/Jujuy'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Knox_IN', 'America/Knox_IN'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Louisville', 'America/Louisville'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Mendoza', 'America/Mendoza'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montreal', 'America/Montreal'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Acre', 'America/Porto_Acre'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Rosario', 'America/Rosario'), ('America/Santa_Isabel', 'America/Santa_Isabel'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Shiprock', 'America/Shiprock'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Virgin', 'America/Virgin'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/South_Pole', 'Antarctica/South_Pole'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Ashkhabad', 'Asia/Ashkhabad'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Calcutta', 'Asia/Calcutta'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Chongqing', 'Asia/Chongqing'), ('Asia/Chungking', 'Asia/Chungking'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Dacca', 'Asia/Dacca'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Harbin', 'Asia/Harbin'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Istanbul', 'Asia/Istanbul'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kashgar', 'Asia/Kashgar'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Katmandu', 'Asia/Katmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macao', 'Asia/Macao'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Rangoon', 'Asia/Rangoon'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Saigon', 'Asia/Saigon'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Tel_Aviv', 'Asia/Tel_Aviv'), ('Asia/Thimbu', 'Asia/Thimbu'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ujung_Pandang', 'Asia/Ujung_Pandang'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Ulan_Bator', 'Asia/Ulan_Bator'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faeroe', 'Atlantic/Faeroe'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Jan_Mayen', 'Atlantic/Jan_Mayen'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/ACT', 'Australia/ACT'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Canberra', 'Australia/Canberra'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/LHI', 'Australia/LHI'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/NSW', 'Australia/NSW'), ('Australia/North', 'Australia/North'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Queensland', 'Australia/Queensland'), ('Australia/South', 'Australia/South'), ('Australia/Sydney', 'Australia/Sydney'), ('Australia/Tasmania', 'Australia/Tasmania'), ('Australia/Victoria', 'Australia/Victoria'), ('Australia/West', 'Australia/West'), ('Australia/Yancowinna', 'Australia/Yancowinna'), ('Brazil/Acre', 'Brazil/Acre'), ('Brazil/DeNoronha', 'Brazil/DeNoronha'), ('Brazil/East', 'Brazil/East'), ('Brazil/West', 'Brazil/West'), ('CET', 'CET'), ('CST6CDT', 'CST6CDT'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Canada/Saskatchewan', 'Canada/Saskatchewan'), ('Canada/Yukon', 'Canada/Yukon'), ('Chile/Continental', 'Chile/Continental'), ('Chile/EasterIsland', 'Chile/EasterIsland'), ('Cuba', 'Cuba'), ('EET', 'EET'), ('EST', 'EST'), ('EST5EDT', 'EST5EDT'), ('Egypt', 'Egypt'), ('Eire', 'Eire'), ('Etc/GMT', 'Etc/GMT'), ('Etc/GMT+0', 'Etc/GMT+0'), ('Etc/GMT+1', 'Etc/GMT+1'), ('Etc/GMT+10', 'Etc/GMT+10'), ('Etc/GMT+11', 'Etc/GMT+11'), ('Etc/GMT+12', 'Etc/GMT+12'), ('Etc/GMT+2', 'Etc/GMT+2'), ('Etc/GMT+3', 'Etc/GMT+3'), ('Etc/GMT+4', 'Etc/GMT+4'), ('Etc/GMT+5', 'Etc/GMT+5'), ('Etc/GMT+6', 'Etc/GMT+6'), ('Etc/GMT+7', 'Etc/GMT+7'), ('Etc/GMT+8', 'Etc/GMT+8'), ('Etc/GMT+9', 'Etc/GMT+9'), ('Etc/GMT-0', 'Etc/GMT-0'), ('Etc/GMT-1', 'Etc/GMT-1'), ('Etc/GMT-10', 'Etc/GMT-10'), ('Etc/GMT-11', 'Etc/GMT-11'), ('Etc/GMT-12', 'Etc/GMT-12'), ('Etc/GMT-13', 'Etc/GMT-13'), ('Etc/GMT-14', 'Etc/GMT-14'), ('Etc/GMT-2', 'Etc/GMT-2'), ('Etc/GMT-3', 'Etc/GMT-3'), ('Etc/GMT-4', 'Etc/GMT-4'), ('Etc/GMT-5', 'Etc/GMT-5'), ('Etc/GMT-6', 'Etc/GMT-6'), ('Etc/GMT-7', 'Etc/GMT-7'), ('Etc/GMT-8', 'Etc/GMT-8'), ('Etc/GMT-9', 'Etc/GMT-9'), ('Etc/GMT0', 'Etc/GMT0'), ('Etc/Greenwich', 'Etc/Greenwich'), ('Etc/UCT', 'Etc/UCT'), ('Etc/UTC', 'Etc/UTC'), ('Etc/Universal', 'Etc/Universal'), ('Etc/Zulu', 'Etc/Zulu'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belfast', 'Europe/Belfast'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Kyiv', 'Europe/Kyiv'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Nicosia', 'Europe/Nicosia'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Tiraspol', 'Europe/Tiraspol'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('GB', 'GB'), ('GB-Eire', 'GB-Eire'), ('GMT', 'GMT'), ('GMT+0', 'GMT+0'), ('GMT-0', 'GMT-0'), ('GMT0', 'GMT0'), ('Greenwich', 'Greenwich'), ('HST', 'HST'), ('Hongkong', 'Hongkong'), ('Iceland', 'Iceland'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Iran', 'Iran'), ('Israel', 'Israel'), ('Jamaica', 'Jamaica'), ('Japan', 'Japan'), ('Kwajalein', 'Kwajalein'), ('Libya', 'Libya'), ('MET', 'MET'), ('MST', 'MST'), ('MST7MDT', 'MST7MDT'), ('Mexico/BajaNorte', 'Mexico/BajaNorte'), ('Mexico/BajaSur', 'Mexico/BajaSur'), ('Mexico/General', 'Mexico/General'), ('NZ', 'NZ'), ('NZ-CHAT', 'NZ-CHAT'), ('Navajo', 'Navajo'), ('PRC', 'PRC'), ('PST8PDT', 'PST8PDT'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Johnston', 'Pacific/Johnston'), ('Pacific/Kanton', 'Pacific/Kanton'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Ponape', 'Pacific/Ponape'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Samoa', 'Pacific/Samoa'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Truk', 'Pacific/Truk'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('Pacific/Yap', 'Pacific/Yap'), ('Poland', 'Poland'), ('Portugal', 'Portugal'), ('ROC', 'ROC'), ('ROK', 'ROK'), ('Singapore', 'Singapore'), ('Turkey', 'Turkey'), ('UCT', 'UCT'), ('US/Alaska', 'US/Alaska'), ('US/Aleutian', 'US/Aleutian'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/East-Indiana', 'US/East-Indiana'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Indiana-Starke', 'US/Indiana-Starke'), ('US/Michigan', 'US/Michigan'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('US/Samoa', 'US/Samoa'), ('UTC', 'UTC'), ('Universal', 'Universal'), ('W-SU', 'W-SU'), ('WET', 'WET'), ('Zulu', 'Zulu')], db_index=True, default='UTC', max_length=50),
|
|
23
|
+
),
|
|
24
|
+
migrations.AlterField(
|
|
25
|
+
model_name='zone',
|
|
26
|
+
name='instance',
|
|
27
|
+
field=models.ForeignKey(limit_choices_to={'is_active': True}, on_delete=django.db.models.deletion.CASCADE, related_name='zones', to='core.instance'),
|
|
28
|
+
),
|
|
29
|
+
]
|
|
Binary file
|
simo/core/serializers.py
CHANGED
|
@@ -28,7 +28,6 @@ from .models import Category, Zone, Icon, ComponentHistory
|
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
|
|
32
31
|
class TimestampField(serializers.Field):
|
|
33
32
|
|
|
34
33
|
def to_representation(self, value):
|
|
@@ -88,13 +87,12 @@ class ObjectSerializerMethodField(serializers.SerializerMethodField):
|
|
|
88
87
|
class FormsetPrimaryKeyRelatedField(PrimaryKeyRelatedField):
|
|
89
88
|
|
|
90
89
|
def get_attribute(self, instance):
|
|
90
|
+
print("f{instance} SOURCE FORMSET ATTRIBUTES: ", self.source_attrs)
|
|
91
91
|
return self.queryset.model.objects.filter(
|
|
92
92
|
pk=instance.get(self.source_attrs[0], -1)
|
|
93
93
|
).first()
|
|
94
94
|
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
98
96
|
# TODO: if form field has initial value and is required, it is serialized as not required field, howerver when trying to submit it fails with a message, that field is required.
|
|
99
97
|
|
|
100
98
|
class HiddenSerializerField(serializers.CharField):
|
|
@@ -104,9 +102,11 @@ class HiddenSerializerField(serializers.CharField):
|
|
|
104
102
|
class TextAreaSerializerField(serializers.CharField):
|
|
105
103
|
pass
|
|
106
104
|
|
|
105
|
+
|
|
107
106
|
class ComponentPrimaryKeyRelatedField(PrimaryKeyRelatedField):
|
|
108
107
|
|
|
109
108
|
def get_attribute(self, instance):
|
|
109
|
+
print(f"{instance} SOURCE ATTRIBUTES: ", self.source_attrs)
|
|
110
110
|
if self.queryset.model in (Icon, Zone, Category):
|
|
111
111
|
return super().get_attribute(instance)
|
|
112
112
|
return self.queryset.model.objects.filter(
|
|
@@ -142,11 +142,11 @@ class ComponentFormsetField(FormSerializer):
|
|
|
142
142
|
field_mapping = {
|
|
143
143
|
HiddenField: HiddenSerializerField,
|
|
144
144
|
Select2ListChoiceField: serializers.ChoiceField,
|
|
145
|
-
|
|
145
|
+
forms.ModelChoiceField: FormsetPrimaryKeyRelatedField,
|
|
146
|
+
Select2ModelChoiceField: FormsetPrimaryKeyRelatedField,
|
|
146
147
|
forms.ModelMultipleChoiceField: ComponentManyToManyRelatedField,
|
|
147
148
|
Select2ListMultipleChoiceField: ComponentManyToManyRelatedField,
|
|
148
149
|
Select2ModelMultipleChoiceField: ComponentManyToManyRelatedField,
|
|
149
|
-
forms.ModelChoiceField: FormsetPrimaryKeyRelatedField,
|
|
150
150
|
forms.TypedChoiceField: serializers.ChoiceField,
|
|
151
151
|
forms.FloatField: serializers.FloatField,
|
|
152
152
|
forms.SlugField: serializers.CharField
|
|
@@ -193,6 +193,8 @@ class ComponentFormsetField(FormSerializer):
|
|
|
193
193
|
)
|
|
194
194
|
|
|
195
195
|
ret[field_name] = self._get_field(form_field, serializer_field_class)
|
|
196
|
+
ret[field_name].initial = form_field.initial
|
|
197
|
+
ret[field_name].default = form_field.initial
|
|
196
198
|
|
|
197
199
|
return ret
|
|
198
200
|
|
|
@@ -201,7 +203,7 @@ class ComponentFormsetField(FormSerializer):
|
|
|
201
203
|
kwargs['style'] = {'form_field': form_field}
|
|
202
204
|
|
|
203
205
|
if serializer_field_class in (
|
|
204
|
-
|
|
206
|
+
FormsetPrimaryKeyRelatedField, ComponentManyToManyRelatedField
|
|
205
207
|
):
|
|
206
208
|
qs = form_field.queryset
|
|
207
209
|
if hasattr(qs.model, 'instance'):
|
|
@@ -254,8 +256,6 @@ class ComponentFormsetField(FormSerializer):
|
|
|
254
256
|
return validated_data
|
|
255
257
|
|
|
256
258
|
|
|
257
|
-
|
|
258
|
-
|
|
259
259
|
class ComponentSerializer(FormSerializer):
|
|
260
260
|
id = ObjectSerializerMethodField()
|
|
261
261
|
last_change = TimestampField(read_only=True)
|
simo/core/signal_receivers.py
CHANGED
|
@@ -82,8 +82,8 @@ def create_instance_defaults(sender, instance, created, **kwargs):
|
|
|
82
82
|
name='Weather', icon=weather_icon,
|
|
83
83
|
zone=other_zone,
|
|
84
84
|
category=climate_category,
|
|
85
|
-
gateway=generic, base_type='weather
|
|
86
|
-
controller_uid='simo.generic.controllers.
|
|
85
|
+
gateway=generic, base_type='weather',
|
|
86
|
+
controller_uid='simo.generic.controllers.Weather',
|
|
87
87
|
config={'is_main': True}
|
|
88
88
|
)
|
|
89
89
|
|
simo/core/tasks.py
CHANGED
|
@@ -195,7 +195,7 @@ def sync_with_remote():
|
|
|
195
195
|
users_data = data.pop('users', {})
|
|
196
196
|
instance_uid = data.pop('uid')
|
|
197
197
|
instance_uids.append(instance_uid)
|
|
198
|
-
|
|
198
|
+
weather = data.pop('weather', None)
|
|
199
199
|
instance, new_instance = Instance.objects.update_or_create(
|
|
200
200
|
uid=instance_uid, defaults=data
|
|
201
201
|
)
|
|
@@ -203,18 +203,15 @@ def sync_with_remote():
|
|
|
203
203
|
instance.is_active = True
|
|
204
204
|
instance.save()
|
|
205
205
|
|
|
206
|
-
if
|
|
207
|
-
from simo.generic.controllers import
|
|
206
|
+
if weather:
|
|
207
|
+
from simo.generic.controllers import Weather
|
|
208
208
|
weather_component = Component.objects.filter(
|
|
209
209
|
zone__instance=instance,
|
|
210
|
-
controller_uid=
|
|
210
|
+
controller_uid=Weather.uid
|
|
211
211
|
).first()
|
|
212
212
|
if weather_component:
|
|
213
213
|
weather_component.track_history = False
|
|
214
|
-
weather_component.controller.set(
|
|
215
|
-
weather_forecast.pop('current', None)
|
|
216
|
-
)
|
|
217
|
-
weather_component.meta['forecast'] = weather_forecast
|
|
214
|
+
weather_component.controller.set(weather)
|
|
218
215
|
weather_component.save()
|
|
219
216
|
|
|
220
217
|
for email, options in users_data.items():
|
|
@@ -406,7 +403,7 @@ def low_battery_notifications():
|
|
|
406
403
|
from simo.notifications.utils import notify_users
|
|
407
404
|
for instance in Instance.objects.filter(is_active=True):
|
|
408
405
|
timezone.activate(instance.timezone)
|
|
409
|
-
if timezone.localtime().hour
|
|
406
|
+
if timezone.localtime().hour not in (10, 18):
|
|
410
407
|
continue
|
|
411
408
|
for comp in Component.objects.filter(
|
|
412
409
|
zone__instance=instance,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/fleet/api.py
CHANGED
|
@@ -5,8 +5,10 @@ from rest_framework.decorators import action
|
|
|
5
5
|
from rest_framework.exceptions import ValidationError as APIValidationError
|
|
6
6
|
from simo.core.api import InstanceMixin
|
|
7
7
|
from simo.core.permissions import IsInstanceSuperuser
|
|
8
|
-
from .models import InstanceOptions, Colonel
|
|
9
|
-
from .serializers import
|
|
8
|
+
from .models import InstanceOptions, Colonel, Interface
|
|
9
|
+
from .serializers import (
|
|
10
|
+
InstanceOptionsSerializer, ColonelSerializer, ColonelInterfaceSerializer
|
|
11
|
+
)
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
class InstanceOptionsViewSet(InstanceMixin, viewsets.ReadOnlyModelViewSet):
|
|
@@ -54,7 +56,6 @@ class ColonelsViewSet(InstanceMixin, viewsets.ModelViewSet):
|
|
|
54
56
|
colonel = self.get_object()
|
|
55
57
|
colonel.update_config()
|
|
56
58
|
|
|
57
|
-
|
|
58
59
|
@action(detail=True, methods=['post'])
|
|
59
60
|
def move_to(self, request, pk, *args, **kwargs):
|
|
60
61
|
colonel = self.get_object()
|
|
@@ -67,3 +68,21 @@ class ColonelsViewSet(InstanceMixin, viewsets.ModelViewSet):
|
|
|
67
68
|
if not target:
|
|
68
69
|
raise APIValidationError(_('Invalid target.'), code=400)
|
|
69
70
|
colonel.move_to(target)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class InterfaceViewSet(
|
|
74
|
+
InstanceMixin,
|
|
75
|
+
viewsets.mixins.RetrieveModelMixin, viewsets.mixins.UpdateModelMixin,
|
|
76
|
+
viewsets.mixins.ListModelMixin, viewsets.GenericViewSet
|
|
77
|
+
):
|
|
78
|
+
url = 'fleet/colonel-interfaces'
|
|
79
|
+
basename = 'colonel-interfaces'
|
|
80
|
+
serializer_class = ColonelInterfaceSerializer
|
|
81
|
+
|
|
82
|
+
def get_permissions(self):
|
|
83
|
+
permissions = super().get_permissions()
|
|
84
|
+
permissions.append(IsInstanceSuperuser())
|
|
85
|
+
return permissions
|
|
86
|
+
|
|
87
|
+
def get_queryset(self):
|
|
88
|
+
return Interface.objects.filter(colonel__instance=self.instance)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Generated by Django 4.2.10 on 2024-11-04 10:01
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
import django.db.models.deletion
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('core', '0043_alter_category_instance_alter_instance_timezone_and_more'),
|
|
11
|
+
('fleet', '0040_alter_colonel_pwm_frequency'),
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
operations = [
|
|
15
|
+
migrations.AlterField(
|
|
16
|
+
model_name='colonel',
|
|
17
|
+
name='instance',
|
|
18
|
+
field=models.ForeignKey(default=1, limit_choices_to={'is_active': True}, on_delete=django.db.models.deletion.CASCADE, related_name='colonels', to='core.instance'),
|
|
19
|
+
preserve_default=False,
|
|
20
|
+
),
|
|
21
|
+
migrations.AlterField(
|
|
22
|
+
model_name='instanceoptions',
|
|
23
|
+
name='instance',
|
|
24
|
+
field=models.OneToOneField(limit_choices_to={'is_active': True}, on_delete=django.db.models.deletion.CASCADE, related_name='fleet_options', to='core.instance'),
|
|
25
|
+
),
|
|
26
|
+
migrations.AlterField(
|
|
27
|
+
model_name='interface',
|
|
28
|
+
name='type',
|
|
29
|
+
field=models.CharField(blank=True, choices=[('i2c', 'I2C'), ('dali', 'DALI')], max_length=20, null=True),
|
|
30
|
+
),
|
|
31
|
+
]
|
|
Binary file
|
simo/fleet/models.py
CHANGED
|
@@ -260,7 +260,7 @@ def after_colonel_save(sender, instance, created, *args, **kwargs):
|
|
|
260
260
|
for no, data in GPIO_PINS.get(instance.type).items():
|
|
261
261
|
ColonelPin.objects.get_or_create(
|
|
262
262
|
colonel=instance, no=no,
|
|
263
|
-
defaults
|
|
263
|
+
defaults={
|
|
264
264
|
'input': data.get('input'), 'output': data.get('output'),
|
|
265
265
|
'capacitive': data.get('capacitive'), 'adc': data.get('adc'),
|
|
266
266
|
'native': data.get('native'), 'note': data.get('note')
|
|
@@ -273,8 +273,13 @@ def after_colonel_save(sender, instance, created, *args, **kwargs):
|
|
|
273
273
|
fleet_gateway.start()
|
|
274
274
|
# create i2c and dali interfaces automatically for game-changer boards
|
|
275
275
|
if instance.type == 'game-changer':
|
|
276
|
+
# occupy ports immediately
|
|
276
277
|
Interface.objects.create(colonel=instance, no=1, type='i2c')
|
|
277
278
|
Interface.objects.create(colonel=instance, no=2, type='dali')
|
|
279
|
+
elif instance.type == 'game-changer-mini':
|
|
280
|
+
# only create interfaces, but do not ocuupy ports
|
|
281
|
+
Interface.objects.create(colonel=instance, no=1)
|
|
282
|
+
Interface.objects.create(colonel=instance, no=2)
|
|
278
283
|
|
|
279
284
|
|
|
280
285
|
@receiver(post_save, sender=Component)
|
|
@@ -343,7 +348,8 @@ class Interface(models.Model):
|
|
|
343
348
|
)
|
|
344
349
|
no = models.PositiveIntegerField(choices=((1, "1"), (2, "2")))
|
|
345
350
|
type = models.CharField(
|
|
346
|
-
max_length=20, choices=(('i2c', "I2C"), ('dali', "DALI"))
|
|
351
|
+
max_length=20, choices=(('i2c', "I2C"), ('dali', "DALI")),
|
|
352
|
+
null=True, blank=True
|
|
347
353
|
)
|
|
348
354
|
pin_a = models.ForeignKey(
|
|
349
355
|
ColonelPin, on_delete=models.CASCADE, limit_choices_to={
|
|
@@ -367,16 +373,29 @@ class Interface(models.Model):
|
|
|
367
373
|
return f"{self.no} - {self.get_type_display()}"
|
|
368
374
|
|
|
369
375
|
def save(self, *args, **kwargs):
|
|
370
|
-
if not self.
|
|
376
|
+
if not self.pin_a:
|
|
377
|
+
self.pin_a = ColonelPin.objects.get(
|
|
378
|
+
colonel=self.colonel, no=INTERFACES_PINS_MAP[self.no][0]
|
|
379
|
+
)
|
|
380
|
+
if not self.pin_b:
|
|
381
|
+
self.pin_b = ColonelPin.objects.get(
|
|
382
|
+
colonel=self.colonel, no=INTERFACES_PINS_MAP[self.no][1]
|
|
383
|
+
)
|
|
384
|
+
if self.type:
|
|
371
385
|
for pin_no in INTERFACES_PINS_MAP[self.no]:
|
|
372
386
|
cpin = ColonelPin.objects.get(colonel=self.colonel, no=pin_no)
|
|
373
|
-
if cpin.occupied_by:
|
|
387
|
+
if cpin.occupied_by and cpin.occupied_by != self:
|
|
374
388
|
raise ValidationError(
|
|
375
389
|
f"Interface can not be created, because "
|
|
376
|
-
f"
|
|
390
|
+
f"{cpin} is already occupied by {cpin.occupied_by}."
|
|
377
391
|
)
|
|
378
|
-
|
|
392
|
+
self.pin_a.occupied_by = self
|
|
393
|
+
self.pin_b.occupied_by = self
|
|
394
|
+
else:
|
|
395
|
+
self.pin_a.occupied_by = None
|
|
396
|
+
self.pin_b.occupied_by = None
|
|
379
397
|
|
|
398
|
+
return super().save(*args, **kwargs)
|
|
380
399
|
|
|
381
400
|
def broadcast_reset(self):
|
|
382
401
|
from .gateways import FleetGatewayHandler
|
|
@@ -425,36 +444,33 @@ class InterfaceAddress(models.Model):
|
|
|
425
444
|
|
|
426
445
|
@receiver(post_save, sender=Interface)
|
|
427
446
|
def post_interface_save(sender, instance, created, *args, **kwargs):
|
|
428
|
-
if
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
)
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
interface=instance, address_type='dali-group',
|
|
456
|
-
address=addr,
|
|
457
|
-
)
|
|
447
|
+
if instance.type == 'i2c':
|
|
448
|
+
InterfaceAddress.objects.filter(
|
|
449
|
+
interface=instance
|
|
450
|
+
).exclude(address_type='i2c').delete()
|
|
451
|
+
for addr in range(128):
|
|
452
|
+
InterfaceAddress.objects.get_or_create(
|
|
453
|
+
interface=instance, address_type='i2c',
|
|
454
|
+
address=addr,
|
|
455
|
+
)
|
|
456
|
+
elif instance.type == 'dali':
|
|
457
|
+
InterfaceAddress.objects.filter(
|
|
458
|
+
interface=instance
|
|
459
|
+
).exclude(address_type__startswith='dali').delete()
|
|
460
|
+
for addr in range(64):
|
|
461
|
+
InterfaceAddress.objects.create(
|
|
462
|
+
interface=instance, address_type='dali-gear',
|
|
463
|
+
address=addr,
|
|
464
|
+
)
|
|
465
|
+
for addr in range(16):
|
|
466
|
+
InterfaceAddress.objects.create(
|
|
467
|
+
interface=instance, address_type='dali-group',
|
|
468
|
+
address=addr,
|
|
469
|
+
)
|
|
470
|
+
else:
|
|
471
|
+
InterfaceAddress.objects.filter(interface=instance).delete()
|
|
472
|
+
|
|
473
|
+
|
|
458
474
|
|
|
459
475
|
|
|
460
476
|
@receiver(post_delete, sender=Interface)
|
simo/fleet/serializers.py
CHANGED
|
@@ -36,8 +36,7 @@ class ColonelInterfaceSerializer(serializers.ModelSerializer):
|
|
|
36
36
|
|
|
37
37
|
class Meta:
|
|
38
38
|
model = Interface
|
|
39
|
-
fields = 'id', 'no', 'type'
|
|
40
|
-
read_only_fields = fields
|
|
39
|
+
fields = 'id', 'colonel', 'no', 'type'
|
|
41
40
|
|
|
42
41
|
|
|
43
42
|
class ColonelSerializer(serializers.ModelSerializer):
|
|
@@ -48,8 +47,7 @@ class ColonelSerializer(serializers.ModelSerializer):
|
|
|
48
47
|
model = Colonel
|
|
49
48
|
fields = (
|
|
50
49
|
'id', 'uid', 'name', 'type', 'firmware_version', 'firmware_auto_update',
|
|
51
|
-
'socket_connected', 'last_seen', '
|
|
52
|
-
'logs_stream', 'pins', 'interfaces',
|
|
50
|
+
'socket_connected', 'last_seen', 'pins', 'interfaces',
|
|
53
51
|
)
|
|
54
52
|
read_only_fields = [
|
|
55
53
|
'uid', 'type', 'firmware_version', 'socket_connected',
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
simo/generic/app_widgets.py
CHANGED
|
@@ -32,9 +32,9 @@ class IPCameraWidget(BaseAppWidget):
|
|
|
32
32
|
size = [2, 2]
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
class
|
|
36
|
-
uid = 'weather
|
|
37
|
-
name = _("Weather
|
|
35
|
+
class WeatherWidget(BaseAppWidget):
|
|
36
|
+
uid = 'weather'
|
|
37
|
+
name = _("Weather")
|
|
38
38
|
size = [4, 2]
|
|
39
39
|
|
|
40
40
|
|
simo/generic/base_types.py
CHANGED
|
@@ -5,7 +5,7 @@ BASE_TYPES = {
|
|
|
5
5
|
'thermostat': _("Thermostat"),
|
|
6
6
|
'alarm-group': _("Alarm Group"),
|
|
7
7
|
'ip-camera': _("IP Camera"),
|
|
8
|
-
'weather
|
|
8
|
+
'weather': _("Weather"),
|
|
9
9
|
'watering': _("Watering"),
|
|
10
10
|
'state-select': _("State Select"),
|
|
11
11
|
'alarm-clock': _("Alarm Clock"),
|
simo/generic/controllers.py
CHANGED
|
@@ -38,13 +38,13 @@ from simo.core.utils.config_values import (
|
|
|
38
38
|
from .gateways import GenericGatewayHandler, DummyGatewayHandler
|
|
39
39
|
from .app_widgets import (
|
|
40
40
|
ScriptWidget, ThermostatWidget, AlarmGroupWidget, IPCameraWidget,
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
WateringWidget, StateSelectWidget, AlarmClockWidget,
|
|
42
|
+
WeatherWidget
|
|
43
43
|
)
|
|
44
44
|
from .forms import (
|
|
45
45
|
ScriptConfigForm, PresenceLightingConfigForm,
|
|
46
46
|
ThermostatConfigForm, AlarmGroupConfigForm,
|
|
47
|
-
IPCameraConfigForm,
|
|
47
|
+
IPCameraConfigForm, WeatherForm,
|
|
48
48
|
WateringConfigForm, StateSelectForm,
|
|
49
49
|
AlarmClockConfigForm
|
|
50
50
|
)
|
|
@@ -527,13 +527,13 @@ class AlarmGroup(ControllerBase):
|
|
|
527
527
|
return map
|
|
528
528
|
|
|
529
529
|
|
|
530
|
-
class
|
|
531
|
-
name = _("Weather
|
|
532
|
-
base_type = 'weather
|
|
530
|
+
class Weather(ControllerBase):
|
|
531
|
+
name = _("Weather")
|
|
532
|
+
base_type = 'weather'
|
|
533
533
|
gateway_class = GenericGatewayHandler
|
|
534
|
-
config_form =
|
|
535
|
-
app_widget =
|
|
536
|
-
admin_widget_template = 'admin/controller_widgets/
|
|
534
|
+
config_form = WeatherForm
|
|
535
|
+
app_widget = WeatherWidget
|
|
536
|
+
admin_widget_template = 'admin/controller_widgets/weather.html'
|
|
537
537
|
default_config = {}
|
|
538
538
|
default_value = {}
|
|
539
539
|
|
simo/generic/forms.py
CHANGED
|
@@ -544,24 +544,24 @@ class IPCameraConfigForm(BaseComponentForm):
|
|
|
544
544
|
|
|
545
545
|
)
|
|
546
546
|
|
|
547
|
-
class
|
|
547
|
+
class WeatherForm(BaseComponentForm):
|
|
548
548
|
is_main = forms.BooleanField(
|
|
549
549
|
required=False,
|
|
550
|
-
help_text="Defines if this is your main/top global weather
|
|
550
|
+
help_text="Defines if this is your main/top global weather."
|
|
551
551
|
)
|
|
552
552
|
|
|
553
553
|
def __init__(self, *args, **kwargs):
|
|
554
554
|
super().__init__(*args, **kwargs)
|
|
555
|
-
from .controllers import
|
|
555
|
+
from .controllers import Weather
|
|
556
556
|
if not self.instance.pk:
|
|
557
|
-
|
|
557
|
+
first_weather = bool(
|
|
558
558
|
not Component.objects.filter(
|
|
559
|
-
controller_uid=
|
|
559
|
+
controller_uid=Weather.uid,
|
|
560
560
|
config__is_main=True
|
|
561
561
|
).count()
|
|
562
562
|
)
|
|
563
|
-
self.fields['is_main'].initial =
|
|
564
|
-
if
|
|
563
|
+
self.fields['is_main'].initial = first_weather
|
|
564
|
+
if first_weather:
|
|
565
565
|
self.fields['is_main'].widget.attrs['disabled'] = 'disabled'
|
|
566
566
|
else:
|
|
567
567
|
if self.instance.config.get('is_main'):
|
|
@@ -570,14 +570,14 @@ class WeatherForecastForm(BaseComponentForm):
|
|
|
570
570
|
|
|
571
571
|
def save(self, *args, **kwargs):
|
|
572
572
|
self.instance.value_units = 'status'
|
|
573
|
-
from .controllers import
|
|
573
|
+
from .controllers import Weather
|
|
574
574
|
if 'is_main' in self.fields and 'is_main' in self.cleaned_data:
|
|
575
575
|
if self.fields['is_main'].widget.attrs.get('disabled'):
|
|
576
576
|
self.cleaned_data['is_main'] = self.fields['is_main'].initial
|
|
577
577
|
obj = super().save(*args, **kwargs)
|
|
578
578
|
if obj.config.get('is_main'):
|
|
579
579
|
for c in Component.objects.filter(
|
|
580
|
-
controller_uid=
|
|
580
|
+
controller_uid=Weather.uid,
|
|
581
581
|
config__is_main=True
|
|
582
582
|
).exclude(pk=obj.pk):
|
|
583
583
|
c.config['is_main'] = False
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Generated by Django 4.2.10 on 2024-11-05 07:52
|
|
2
|
+
|
|
3
|
+
from django.db import migrations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def forwards_func(apps, schema_editor):
|
|
7
|
+
|
|
8
|
+
Component = apps.get_model("core", "Component")
|
|
9
|
+
|
|
10
|
+
Component.objects.filter(
|
|
11
|
+
controller_uid='simo.generic.controllers.WeatherForecast'
|
|
12
|
+
).update(
|
|
13
|
+
controller_uid='simo.generic.controllers.Weather', base_type='weather'
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def reverse_func(apps, schema_editor):
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Migration(migrations.Migration):
|
|
22
|
+
|
|
23
|
+
dependencies = [
|
|
24
|
+
('core', '0043_alter_category_instance_alter_instance_timezone_and_more'),
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
operations = [
|
|
28
|
+
migrations.RunPython(forwards_func, reverse_func, elidable=True),
|
|
29
|
+
]
|
|
File without changes
|
|
Binary file
|
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
position: relative;
|
|
10
10
|
bottom: -4px;
|
|
11
11
|
"></span>
|
|
12
|
-
{{ obj.value.temp }}ᴼ {% if obj.zone.instance.units_of_measure == 'metric' %}C{% else %}F{% endif %}
|
|
12
|
+
{{ obj.value.main.temp }}ᴼ {% if obj.zone.instance.units_of_measure == 'metric' %}C{% else %}F{% endif %}
|
|
13
13
|
</div>
|
|
Binary file
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Generated by Django 4.2.10 on 2024-11-04 10:01
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
import django.db.models.deletion
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
dependencies = [
|
|
10
|
+
('core', '0043_alter_category_instance_alter_instance_timezone_and_more'),
|
|
11
|
+
('notifications', '0002_notification_instance'),
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
operations = [
|
|
15
|
+
migrations.AlterField(
|
|
16
|
+
model_name='notification',
|
|
17
|
+
name='instance',
|
|
18
|
+
field=models.ForeignKey(limit_choices_to={'is_active': True}, on_delete=django.db.models.deletion.CASCADE, to='core.instance'),
|
|
19
|
+
),
|
|
20
|
+
]
|
|
Binary file
|
simo/notifications/models.py
CHANGED
|
@@ -10,10 +10,6 @@ from simo.conf import dynamic_settings
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class Notification(models.Model):
|
|
13
|
-
'''
|
|
14
|
-
Notification get's sent to_users as soon as it's created.
|
|
15
|
-
If new users are added, notification gets sent to those users as well.
|
|
16
|
-
'''
|
|
17
13
|
instance = models.ForeignKey(
|
|
18
14
|
Instance, on_delete=models.CASCADE, limit_choices_to={'is_active': True}
|
|
19
15
|
)
|
|
@@ -47,7 +43,9 @@ class Notification(models.Model):
|
|
|
47
43
|
for user_notification in user_notifications:
|
|
48
44
|
token = user_notification.user.primary_device_token
|
|
49
45
|
if token:
|
|
50
|
-
data['to_tokens'].append(
|
|
46
|
+
data['to_tokens'].append(
|
|
47
|
+
user_notification.user.primary_device_token
|
|
48
|
+
)
|
|
51
49
|
try:
|
|
52
50
|
response = requests.post(
|
|
53
51
|
'https://simo.io/api/notifications/postmaster/', json=data
|
|
@@ -33,7 +33,7 @@ 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=5mi0Qe9TM-OILCxbcRfGJvq397QCPxjYX30K3CIZrPs,18133
|
|
36
|
-
simo/core/api.py,sha256=
|
|
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
|
|
@@ -55,24 +55,24 @@ simo/core/middleware.py,sha256=hExD7Vmw7eitk0vAjOwKzkwrtuw8YxpflF92j_CA2YY,3193
|
|
|
55
55
|
simo/core/models.py,sha256=Z6WLvU4K-LWIXghCBwTyZAOW5n2hCFNU-pteiPnpOAQ,22617
|
|
56
56
|
simo/core/permissions.py,sha256=v0iJM4LOeYoEfMiw3OLPYio272G1aUEAg_z9Wd1q5m0,2993
|
|
57
57
|
simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
|
|
58
|
-
simo/core/serializers.py,sha256=
|
|
59
|
-
simo/core/signal_receivers.py,sha256=
|
|
58
|
+
simo/core/serializers.py,sha256=HaX5F_wxg_7nX0XMVnfbTsnocFaRTXUPDAkShaTxP4s,21843
|
|
59
|
+
simo/core/signal_receivers.py,sha256=nNHuva91n0CUmaaRr81h2W_koTvZgvT8tWThIsWpido,9250
|
|
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=ESXKD5rN-3Q4wuuwX7CAwcWSaejY1mjb3gyKCgcaNjI,15449
|
|
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
68
|
simo/core/__pycache__/admin.cpython-38.pyc,sha256=uM58xiBAbbstmKZ0CoxLSk_RRu5TDVuHJNOveXUhFqM,13723
|
|
69
|
-
simo/core/__pycache__/api.cpython-38.pyc,sha256=
|
|
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=6M9Cl_ha4y_Vf8Rv4GMYL8dcBCmp0KzYi6jn3SQTgys,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=wDak1gJYUF5oXSlDz1Dtn-Rhy5CxYEY-v1sPkJhQDpk,4128
|
|
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=ck1FcBljLB4__5F6poS2tEEn8IDDgK7pU3FcXDPc_mI,1329
|
|
78
78
|
simo/core/__pycache__/controllers.cpython-38.pyc,sha256=s7onEMtWmHjvTGvWXIbpvWMWb7aAfOVhFhWuu49kLSg,30701
|
|
@@ -88,11 +88,11 @@ simo/core/__pycache__/middleware.cpython-38.pyc,sha256=iOSTXSQl3sEsa-9kx_6w5zbEB
|
|
|
88
88
|
simo/core/__pycache__/models.cpython-38.pyc,sha256=Nw2Fb11EwBdMVTHCpzkY6x0hRNCqRo0RtLNlRxS1VZE,18534
|
|
89
89
|
simo/core/__pycache__/permissions.cpython-38.pyc,sha256=fH4iyqd9DdzRLEu2b621-FeM-napR0M7hzBUTHo9Q3g,2972
|
|
90
90
|
simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
|
|
91
|
-
simo/core/__pycache__/serializers.cpython-38.pyc,sha256=
|
|
92
|
-
simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=
|
|
91
|
+
simo/core/__pycache__/serializers.cpython-38.pyc,sha256=o8vSdZC2mqKRAMJRpKXade-Jp0g4X6PmilOulvZ92Rk,19625
|
|
92
|
+
simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=HBT3dEylVbJsRAUl7AB3m0J7sg1VsXjQYzKp1ONTXvk,7039
|
|
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=EKvyYqv-1DkxTLCpRosLpwMWd_zbxPLipzu3Fjfu3IA,10413
|
|
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
|
|
@@ -205,6 +205,7 @@ simo/core/migrations/0039_instance_is_active_alter_instance_timezone.py,sha256=8
|
|
|
205
205
|
simo/core/migrations/0040_alter_instance_name.py,sha256=FqUq-NnO_eqMy3lg5Yl0uG3C-NgC_Qff7bcoBipTZSc,424
|
|
206
206
|
simo/core/migrations/0041_alter_instance_slug.py,sha256=MmuW0n5CCpF7NyKYINDcqChOU1DynSqQu_3wAYQypCo,401
|
|
207
207
|
simo/core/migrations/0042_alter_instance_timezone.py,sha256=5fLprOmoV06y37rh3uJWq8Fy4SjNmu86Imky6t7j13g,23334
|
|
208
|
+
simo/core/migrations/0043_alter_category_instance_alter_instance_timezone_and_more.py,sha256=TpJRZjwJu1iDYt1cCQr62jLOz14yy7yjrfbyHYgu9pM,23896
|
|
208
209
|
simo/core/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
209
210
|
simo/core/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=w6GiBXVxWj30Bg4Sn_pFVeA041d-pCrkaq8mR3KuF70,5381
|
|
210
211
|
simo/core/migrations/__pycache__/0002_load_icons.cpython-38.pyc,sha256=Nb9RrPjVYo_RpZ5PmzoaEIWGCeVt4kicpmGiKlBrpIw,2123
|
|
@@ -248,6 +249,7 @@ simo/core/migrations/__pycache__/0039_instance_is_active_alter_instance_timezone
|
|
|
248
249
|
simo/core/migrations/__pycache__/0040_alter_instance_name.cpython-38.pyc,sha256=PPZHAHRMnFS0PsPHxovAkkM3cPEQnLOyJz8q25ZshWs,642
|
|
249
250
|
simo/core/migrations/__pycache__/0041_alter_instance_slug.cpython-38.pyc,sha256=tVBd5-92gJPHR-I2yjUhsbtxwcykBMzxA6W3mvs8giE,620
|
|
250
251
|
simo/core/migrations/__pycache__/0042_alter_instance_timezone.cpython-38.pyc,sha256=_IdEOLCC0xgeVcKfCk7x0kKxVPu0iWuCxCg8aqkzeSI,16392
|
|
252
|
+
simo/core/migrations/__pycache__/0043_alter_category_instance_alter_instance_timezone_and_more.cpython-38.pyc,sha256=97_eFPQ_Iy-M1712Nad1w8t3ITBV4BF0eY1e8N-oOE4,16759
|
|
251
253
|
simo/core/migrations/__pycache__/__init__.cpython-38.pyc,sha256=VZmDQ57BTcebuM0KMhjiTOabgWZCBxQmSJzWZos9SO8,169
|
|
252
254
|
simo/core/static/ansi_styles.css,sha256=4ieJGrjZPKyPSago9FdB_gflHoGE1vxCHi8qVn5tY-Y,37352
|
|
253
255
|
simo/core/static/admin/Img/plus.svg,sha256=2NpSFPWqGIjpAQGFI7LDQHPKagEhYkJiJX95ufCoZaI,741
|
|
@@ -10217,7 +10219,7 @@ simo/core/utils/__pycache__/type_constants.cpython-38.pyc,sha256=DEgtIL7cPWeIsjG
|
|
|
10217
10219
|
simo/core/utils/__pycache__/validators.cpython-38.pyc,sha256=gjeBOjL_keMoRDjdn8v-3F3wcjPIT3Xx5KpTalo0e-Y,1247
|
|
10218
10220
|
simo/fleet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10219
10221
|
simo/fleet/admin.py,sha256=3iQLbpJnPku4MSp4sOL3Wj01lZQBBPyGV-bzTrRxKA4,6295
|
|
10220
|
-
simo/fleet/api.py,sha256=
|
|
10222
|
+
simo/fleet/api.py,sha256=bK-j762v-KsPIvdh2SQCVC3TZ0D_RZgAaIyOfyNifeU,3108
|
|
10221
10223
|
simo/fleet/auto_urls.py,sha256=UX66eR2ykMqFgfIllW-RTdjup5-FieCWl_BVm3CcXKg,702
|
|
10222
10224
|
simo/fleet/base_types.py,sha256=wL9RVkHr0gA7HI1wZq0pruGEIgvQqpfnCL4cC3ywsvw,102
|
|
10223
10225
|
simo/fleet/ble.py,sha256=eHA_9ABjbmH1vUVCv9hiPXQL2GZZSEVwfO0xyI1S0nI,1081
|
|
@@ -10225,16 +10227,16 @@ simo/fleet/controllers.py,sha256=fjri1GtCnflkkDpNqhTwy6i9CK6RDEB0Q_BtADzcG8E,291
|
|
|
10225
10227
|
simo/fleet/forms.py,sha256=344V3bLxXQdHiYzZYnwuKlyvc_6tVz8Z6XbBuSRN88s,62598
|
|
10226
10228
|
simo/fleet/gateways.py,sha256=lKEJW0MgaOEiNnijH50DNSVChvaUT3TA3UurcI57P8k,5677
|
|
10227
10229
|
simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
|
|
10228
|
-
simo/fleet/models.py,sha256=
|
|
10230
|
+
simo/fleet/models.py,sha256=xAffeAh5hf8NC94B66ZqmYoF7qDN53wEQ1xE2E9D8Xc,17524
|
|
10229
10231
|
simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
|
|
10230
|
-
simo/fleet/serializers.py,sha256
|
|
10232
|
+
simo/fleet/serializers.py,sha256=X2M0DFKVaxM6JFGDsdg3S2nJlLIcBvbujidZdfxD88w,2169
|
|
10231
10233
|
simo/fleet/socket_consumers.py,sha256=8RLEmKQ0Q7nVgJJ6IrU4ioocsWBJrgBVH_AUpVas1no,18095
|
|
10232
10234
|
simo/fleet/tasks.py,sha256=AGq9BXFNAqkhOANsPvId8yjEbDtVCB3MRsi_AKDpgIM,821
|
|
10233
10235
|
simo/fleet/utils.py,sha256=4RaoxyOByh3_Svb-WgTdQjG6R6ZGRN4Zf7-daFc4H80,4708
|
|
10234
10236
|
simo/fleet/views.py,sha256=OzsumjMjjt2WEXuThBzSAHcTNLU2dyBtvz4IyeHoAaA,3226
|
|
10235
10237
|
simo/fleet/__pycache__/__init__.cpython-38.pyc,sha256=pIZE7EL6-cuJ3pQtaSwjKLrKLsTYelp1k9sRhXKLh6s,159
|
|
10236
10238
|
simo/fleet/__pycache__/admin.cpython-38.pyc,sha256=IqVvpyyOnHChnEc07GubvtH6Tk1PA0rcYGYrJDg0hm4,6503
|
|
10237
|
-
simo/fleet/__pycache__/api.cpython-38.pyc,sha256=
|
|
10239
|
+
simo/fleet/__pycache__/api.cpython-38.pyc,sha256=Ntc1sYKZMygW2eNTxVUgoeCF3StoUZcZA7ST7iYKrlg,3846
|
|
10238
10240
|
simo/fleet/__pycache__/auto_urls.cpython-38.pyc,sha256=Tc6a6BCXHjijP8U2jE2ghlJwnSNrGm59-hW5t-80wF0,689
|
|
10239
10241
|
simo/fleet/__pycache__/base_types.cpython-38.pyc,sha256=deyPwjpT6xZiFxBGFnj5b7R-lbdOTh2krgpJhrcGVhc,274
|
|
10240
10242
|
simo/fleet/__pycache__/ble.cpython-38.pyc,sha256=Nrof9w7cm4OlpFWHeVnmvvanh2_oF9oQ3TknJiV93-0,1267
|
|
@@ -10242,9 +10244,9 @@ simo/fleet/__pycache__/controllers.cpython-38.pyc,sha256=jtFHr_uyjCCeuidL-o-hGaf
|
|
|
10242
10244
|
simo/fleet/__pycache__/forms.cpython-38.pyc,sha256=vGc539_6e6-Ap-qVPoHd78p2bThdVidhV8XUzW0wQu8,42296
|
|
10243
10245
|
simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=0RKVn0ndreVKhsrukqeLPSdMnRrsQ_W7yeVeBkRLfIk,5058
|
|
10244
10246
|
simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
|
|
10245
|
-
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=
|
|
10247
|
+
simo/fleet/__pycache__/models.cpython-38.pyc,sha256=TH2J-7xC1TE9AzOJ2lRhVGxUUYqnoYGWTzH9GktuVV0,14138
|
|
10246
10248
|
simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
|
|
10247
|
-
simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=
|
|
10249
|
+
simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=gIWHJaSUbTe9H_xerD29Fz7BxIqXNzBI60GsIVXbNdY,3134
|
|
10248
10250
|
simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=cNLhA0PTF2BgXXcw4b4va1zIw-gBrghoRrSr8iZluE0,13893
|
|
10249
10251
|
simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
|
|
10250
10252
|
simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=J2N68RzYUnzFeqKH50x9Vtrwd3nrkMKBWOfD99IvfIs,3344
|
|
@@ -10289,6 +10291,7 @@ simo/fleet/migrations/0037_alter_colonelpin_options_alter_colonelpin_no_and_more
|
|
|
10289
10291
|
simo/fleet/migrations/0038_alter_colonel_type.py,sha256=3NCAJc5M5BilQynd3lIvub3VJJnVhcONMoGInkd1Los,584
|
|
10290
10292
|
simo/fleet/migrations/0039_auto_20241016_1047.py,sha256=c75iDlPH9NPQohkNBt58NPl31tNmctk5rww8wWQJmxA,801
|
|
10291
10293
|
simo/fleet/migrations/0040_alter_colonel_pwm_frequency.py,sha256=AiiYeLXEmBAFj1O3WdJB0xQy1KqfiErYR8yPpL8W7e4,498
|
|
10294
|
+
simo/fleet/migrations/0041_alter_colonel_instance_and_more.py,sha256=r3PzZERt4kM0ul_TFl-i7qS7n0ht0G8jS83nucMxZfQ,1181
|
|
10292
10295
|
simo/fleet/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10293
10296
|
simo/fleet/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=9kc1UyMEYkRNVnZ7iwZbiW1t3qWXROvWrI2G1BdzIaA,1250
|
|
10294
10297
|
simo/fleet/migrations/__pycache__/0002_auto_20220422_0743.cpython-38.pyc,sha256=8oxhGb7rL8QYKlBLU3pOYcd8aHeQWDB9I8awkK04mXg,841
|
|
@@ -10330,27 +10333,31 @@ simo/fleet/migrations/__pycache__/0037_alter_colonelpin_options_alter_colonelpin
|
|
|
10330
10333
|
simo/fleet/migrations/__pycache__/0038_alter_colonel_type.cpython-38.pyc,sha256=8qbVMh7Hy3YngqjKuOEMCV29J5cZtRoF3MF1bWesC54,793
|
|
10331
10334
|
simo/fleet/migrations/__pycache__/0039_auto_20241016_1047.cpython-38.pyc,sha256=6QU9LBUexU9GFSwPoBgLznO6xZU0N-HbWITah-W1xWo,1088
|
|
10332
10335
|
simo/fleet/migrations/__pycache__/0040_alter_colonel_pwm_frequency.cpython-38.pyc,sha256=o_trHQUyQfYzWO_iWmZpvzc-uVJlBjK-GfyKhPOVSjc,736
|
|
10336
|
+
simo/fleet/migrations/__pycache__/0041_alter_colonel_instance_and_more.cpython-38.pyc,sha256=76yu9gz3pcAq5IYbNeZIoOSgdi0HVqTvc3EdXLGriQI,1178
|
|
10333
10337
|
simo/fleet/migrations/__pycache__/__init__.cpython-38.pyc,sha256=5k1KW0jeSDzw6RnVPRq4CaO13Lg7M0F-pxA_gqqZ6Mg,170
|
|
10334
10338
|
simo/fleet/templates/fleet/controllers_info/Button.md,sha256=GIuxqG617174NEtpPeCGVocxO4YMe7-CacgVSu_L5-E,739
|
|
10335
10339
|
simo/fleet/templates/fleet/controllers_info/ENS160AirQualitySensor.md,sha256=3LSTY9YPFuVPIbVsYCAifcotrXJcOXl2k774_vo6nAE,770
|
|
10336
10340
|
simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10337
|
-
simo/generic/app_widgets.py,sha256=
|
|
10338
|
-
simo/generic/base_types.py,sha256=
|
|
10339
|
-
simo/generic/controllers.py,sha256=
|
|
10340
|
-
simo/generic/forms.py,sha256=
|
|
10341
|
+
simo/generic/app_widgets.py,sha256=TPRLj4hri2hBuY6mrdwBiv-01z2hDxZmsup-GDD9LrM,953
|
|
10342
|
+
simo/generic/base_types.py,sha256=u3SlfpNYaCwkVBwomWgso4ODzL71ay9MhiAW-bxgnDU,341
|
|
10343
|
+
simo/generic/controllers.py,sha256=Qf54CAeD8DviMV_S19E-7f-w-94Vr90-8xasy-IfG_A,49311
|
|
10344
|
+
simo/generic/forms.py,sha256=H841-wbWltnZ2-RXQEM1G8H4kfOcl88Qhg7bxE4VCiQ,28993
|
|
10341
10345
|
simo/generic/gateways.py,sha256=dUzRBxVDdsx70mrCvxSQwhJr0ydQ5NtoLHoYeVLJmtA,15224
|
|
10342
10346
|
simo/generic/models.py,sha256=Adq7ipWK-renxJlNW-SZnAq2oGEOwKx8EdUWaKnfcVQ,7597
|
|
10343
10347
|
simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
|
|
10344
10348
|
simo/generic/socket_consumers.py,sha256=K2OjphIhKJH48BvfFfoCOyCQZ1NmXb_phs6y1IP-qaQ,1757
|
|
10345
10349
|
simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
|
|
10346
|
-
simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=
|
|
10347
|
-
simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=
|
|
10348
|
-
simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=
|
|
10349
|
-
simo/generic/__pycache__/forms.cpython-38.pyc,sha256=
|
|
10350
|
+
simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=YZ5db6-FPynBi6ooPW5crK9lZ6ymRh2DlGN6FwxfX4M,1820
|
|
10351
|
+
simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=aV5NdIuvXR-ItKpI__MwcyPZHD6Z882TFdgYkPCkr1I,493
|
|
10352
|
+
simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=EwtavDlVJX0b6taQ0moYk11oL9nZL5_esoCXGdtcNNo,32751
|
|
10353
|
+
simo/generic/__pycache__/forms.cpython-38.pyc,sha256=w7p-dFYvxtNMlrKVnM2zWa1Jp0zXygP6Lbo6kKg-Ox4,21228
|
|
10350
10354
|
simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=IazhRBe-YZ9t7_wq1fULoyLnxn3frR967lAN9D7MbKY,11583
|
|
10351
10355
|
simo/generic/__pycache__/models.cpython-38.pyc,sha256=MZpum7syAFxuulf47K7gtUlJJ7xRD-IBUBAwUM1ZRnw,5825
|
|
10352
10356
|
simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
|
|
10353
10357
|
simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=qJO5kvQLWhsQDOr1AtAtsAybuRWioxSkQei3Pc7rdP0,1737
|
|
10358
|
+
simo/generic/migrations/0001_initial.py,sha256=7FpPcfpRU5ya0b8s2KbxR5a3npf92YruvZltUybjzys,676
|
|
10359
|
+
simo/generic/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10360
|
+
simo/generic/migrations/__pycache__/__init__.cpython-38.pyc,sha256=nJV0NkIT8MuONj1hUX-V6aCU2lX3BXHyPjisapnBsPA,172
|
|
10354
10361
|
simo/generic/scripting/__init__.py,sha256=aZZvNBae7unnux_zGHCIWCV2z47hVJc-DIL72Hqfkeo,600
|
|
10355
10362
|
simo/generic/scripting/example.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10356
10363
|
simo/generic/scripting/helpers.py,sha256=Zt8Mx5AXIggzYk0e7jn-xQNR_NOqzolAReLkrmDJzVQ,3042
|
|
@@ -10381,7 +10388,7 @@ simo/generic/templates/admin/controller_widgets/gate.html,sha256=rqtgEQTmyK8Q66o
|
|
|
10381
10388
|
simo/generic/templates/admin/controller_widgets/ip_camera.html,sha256=ZmWm21EswkgT6XR9x1GgzDIkSU2j_GpdOTfbPINg6jY,657
|
|
10382
10389
|
simo/generic/templates/admin/controller_widgets/script.html,sha256=biUEMo5V35wqSrM97d5WqNDi47GNaDpi53I3YBfDLOs,1484
|
|
10383
10390
|
simo/generic/templates/admin/controller_widgets/thermostat.html,sha256=iH7j631AY6ahsI7dTMyMYHL_EuX6Q_aRxQgQcPIVxvI,288
|
|
10384
|
-
simo/generic/templates/admin/controller_widgets/
|
|
10391
|
+
simo/generic/templates/admin/controller_widgets/weather.html,sha256=84SESQBhhzNUay8-6l8XtrC_GNZqI5HWJrgk0Mi6qbM,489
|
|
10385
10392
|
simo/generic/templates/generic/controllers_info/dummy.md,sha256=DcdkpYXpK7sroINukZZPUQs9uekN9kkE7p5hfnArgFo,147
|
|
10386
10393
|
simo/generic/templates/generic/controllers_info/stateselect.md,sha256=T0w3vJg02W3RMSsljN1EPRnkVaeRW5acSZaSq9FYvZw,135
|
|
10387
10394
|
simo/multimedia/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -10416,20 +10423,22 @@ simo/multimedia/migrations/__pycache__/__init__.cpython-38.pyc,sha256=mCgSiQBphL
|
|
|
10416
10423
|
simo/notifications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10417
10424
|
simo/notifications/admin.py,sha256=WQbN_bd2KRxVjbOajeworNrV9QlDNSadQT58La0Nn2M,1174
|
|
10418
10425
|
simo/notifications/api.py,sha256=GXQpq68ULBaJpU8w3SJKaCKuxYGWYehKnGeocGB1RVc,1783
|
|
10419
|
-
simo/notifications/models.py,sha256=
|
|
10426
|
+
simo/notifications/models.py,sha256=QGDLGAi5gk8OTcvd7ho5WNdctDymWGmGF1ZqN4-G_ZA,2443
|
|
10420
10427
|
simo/notifications/serializers.py,sha256=altDEAPWwOhxRcEzE9-34jL8EFpyf3vPoEdAPoVLfGc,523
|
|
10421
10428
|
simo/notifications/utils.py,sha256=uBl-Y7WGu00iaGM5rrdogcq0OMRVtyVfJF39-mdB3_k,1853
|
|
10422
10429
|
simo/notifications/__pycache__/__init__.cpython-38.pyc,sha256=YvucUfu98XFvEEg1LYFMlOZJpo_jSGxTVrM-ylAFLOg,167
|
|
10423
10430
|
simo/notifications/__pycache__/admin.cpython-38.pyc,sha256=MScNrtVM1wavefsPfxy0A7LVyXKcbvEkLH9GJkgNOl8,1945
|
|
10424
10431
|
simo/notifications/__pycache__/api.cpython-38.pyc,sha256=ys6E4AFghX6bq-rQ0gtA9s0Y2Hh-ypsWH8-Yz4edMrc,2073
|
|
10425
|
-
simo/notifications/__pycache__/models.cpython-38.pyc,sha256=
|
|
10432
|
+
simo/notifications/__pycache__/models.cpython-38.pyc,sha256=PoqLuOnlaAWQQ-20AtqhvAlLSkakPmdn7J7wGvHNW3g,2449
|
|
10426
10433
|
simo/notifications/__pycache__/serializers.cpython-38.pyc,sha256=7-eRGKYuQ4g1SpKOMpz17SIiu1HmaMoYv-cJbaO9QGA,1028
|
|
10427
10434
|
simo/notifications/__pycache__/utils.cpython-38.pyc,sha256=6Tq7VkW-pZLzWzcxPtBU9MDFZLO7iLY8-ygyefoJ5OQ,1529
|
|
10428
10435
|
simo/notifications/migrations/0001_initial.py,sha256=Zh69AQ-EKlQKfqfnMDVRcxvo1MxRY-TFLCdnNcgqi6g,2003
|
|
10429
10436
|
simo/notifications/migrations/0002_notification_instance.py,sha256=B3msbMeKvsuq-V7gvRADRjj5PFLayhi3pQvHZjqzO5g,563
|
|
10437
|
+
simo/notifications/migrations/0003_alter_notification_instance.py,sha256=CXrOkdbXYwlEK5O8iEjDzrocAP5WQ9fQ-0_TcT4VgEA,609
|
|
10430
10438
|
simo/notifications/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10431
10439
|
simo/notifications/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=YnOJYRZH649OZj9j6VU5HR_zCERCrOsKm_U69jRVq9w,1648
|
|
10432
10440
|
simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.pyc,sha256=Gkb3Qwr_zglGibQg9g5ekIgxtGapS4ENXVWQVHqM56I,794
|
|
10441
|
+
simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpython-38.pyc,sha256=awhD1F9RyK_706zVNM5io3WT_konFkKQgL7D5MkONwk,851
|
|
10433
10442
|
simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
|
|
10434
10443
|
simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
|
|
10435
10444
|
simo/users/admin.py,sha256=Xr7faGeupUKkpo1QLRm84OS63u-5Rf2ir_nVEaAPBZw,6839
|
|
@@ -10551,9 +10560,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
10551
10560
|
simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10552
10561
|
simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10553
10562
|
simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10554
|
-
simo-2.5.
|
|
10555
|
-
simo-2.5.
|
|
10556
|
-
simo-2.5.
|
|
10557
|
-
simo-2.5.
|
|
10558
|
-
simo-2.5.
|
|
10559
|
-
simo-2.5.
|
|
10563
|
+
simo-2.5.13.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
|
|
10564
|
+
simo-2.5.13.dist-info/METADATA,sha256=-YDiu4BTmBJuCqftPrXwh90exRHxZMoVJ7CBnXEydJE,1924
|
|
10565
|
+
simo-2.5.13.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
|
10566
|
+
simo-2.5.13.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
|
|
10567
|
+
simo-2.5.13.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
|
|
10568
|
+
simo-2.5.13.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|