simo 2.5.11__py3-none-any.whl → 2.5.12__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (27) hide show
  1. simo/core/__pycache__/api.cpython-38.pyc +0 -0
  2. simo/core/__pycache__/autocomplete_views.cpython-38.pyc +0 -0
  3. simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
  4. simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
  5. simo/core/migrations/0043_alter_category_instance_alter_instance_timezone_and_more.py +29 -0
  6. simo/core/migrations/__pycache__/0043_alter_category_instance_alter_instance_timezone_and_more.cpython-38.pyc +0 -0
  7. simo/core/serializers.py +8 -8
  8. simo/core/tasks.py +1 -1
  9. simo/fleet/__pycache__/api.cpython-38.pyc +0 -0
  10. simo/fleet/__pycache__/models.cpython-38.pyc +0 -0
  11. simo/fleet/__pycache__/serializers.cpython-38.pyc +0 -0
  12. simo/fleet/api.py +22 -3
  13. simo/fleet/migrations/0041_alter_colonel_instance_and_more.py +31 -0
  14. simo/fleet/migrations/__pycache__/0041_alter_colonel_instance_and_more.cpython-38.pyc +0 -0
  15. simo/fleet/models.py +52 -36
  16. simo/fleet/serializers.py +2 -4
  17. simo/generic/__pycache__/forms.cpython-38.pyc +0 -0
  18. simo/notifications/__pycache__/models.cpython-38.pyc +0 -0
  19. simo/notifications/migrations/0003_alter_notification_instance.py +20 -0
  20. simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpython-38.pyc +0 -0
  21. simo/notifications/models.py +3 -5
  22. {simo-2.5.11.dist-info → simo-2.5.12.dist-info}/METADATA +1 -1
  23. {simo-2.5.11.dist-info → simo-2.5.12.dist-info}/RECORD +27 -21
  24. {simo-2.5.11.dist-info → simo-2.5.12.dist-info}/LICENSE.md +0 -0
  25. {simo-2.5.11.dist-info → simo-2.5.12.dist-info}/WHEEL +0 -0
  26. {simo-2.5.11.dist-info → simo-2.5.12.dist-info}/entry_points.txt +0 -0
  27. {simo-2.5.11.dist-info → simo-2.5.12.dist-info}/top_level.txt +0 -0
Binary file
Binary file
@@ -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
+ ]
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
- Select2ModelChoiceField: ComponentPrimaryKeyRelatedField,
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
- ComponentPrimaryKeyRelatedField, ComponentManyToManyRelatedField
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/tasks.py CHANGED
@@ -406,7 +406,7 @@ def low_battery_notifications():
406
406
  from simo.notifications.utils import notify_users
407
407
  for instance in Instance.objects.filter(is_active=True):
408
408
  timezone.activate(instance.timezone)
409
- if timezone.localtime().hour != 10:
409
+ if timezone.localtime().hour not in (10, 18):
410
410
  continue
411
411
  for comp in Component.objects.filter(
412
412
  zone__instance=instance,
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 InstanceOptionsSerializer, ColonelSerializer
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
+ ]
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.pk:
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"GPIO{cpin} is already occupied by {cpin.occupied_by}."
390
+ f"{cpin} is already occupied by {cpin.occupied_by}."
377
391
  )
