simo 2.0.5__py3-none-any.whl → 2.0.7__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 (183) hide show
  1. simo/__pycache__/settings.cpython-38.pyc +0 -0
  2. simo/__pycache__/urls.cpython-38.pyc +0 -0
  3. simo/core/__pycache__/admin.cpython-38.pyc +0 -0
  4. simo/core/__pycache__/api.cpython-38.pyc +0 -0
  5. simo/core/__pycache__/api_auth.cpython-38.pyc +0 -0
  6. simo/core/__pycache__/api_meta.cpython-38.pyc +0 -0
  7. simo/core/__pycache__/auto_urls.cpython-38.pyc +0 -0
  8. simo/core/__pycache__/autocomplete_views.cpython-38.pyc +0 -0
  9. simo/core/__pycache__/base_types.cpython-38.pyc +0 -0
  10. simo/core/__pycache__/context.cpython-38.pyc +0 -0
  11. simo/core/__pycache__/controllers.cpython-38.pyc +0 -0
  12. simo/core/__pycache__/events.cpython-38.pyc +0 -0
  13. simo/core/__pycache__/forms.cpython-38.pyc +0 -0
  14. simo/core/__pycache__/gateways.cpython-38.pyc +0 -0
  15. simo/core/__pycache__/managers.cpython-38.pyc +0 -0
  16. simo/core/__pycache__/middleware.cpython-38.pyc +0 -0
  17. simo/core/__pycache__/models.cpython-38.pyc +0 -0
  18. simo/core/__pycache__/permissions.cpython-38.pyc +0 -0
  19. simo/core/__pycache__/serializers.cpython-38.pyc +0 -0
  20. simo/core/__pycache__/socket_consumers.cpython-38.pyc +0 -0
  21. simo/core/__pycache__/tasks.cpython-38.pyc +0 -0
  22. simo/core/__pycache__/views.cpython-38.pyc +0 -0
  23. simo/core/admin.py +10 -10
  24. simo/core/api.py +7 -6
  25. simo/core/controllers.py +1 -0
  26. simo/core/db_backend/__pycache__/__init__.cpython-38.pyc +0 -0
  27. simo/core/db_backend/__pycache__/base.cpython-38.pyc +0 -0
  28. simo/core/drf_braces/__pycache__/__init__.cpython-38.pyc +0 -0
  29. simo/core/drf_braces/__pycache__/utils.cpython-38.pyc +0 -0
  30. simo/core/drf_braces/fields/__pycache__/__init__.cpython-38.pyc +0 -0
  31. simo/core/drf_braces/fields/__pycache__/_fields.cpython-38.pyc +0 -0
  32. simo/core/drf_braces/fields/__pycache__/custom.cpython-38.pyc +0 -0
  33. simo/core/drf_braces/fields/__pycache__/mixins.cpython-38.pyc +0 -0
  34. simo/core/drf_braces/fields/__pycache__/modified.cpython-38.pyc +0 -0
  35. simo/core/drf_braces/serializers/__pycache__/__init__.cpython-38.pyc +0 -0
  36. simo/core/drf_braces/serializers/__pycache__/form_serializer.cpython-38.pyc +0 -0
  37. simo/core/forms.py +8 -6
  38. simo/core/migrations/0030_alter_instance_timezone.py +18 -0
  39. simo/core/migrations/__pycache__/0001_initial.cpython-38.pyc +0 -0
  40. simo/core/migrations/__pycache__/0002_load_icons.cpython-38.pyc +0 -0
  41. simo/core/migrations/__pycache__/0003_create_default_zones_and_categories.cpython-38.pyc +0 -0
  42. simo/core/migrations/__pycache__/0004_create_generic.cpython-38.pyc +0 -0
  43. simo/core/migrations/__pycache__/0005_component_subcomponents.cpython-38.pyc +0 -0
  44. simo/core/migrations/__pycache__/0006_alter_component_subcomponents.cpython-38.pyc +0 -0
  45. simo/core/migrations/__pycache__/0007_component_change_init_to.cpython-38.pyc +0 -0
  46. simo/core/migrations/__pycache__/0008_alter_component_change_init_to.cpython-38.pyc +0 -0
  47. simo/core/migrations/__pycache__/0009_auto_20220707_1404.cpython-38.pyc +0 -0
  48. simo/core/migrations/__pycache__/0010_historyaggregate.cpython-38.pyc +0 -0
  49. simo/core/migrations/__pycache__/0011_component_last_change.cpython-38.pyc +0 -0
  50. simo/core/migrations/__pycache__/0012_instance.cpython-38.pyc +0 -0
  51. simo/core/migrations/__pycache__/0013_auto_20231003_0754.cpython-38.pyc +0 -0
  52. simo/core/migrations/__pycache__/0014_zone_instance.cpython-38.pyc +0 -0
  53. simo/core/migrations/__pycache__/0015_auto_20231004_1113.cpython-38.pyc +0 -0
  54. simo/core/migrations/__pycache__/0016_auto_20231004_1113.cpython-38.pyc +0 -0
  55. simo/core/migrations/__pycache__/0017_auto_20231004_1313.cpython-38.pyc +0 -0
  56. simo/core/migrations/__pycache__/0018_auto_20231005_0622.cpython-38.pyc +0 -0
  57. simo/core/migrations/__pycache__/0019_alter_gateway_type.cpython-38.pyc +0 -0
  58. simo/core/migrations/__pycache__/0020_component_meta.cpython-38.pyc +0 -0
  59. simo/core/migrations/__pycache__/0021_auto_20231020_1041.cpython-38.pyc +0 -0
  60. simo/core/migrations/__pycache__/0026_category_instance.cpython-38.pyc +0 -0
  61. simo/core/migrations/__pycache__/0027_remove_component_tags.cpython-38.pyc +0 -0
  62. simo/core/migrations/__pycache__/0028_rename_subcomponents_component_slaves.cpython-38.pyc +0 -0
  63. simo/core/migrations/__pycache__/0029_auto_20240229_1331.cpython-38.pyc +0 -0
  64. simo/core/migrations/__pycache__/0030_alter_instance_timezone.cpython-38.pyc +0 -0
  65. simo/core/migrations/__pycache__/__init__.cpython-38.pyc +0 -0
  66. simo/core/models.py +31 -46
  67. simo/core/serializers.py +3 -4
  68. simo/core/templatetags/__pycache__/__init__.cpython-38.pyc +0 -0
  69. simo/core/templatetags/__pycache__/components_list.cpython-38.pyc +0 -0
  70. simo/core/utils/__pycache__/__init__.cpython-38.pyc +0 -0
  71. simo/core/utils/__pycache__/admin.cpython-38.pyc +0 -0
  72. simo/core/utils/__pycache__/config_values.cpython-38.pyc +0 -0
  73. simo/core/utils/__pycache__/easing.cpython-38.pyc +0 -0
  74. simo/core/utils/__pycache__/form_fields.cpython-38.pyc +0 -0
  75. simo/core/utils/__pycache__/form_widgets.cpython-38.pyc +0 -0
  76. simo/core/utils/__pycache__/formsets.cpython-38.pyc +0 -0
  77. simo/core/utils/__pycache__/helpers.cpython-38.pyc +0 -0
  78. simo/core/utils/__pycache__/logs.cpython-38.pyc +0 -0
  79. simo/core/utils/__pycache__/mixins.cpython-38.pyc +0 -0
  80. simo/core/utils/__pycache__/model_helpers.cpython-38.pyc +0 -0
  81. simo/core/utils/__pycache__/relay.cpython-38.pyc +0 -0
  82. simo/core/utils/__pycache__/serialization.cpython-38.pyc +0 -0
  83. simo/core/utils/__pycache__/type_constants.cpython-38.pyc +0 -0
  84. simo/core/utils/__pycache__/validators.cpython-38.pyc +0 -0
  85. simo/core/utils/serialization.py +4 -2
  86. simo/core/utils/type_constants.py +32 -11
  87. simo/fleet/__pycache__/admin.cpython-38.pyc +0 -0
  88. simo/fleet/__pycache__/api.cpython-38.pyc +0 -0
  89. simo/fleet/__pycache__/auto_urls.cpython-38.pyc +0 -0
  90. simo/fleet/__pycache__/controllers.cpython-38.pyc +0 -0
  91. simo/fleet/__pycache__/forms.cpython-38.pyc +0 -0
  92. simo/fleet/__pycache__/gateways.cpython-38.pyc +0 -0
  93. simo/fleet/__pycache__/managers.cpython-38.pyc +0 -0
  94. simo/fleet/__pycache__/models.cpython-38.pyc +0 -0
  95. simo/fleet/__pycache__/serializers.cpython-38.pyc +0 -0
  96. simo/fleet/__pycache__/socket_consumers.cpython-38.pyc +0 -0
  97. simo/fleet/__pycache__/utils.cpython-38.pyc +0 -0
  98. simo/fleet/__pycache__/views.cpython-38.pyc +0 -0
  99. simo/fleet/admin.py +6 -6
  100. simo/fleet/auto_urls.py +4 -4
  101. simo/fleet/controllers.py +75 -2
  102. simo/fleet/forms.py +68 -33
  103. simo/fleet/gateways.py +7 -3
  104. simo/fleet/managers.py +4 -2
  105. simo/fleet/migrations/0032_auto_20240415_0736.py +33 -0
  106. simo/fleet/migrations/0033_auto_20240415_0736.py +28 -0
  107. simo/fleet/migrations/__pycache__/0025_auto_20240130_1334.cpython-38.pyc +0 -0
  108. simo/fleet/migrations/__pycache__/0026_rename_i2cinterface_scl_pin_and_more.cpython-38.pyc +0 -0
  109. simo/fleet/migrations/__pycache__/0027_auto_20240306_0802.cpython-38.pyc +0 -0
  110. simo/fleet/migrations/__pycache__/0028_remove_i2cinterface_scl_pin_no_and_more.cpython-38.pyc +0 -0
  111. simo/fleet/migrations/__pycache__/0029_alter_i2cinterface_scl_pin_and_more.cpython-38.pyc +0 -0
  112. simo/fleet/migrations/__pycache__/0030_colonelpin_label_alter_colonel_type.cpython-38.pyc +0 -0
  113. simo/fleet/migrations/__pycache__/0031_alter_colonel_type.cpython-38.pyc +0 -0
  114. simo/fleet/migrations/__pycache__/0032_auto_20240415_0736.cpython-38.pyc +0 -0
  115. simo/fleet/migrations/__pycache__/0033_auto_20240415_0736.cpython-38.pyc +0 -0
  116. simo/fleet/models.py +82 -14
  117. simo/fleet/socket_consumers.py +19 -12
  118. simo/fleet/utils.py +6 -1
  119. simo/fleet/views.py +10 -9
  120. simo/generic/__pycache__/__init__.cpython-38.pyc +0 -0
  121. simo/generic/__pycache__/app_widgets.cpython-38.pyc +0 -0
  122. simo/generic/__pycache__/base_types.cpython-38.pyc +0 -0
  123. simo/generic/__pycache__/controllers.cpython-38.pyc +0 -0
  124. simo/generic/__pycache__/forms.cpython-38.pyc +0 -0
  125. simo/generic/__pycache__/gateways.cpython-38.pyc +0 -0
  126. simo/generic/__pycache__/models.cpython-38.pyc +0 -0
  127. simo/generic/__pycache__/routing.cpython-38.pyc +0 -0
  128. simo/generic/__pycache__/socket_consumers.cpython-38.pyc +0 -0
  129. simo/generic/controllers.py +0 -7
  130. simo/generic/forms.py +0 -3
  131. simo/generic/gateways.py +0 -8
  132. simo/multimedia/__pycache__/__init__.cpython-38.pyc +0 -0
  133. simo/multimedia/__pycache__/admin.cpython-38.pyc +0 -0
  134. simo/multimedia/__pycache__/api.cpython-38.pyc +0 -0
  135. simo/multimedia/__pycache__/app_widgets.cpython-38.pyc +0 -0
  136. simo/multimedia/__pycache__/base_types.cpython-38.pyc +0 -0
  137. simo/multimedia/__pycache__/controllers.cpython-38.pyc +0 -0
  138. simo/multimedia/__pycache__/forms.cpython-38.pyc +0 -0
  139. simo/multimedia/__pycache__/models.cpython-38.pyc +0 -0
  140. simo/multimedia/__pycache__/serializers.cpython-38.pyc +0 -0
  141. simo/multimedia/migrations/__pycache__/0001_initial.cpython-38.pyc +0 -0
  142. simo/multimedia/migrations/__pycache__/0002_sound_length.cpython-38.pyc +0 -0
  143. simo/multimedia/migrations/__pycache__/0003_alter_sound_length.cpython-38.pyc +0 -0
  144. simo/multimedia/migrations/__pycache__/0004_auto_20231023_1055.cpython-38.pyc +0 -0
  145. simo/multimedia/migrations/__pycache__/__init__.cpython-38.pyc +0 -0
  146. simo/notifications/__pycache__/__init__.cpython-38.pyc +0 -0
  147. simo/notifications/__pycache__/admin.cpython-38.pyc +0 -0
  148. simo/notifications/__pycache__/api.cpython-38.pyc +0 -0
  149. simo/notifications/__pycache__/models.cpython-38.pyc +0 -0
  150. simo/notifications/__pycache__/serializers.cpython-38.pyc +0 -0
  151. simo/notifications/migrations/__pycache__/0001_initial.cpython-38.pyc +0 -0
  152. simo/notifications/migrations/__pycache__/0002_notification_instance.cpython-38.pyc +0 -0
  153. simo/notifications/migrations/__pycache__/__init__.cpython-38.pyc +0 -0
  154. simo/users/__pycache__/admin.cpython-38.pyc +0 -0
  155. simo/users/__pycache__/api.cpython-38.pyc +0 -0
  156. simo/users/__pycache__/auto_urls.cpython-38.pyc +0 -0
  157. simo/users/__pycache__/middleware.cpython-38.pyc +0 -0
  158. simo/users/__pycache__/models.cpython-38.pyc +0 -0
  159. simo/users/__pycache__/serializers.cpython-38.pyc +0 -0
  160. simo/users/__pycache__/sso_urls.cpython-38.pyc +0 -0
  161. simo/users/migrations/__pycache__/0001_initial.cpython-38.pyc +0 -0
  162. simo/users/migrations/__pycache__/0002_componentpermission.cpython-38.pyc +0 -0
  163. simo/users/migrations/__pycache__/0003_create_roles_and_system_user.cpython-38.pyc +0 -0
  164. simo/users/migrations/__pycache__/0004_user_secret_key.cpython-38.pyc +0 -0
  165. simo/users/migrations/__pycache__/0005_permissionsrole_instance.cpython-38.pyc +0 -0
  166. simo/users/migrations/__pycache__/0006_auto_20231003_0850.cpython-38.pyc +0 -0
  167. simo/users/migrations/__pycache__/0007_auto_20231003_1228.cpython-38.pyc +0 -0
  168. simo/users/migrations/__pycache__/0008_auto_20231003_1229.cpython-38.pyc +0 -0
  169. simo/users/migrations/__pycache__/0009_remove_user_role.cpython-38.pyc +0 -0
  170. simo/users/migrations/__pycache__/0010_auto_20231004_1313.cpython-38.pyc +0 -0
  171. simo/users/migrations/__pycache__/0011_auto_20231004_1313.cpython-38.pyc +0 -0
  172. simo/users/migrations/__pycache__/0012_alter_userinstancerole_unique_together.cpython-38.pyc +0 -0
  173. simo/users/migrations/__pycache__/0013_remove_user_roles.cpython-38.pyc +0 -0
  174. simo/users/migrations/__pycache__/0014_user_roles.cpython-38.pyc +0 -0
  175. simo/users/migrations/__pycache__/0015_remove_user_at_home.cpython-38.pyc +0 -0
  176. simo/users/migrations/__pycache__/0016_auto_20231005_1050.cpython-38.pyc +0 -0
  177. simo/users/migrations/__pycache__/0025_rename_name_fingerprint_type_and_more.cpython-38.pyc +0 -0
  178. simo/users/migrations/__pycache__/__init__.cpython-38.pyc +0 -0
  179. {simo-2.0.5.dist-info → simo-2.0.7.dist-info}/METADATA +1 -1
  180. {simo-2.0.5.dist-info → simo-2.0.7.dist-info}/RECORD +183 -89
  181. {simo-2.0.5.dist-info → simo-2.0.7.dist-info}/LICENSE.md +0 -0
  182. {simo-2.0.5.dist-info → simo-2.0.7.dist-info}/WHEEL +0 -0
  183. {simo-2.0.5.dist-info → simo-2.0.7.dist-info}/top_level.txt +0 -0
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
simo/core/admin.py CHANGED
@@ -9,8 +9,7 @@ from django.views.decorators.csrf import csrf_protect
9
9
  from django.shortcuts import redirect, render
