openwisp-controller 1.2__tar.gz → 1.2.2__tar.gz

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.
Files changed (333) hide show
  1. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/CHANGES.rst +24 -0
  2. {openwisp_controller-1.2/openwisp_controller.egg-info → openwisp_controller-1.2.2}/PKG-INFO +1 -1
  3. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/__init__.py +1 -1
  4. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/admin.py +12 -3
  5. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/config.py +4 -4
  6. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/device_group.py +4 -4
  7. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/multitenancy.py +2 -1
  8. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/template.py +3 -4
  9. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/vpn.py +1 -1
  10. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0023_update_context.py +4 -3
  11. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0028_template_default_values.py +3 -3
  12. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0036_device_group.py +5 -3
  13. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0049_devicegroup_context.py +2 -2
  14. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0051_organizationconfigsettings_context.py +2 -2
  15. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_admin.py +30 -0
  16. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_vpn.py +22 -9
  17. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/views.py +1 -0
  18. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_api.py +18 -0
  19. {openwisp_controller-1.2 → openwisp_controller-1.2.2/openwisp_controller.egg-info}/PKG-INFO +1 -1
  20. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/LICENSE +0 -0
  21. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/MANIFEST.in +0 -0
  22. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/README.rst +0 -0
  23. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/admin.py +0 -0
  24. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/base.py +0 -0
  25. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/checks.py +0 -0
  26. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/__init__.py +0 -0
  27. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/__init__.py +0 -0
  28. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/download_views.py +0 -0
  29. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/filters.py +0 -0
  30. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/serializers.py +0 -0
  31. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/urls.py +0 -0
  32. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/views.py +0 -0
  33. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/zerotier_service.py +0 -0
  34. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/apps.py +0 -0
  35. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/__init__.py +0 -0
  36. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/base.py +0 -0
  37. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/channels_consumer.py +0 -0
  38. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/device.py +0 -0
  39. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/tag.py +0 -0
  40. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/controller/__init__.py +0 -0
  41. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/controller/urls.py +0 -0
  42. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/controller/views.py +0 -0
  43. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/crypto.py +0 -0
  44. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/exceptions.py +0 -0
  45. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/exportable.py +0 -0
  46. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/filters.py +0 -0
  47. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/fixtures/test_templates.json +0 -0
  48. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/handlers.py +0 -0
  49. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0001_squashed_0002_config_settings_uuid.py +0 -0
  50. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0003_template_tags.py +0 -0
  51. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0004_add_device_model.py +0 -0
  52. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0005_populate_device.py +0 -0
  53. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0006_config_device_not_null.py +0 -0
  54. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0007_simplify_config.py +0 -0
  55. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0008_update_indexes.py +0 -0
  56. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0009_device_system.py +0 -0
  57. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0010_auto_20180106_1814.py +0 -0
  58. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0011_update_device_mac_address.py +0 -0
  59. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0012_auto_20180219_1501.py +0 -0
  60. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0013_last_ip_management_ip_and_status_applied.py +0 -0
  61. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0014_device_hardware_id.py +0 -0
  62. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0015_default_groups_permissions.py +0 -0
  63. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0016_default_organization_config_settings.py +0 -0
  64. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0017_template_name_organization_unique_together.py +0 -0
  65. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0018_config_context.py +0 -0
  66. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0019_organization_mac_add_hardware_id_name_unique_together.py +0 -0
  67. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0020_remove_config_organization.py +0 -0
  68. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0021_vpn_key.py +0 -0
  69. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0022_vpn_format_dh.py +0 -0
  70. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0024_update_context_data.py +0 -0
  71. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0025_update_device_key.py +0 -0
  72. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0026_hardware_id_not_unique.py +0 -0
  73. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0027_add_indexes_on_ip_fields.py +0 -0
  74. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0029_merge_django_netjsonconfig.py +0 -0
  75. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0030_django_taggit_update.py +0 -0
  76. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0031_update_vpn_dh_param.py +0 -0
  77. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0032_update_legacy_vpn_backend.py +0 -0
  78. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0033_name_unique_per_organization.py +0 -0
  79. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0034_template_required.py +0 -0
  80. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0035_device_name_unique_optional.py +0 -0
  81. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0037_alter_taggedtemplate.py +0 -0
  82. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0038_vpn_subnet.py +0 -0
  83. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0039_wireguard_vxlan_ipam.py +0 -0
  84. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0040_vpnclient_ip_setnull.py +0 -0
  85. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0041_default_groups_organizationconfigsettings_permission.py +0 -0
  86. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0042_multiple_wireguard_tunnels.py +0 -0
  87. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0043_devicegroup_templates.py +0 -0
  88. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0044_config_error_reason.py +0 -0
  89. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0045_alter_vpn_webhook_endpoint.py +0 -0
  90. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0046_organizationlimits.py +0 -0
  91. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0047_add_organizationlimits.py +0 -0
  92. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0048_wifi_radio_band_migration.py +0 -0
  93. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0050_alter_vpnclient_unique_together.py +0 -0
  94. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0052_vpn_node_network_id.py +0 -0
  95. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0053_vpnclient_secret.py +0 -0
  96. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0054_device__is_deactivated.py +0 -0
  97. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0055_alter_config_status.py +0 -0
  98. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0056_vpnclient_template.py +0 -0
  99. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0057_populate_vpnclient_template.py +0 -0
  100. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0058_alter_vpnclient_template.py +0 -0
  101. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0059_zerotier_templates_ow_zt_to_global.py +0 -0
  102. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0060_cleanup_api_task_notification_types.py +0 -0
  103. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0061_config_checksum_db.py +0 -0
  104. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/__init__.py +0 -0
  105. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/models.py +0 -0
  106. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/settings.py +0 -0
  107. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/signals.py +0 -0
  108. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/sortedm2m/__init__.py +0 -0
  109. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/sortedm2m/fields.py +0 -0
  110. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/sortedm2m/forms.py +0 -0
  111. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/admin.css +0 -0
  112. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/device-delete-confirmation.css +0 -0
  113. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/devicegroup.css +0 -0
  114. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/lib/advanced-mode.css +0 -0
  115. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/lib/img/jsoneditor-icons.svg +0 -0
  116. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/lib/jsonschema-ui.css +0 -0
  117. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/device-delete-confirmation.js +0 -0
  118. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/lib/advanced-mode.js +0 -0
  119. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/lib/jsonschema-ui.js +0 -0
  120. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/lib/tomorrow_night_bright.js +0 -0
  121. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/management_ip.js +0 -0
  122. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/preview.js +0 -0
  123. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/relevant_templates.js +0 -0
  124. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/switcher.js +0 -0
  125. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/tabs.js +0 -0
  126. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/unsaved_changes.js +0 -0
  127. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/utils.js +0 -0
  128. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/vpn.js +0 -0
  129. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/widget.js +0 -0
  130. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/import_export/import-openwisp.css +0 -0
  131. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/sortedm2m/patch_sortedm2m.js +0 -0
  132. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/support.css +0 -0
  133. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tasks.py +0 -0
  134. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tasks_zerotier.py +0 -0
  135. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/change_device_group.html +0 -0
  136. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/change_form.html +0 -0
  137. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/change_list_device.html +0 -0
  138. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/clone_template_form.html +0 -0
  139. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/device/change_form.html +0 -0
  140. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/device/delete_confirmation.html +0 -0
  141. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/device/delete_selected_confirmation.html +0 -0
  142. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/device_recover_form.html +0 -0
  143. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/jsonschema-widget.html +0 -0
  144. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/preview.html +0 -0
  145. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/system_context.html +0 -0
  146. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/device_group/change_form.html +0 -0
  147. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/import_export/import.html +0 -0
  148. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/reversion/config/revision_form.html +0 -0
  149. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/__init__.py +0 -0
  150. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/pytest.py +0 -0
  151. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_api.py +0 -0
  152. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_apps.py +0 -0
  153. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_config.py +0 -0
  154. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_controller.py +0 -0
  155. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_device.py +0 -0
  156. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_device_group.py +0 -0
  157. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_handlers.py +0 -0
  158. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_notifications.py +0 -0
  159. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_selenium.py +0 -0
  160. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_tag.py +0 -0
  161. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_template.py +0 -0
  162. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_views.py +0 -0
  163. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/utils.py +0 -0
  164. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/urls.py +0 -0
  165. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/utils.py +0 -0
  166. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/validators.py +0 -0
  167. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/views.py +0 -0
  168. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/widgets.py +0 -0
  169. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/__init__.py +0 -0
  170. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/admin.py +0 -0
  171. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/api/serializers.py +0 -0
  172. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/api/urls.py +0 -0
  173. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/api/views.py +0 -0
  174. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/apps.py +0 -0
  175. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/base/__init__.py +0 -0
  176. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/base/models.py +0 -0
  177. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/channels/consumers.py +0 -0
  178. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/channels/routing.py +0 -0
  179. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/commands.py +0 -0
  180. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/__init__.py +0 -0
  181. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/airos/snmp.py +0 -0
  182. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/exceptions.py +0 -0
  183. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/openwrt/__init__.py +0 -0
  184. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/openwrt/snmp.py +0 -0
  185. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/openwrt/ssh.py +0 -0
  186. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/snmp.py +0 -0
  187. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/ssh.py +0 -0
  188. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/exceptions.py +0 -0
  189. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0001_initial.py +0 -0
  190. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0002_credentials_auto_add.py +0 -0
  191. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0003_default_group_permissions.py +0 -0
  192. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0004_django3_1_upgrade.py +0 -0
  193. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0005_device_connection_failure_reason.py +0 -0
  194. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0006_name_unique_per_organization.py +0 -0
  195. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0007_command.py +0 -0
  196. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0008_remove_conflicting_deviceconnections.py +0 -0
  197. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0009_alter_deviceconnection_unique_together.py +0 -0
  198. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/__init__.py +0 -0
  199. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/models.py +0 -0
  200. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/schema.py +0 -0
  201. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/settings.py +0 -0
  202. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/signals.py +0 -0
  203. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/css/command-inline.css +0 -0
  204. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/css/credentials.css +0 -0
  205. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/js/commands.js +0 -0
  206. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/js/credentials.js +0 -0
  207. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/js/lib/reconnecting-websocket.min.js +0 -0
  208. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tasks.py +0 -0
  209. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/__init__.py +0 -0
  210. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/base.py +0 -0
  211. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/pytest.py +0 -0
  212. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test-key.ed25519 +0 -0
  213. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test-key.rsa +0 -0
  214. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_admin.py +0 -0
  215. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_api.py +0 -0
  216. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_command_utilities.py +0 -0
  217. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_models.py +0 -0
  218. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_notifications.py +0 -0
  219. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_selenium.py +0 -0
  220. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_snmp.py +0 -0
  221. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_ssh.py +0 -0
  222. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_tasks.py +0 -0
  223. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/utils.py +0 -0
  224. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/utils.py +0 -0
  225. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/widgets.py +0 -0
  226. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/context_processors.py +0 -0
  227. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/__init__.py +0 -0
  228. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/admin.py +0 -0
  229. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/__init__.py +0 -0
  230. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/filters.py +0 -0
  231. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/serializers.py +0 -0
  232. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/urls.py +0 -0
  233. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/apps.py +0 -0
  234. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/base/__init__.py +0 -0
  235. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/base/models.py +0 -0
  236. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/channels/__init__.py +0 -0
  237. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/channels/consumers.py +0 -0
  238. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/channels/routing.py +0 -0
  239. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/exportable.py +0 -0
  240. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/migrations/0001_initial.py +0 -0
  241. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/migrations/0002_default_groups_permissions.py +0 -0
  242. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/migrations/0003_alter_devicelocation_floorplan_location.py +0 -0
  243. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/migrations/__init__.py +0 -0
  244. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/models.py +0 -0
  245. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/templates/admin/widgets/foreign_key_raw_id.html +0 -0
  246. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/__init__.py +0 -0
  247. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/pytest.py +0 -0
  248. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_admin.py +0 -0
  249. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_admin_inline.py +0 -0
  250. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_apps.py +0 -0
  251. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_models.py +0 -0
  252. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_selenium.py +0 -0
  253. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/utils.py +0 -0
  254. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/utils.py +0 -0
  255. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/migrations.py +0 -0
  256. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/mixins.py +0 -0
  257. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/__init__.py +0 -0
  258. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/admin.py +0 -0
  259. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/api/serializers.py +0 -0
  260. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/api/urls.py +0 -0
  261. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/api/views.py +0 -0
  262. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/apps.py +0 -0
  263. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/base/__init__.py +0 -0
  264. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/base/models.py +0 -0
  265. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0001_initial.py +0 -0
  266. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0002_add_organization_name.py +0 -0
  267. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0003_fill_organization_name.py +0 -0
  268. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0004_auto_20180106_1814.py +0 -0
  269. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0005_organizational_unit_name.py +0 -0
  270. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0006_add_x509_passphrase_field.py +0 -0
  271. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0007_default_groups_permissions.py +0 -0
  272. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0008_serial_number_length.py +0 -0
  273. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0009_common_name_maxlength_64.py +0 -0
  274. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0010_common_name_organization_unique.py +0 -0
  275. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0011_disallowed_blank_key_length_or_digest.py +0 -0
  276. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/__init__.py +0 -0
  277. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/models.py +0 -0
  278. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/static/admin/pki/js/show-org-field.js +0 -0
  279. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/templates/admin/pki/change_form.html +0 -0
  280. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/__init__.py +0 -0
  281. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/test_admin.py +0 -0
  282. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/test_api.py +0 -0
  283. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/test_models.py +0 -0
  284. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/utils.py +0 -0
  285. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/urls.py +0 -0
  286. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/utils.py +0 -0
  287. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/routing.py +0 -0
  288. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/serializers.py +0 -0
  289. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/settings.py +0 -0
  290. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/__init__.py +0 -0
  291. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/admin.py +0 -0
  292. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/apps.py +0 -0
  293. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/base/models.py +0 -0
  294. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/filters.py +0 -0
  295. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0001_initial.py +0 -0
  296. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0002_default_group_migration.py +0 -0
  297. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0003_related_field_allow_blank.py +0 -0
  298. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0004_index_rule_on_delete.py +0 -0
  299. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0005_number_of_subnets_and_ips.py +0 -0
  300. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/__init__.py +0 -0
  301. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/models.py +0 -0
  302. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/rule_types/__init__.py +0 -0
  303. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/rule_types/base.py +0 -0
  304. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/rule_types/device.py +0 -0
  305. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/rule_types/vpn.py +0 -0
  306. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/settings.py +0 -0
  307. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/signals.py +0 -0
  308. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/static/subnet-division/css/subnet-division.css +0 -0
  309. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/static/subnet-division/js/subnet-division.js +0 -0
  310. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tasks.py +0 -0
  311. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/__init__.py +0 -0
  312. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/helpers.py +0 -0
  313. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/test_admin.py +0 -0
  314. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/test_models.py +0 -0
  315. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/test_rule.py +0 -0
  316. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/utils.py +0 -0
  317. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/__init__.py +0 -0
  318. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/mixins.py +0 -0
  319. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/test_selenium.py +0 -0
  320. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/test_users_integration.py +0 -0
  321. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/test_utilities.py +0 -0
  322. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/utils.py +0 -0
  323. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/urls.py +0 -0
  324. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/vpn_backends.py +0 -0
  325. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/SOURCES.txt +0 -0
  326. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/dependency_links.txt +0 -0
  327. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/not-zip-safe +0 -0
  328. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/requires.txt +0 -0
  329. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/top_level.txt +0 -0
  330. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/pyproject.toml +0 -0
  331. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/requirements.txt +0 -0
  332. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/setup.cfg +0 -0
  333. {openwisp_controller-1.2 → openwisp_controller-1.2.2}/setup.py +0 -0
@@ -1,6 +1,30 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ Version 1.2.2 [2026-03-06]
5
+ --------------------------
6
+
7
+ Changes
8
+ ~~~~~~~
9
+
10
+ Other changes
11
+ +++++++++++++
12
+
13
+ - Improved help text of configuration variable fields
14
+ - Minor fixes in the test suite
15
+
16
+ Version 1.2.1 [2026-03-04]
17
+ --------------------------
18
+
19
+ Bugfixes
20
+ ~~~~~~~~
21
+
22
+ - Use context variables in Vpn.auto_client for OpenVPN backend
23
+ - Fixed 500 FieldError in DeviceLocationView `#1110
24
+ <https://github.com/openwisp/openwisp-controller/issues/1110>`_
25
+ - Fixed MultiValueDictKeyError on empty device form submission `#1057
26
+ <https://github.com/openwisp/openwisp-controller/issues/1057>`_
27
+
4
28
  Version 1.2.0 [2025-10-24]
5
29
  --------------------------
6
30
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openwisp-controller
3
- Version: 1.2
3
+ Version: 1.2.2
4
4
  Summary: OpenWISP Controller
5
5
  Home-page: http://openwisp.org
6
6
  Download-URL: https://github.com/openwisp/openwisp-controller/releases
@@ -1,4 +1,4 @@
1
- VERSION = (1, 2, 0, "final")
1
+ VERSION = (1, 2, 2, "final")
2
2
  __version__ = VERSION # alias
3
3
 
4
4
 
@@ -352,10 +352,13 @@ class ConfigForm(AlwaysHasChangedMixin, BaseForm):
352
352
  config_model = self.Meta.model
353
353
  instance = config_model(**options)
354
354
  device_model = config_model.device.field.related_model
355
- org = Organization.objects.get(pk=self.data["organization"])
355
+ if not (org_id := self.data.get("organization")):
356
+ # We cannot validate the templates without an organization.
357
+ return
358
+ org = Organization.objects.get(pk=org_id)
356
359
  instance.device = device_model(
357
- name=self.data["name"],
358
- mac_address=self.data["mac_address"],
360
+ name=self.data.get("name", ""),
361
+ mac_address=self.data.get("mac_address", ""),
359
362
  organization=org,
360
363
  )
361
364
  return instance
@@ -369,6 +372,12 @@ class ConfigForm(AlwaysHasChangedMixin, BaseForm):
369
372
  # when adding self.instance is empty, we need to create a
370
373
  # temporary instance that we'll use just for validation
371
374
  config = self.get_temp_model_instance(**data)
375
+ if not config:
376
+ # The request does not contain vaild data to create a temporary
377
+ # Device instance. Thus, we cannot validate the templates.
378
+ # The Device validation will be handled by DeviceAdmin.
379
+ # Therefore, we don't need to raise any error here.
380
+ return
372
381
  else:
373
382
  config = self.instance
374
383
  if config.backend and templates:
@@ -94,10 +94,10 @@ class AbstractConfig(ChecksumCacheMixin, BaseConfig):
94
94
  blank=True,
95
95
  default=dict,
96
96
  help_text=_(
97
- "Additional "
98
- '<a href="http://netjsonconfig.openwisp.org/'
99
- 'en/stable/general/basics.html#context" target="_blank">'
100
- "context (configuration variables)</a> in JSON format"
97
+ "allows overriding "
98
+ '<a href="https://openwisp.io/docs/stable/controller/user/variables.html'
99
+ '" target="_blank">'
100
+ "configuration variables</a>"
101
101
  ),
102
102
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
103
103
  dump_kwargs={"indent": 4},
@@ -42,8 +42,9 @@ class AbstractDeviceGroup(OrgMixin, TimeStampedEditableModel):
42
42
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
43
43
  dump_kwargs={"indent": 4},
44
44
  help_text=_(
45
- "Group meta data, use this field to store data which is related"
46
- " to this group and can be retrieved via the REST API."
45
+ "Store custom metadata related to this group. This field is intended "
46
+ "for arbitrary data that does not affect device configuration and can "
47
+ "be retrieved via the REST API for integrations or external tools."
47
48
  ),
48
49
  verbose_name=_("Metadata"),
49
50
  )
@@ -53,8 +54,7 @@ class AbstractDeviceGroup(OrgMixin, TimeStampedEditableModel):
53
54
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
54
55
  dump_kwargs={"indent": 4},
55
56
  help_text=_(
56
- "This field can be used to add meta data for the group"
57
- ' or to add "Configuration Variables" to the devices.'
57
+ "Define configuration variables available to all devices in this group"
58
58
  ),
59
59
  verbose_name=_("Configuration Variables"),
60
60
  )
@@ -37,7 +37,8 @@ class AbstractOrganizationConfigSettings(UUIDModel):
37
37
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
38
38
  dump_kwargs={"indent": 4},
39
39
  help_text=_(
40
- 'This field can be used to add "Configuration Variables"' " to the devices."
40
+ "Define reusable configuration variables available "
41
+ "to all devices in this organization"
41
42
  ),
42
43
  verbose_name=_("Configuration Variables"),
43
44
  )
@@ -97,10 +97,9 @@ class AbstractTemplate(ShareableOrgMixinUniqueName, BaseConfig):
97
97
  default=dict,
98
98
  blank=True,
99
99
  help_text=_(
100
- "A dictionary containing the default "
101
- "values for the variables used by this "
102
- "template; these default variables will "
103
- "be used during schema validation."
100
+ "Define default values for the variables used in this template. "
101
+ "These values are used during validation and when a variable is "
102
+ "not provided by the device, group, or organization."
104
103
  ),
105
104
  load_kwargs={"object_pairs_hook": OrderedDict},
106
105
  dump_kwargs={"indent": 4},
@@ -648,7 +648,7 @@ class AbstractVpn(ConfigChecksumCacheMixin, ShareableOrgMixinUniqueName, BaseCon
648
648
  context_keys.pop("ip_address", None)
649
649
  context_keys.pop("vpn_subnet", None)
650
650
  auto = backend.auto_client(
651
- host=self.host,
651
+ host=vpn_host,
652
652
  server=self.config[config_dict_key][0],
653
653
  **context_keys,
654
654
  )
@@ -18,9 +18,10 @@ class Migration(migrations.Migration):
18
18
  default=dict,
19
19
  dump_kwargs={"ensure_ascii": False, "indent": 4},
20
20
  help_text=(
21
- 'Additional <a href="http://netjsonconfig.openwisp.org'
22
- '/en/stable/general/basics.html#context" target="_blank">'
23
- "context (configuration variables)</a> in JSON format"
21
+ "allows overriding "
22
+ '<a href="https://openwisp.io/docs/stable/controller/user/variables.html' # noqa: E501
23
+ '" target="_blank">'
24
+ "configuration variables</a>"
24
25
  ),
25
26
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
26
27
  ),
@@ -18,9 +18,9 @@ class Migration(migrations.Migration):
18
18
  default=dict,
19
19
  dump_kwargs={"ensure_ascii": False, "indent": 4},
20
20
  help_text=(
21
- "A dictionary containing the default values for "
22
- "the variables used by this template; these default "
23
- "variables will be used during schema validation."
21
+ "Define default values for the variables used in this template. "
22
+ "These values are used during validation and when a variable is "
23
+ "not provided by the device, group, or organization."
24
24
  ),
25
25
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
26
26
  verbose_name="Default Values",
@@ -62,9 +62,11 @@ class Migration(migrations.Migration):
62
62
  dump_kwargs={"ensure_ascii": False, "indent": 4},
63
63
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
64
64
  help_text=(
65
- "Group meta data, use this field to store data which is"
66
- " related to this group and can be retrieved via the"
67
- " REST API."
65
+ "Store custom metadata related to this group. "
66
+ "This field is intended for arbitrary data that "
67
+ "does not affect device configuration and can "
68
+ "be retrieved via the REST API for integrations "
69
+ "or external tools."
68
70
  ),
69
71
  verbose_name="Metadata",
70
72
  ),
@@ -20,8 +20,8 @@ class Migration(migrations.Migration):
20
20
  default=dict,
21
21
  dump_kwargs={"ensure_ascii": False, "indent": 4},
22
22
  help_text=(
23
- "This field can be used to add meta data for the group"
24
- ' or to add "Configuration Variables" to the devices.'
23
+ "Define configuration variables available "
24
+ "to all devices in this group"
25
25
  ),
26
26
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
27
27
  verbose_name="Configuration Variables",
@@ -20,8 +20,8 @@ class Migration(migrations.Migration):
20
20
  default=dict,
21
21
  dump_kwargs={"indent": 4},
22
22
  help_text=(
23
- 'This field can be used to add "Configuration Variables"'
24
- " to the devices."
23
+ "Define reusable configuration variables available "
24
+ "to all devices in this organization"
25
25
  ),
26
26
  load_kwargs={"object_pairs_hook": collections.OrderedDict},
27
27
  verbose_name="Configuration Variables",
@@ -2279,6 +2279,36 @@ class TestAdmin(
2279
2279
  config = self._create_config(organization=self._get_org())
2280
2280
  self._verify_template_queries(config, 10)
2281
2281
 
2282
+ def test_empty_device_form_with_config_inline(self):
2283
+ org = self._get_org()
2284
+ template = self._create_template(organization=org)
2285
+ path = reverse(f"admin:{self.app_label}_device_add")
2286
+ # Submit form without required device fields but with config inline
2287
+ # This reproduces the scenario where user clicks "Add another Configuration"
2288
+ # and submits without filling device details
2289
+ params = {
2290
+ "config-0-backend": "netjsonconfig.OpenWrt",
2291
+ "config-0-templates": str(template.pk),
2292
+ "config-0-config": json.dumps({}),
2293
+ "config-0-context": "",
2294
+ "config-TOTAL_FORMS": 1,
2295
+ "config-INITIAL_FORMS": 0,
2296
+ "config-MIN_NUM_FORMS": 0,
2297
+ "config-MAX_NUM_FORMS": 1,
2298
+ "deviceconnection_set-TOTAL_FORMS": 0,
2299
+ "deviceconnection_set-INITIAL_FORMS": 0,
2300
+ "deviceconnection_set-MIN_NUM_FORMS": 0,
2301
+ "deviceconnection_set-MAX_NUM_FORMS": 1000,
2302
+ "command_set-TOTAL_FORMS": 0,
2303
+ "command_set-INITIAL_FORMS": 0,
2304
+ "command_set-MIN_NUM_FORMS": 0,
2305
+ "command_set-MAX_NUM_FORMS": 1000,
2306
+ }
2307
+ response = self.client.post(path, params)
2308
+ self.assertEqual(response.status_code, 200)
2309
+ self.assertContains(response, "errorlist")
2310
+ self.assertEqual(Device.objects.count(), 0)
2311
+
2282
2312
 
2283
2313
  class TestTransactionAdmin(
2284
2314
  CreateConfigTemplateMixin,
@@ -3,12 +3,13 @@ import uuid
3
3
  from subprocess import CalledProcessError, TimeoutExpired
4
4
  from unittest import mock
5
5
 
6
+ import requests
6
7
  from celery.exceptions import Retry, SoftTimeLimitExceeded
7
8
  from django.conf import settings
8
9
  from django.core.exceptions import ValidationError
9
10
  from django.db.models.signals import post_save
10
11
  from django.db.utils import IntegrityError
11
- from django.http.response import HttpResponse, HttpResponseNotFound
12
+ from django.http.response import HttpResponse
12
13
  from django.test import TestCase, TransactionTestCase
13
14
  from requests.exceptions import ConnectionError, RequestException, Timeout
14
15
  from swapper import load_model
@@ -194,12 +195,13 @@ class TestVpn(BaseTestVpn, TestCase):
194
195
  vpn = self._create_vpn()
195
196
  auto = vpn.auto_client()
196
197
  context_keys = vpn._get_auto_context_keys()
197
- del context_keys["vpn_host"]
198
198
  del context_keys["vpn_port"]
199
199
  for key in context_keys.keys():
200
200
  context_keys[key] = "{{%s}}" % context_keys[key]
201
201
  control = vpn.backend_class.auto_client(
202
- host=vpn.host, server=self._vpn_config["openvpn"][0], **context_keys
202
+ host=context_keys.pop("vpn_host"),
203
+ server=self._vpn_config["openvpn"][0],
204
+ **context_keys,
203
205
  )
204
206
  control["files"] = [
205
207
  {
@@ -224,14 +226,15 @@ class TestVpn(BaseTestVpn, TestCase):
224
226
  vpn = self._create_vpn()
225
227
  auto = vpn.auto_client(auto_cert=False)
226
228
  context_keys = vpn._get_auto_context_keys()
227
- del context_keys["vpn_host"]
228
229
  del context_keys["vpn_port"]
229
230
  for key in context_keys.keys():
230
231
  context_keys[key] = "{{%s}}" % context_keys[key]
231
232
  for key in ["cert_path", "cert_contents", "key_path", "key_contents"]:
232
233
  del context_keys[key]
233
234
  control = vpn.backend_class.auto_client(
234
- host=vpn.host, server=self._vpn_config["openvpn"][0], **context_keys
235
+ host=context_keys.pop("vpn_host"),
236
+ server=self._vpn_config["openvpn"][0],
237
+ **context_keys,
235
238
  )
236
239
  control["files"] = [
237
240
  {
@@ -828,23 +831,33 @@ class TestWireguardTransaction(BaseTestVpn, TestWireguardVpnMixin, TransactionTe
828
831
  with self.subTest("Webhook endpoint and authentication endpoint is present"):
829
832
  vpn.webhook_endpoint = "https://example.com"
830
833
  vpn.auth_token = "super-secret-token"
831
- vpn.save()
832
- vpn_client.refresh_from_db()
834
+ success_response = mock.Mock(spec=requests.Response)
835
+ success_response.status_code = 200
836
+ success_response.raise_for_status = mock.Mock()
833
837
 
834
838
  with mock.patch(
835
839
  "openwisp_controller.config.tasks.logger.info"
836
840
  ) as mocked_logger, mock.patch(
837
841
  "requests.post", return_value=HttpResponse()
838
842
  ):
843
+ vpn.save()
844
+ vpn_client.refresh_from_db()
839
845
  post_save.send(
840
846
  instance=vpn_client, sender=vpn_client._meta.model, created=False
841
847
  )
842
- mocked_logger.assert_called_once_with(
848
+ expected_call = mock.call(
843
849
  f"Triggered update webhook of VPN Server UUID: {vpn.pk}"
844
850
  )
851
+ mocked_logger.assert_has_calls([expected_call, expected_call])
852
+ self.assertEqual(mocked_logger.call_count, 2)
845
853
 
854
+ fail_response = mock.Mock(spec=requests.Response)
855
+ fail_response.status_code = 404
856
+ fail_response.raise_for_status.side_effect = requests.exceptions.HTTPError(
857
+ "Not Found"
858
+ )
846
859
  with mock.patch("logging.Logger.error") as mocked_logger, mock.patch(
847
- "requests.post", return_value=HttpResponseNotFound()
860
+ "requests.post", return_value=fail_response
848
861
  ):
849
862
  post_save.send(
850
863
  instance=vpn_client, sender=vpn_client._meta.model, created=False
@@ -115,6 +115,7 @@ class DeviceLocationView(
115
115
  lookup_field = "content_object"
116
116
  lookup_url_kwarg = "pk"
117
117
  organization_field = "content_object__organization"
118
+ organization_lookup = "organization__in"
118
119
  _device_field = "content_object"
119
120
 
120
121
  def get_queryset(self):
@@ -9,6 +9,7 @@ from django.test.client import BOUNDARY, MULTIPART_CONTENT, encode_multipart
9
9
  from django.urls import reverse
10
10
  from django.urls.exceptions import NoReverseMatch
11
11
  from PIL import Image
12
+ from rest_framework import status
12
13
  from rest_framework.authtoken.models import Token
13
14
  from swapper import load_model
14
15
 
@@ -1036,3 +1037,20 @@ class TestGeoApi(
1036
1037
  with self.subTest("Test deleting DeviceLocation"):
1037
1038
  response = self.client.delete(url)
1038
1039
  self.assertEqual(response.status_code, 403)
1040
+
1041
+ def test_device_location_view_parent_permission(self):
1042
+ org1 = self._create_org(name="Org One")
1043
+ device1 = self._create_device(organization=org1)
1044
+ org2 = self._create_org(name="Org Two")
1045
+ manager_org2 = self._create_administrator(
1046
+ organizations=[org2],
1047
+ username="manager_org2",
1048
+ password="test_password",
1049
+ is_superuser=False,
1050
+ is_staff=True,
1051
+ )
1052
+ self.client.force_login(manager_org2)
1053
+ url = reverse("geo_api:device_location", args=[device1.pk])
1054
+ response = self.client.get(url)
1055
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
1056
+ self.client.logout()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openwisp-controller
3
- Version: 1.2
3
+ Version: 1.2.2
4
4
  Summary: OpenWISP Controller
5
5
  Home-page: http://openwisp.org
6
6
  Download-URL: https://github.com/openwisp/openwisp-controller/releases