378
- return super().save(*args, **kwargs)
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 created:
429
- instance.pin_a = ColonelPin.objects.get(
430
- colonel=instance.colonel, no=INTERFACES_PINS_MAP[instance.no][0]
431
- )
432
- instance.pin_a.occupied_by = instance
433
- instance.pin_a.save()
434
- instance.pin_b = ColonelPin.objects.get(
435
- colonel=instance.colonel, no=INTERFACES_PINS_MAP[instance.no][1]
436
- )
437
- instance.pin_b.occupied_by = instance
438
- instance.pin_b.save()
439
- instance.save()
440
-
441
- if instance.type == 'i2c':
442
- for addr in range(128):
443
- InterfaceAddress.objects.create(
444
- interface=instance, address_type='i2c',
445
- address=addr,
446
- )
447
- elif instance.type == 'dali':
448
- for addr in range(64):
449
- InterfaceAddress.objects.create(
450
- interface=instance, address_type='dali-gear',
451
- address=addr,
452
- )
453
- for addr in range(16):
454
- InterfaceAddress.objects.create(
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', 'enabled', 'pwm_frequency',
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',
@@ -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
+ ]
@@ -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(user_notification.user.primary_device_token)
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.5.11
3
+ Version: 2.5.12
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
@@ -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=i6AWIfhJq86AHs8jq3GrCfW3iSQDS3fQiLmcjHd3K5E,21593
58
+ simo/core/serializers.py,sha256=HaX5F_wxg_7nX0XMVnfbTsnocFaRTXUPDAkShaTxP4s,21843
59
59
  simo/core/signal_receivers.py,sha256=qCpzEUv5Bl9--K8fe08GVDmE6EBOj292YBia1TYDdSE,9267
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=M86_0KAK95hpfxD-mWLYtWU-6L7rHVkytlINjEdtimI,15632
62
+ simo/core/tasks.py,sha256=8n0zw6p2P2dJhR2SovIYsP8HMd1jjs_bgXOOkYqRvNI,15642
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=OFl3_PMd48Is0ohUEXeN-eQv_V2oAlphKyWS4FzKGhY,21862
69
+ simo/core/__pycache__/api.cpython-38.pyc,sha256=8vfLeuJIPaWeQXIghIEGbNwKJtK_0ZTcPexKlEbig0A,21868
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=hJ6JILI1LqrAtpQMvxnLvljGdW1v1gpvBsD79vFkZ58,3972
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=fN3kkfxFbQczNkAoghp_mjuXEuFhpiecd87MB3cXW6k,19483
91
+ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=o8vSdZC2mqKRAMJRpKXade-Jp0g4X6PmilOulvZ92Rk,19625
92
92
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=lBVca6zNPVn3Ev98ekjPGzBR1MJk4xI19CyMcm4lf6A,7056
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=rhf1RimWBxylGo8nk0orAJ4SqTsLF0OKW2TThpREp54,10472
95
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=5Nc_A5eOn3X_ZeC1OyZP1PFzXDgaV4ihmqz9eQbirpQ,10479
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=Hxn84xI-Q77HxjINgRbjSJQOv9jii4OL20LxK0VSrS8,2499
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=4ZHiT2yoUv3xnDzsMbPi0Z3DOvYzEfwYZw-jxFlqG30,16884
10230
+ simo/fleet/models.py,sha256=xAffeAh5hf8NC94B66ZqmYoF7qDN53wEQ1xE2E9D8Xc,17524
10229
10231
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10230
- simo/fleet/serializers.py,sha256=-16BjY_bp9VbDOYuD0V54h7r_RHpuLNkJX0SydWL9aU,2247
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=rL9fb7cCQatyFvXyKmlNOKmxVo8vHYeYhfSiAgchyAs,3110
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=ePD11IHU9AoiufsuwcgaXukCGkNE0dco-JPajXB96c0,13935
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=9ljhwoHkolcVrJwOVbYCbGPAUKgALRwor_M3W_K0adE,3173
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,6 +10333,7 @@ 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
@@ -10346,7 +10350,7 @@ simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFI
10346
10350
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=dt7fSf38eDA5hVUvVfpytOKoAFLQJuFffoAfqhJUKNc,1846
10347
10351
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=8YDxrsRFGqaeBfSF3Y1WmIGDRHGH1Ww7dSBkxRxkKyc,511
10348
10352
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=DsxStuB6A2NhZOqx2tcgMisR4Y2Tkkr30PAU45DHiok,32819
10349
- simo/generic/__pycache__/forms.cpython-38.pyc,sha256=dJiITb6CUlTPS8qzBOOyRx0Xcj5vQ_xIQXnX27Pvw30,21268
10353
+ simo/generic/__pycache__/forms.cpython-38.pyc,sha256=OtzGDat6Zg7SlVVub0RIsR-vJTonL8pJqxzI1TrBXcs,21278
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
@@ -10416,20 +10420,22 @@ simo/multimedia/migrations/__pycache__/__init__.cpython-38.pyc,sha256=mCgSiQBphL
10416
10420
  simo/notifications/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10417
10421
  simo/notifications/admin.py,sha256=WQbN_bd2KRxVjbOajeworNrV9QlDNSadQT58La0Nn2M,1174
10418
10422
  simo/notifications/api.py,sha256=GXQpq68ULBaJpU8w3SJKaCKuxYGWYehKnGeocGB1RVc,1783
10419
- simo/notifications/models.py,sha256=gJW0ahHvSyFrb7BzrJXa3Nk2FFDvX361ZgLcf1k7ff8,2558
10423
+ simo/notifications/models.py,sha256=QGDLGAi5gk8OTcvd7ho5WNdctDymWGmGF1ZqN4-G_ZA,2443
10420
10424
  simo/notifications/serializers.py,sha256=altDEAPWwOhxRcEzE9-34jL8EFpyf3vPoEdAPoVLfGc,523
10421
10425
  simo/notifications/utils.py,sha256=uBl-Y7WGu00iaGM5rrdogcq0OMRVtyVfJF39-mdB3_k,1853
10422
10426
  simo/notifications/__pycache__/__init__.cpython-38.pyc,sha256=YvucUfu98XFvEEg1LYFMlOZJpo_jSGxTVrM-ylAFLOg,167
10423
10427
  simo/notifications/__pycache__/admin.cpython-38.pyc,sha256=MScNrtVM1wavefsPfxy0A7LVyXKcbvEkLH9GJkgNOl8,1945
10424
10428
  simo/notifications/__pycache__/api.cpython-38.pyc,sha256=ys6E4AFghX6bq-rQ0gtA9s0Y2Hh-ypsWH8-Yz4edMrc,2073
10425
- simo/notifications/__pycache__/models.cpython-38.pyc,sha256=iOBlXejQrYV-M_SaPIGt6WbIV2YF5y5a3eXgnG5ZaJg,2604
10429
+ simo/notifications/__pycache__/models.cpython-38.pyc,sha256=PoqLuOnlaAWQQ-20AtqhvAlLSkakPmdn7J7wGvHNW3g,2449
10426
10430
  simo/notifications/__pycache__/serializers.cpython-38.pyc,sha256=7-eRGKYuQ4g1SpKOMpz17SIiu1HmaMoYv-cJbaO9QGA,1028
10427
10431
  simo/notifications/__pycache__/utils.cpython-38.pyc,sha256=6Tq7VkW-pZLzWzcxPtBU9MDFZLO7iLY8-ygyefoJ5OQ,1529
10428
10432
  simo/notifications/migrations/0001_initial.py,sha256=Zh69AQ-EKlQKfqfnMDVRcxvo1MxRY-TFLCdnNcgqi6g,2003
10429
10433
  simo/notifications/migrations/0002_notification_instance.py,sha256=B3msbMeKvsuq-V7gvRADRjj5PFLayhi3pQvHZjqzO5g,563
10434
+ simo/notifications/migrations/0003_alter_notification_instance.py,sha256=CXrOkdbXYwlEK5O8iEjDzrocAP5WQ9fQ-0_TcT4VgEA,609
10430
10435
  simo/notifications/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10431
10436
  simo/notifications/migrations/__pycache__/0001_initial.cpython-38.pyc,sha256=YnOJYRZH649OZj9j6VU5HR_zCERCrOsKm_U69jRVq9w,1648
10432
10437
  simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.pyc,sha256=Gkb3Qwr_zglGibQg9g5ekIgxtGapS4ENXVWQVHqM56I,794
10438
+ simo/notifications/migrations/__pycache__/0003_alter_notification_instance.cpython-38.pyc,sha256=awhD1F9RyK_706zVNM5io3WT_konFkKQgL7D5MkONwk,851
10433
10439
  simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc,sha256=YMBRHVon2nWDtIUbghckjnC12sIg_ykPWhV5aM0tto4,178
10434
10440
  simo/users/__init__.py,sha256=6a7uBpCWB_DR7p54rbHusc0xvi1qfT1ZCCQGb6TiBh8,52
10435
10441
  simo/users/admin.py,sha256=Xr7faGeupUKkpo1QLRm84OS63u-5Rf2ir_nVEaAPBZw,6839
@@ -10551,9 +10557,9 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10551
10557
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10552
10558
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10553
10559
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10554
- simo-2.5.11.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10555
- simo-2.5.11.dist-info/METADATA,sha256=EA87aQ2mip3VAeGWmYPF2WzEPLqpjFR_cu7NSzd2XtE,1924
10556
- simo-2.5.11.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10557
- simo-2.5.11.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10558
- simo-2.5.11.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10559
- simo-2.5.11.dist-info/RECORD,,
10560
+ simo-2.5.12.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10561
+ simo-2.5.12.dist-info/METADATA,sha256=PxKmTOUs81ncFdpPiAcL2KrrVlTtwuHmGgPIqBQbtdo,1924
10562
+ simo-2.5.12.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
10563
+ simo-2.5.12.dist-info/entry_points.txt,sha256=S9PwnUYmTSW7681GKDCxUbL0leRJIaRk6fDQIKgbZBA,135
10564
+ simo-2.5.12.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10565
+ simo-2.5.12.dist-info/RECORD,,
File without changes