10
10
  from simo.users.models import ComponentPermission
11
11
  from .utils.type_constants import (
12
- ALL_BASE_TYPES,
13
- get_all_gateways, get_controller_types_map
12
+ ALL_BASE_TYPES, GATEWAYS_MAP, CONTROLLERS_BY_GATEWAY
14
13
  )
15
14
  from .models import Instance, Icon, Gateway, Component, Zone, Category
16
15
  from .forms import (
@@ -22,7 +21,6 @@ from .forms import (
22
21
  )
23
22
  from .filters import ZonesFilter
24
23
  from .widgets import AdminImageWidget
25
- from .middleware import get_current_instance
26
24
  from simo.conf import dynamic_settings
27
25
 
28
26
  csrf_protect_m = method_decorator(csrf_protect)
@@ -156,7 +154,7 @@ class GatewayAdmin(admin.ModelAdmin):
156
154
  }
157
155
  if request.session.get('gateway_type'):
158
156
  try:
159
- formClass = get_all_gateways().get(
157
+ formClass = GATEWAYS_MAP.get(
160
158
  request.session.get('gateway_type')
161
159
  ).config_form
162
160
  except:
@@ -188,7 +186,7 @@ class GatewayAdmin(admin.ModelAdmin):
188
186
  )
189
187
  except:
