openwisp-controller 1.2__tar.gz → 1.2.1__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.1}/CHANGES.rst +12 -0
  2. {openwisp_controller-1.2/openwisp_controller.egg-info → openwisp_controller-1.2.1}/PKG-INFO +1 -1
  3. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/__init__.py +1 -1
  4. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/admin.py +12 -3
  5. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/vpn.py +1 -1
  6. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_admin.py +30 -0
  7. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_vpn.py +21 -9
  8. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/views.py +1 -0
  9. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_api.py +18 -0
  10. {openwisp_controller-1.2 → openwisp_controller-1.2.1/openwisp_controller.egg-info}/PKG-INFO +1 -1
  11. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/LICENSE +0 -0
  12. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/MANIFEST.in +0 -0
  13. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/README.rst +0 -0
  14. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/admin.py +0 -0
  15. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/base.py +0 -0
  16. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/checks.py +0 -0
  17. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/__init__.py +0 -0
  18. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/__init__.py +0 -0
  19. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/download_views.py +0 -0
  20. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/filters.py +0 -0
  21. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/serializers.py +0 -0
  22. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/urls.py +0 -0
  23. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/views.py +0 -0
  24. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/zerotier_service.py +0 -0
  25. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/apps.py +0 -0
  26. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/__init__.py +0 -0
  27. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/base.py +0 -0
  28. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/channels_consumer.py +0 -0
  29. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/config.py +0 -0
  30. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/device.py +0 -0
  31. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/device_group.py +0 -0
  32. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/multitenancy.py +0 -0
  33. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/tag.py +0 -0
  34. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/template.py +0 -0
  35. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/controller/__init__.py +0 -0
  36. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/controller/urls.py +0 -0
  37. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/controller/views.py +0 -0
  38. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/crypto.py +0 -0
  39. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/exceptions.py +0 -0
  40. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/exportable.py +0 -0
  41. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/filters.py +0 -0
  42. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/fixtures/test_templates.json +0 -0
  43. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/handlers.py +0 -0
  44. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0001_squashed_0002_config_settings_uuid.py +0 -0
  45. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0003_template_tags.py +0 -0
  46. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0004_add_device_model.py +0 -0
  47. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0005_populate_device.py +0 -0
  48. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0006_config_device_not_null.py +0 -0
  49. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0007_simplify_config.py +0 -0
  50. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0008_update_indexes.py +0 -0
  51. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0009_device_system.py +0 -0
  52. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0010_auto_20180106_1814.py +0 -0
  53. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0011_update_device_mac_address.py +0 -0
  54. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0012_auto_20180219_1501.py +0 -0
  55. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0013_last_ip_management_ip_and_status_applied.py +0 -0
  56. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0014_device_hardware_id.py +0 -0
  57. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0015_default_groups_permissions.py +0 -0
  58. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0016_default_organization_config_settings.py +0 -0
  59. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0017_template_name_organization_unique_together.py +0 -0
  60. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0018_config_context.py +0 -0
  61. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0019_organization_mac_add_hardware_id_name_unique_together.py +0 -0
  62. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0020_remove_config_organization.py +0 -0
  63. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0021_vpn_key.py +0 -0
  64. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0022_vpn_format_dh.py +0 -0
  65. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0023_update_context.py +0 -0
  66. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0024_update_context_data.py +0 -0
  67. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0025_update_device_key.py +0 -0
  68. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0026_hardware_id_not_unique.py +0 -0
  69. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0027_add_indexes_on_ip_fields.py +0 -0
  70. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0028_template_default_values.py +0 -0
  71. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0029_merge_django_netjsonconfig.py +0 -0
  72. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0030_django_taggit_update.py +0 -0
  73. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0031_update_vpn_dh_param.py +0 -0
  74. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0032_update_legacy_vpn_backend.py +0 -0
  75. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0033_name_unique_per_organization.py +0 -0
  76. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0034_template_required.py +0 -0
  77. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0035_device_name_unique_optional.py +0 -0
  78. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0036_device_group.py +0 -0
  79. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0037_alter_taggedtemplate.py +0 -0
  80. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0038_vpn_subnet.py +0 -0
  81. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0039_wireguard_vxlan_ipam.py +0 -0
  82. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0040_vpnclient_ip_setnull.py +0 -0
  83. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0041_default_groups_organizationconfigsettings_permission.py +0 -0
  84. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0042_multiple_wireguard_tunnels.py +0 -0
  85. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0043_devicegroup_templates.py +0 -0
  86. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0044_config_error_reason.py +0 -0
  87. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0045_alter_vpn_webhook_endpoint.py +0 -0
  88. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0046_organizationlimits.py +0 -0
  89. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0047_add_organizationlimits.py +0 -0
  90. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0048_wifi_radio_band_migration.py +0 -0
  91. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0049_devicegroup_context.py +0 -0
  92. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0050_alter_vpnclient_unique_together.py +0 -0
  93. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0051_organizationconfigsettings_context.py +0 -0
  94. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0052_vpn_node_network_id.py +0 -0
  95. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0053_vpnclient_secret.py +0 -0
  96. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0054_device__is_deactivated.py +0 -0
  97. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0055_alter_config_status.py +0 -0
  98. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0056_vpnclient_template.py +0 -0
  99. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0057_populate_vpnclient_template.py +0 -0
  100. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0058_alter_vpnclient_template.py +0 -0
  101. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0059_zerotier_templates_ow_zt_to_global.py +0 -0
  102. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0060_cleanup_api_task_notification_types.py +0 -0
  103. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0061_config_checksum_db.py +0 -0
  104. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/__init__.py +0 -0
  105. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/models.py +0 -0
  106. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/settings.py +0 -0
  107. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/signals.py +0 -0
  108. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/sortedm2m/__init__.py +0 -0
  109. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/sortedm2m/fields.py +0 -0
  110. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/sortedm2m/forms.py +0 -0
  111. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/admin.css +0 -0
  112. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/device-delete-confirmation.css +0 -0
  113. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/devicegroup.css +0 -0
  114. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/lib/advanced-mode.css +0 -0
  115. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/lib/img/jsoneditor-icons.svg +0 -0
  116. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/lib/jsonschema-ui.css +0 -0
  117. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/device-delete-confirmation.js +0 -0
  118. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/lib/advanced-mode.js +0 -0
  119. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/lib/jsonschema-ui.js +0 -0
  120. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/lib/tomorrow_night_bright.js +0 -0
  121. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/management_ip.js +0 -0
  122. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/preview.js +0 -0
  123. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/relevant_templates.js +0 -0
  124. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/switcher.js +0 -0
  125. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/tabs.js +0 -0
  126. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/unsaved_changes.js +0 -0
  127. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/utils.js +0 -0
  128. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/vpn.js +0 -0
  129. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/widget.js +0 -0
  130. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/import_export/import-openwisp.css +0 -0
  131. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/sortedm2m/patch_sortedm2m.js +0 -0
  132. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/support.css +0 -0
  133. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tasks.py +0 -0
  134. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tasks_zerotier.py +0 -0
  135. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/change_device_group.html +0 -0
  136. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/change_form.html +0 -0
  137. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/change_list_device.html +0 -0
  138. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/clone_template_form.html +0 -0
  139. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/device/change_form.html +0 -0
  140. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/device/delete_confirmation.html +0 -0
  141. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/device/delete_selected_confirmation.html +0 -0
  142. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/device_recover_form.html +0 -0
  143. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/jsonschema-widget.html +0 -0
  144. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/preview.html +0 -0
  145. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/system_context.html +0 -0
  146. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/device_group/change_form.html +0 -0
  147. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/import_export/import.html +0 -0
  148. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/reversion/config/revision_form.html +0 -0
  149. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/__init__.py +0 -0
  150. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/pytest.py +0 -0
  151. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_api.py +0 -0
  152. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_apps.py +0 -0
  153. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_config.py +0 -0
  154. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_controller.py +0 -0
  155. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_device.py +0 -0
  156. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_device_group.py +0 -0
  157. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_handlers.py +0 -0
  158. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_notifications.py +0 -0
  159. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_selenium.py +0 -0
  160. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_tag.py +0 -0
  161. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_template.py +0 -0
  162. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_views.py +0 -0
  163. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/utils.py +0 -0
  164. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/urls.py +0 -0
  165. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/utils.py +0 -0
  166. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/validators.py +0 -0
  167. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/views.py +0 -0
  168. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/widgets.py +0 -0
  169. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/__init__.py +0 -0
  170. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/admin.py +0 -0
  171. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/api/serializers.py +0 -0
  172. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/api/urls.py +0 -0
  173. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/api/views.py +0 -0
  174. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/apps.py +0 -0
  175. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/base/__init__.py +0 -0
  176. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/base/models.py +0 -0
  177. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/channels/consumers.py +0 -0
  178. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/channels/routing.py +0 -0
  179. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/commands.py +0 -0
  180. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/__init__.py +0 -0
  181. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/airos/snmp.py +0 -0
  182. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/exceptions.py +0 -0
  183. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/openwrt/__init__.py +0 -0
  184. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/openwrt/snmp.py +0 -0
  185. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/openwrt/ssh.py +0 -0
  186. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/snmp.py +0 -0
  187. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/ssh.py +0 -0
  188. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/exceptions.py +0 -0
  189. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0001_initial.py +0 -0
  190. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0002_credentials_auto_add.py +0 -0
  191. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0003_default_group_permissions.py +0 -0
  192. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0004_django3_1_upgrade.py +0 -0
  193. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0005_device_connection_failure_reason.py +0 -0
  194. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0006_name_unique_per_organization.py +0 -0
  195. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0007_command.py +0 -0
  196. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0008_remove_conflicting_deviceconnections.py +0 -0
  197. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0009_alter_deviceconnection_unique_together.py +0 -0
  198. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/__init__.py +0 -0
  199. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/models.py +0 -0
  200. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/schema.py +0 -0
  201. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/settings.py +0 -0
  202. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/signals.py +0 -0
  203. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/css/command-inline.css +0 -0
  204. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/css/credentials.css +0 -0
  205. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/js/commands.js +0 -0
  206. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/js/credentials.js +0 -0
  207. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/js/lib/reconnecting-websocket.min.js +0 -0
  208. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tasks.py +0 -0
  209. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/__init__.py +0 -0
  210. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/base.py +0 -0
  211. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/pytest.py +0 -0
  212. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test-key.ed25519 +0 -0
  213. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test-key.rsa +0 -0
  214. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_admin.py +0 -0
  215. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_api.py +0 -0
  216. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_command_utilities.py +0 -0
  217. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_models.py +0 -0
  218. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_notifications.py +0 -0
  219. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_selenium.py +0 -0
  220. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_snmp.py +0 -0
  221. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_ssh.py +0 -0
  222. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_tasks.py +0 -0
  223. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/utils.py +0 -0
  224. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/utils.py +0 -0
  225. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/widgets.py +0 -0
  226. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/context_processors.py +0 -0
  227. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/__init__.py +0 -0
  228. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/admin.py +0 -0
  229. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/__init__.py +0 -0
  230. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/filters.py +0 -0
  231. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/serializers.py +0 -0
  232. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/urls.py +0 -0
  233. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/apps.py +0 -0
  234. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/base/__init__.py +0 -0
  235. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/base/models.py +0 -0
  236. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/channels/__init__.py +0 -0
  237. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/channels/consumers.py +0 -0
  238. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/channels/routing.py +0 -0
  239. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/exportable.py +0 -0
  240. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/migrations/0001_initial.py +0 -0
  241. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/migrations/0002_default_groups_permissions.py +0 -0
  242. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/migrations/0003_alter_devicelocation_floorplan_location.py +0 -0
  243. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/migrations/__init__.py +0 -0
  244. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/models.py +0 -0
  245. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/templates/admin/widgets/foreign_key_raw_id.html +0 -0
  246. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/__init__.py +0 -0
  247. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/pytest.py +0 -0
  248. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_admin.py +0 -0
  249. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_admin_inline.py +0 -0
  250. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_apps.py +0 -0
  251. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_models.py +0 -0
  252. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_selenium.py +0 -0
  253. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/utils.py +0 -0
  254. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/utils.py +0 -0
  255. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/migrations.py +0 -0
  256. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/mixins.py +0 -0
  257. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/__init__.py +0 -0
  258. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/admin.py +0 -0
  259. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/api/serializers.py +0 -0
  260. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/api/urls.py +0 -0
  261. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/api/views.py +0 -0
  262. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/apps.py +0 -0
  263. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/base/__init__.py +0 -0
  264. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/base/models.py +0 -0
  265. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0001_initial.py +0 -0
  266. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0002_add_organization_name.py +0 -0
  267. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0003_fill_organization_name.py +0 -0
  268. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0004_auto_20180106_1814.py +0 -0
  269. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0005_organizational_unit_name.py +0 -0
  270. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0006_add_x509_passphrase_field.py +0 -0
  271. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0007_default_groups_permissions.py +0 -0
  272. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0008_serial_number_length.py +0 -0
  273. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0009_common_name_maxlength_64.py +0 -0
  274. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0010_common_name_organization_unique.py +0 -0
  275. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0011_disallowed_blank_key_length_or_digest.py +0 -0
  276. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/__init__.py +0 -0
  277. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/models.py +0 -0
  278. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/static/admin/pki/js/show-org-field.js +0 -0
  279. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/templates/admin/pki/change_form.html +0 -0
  280. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/__init__.py +0 -0
  281. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/test_admin.py +0 -0
  282. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/test_api.py +0 -0
  283. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/test_models.py +0 -0
  284. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/utils.py +0 -0
  285. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/urls.py +0 -0
  286. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/utils.py +0 -0
  287. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/routing.py +0 -0
  288. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/serializers.py +0 -0
  289. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/settings.py +0 -0
  290. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/__init__.py +0 -0
  291. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/admin.py +0 -0
  292. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/apps.py +0 -0
  293. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/base/models.py +0 -0
  294. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/filters.py +0 -0
  295. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0001_initial.py +0 -0
  296. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0002_default_group_migration.py +0 -0
  297. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0003_related_field_allow_blank.py +0 -0
  298. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0004_index_rule_on_delete.py +0 -0
  299. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0005_number_of_subnets_and_ips.py +0 -0
  300. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/__init__.py +0 -0
  301. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/models.py +0 -0
  302. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/rule_types/__init__.py +0 -0
  303. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/rule_types/base.py +0 -0
  304. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/rule_types/device.py +0 -0
  305. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/rule_types/vpn.py +0 -0
  306. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/settings.py +0 -0
  307. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/signals.py +0 -0
  308. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/static/subnet-division/css/subnet-division.css +0 -0
  309. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/static/subnet-division/js/subnet-division.js +0 -0
  310. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tasks.py +0 -0
  311. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/__init__.py +0 -0
  312. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/helpers.py +0 -0
  313. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/test_admin.py +0 -0
  314. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/test_models.py +0 -0
  315. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/test_rule.py +0 -0
  316. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/utils.py +0 -0
  317. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/__init__.py +0 -0
  318. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/mixins.py +0 -0
  319. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/test_selenium.py +0 -0
  320. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/test_users_integration.py +0 -0
  321. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/test_utilities.py +0 -0
  322. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/utils.py +0 -0
  323. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/urls.py +0 -0
  324. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/vpn_backends.py +0 -0
  325. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/SOURCES.txt +0 -0
  326. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/dependency_links.txt +0 -0
  327. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/not-zip-safe +0 -0
  328. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/requires.txt +0 -0
  329. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/top_level.txt +0 -0
  330. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/pyproject.toml +0 -0
  331. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/requirements.txt +0 -0
  332. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/setup.cfg +0 -0
  333. {openwisp_controller-1.2 → openwisp_controller-1.2.1}/setup.py +0 -0
@@ -1,6 +1,18 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ Version 1.2.1 [2026-03-04]
5
+ --------------------------
6
+
7
+ Bugfixes
8
+ ~~~~~~~~
9
+
10
+ - Use context variables in Vpn.auto_client for OpenVPN backend
11
+ - Fixed 500 FieldError in DeviceLocationView `#1110
12
+ <https://github.com/openwisp/openwisp-controller/issues/1110>`_
13
+ - Fixed MultiValueDictKeyError on empty device form submission `#1057
14
+ <https://github.com/openwisp/openwisp-controller/issues/1057>`_
15
+
4
16
  Version 1.2.0 [2025-10-24]
5
17
  --------------------------
6
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openwisp-controller
3
- Version: 1.2
3
+ Version: 1.2.1
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, 1, "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:
@@ -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
  )
@@ -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,
@@ -194,12 +194,13 @@ class TestVpn(BaseTestVpn, TestCase):
194
194
  vpn = self._create_vpn()
195
195
  auto = vpn.auto_client()
196
196
  context_keys = vpn._get_auto_context_keys()
197
- del context_keys["vpn_host"]
198
197
  del context_keys["vpn_port"]
199
198
  for key in context_keys.keys():
200
199
  context_keys[key] = "{{%s}}" % context_keys[key]
201
200
  control = vpn.backend_class.auto_client(
202
- host=vpn.host, server=self._vpn_config["openvpn"][0], **context_keys
201
+ host=context_keys.pop("vpn_host"),
202
+ server=self._vpn_config["openvpn"][0],
203
+ **context_keys,
203
204
  )
204
205
  control["files"] = [
205
206
  {
@@ -224,14 +225,15 @@ class TestVpn(BaseTestVpn, TestCase):
224
225
  vpn = self._create_vpn()
225
226
  auto = vpn.auto_client(auto_cert=False)
226
227
  context_keys = vpn._get_auto_context_keys()
227
- del context_keys["vpn_host"]
228
228
  del context_keys["vpn_port"]
229
229
  for key in context_keys.keys():
230
230
  context_keys[key] = "{{%s}}" % context_keys[key]
231
231
  for key in ["cert_path", "cert_contents", "key_path", "key_contents"]:
232
232
  del context_keys[key]
233
233
  control = vpn.backend_class.auto_client(
234
- host=vpn.host, server=self._vpn_config["openvpn"][0], **context_keys
234
+ host=context_keys.pop("vpn_host"),
235
+ server=self._vpn_config["openvpn"][0],
236
+ **context_keys,
235
237
  )
236
238
  control["files"] = [
237
239
  {
@@ -828,23 +830,33 @@ class TestWireguardTransaction(BaseTestVpn, TestWireguardVpnMixin, TransactionTe
828
830
  with self.subTest("Webhook endpoint and authentication endpoint is present"):
829
831
  vpn.webhook_endpoint = "https://example.com"
830
832
  vpn.auth_token = "super-secret-token"
831
- vpn.save()
832
- vpn_client.refresh_from_db()
833
+ success_response = mock.Mock(spec=requests.Response)
834
+ success_response.status_code = 200
835
+ success_response.raise_for_status = mock.Mock()
833
836
 
834
837
  with mock.patch(
835
838
  "openwisp_controller.config.tasks.logger.info"
836
839
  ) as mocked_logger, mock.patch(
837
840
  "requests.post", return_value=HttpResponse()
838
841
  ):
842
+ vpn.save()
843
+ vpn_client.refresh_from_db()
839
844
  post_save.send(
840
845
  instance=vpn_client, sender=vpn_client._meta.model, created=False
841
846
  )
842
- mocked_logger.assert_called_once_with(
847
+ expected_call = mock.call(
843
848
  f"Triggered update webhook of VPN Server UUID: {vpn.pk}"
844
849
  )
850
+ mocked_logger.assert_has_calls([expected_call, expected_call])
851
+ self.assertEqual(mocked_logger.call_count, 2)
845
852
 
846
- with mock.patch("logging.Logger.error") as mocked_logger, mock.patch(
847
- "requests.post", return_value=HttpResponseNotFound()
853
+ fail_response = mock.Mock(spec=requests.Response)
854
+ fail_response.status_code = 404
855
+ fail_response.raise_for_status.side_effect = requests.exceptions.HTTPError(
856
+ "Not Found"
857
+ )
858
+ with mock.patch("logging.Logger.warning") as mocked_logger, mock.patch(
859
+ "requests.post", return_value=fail_response
848
860
  ):
849
861
  post_save.send(
850
862
  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.1
4
4
  Summary: OpenWISP Controller
5
5
  Home-page: http://openwisp.org
6
6
  Download-URL: https://github.com/openwisp/openwisp-controller/releases