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.
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/CHANGES.rst +12 -0
- {openwisp_controller-1.2/openwisp_controller.egg-info → openwisp_controller-1.2.1}/PKG-INFO +1 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/__init__.py +1 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/admin.py +12 -3
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/vpn.py +1 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_admin.py +30 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_vpn.py +21 -9
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/views.py +1 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_api.py +18 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1/openwisp_controller.egg-info}/PKG-INFO +1 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/LICENSE +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/MANIFEST.in +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/README.rst +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/base.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/checks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/download_views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/filters.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/zerotier_service.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/base.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/channels_consumer.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/config.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/device.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/device_group.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/multitenancy.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/tag.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/controller/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/controller/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/controller/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/crypto.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/exceptions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/exportable.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/filters.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/fixtures/test_templates.json +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/handlers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0001_squashed_0002_config_settings_uuid.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0003_template_tags.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0004_add_device_model.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0005_populate_device.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0006_config_device_not_null.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0007_simplify_config.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0008_update_indexes.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0009_device_system.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0010_auto_20180106_1814.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0011_update_device_mac_address.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0012_auto_20180219_1501.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0013_last_ip_management_ip_and_status_applied.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0014_device_hardware_id.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0015_default_groups_permissions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0016_default_organization_config_settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0017_template_name_organization_unique_together.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0018_config_context.py +0 -0
- {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
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0020_remove_config_organization.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0021_vpn_key.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0022_vpn_format_dh.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0023_update_context.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0024_update_context_data.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0025_update_device_key.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0026_hardware_id_not_unique.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0027_add_indexes_on_ip_fields.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0028_template_default_values.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0029_merge_django_netjsonconfig.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0030_django_taggit_update.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0031_update_vpn_dh_param.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0032_update_legacy_vpn_backend.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0033_name_unique_per_organization.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0034_template_required.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0035_device_name_unique_optional.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0036_device_group.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0037_alter_taggedtemplate.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0038_vpn_subnet.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0039_wireguard_vxlan_ipam.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0040_vpnclient_ip_setnull.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0041_default_groups_organizationconfigsettings_permission.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0042_multiple_wireguard_tunnels.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0043_devicegroup_templates.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0044_config_error_reason.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0045_alter_vpn_webhook_endpoint.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0046_organizationlimits.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0047_add_organizationlimits.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0048_wifi_radio_band_migration.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0049_devicegroup_context.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0050_alter_vpnclient_unique_together.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0051_organizationconfigsettings_context.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0052_vpn_node_network_id.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0053_vpnclient_secret.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0054_device__is_deactivated.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0055_alter_config_status.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0056_vpnclient_template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0057_populate_vpnclient_template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0058_alter_vpnclient_template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0059_zerotier_templates_ow_zt_to_global.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0060_cleanup_api_task_notification_types.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/0061_config_checksum_db.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/signals.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/sortedm2m/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/sortedm2m/fields.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/sortedm2m/forms.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/admin.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/device-delete-confirmation.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/devicegroup.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/lib/advanced-mode.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/lib/img/jsoneditor-icons.svg +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/css/lib/jsonschema-ui.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/device-delete-confirmation.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/lib/advanced-mode.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/lib/jsonschema-ui.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/lib/tomorrow_night_bright.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/management_ip.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/preview.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/relevant_templates.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/switcher.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/tabs.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/unsaved_changes.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/utils.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/vpn.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/config/js/widget.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/import_export/import-openwisp.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/sortedm2m/patch_sortedm2m.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/support.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tasks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tasks_zerotier.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/change_device_group.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/change_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/change_list_device.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/clone_template_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/device/change_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/device/delete_confirmation.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/device/delete_selected_confirmation.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/device_recover_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/jsonschema-widget.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/preview.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/config/system_context.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/device_group/change_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/admin/import_export/import.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/templates/reversion/config/revision_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/pytest.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_api.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_config.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_controller.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_device.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_device_group.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_handlers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_notifications.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_selenium.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_tag.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/validators.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/widgets.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/api/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/api/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/api/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/base/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/base/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/channels/consumers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/channels/routing.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/commands.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/airos/snmp.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/exceptions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/openwrt/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/openwrt/snmp.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/openwrt/ssh.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/snmp.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/connectors/ssh.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/exceptions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0001_initial.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0002_credentials_auto_add.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0003_default_group_permissions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0004_django3_1_upgrade.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0005_device_connection_failure_reason.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0006_name_unique_per_organization.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0007_command.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0008_remove_conflicting_deviceconnections.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/0009_alter_deviceconnection_unique_together.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/schema.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/signals.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/css/command-inline.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/css/credentials.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/js/commands.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/js/credentials.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/static/connection/js/lib/reconnecting-websocket.min.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tasks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/base.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/pytest.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test-key.ed25519 +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test-key.rsa +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_api.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_command_utilities.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_notifications.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_selenium.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_snmp.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_ssh.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/test_tasks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/connection/widgets.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/context_processors.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/filters.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/api/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/base/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/base/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/channels/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/channels/consumers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/channels/routing.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/exportable.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/migrations/0001_initial.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/migrations/0002_default_groups_permissions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/migrations/0003_alter_devicelocation_floorplan_location.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/templates/admin/widgets/foreign_key_raw_id.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/pytest.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_admin_inline.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_selenium.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/migrations.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/mixins.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/api/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/api/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/api/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/base/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/base/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0001_initial.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0002_add_organization_name.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0003_fill_organization_name.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0004_auto_20180106_1814.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0005_organizational_unit_name.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0006_add_x509_passphrase_field.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0007_default_groups_permissions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0008_serial_number_length.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0009_common_name_maxlength_64.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0010_common_name_organization_unique.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/0011_disallowed_blank_key_length_or_digest.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/static/admin/pki/js/show-org-field.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/templates/admin/pki/change_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/test_admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/test_api.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/test_models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/pki/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/routing.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/base/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/filters.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0001_initial.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0002_default_group_migration.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0003_related_field_allow_blank.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0004_index_rule_on_delete.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/0005_number_of_subnets_and_ips.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/rule_types/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/rule_types/base.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/rule_types/device.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/rule_types/vpn.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/signals.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/static/subnet-division/css/subnet-division.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/static/subnet-division/js/subnet-division.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tasks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/helpers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/test_admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/test_models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/tests/test_rule.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/subnet_division/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/mixins.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/test_selenium.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/test_users_integration.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/test_utilities.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/vpn_backends.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/SOURCES.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/dependency_links.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/not-zip-safe +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/requires.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller.egg-info/top_level.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/pyproject.toml +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/requirements.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.1}/setup.cfg +0 -0
- {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
|
|
|
@@ -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
|
-
|
|
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
|
|
358
|
-
mac_address=self.data
|
|
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:
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/vpn.py
RENAMED
|
@@ -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=
|
|
651
|
+
host=vpn_host,
|
|
652
652
|
server=self.config[config_dict_key][0],
|
|
653
653
|
**context_keys,
|
|
654
654
|
)
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_admin.py
RENAMED
|
@@ -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,
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tests/test_vpn.py
RENAMED
|
@@ -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=
|
|
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=
|
|
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
|
-
|
|
832
|
-
|
|
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
|
-
|
|
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
|
-
|
|
847
|
-
|
|
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):
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/geo/tests/test_api.py
RENAMED
|
@@ -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()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/__init__.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/filters.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/serializers.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/urls.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/api/views.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/__init__.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/base.py
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/config.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/device.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/tag.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/base/template.py
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/controller/urls.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/controller/views.py
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/exceptions.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/exportable.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/handlers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/settings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/sortedm2m/fields.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/sortedm2m/forms.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/static/support.css
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.1}/openwisp_controller/config/tasks_zerotier.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|