190
188
  ctx['error'] = '%s gateway already exists!' \
191
- % get_all_gateways().get(
189
+ % GATEWAYS_MAP.get(
192
190
  request.session.get('gateway_type'), 'None'
193
191
  ).name
194
192
  else:
@@ -210,7 +208,7 @@ class GatewayAdmin(admin.ModelAdmin):
210
208
 
211
209
  def get_form(self, request, obj=None, change=False, **kwargs):
212
210
  if obj:
213
- gateway_class = get_all_gateways().get(obj.type)
211
+ gateway_class = GATEWAYS_MAP.get(obj.type)
214
212
  if gateway_class:
215
213
  return gateway_class.config_form
216
214
  return BaseGatewayForm
@@ -323,8 +321,8 @@ class ComponentAdmin(admin.ModelAdmin):
323
321
 
324
322
  if request.session.get('add_comp_type'):
325
323
  try:
326
- controller_cls = get_controller_types_map(
327
- gateway
324
+ controller_cls = CONTROLLERS_BY_GATEWAY.get(
325
+ gateway.type, {}
328
326
  )[request.session['add_comp_type']]
329
327
  except:
330
328
  request.session.pop('add_comp_type')
@@ -357,6 +355,7 @@ class ComponentAdmin(admin.ModelAdmin):
357
355
  pop_fields_from_form(ctx['form'])
358
356
  if ctx['form'].is_valid():
359
357
  if ctx['form'].controller.is_discoverable:
358
+ print("INIT DISCOVERY!!!")
360
359
  ctx['form'].controller.init_discovery(
361
360
  ctx['form'].cleaned_data
362
361
  )
@@ -395,6 +394,7 @@ class ComponentAdmin(admin.ModelAdmin):
395
394
  if ctx['form'].is_valid():
396
395
  request.session['add_comp_type'] = \
397
396
  ctx['form'].cleaned_data['controller_type']
397
+ print("Session controller type: ", request.session['add_comp_type'])
398
398
  return redirect(request.path)
399
399
 
400
400
  else:
@@ -430,8 +430,8 @@ class ComponentAdmin(admin.ModelAdmin):
430
430
  def get_form(self, request, obj=None, change=False, **kwargs):
431
431
  if obj:
432
432
  try:
433
- self.form = get_controller_types_map(
434
- obj.gateway
433
+ self.form = CONTROLLERS_BY_GATEWAY.get(
434
+ obj.gateway.type, {}
435
435
  )[obj.controller_uid].config_form
436
436
  except KeyError:
437
437
  pass
simo/core/api.py CHANGED
@@ -62,7 +62,7 @@ class IconViewSet(viewsets.ReadOnlyModelViewSet):
62
62
  if 'q' in self.request.GET:
63
63
  queryset = search_queryset(
64
64
  queryset, self.request.GET['q'], ['slug', 'keywords']
65
- )[:10]
65
+ )[:25]
66
66
  return queryset
67
67
 
68
68
  def get_view_name(self):
@@ -182,7 +182,6 @@ class ComponentViewSet(InstanceMixin, viewsets.ModelViewSet):
182
182
  return singular
183
183
 
184
184
  def perform_controller_method(self, json_data, component):
185
- component.prepare_controller()
186
185
  for method_name, param in json_data.items():
187
186
  if not hasattr(component, method_name):
188
187
  raise APIValidationError(
@@ -584,16 +583,17 @@ class ControllerTypes(InstanceMixin, viewsets.GenericViewSet):
584
583
  return permissions
585
584
 
586
585
  def list(self, request, *args, **kwargs):
587
- from .utils.type_constants import get_controller_types_map
586
+ from .utils.type_constants import CONTROLLER_TYPES_MAP
588
587
  data = {}
589
588
 
590
- for uid, cls in get_controller_types_map().items():
589
+ for uid, cls in CONTROLLER_TYPES_MAP.items():
591
590
  if cls.gateway_class.name not in data:
592
591
  data[cls.gateway_class.name] = []
593
592
  data[cls.gateway_class.name].append({
594
593
  'uid': uid,
595
594
  'name': cls.name,
596
- 'is_discoverable': cls.is_discoverable
595
+ 'is_discoverable': cls.is_discoverable,
596
+ 'manual_add': cls.manual_add
597
597
  })
598
598
 
599
599
  return RESTResponse(data)
@@ -604,7 +604,6 @@ class RunningDiscoveries(InstanceMixin, viewsets.GenericViewSet):
604
604
  basename = 'discoveries'
605
605
  queryset = []
606
606
 
607
-
608
607
  def get_permissions(self):
609
608
  permissions = super().get_permissions()
610
609
  permissions.append(IsInstanceSuperuser())
@@ -613,6 +612,8 @@ class RunningDiscoveries(InstanceMixin, viewsets.GenericViewSet):
613
612
  def get_data(self, gateways):
614
613
  data = []
615
614
  for gateway in gateways:
615
+ gateway.discovery['last_check'] = time.time()
616
+ gateway.save(update_fields=['discovery'])
616
617
  data.append({
617
618
  'gateway': gateway.id,
618
619
  'start': gateway.discovery['start'],
simo/core/controllers.py CHANGED
@@ -34,6 +34,7 @@ class ControllerBase(ABC):
34
34
  default_config = {}
35
35
  default_meta = {}
36
36
  discovery_msg = None
37
+ manual_add = True # Can be added manually
37
38
 
38
39
  @property
39
40
  @abstractmethod
simo/core/forms.py CHANGED
@@ -260,10 +260,12 @@ class CompTypeSelectForm(forms.Form):
260
260
  def __init__(self, gateway, *args, **kwargs):
261
261
  super().__init__(*args, **kwargs)
262
262
  if gateway:
263
- from .utils.type_constants import get_controller_types_choices
264
- self.fields['controller_type'].choices = get_controller_types_choices(
265
- gateway
266
- )
263
+ from .utils.type_constants import CONTROLLERS_BY_GATEWAY
264
+ self.fields['controller_type'].choices = [
265
+ (cls.uid, cls.name) for cls in CONTROLLERS_BY_GATEWAY.get(
266
+ gateway.handler.uid, {}
267
+ ).values() if cls.manual_add
268
+ ]
267
269
 
268
270
 
269
271
  class ComponentAdminForm(forms.ModelForm):
@@ -300,8 +302,8 @@ class ComponentAdminForm(forms.ModelForm):
300
302
  self.gateway = self.instance.gateway
301
303
  self.controller = self.instance.controller
302
304
  else:
303
- from .utils.type_constants import get_controller_types_map
304
- ControllerClass = get_controller_types_map().get(self.controller_uid)
305
+ from .utils.type_constants import CONTROLLER_TYPES_MAP
306
+ ControllerClass = CONTROLLER_TYPES_MAP.get(self.controller_uid)
305
307
  if ControllerClass:
306
308
  self.controller = ControllerClass(self.instance)
307
309
  self.gateway = Gateway.objects.filter(
@@ -0,0 +1,18 @@
1
+ # Generated by Django 3.2.9 on 2024-04-15 11:08
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('core', '0029_auto_20240229_1331'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='instance',
15
+ name='timezone',
16
+ 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/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/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, max_length=50),
17
+ ),
18
+ ]
simo/core/models.py CHANGED
@@ -217,16 +217,11 @@ class Gateway(DirtyFieldsMixin, models.Model, SimoAdminMixin):
217
217
  return self.type
218
218
 
219
219
  def __init__(self, *args, **kwargs):
220
- from .utils.type_constants import get_all_gateways
221
- ALL_GATEWAYS = get_all_gateways()
222
- GATEWAYS_CHOICES = [
223
- (slug, cls.name) for slug, cls in ALL_GATEWAYS.items()
224
- ]
225
- GATEWAYS_CHOICES.sort(key=lambda e: e[1])
220
+ from .utils.type_constants import GATEWAYS_MAP, GATEWAYS_CHOICES
226
221
  self._meta.get_field('type').choices = GATEWAYS_CHOICES
227
222
  super().__init__(*args, **kwargs)
228
223
 
229
- gateway_class = ALL_GATEWAYS.get(self.type)
224
+ gateway_class = GATEWAYS_MAP.get(self.type)
230
225
  if gateway_class:
231
226
  self.handler = gateway_class(self)
232
227
  if hasattr(self.handler, 'run'):
@@ -272,8 +267,8 @@ class Gateway(DirtyFieldsMixin, models.Model, SimoAdminMixin):
272
267
 
273
268
  def process_discovery(self, data):
274
269
  self.refresh_from_db()
275
- from .utils.type_constants import get_controller_types_map
276
- ControllerClass = get_controller_types_map().get(
270
+ from .utils.type_constants import CONTROLLER_TYPES_MAP
271
+ ControllerClass = CONTROLLER_TYPES_MAP.get(
277
272
  self.discovery['controller_uid']
278
273
  )
279
274
  if ControllerClass and hasattr(
@@ -283,6 +278,7 @@ class Gateway(DirtyFieldsMixin, models.Model, SimoAdminMixin):
283
278
  started_with=self.discovery['init_data'], data=data
284
279
  )
285
280
  if result:
281
+ self.refresh_from_db()
286
282
  if not isinstance(result, dict) and isinstance(result, Iterable):
287
283
  for res in result:
288
284
  if isinstance(res, models.Model):
@@ -403,18 +399,7 @@ def is_in_alarm(self):
403
399
 
404
400
  def __init__(self, *args, **kwargs):
405
401
  super().__init__(*args, **kwargs)
406
- # Goes in zero seconds!
407
- if self.instance_methods:
408
- custom_methods = {}
409
- funcType = type(self.save)
410
- try:
411
- exec(self.instance_methods, None, custom_methods)
412
- except:
413
- pass
414
- for key, val in custom_methods.items():
415
- if not callable(val):
416
- continue
417
- setattr(self, key, funcType(val, self))
402
+ self.prepare_controller()
418
403
 
419
404
  def __str__(self):
420
405
  if self.zone:
@@ -424,40 +409,40 @@ def is_in_alarm(self):
424
409
  @cached_property
425
410
  def controller(self):
426
411
  from .utils.type_constants import (
427
- get_controller_types_map,
428
- get_controller_types_choices
412
+ CONTROLLERS_BY_GATEWAY,
413
+ CONTROLLER_TYPES_CHOICES
429
414
  )
430
- self._meta.get_field('controller_uid').choices = \
431
- get_controller_types_choices()
415
+ self._meta.get_field('controller_uid').choices = CONTROLLER_TYPES_CHOICES
432
416
  if self.controller_uid:
433
417
  controller_cls = None
434
- if self.id and not 'test' in sys.argv:
435
- try:
436
- controller_cls = cache.get('c_%d_contr_cls' % self.id)
437
- except:
438
- pass
439
418
  if not controller_cls:
440
- controller_cls = get_controller_types_map(
441
- self.gateway
419
+ controller_cls = CONTROLLERS_BY_GATEWAY.get(
420
+ self.gateway.type, {}
442
421
  ).get(self.controller_uid)
443
- if controller_cls and self.id and not 'test' in sys.argv:
444
- cache.set(
445
- 'c_%d_contr_cls' % self.id,
446
- controller_cls, None
447
- )
448
422
  if controller_cls:
449
423
  return controller_cls(self)
450
424
 
451
425
  def prepare_controller(self):
452
- if not self.controller:
453
- return
454
- controller_methods = [m for m in inspect.getmembers(
455
- self.controller, predicate=inspect.ismethod
456
- ) if not m[0].startswith('_')]
457
- for method in controller_methods:
458
- setattr(self, method[0], method[1])
459
- if not self.id:
460
- self.value = self.controller.default_value
426
+ if self.controller:
427
+ controller_methods = [m for m in inspect.getmembers(
428
+ self.controller, predicate=inspect.ismethod
429
+ ) if not m[0].startswith('_')]
430
+ for method in controller_methods:
431
+ setattr(self, method[0], method[1])
432
+ if not self.id:
433
+ self.value = self.controller.default_value
434
+
435
+ if self.instance_methods:
436
+ custom_methods = {}
437
+ funcType = type(self.save)
438
+ try:
439
+ exec(self.instance_methods, None, custom_methods)
440
+ except:
441
+ pass
442
+ for key, val in custom_methods.items():
443
+ if not callable(val):
444
+ continue
445
+ setattr(self, key, funcType(val, self))
461
446
 
462
447
  def get_socket_url(self):
463
448
  return reverse_lazy(
simo/core/serializers.py CHANGED
@@ -284,17 +284,16 @@ class ComponentSerializer(FormSerializer):
284
284
  def set_form_cls(self):
285
285
  self.Meta.form = ComponentAdminForm
286
286
  if not isinstance(self.instance, Iterable):
287
- from .utils.type_constants import get_controller_types_map
288
- controllers_map = get_controller_types_map()
287
+ from .utils.type_constants import CONTROLLER_TYPES_MAP
289
288
  if not self.instance:
290
- controller = controllers_map.get(
289
+ controller = CONTROLLER_TYPES_MAP.get(
291
290
  #'simo.generic.controllers.AlarmClock'
292
291
  self.context['request'].META.get('HTTP_CONTROLLER')
293
292
  )
294
293
  if controller:
295
294
  self.Meta.form = controller.add_form
296
295
  else:
297
- controller = controllers_map.get(
296
+ controller = CONTROLLER_TYPES_MAP.get(
298
297
  self.instance.controller_uid
299
298
  )
300
299
  if controller: