openwisp-controller 1.2__tar.gz → 1.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/CHANGES.rst +24 -0
- {openwisp_controller-1.2/openwisp_controller.egg-info → openwisp_controller-1.2.2}/PKG-INFO +1 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/__init__.py +1 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/admin.py +12 -3
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/config.py +4 -4
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/device_group.py +4 -4
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/multitenancy.py +2 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/template.py +3 -4
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/vpn.py +1 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0023_update_context.py +4 -3
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0028_template_default_values.py +3 -3
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0036_device_group.py +5 -3
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0049_devicegroup_context.py +2 -2
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0051_organizationconfigsettings_context.py +2 -2
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_admin.py +30 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_vpn.py +22 -9
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/views.py +1 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_api.py +18 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2/openwisp_controller.egg-info}/PKG-INFO +1 -1
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/LICENSE +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/MANIFEST.in +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/README.rst +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/base.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/checks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/download_views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/filters.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/zerotier_service.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/base.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/channels_consumer.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/device.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/tag.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/controller/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/controller/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/controller/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/crypto.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/exceptions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/exportable.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/filters.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/fixtures/test_templates.json +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/handlers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0001_squashed_0002_config_settings_uuid.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0003_template_tags.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0004_add_device_model.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0005_populate_device.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0006_config_device_not_null.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0007_simplify_config.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0008_update_indexes.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0009_device_system.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0010_auto_20180106_1814.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0011_update_device_mac_address.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0012_auto_20180219_1501.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0013_last_ip_management_ip_and_status_applied.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0014_device_hardware_id.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0015_default_groups_permissions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0016_default_organization_config_settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0017_template_name_organization_unique_together.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0018_config_context.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0019_organization_mac_add_hardware_id_name_unique_together.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0020_remove_config_organization.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0021_vpn_key.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0022_vpn_format_dh.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0024_update_context_data.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0025_update_device_key.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0026_hardware_id_not_unique.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0027_add_indexes_on_ip_fields.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0029_merge_django_netjsonconfig.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0030_django_taggit_update.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0031_update_vpn_dh_param.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0032_update_legacy_vpn_backend.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0033_name_unique_per_organization.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0034_template_required.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0035_device_name_unique_optional.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0037_alter_taggedtemplate.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0038_vpn_subnet.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0039_wireguard_vxlan_ipam.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0040_vpnclient_ip_setnull.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0041_default_groups_organizationconfigsettings_permission.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0042_multiple_wireguard_tunnels.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0043_devicegroup_templates.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0044_config_error_reason.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0045_alter_vpn_webhook_endpoint.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0046_organizationlimits.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0047_add_organizationlimits.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0048_wifi_radio_band_migration.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0050_alter_vpnclient_unique_together.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0052_vpn_node_network_id.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0053_vpnclient_secret.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0054_device__is_deactivated.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0055_alter_config_status.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0056_vpnclient_template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0057_populate_vpnclient_template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0058_alter_vpnclient_template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0059_zerotier_templates_ow_zt_to_global.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0060_cleanup_api_task_notification_types.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/0061_config_checksum_db.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/signals.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/sortedm2m/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/sortedm2m/fields.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/sortedm2m/forms.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/admin.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/device-delete-confirmation.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/devicegroup.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/lib/advanced-mode.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/lib/img/jsoneditor-icons.svg +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/css/lib/jsonschema-ui.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/device-delete-confirmation.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/lib/advanced-mode.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/lib/jsonschema-ui.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/lib/tomorrow_night_bright.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/management_ip.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/preview.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/relevant_templates.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/switcher.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/tabs.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/unsaved_changes.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/utils.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/vpn.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/config/js/widget.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/import_export/import-openwisp.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/sortedm2m/patch_sortedm2m.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/static/support.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tasks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tasks_zerotier.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/change_device_group.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/change_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/change_list_device.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/clone_template_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/device/change_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/device/delete_confirmation.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/device/delete_selected_confirmation.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/device_recover_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/jsonschema-widget.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/preview.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/config/system_context.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/device_group/change_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/admin/import_export/import.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/templates/reversion/config/revision_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/pytest.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_api.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_config.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_controller.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_device.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_device_group.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_handlers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_notifications.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_selenium.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_tag.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_template.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/test_views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/validators.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/widgets.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/api/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/api/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/api/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/base/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/base/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/channels/consumers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/channels/routing.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/commands.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/airos/snmp.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/exceptions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/openwrt/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/openwrt/snmp.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/openwrt/ssh.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/snmp.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/connectors/ssh.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/exceptions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0001_initial.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0002_credentials_auto_add.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0003_default_group_permissions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0004_django3_1_upgrade.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0005_device_connection_failure_reason.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0006_name_unique_per_organization.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0007_command.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0008_remove_conflicting_deviceconnections.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/0009_alter_deviceconnection_unique_together.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/schema.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/signals.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/css/command-inline.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/css/credentials.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/js/commands.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/js/credentials.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/static/connection/js/lib/reconnecting-websocket.min.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tasks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/base.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/pytest.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test-key.ed25519 +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test-key.rsa +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_api.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_command_utilities.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_notifications.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_selenium.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_snmp.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_ssh.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/test_tasks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/connection/widgets.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/context_processors.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/filters.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/api/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/base/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/base/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/channels/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/channels/consumers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/channels/routing.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/exportable.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/migrations/0001_initial.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/migrations/0002_default_groups_permissions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/migrations/0003_alter_devicelocation_floorplan_location.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/templates/admin/widgets/foreign_key_raw_id.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/pytest.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_admin_inline.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/test_selenium.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/geo/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/migrations.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/mixins.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/api/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/api/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/api/views.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/base/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/base/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0001_initial.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0002_add_organization_name.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0003_fill_organization_name.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0004_auto_20180106_1814.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0005_organizational_unit_name.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0006_add_x509_passphrase_field.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0007_default_groups_permissions.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0008_serial_number_length.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0009_common_name_maxlength_64.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0010_common_name_organization_unique.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/0011_disallowed_blank_key_length_or_digest.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/static/admin/pki/js/show-org-field.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/templates/admin/pki/change_form.html +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/test_admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/test_api.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/test_models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/pki/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/routing.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/serializers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/apps.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/base/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/filters.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0001_initial.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0002_default_group_migration.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0003_related_field_allow_blank.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0004_index_rule_on_delete.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/0005_number_of_subnets_and_ips.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/migrations/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/rule_types/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/rule_types/base.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/rule_types/device.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/rule_types/vpn.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/settings.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/signals.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/static/subnet-division/css/subnet-division.css +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/static/subnet-division/js/subnet-division.js +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tasks.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/helpers.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/test_admin.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/test_models.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/tests/test_rule.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/subnet_division/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/__init__.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/mixins.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/test_selenium.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/test_users_integration.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/test_utilities.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/tests/utils.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/urls.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/vpn_backends.py +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/SOURCES.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/dependency_links.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/not-zip-safe +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/requires.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller.egg-info/top_level.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/pyproject.toml +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/requirements.txt +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/setup.cfg +0 -0
- {openwisp_controller-1.2 → openwisp_controller-1.2.2}/setup.py +0 -0
|
@@ -1,6 +1,30 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
Version 1.2.2 [2026-03-06]
|
|
5
|
+
--------------------------
|
|
6
|
+
|
|
7
|
+
Changes
|
|
8
|
+
~~~~~~~
|
|
9
|
+
|
|
10
|
+
Other changes
|
|
11
|
+
+++++++++++++
|
|
12
|
+
|
|
13
|
+
- Improved help text of configuration variable fields
|
|
14
|
+
- Minor fixes in the test suite
|
|
15
|
+
|
|
16
|
+
Version 1.2.1 [2026-03-04]
|
|
17
|
+
--------------------------
|
|
18
|
+
|
|
19
|
+
Bugfixes
|
|
20
|
+
~~~~~~~~
|
|
21
|
+
|
|
22
|
+
- Use context variables in Vpn.auto_client for OpenVPN backend
|
|
23
|
+
- Fixed 500 FieldError in DeviceLocationView `#1110
|
|
24
|
+
<https://github.com/openwisp/openwisp-controller/issues/1110>`_
|
|
25
|
+
- Fixed MultiValueDictKeyError on empty device form submission `#1057
|
|
26
|
+
<https://github.com/openwisp/openwisp-controller/issues/1057>`_
|
|
27
|
+
|
|
4
28
|
Version 1.2.0 [2025-10-24]
|
|
5
29
|
--------------------------
|
|
6
30
|
|
|
@@ -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.2}/openwisp_controller/config/base/config.py
RENAMED
|
@@ -94,10 +94,10 @@ class AbstractConfig(ChecksumCacheMixin, BaseConfig):
|
|
|
94
94
|
blank=True,
|
|
95
95
|
default=dict,
|
|
96
96
|
help_text=_(
|
|
97
|
-
"
|
|
98
|
-
'<a href="
|
|
99
|
-
'
|
|
100
|
-
"
|
|
97
|
+
"allows overriding "
|
|
98
|
+
'<a href="https://openwisp.io/docs/stable/controller/user/variables.html'
|
|
99
|
+
'" target="_blank">'
|
|
100
|
+
"configuration variables</a>"
|
|
101
101
|
),
|
|
102
102
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
103
103
|
dump_kwargs={"indent": 4},
|
|
@@ -42,8 +42,9 @@ class AbstractDeviceGroup(OrgMixin, TimeStampedEditableModel):
|
|
|
42
42
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
43
43
|
dump_kwargs={"indent": 4},
|
|
44
44
|
help_text=_(
|
|
45
|
-
"
|
|
46
|
-
"
|
|
45
|
+
"Store custom metadata related to this group. This field is intended "
|
|
46
|
+
"for arbitrary data that does not affect device configuration and can "
|
|
47
|
+
"be retrieved via the REST API for integrations or external tools."
|
|
47
48
|
),
|
|
48
49
|
verbose_name=_("Metadata"),
|
|
49
50
|
)
|
|
@@ -53,8 +54,7 @@ class AbstractDeviceGroup(OrgMixin, TimeStampedEditableModel):
|
|
|
53
54
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
54
55
|
dump_kwargs={"indent": 4},
|
|
55
56
|
help_text=_(
|
|
56
|
-
"
|
|
57
|
-
' or to add "Configuration Variables" to the devices.'
|
|
57
|
+
"Define configuration variables available to all devices in this group"
|
|
58
58
|
),
|
|
59
59
|
verbose_name=_("Configuration Variables"),
|
|
60
60
|
)
|
|
@@ -37,7 +37,8 @@ class AbstractOrganizationConfigSettings(UUIDModel):
|
|
|
37
37
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
38
38
|
dump_kwargs={"indent": 4},
|
|
39
39
|
help_text=_(
|
|
40
|
-
|
|
40
|
+
"Define reusable configuration variables available "
|
|
41
|
+
"to all devices in this organization"
|
|
41
42
|
),
|
|
42
43
|
verbose_name=_("Configuration Variables"),
|
|
43
44
|
)
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/template.py
RENAMED
|
@@ -97,10 +97,9 @@ class AbstractTemplate(ShareableOrgMixinUniqueName, BaseConfig):
|
|
|
97
97
|
default=dict,
|
|
98
98
|
blank=True,
|
|
99
99
|
help_text=_(
|
|
100
|
-
"
|
|
101
|
-
"values
|
|
102
|
-
"
|
|
103
|
-
"be used during schema validation."
|
|
100
|
+
"Define default values for the variables used in this template. "
|
|
101
|
+
"These values are used during validation and when a variable is "
|
|
102
|
+
"not provided by the device, group, or organization."
|
|
104
103
|
),
|
|
105
104
|
load_kwargs={"object_pairs_hook": OrderedDict},
|
|
106
105
|
dump_kwargs={"indent": 4},
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/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
|
)
|
|
@@ -18,9 +18,10 @@ class Migration(migrations.Migration):
|
|
|
18
18
|
default=dict,
|
|
19
19
|
dump_kwargs={"ensure_ascii": False, "indent": 4},
|
|
20
20
|
help_text=(
|
|
21
|
-
|
|
22
|
-
'/
|
|
23
|
-
"
|
|
21
|
+
"allows overriding "
|
|
22
|
+
'<a href="https://openwisp.io/docs/stable/controller/user/variables.html' # noqa: E501
|
|
23
|
+
'" target="_blank">'
|
|
24
|
+
"configuration variables</a>"
|
|
24
25
|
),
|
|
25
26
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
26
27
|
),
|
|
@@ -18,9 +18,9 @@ class Migration(migrations.Migration):
|
|
|
18
18
|
default=dict,
|
|
19
19
|
dump_kwargs={"ensure_ascii": False, "indent": 4},
|
|
20
20
|
help_text=(
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
21
|
+
"Define default values for the variables used in this template. "
|
|
22
|
+
"These values are used during validation and when a variable is "
|
|
23
|
+
"not provided by the device, group, or organization."
|
|
24
24
|
),
|
|
25
25
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
26
26
|
verbose_name="Default Values",
|
|
@@ -62,9 +62,11 @@ class Migration(migrations.Migration):
|
|
|
62
62
|
dump_kwargs={"ensure_ascii": False, "indent": 4},
|
|
63
63
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
64
64
|
help_text=(
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
65
|
+
"Store custom metadata related to this group. "
|
|
66
|
+
"This field is intended for arbitrary data that "
|
|
67
|
+
"does not affect device configuration and can "
|
|
68
|
+
"be retrieved via the REST API for integrations "
|
|
69
|
+
"or external tools."
|
|
68
70
|
),
|
|
69
71
|
verbose_name="Metadata",
|
|
70
72
|
),
|
|
@@ -20,8 +20,8 @@ class Migration(migrations.Migration):
|
|
|
20
20
|
default=dict,
|
|
21
21
|
dump_kwargs={"ensure_ascii": False, "indent": 4},
|
|
22
22
|
help_text=(
|
|
23
|
-
"
|
|
24
|
-
|
|
23
|
+
"Define configuration variables available "
|
|
24
|
+
"to all devices in this group"
|
|
25
25
|
),
|
|
26
26
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
27
27
|
verbose_name="Configuration Variables",
|
|
@@ -20,8 +20,8 @@ class Migration(migrations.Migration):
|
|
|
20
20
|
default=dict,
|
|
21
21
|
dump_kwargs={"indent": 4},
|
|
22
22
|
help_text=(
|
|
23
|
-
|
|
24
|
-
"
|
|
23
|
+
"Define reusable configuration variables available "
|
|
24
|
+
"to all devices in this organization"
|
|
25
25
|
),
|
|
26
26
|
load_kwargs={"object_pairs_hook": collections.OrderedDict},
|
|
27
27
|
verbose_name="Configuration Variables",
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/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.2}/openwisp_controller/config/tests/test_vpn.py
RENAMED
|
@@ -3,12 +3,13 @@ import uuid
|
|
|
3
3
|
from subprocess import CalledProcessError, TimeoutExpired
|
|
4
4
|
from unittest import mock
|
|
5
5
|
|
|
6
|
+
import requests
|
|
6
7
|
from celery.exceptions import Retry, SoftTimeLimitExceeded
|
|
7
8
|
from django.conf import settings
|
|
8
9
|
from django.core.exceptions import ValidationError
|
|
9
10
|
from django.db.models.signals import post_save
|
|
10
11
|
from django.db.utils import IntegrityError
|
|
11
|
-
from django.http.response import HttpResponse
|
|
12
|
+
from django.http.response import HttpResponse
|
|
12
13
|
from django.test import TestCase, TransactionTestCase
|
|
13
14
|
from requests.exceptions import ConnectionError, RequestException, Timeout
|
|
14
15
|
from swapper import load_model
|
|
@@ -194,12 +195,13 @@ class TestVpn(BaseTestVpn, TestCase):
|
|
|
194
195
|
vpn = self._create_vpn()
|
|
195
196
|
auto = vpn.auto_client()
|
|
196
197
|
context_keys = vpn._get_auto_context_keys()
|
|
197
|
-
del context_keys["vpn_host"]
|
|
198
198
|
del context_keys["vpn_port"]
|
|
199
199
|
for key in context_keys.keys():
|
|
200
200
|
context_keys[key] = "{{%s}}" % context_keys[key]
|
|
201
201
|
control = vpn.backend_class.auto_client(
|
|
202
|
-
host=
|
|
202
|
+
host=context_keys.pop("vpn_host"),
|
|
203
|
+
server=self._vpn_config["openvpn"][0],
|
|
204
|
+
**context_keys,
|
|
203
205
|
)
|
|
204
206
|
control["files"] = [
|
|
205
207
|
{
|
|
@@ -224,14 +226,15 @@ class TestVpn(BaseTestVpn, TestCase):
|
|
|
224
226
|
vpn = self._create_vpn()
|
|
225
227
|
auto = vpn.auto_client(auto_cert=False)
|
|
226
228
|
context_keys = vpn._get_auto_context_keys()
|
|
227
|
-
del context_keys["vpn_host"]
|
|
228
229
|
del context_keys["vpn_port"]
|
|
229
230
|
for key in context_keys.keys():
|
|
230
231
|
context_keys[key] = "{{%s}}" % context_keys[key]
|
|
231
232
|
for key in ["cert_path", "cert_contents", "key_path", "key_contents"]:
|
|
232
233
|
del context_keys[key]
|
|
233
234
|
control = vpn.backend_class.auto_client(
|
|
234
|
-
host=
|
|
235
|
+
host=context_keys.pop("vpn_host"),
|
|
236
|
+
server=self._vpn_config["openvpn"][0],
|
|
237
|
+
**context_keys,
|
|
235
238
|
)
|
|
236
239
|
control["files"] = [
|
|
237
240
|
{
|
|
@@ -828,23 +831,33 @@ class TestWireguardTransaction(BaseTestVpn, TestWireguardVpnMixin, TransactionTe
|
|
|
828
831
|
with self.subTest("Webhook endpoint and authentication endpoint is present"):
|
|
829
832
|
vpn.webhook_endpoint = "https://example.com"
|
|
830
833
|
vpn.auth_token = "super-secret-token"
|
|
831
|
-
|
|
832
|
-
|
|
834
|
+
success_response = mock.Mock(spec=requests.Response)
|
|
835
|
+
success_response.status_code = 200
|
|
836
|
+
success_response.raise_for_status = mock.Mock()
|
|
833
837
|
|
|
834
838
|
with mock.patch(
|
|
835
839
|
"openwisp_controller.config.tasks.logger.info"
|
|
836
840
|
) as mocked_logger, mock.patch(
|
|
837
841
|
"requests.post", return_value=HttpResponse()
|
|
838
842
|
):
|
|
843
|
+
vpn.save()
|
|
844
|
+
vpn_client.refresh_from_db()
|
|
839
845
|
post_save.send(
|
|
840
846
|
instance=vpn_client, sender=vpn_client._meta.model, created=False
|
|
841
847
|
)
|
|
842
|
-
|
|
848
|
+
expected_call = mock.call(
|
|
843
849
|
f"Triggered update webhook of VPN Server UUID: {vpn.pk}"
|
|
844
850
|
)
|
|
851
|
+
mocked_logger.assert_has_calls([expected_call, expected_call])
|
|
852
|
+
self.assertEqual(mocked_logger.call_count, 2)
|
|
845
853
|
|
|
854
|
+
fail_response = mock.Mock(spec=requests.Response)
|
|
855
|
+
fail_response.status_code = 404
|
|
856
|
+
fail_response.raise_for_status.side_effect = requests.exceptions.HTTPError(
|
|
857
|
+
"Not Found"
|
|
858
|
+
)
|
|
846
859
|
with mock.patch("logging.Logger.error") as mocked_logger, mock.patch(
|
|
847
|
-
"requests.post", return_value=
|
|
860
|
+
"requests.post", return_value=fail_response
|
|
848
861
|
):
|
|
849
862
|
post_save.send(
|
|
850
863
|
instance=vpn_client, sender=vpn_client._meta.model, created=False
|
|
@@ -115,6 +115,7 @@ class DeviceLocationView(
|
|
|
115
115
|
lookup_field = "content_object"
|
|
116
116
|
lookup_url_kwarg = "pk"
|
|
117
117
|
organization_field = "content_object__organization"
|
|
118
|
+
organization_lookup = "organization__in"
|
|
118
119
|
_device_field = "content_object"
|
|
119
120
|
|
|
120
121
|
def get_queryset(self):
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/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.2}/openwisp_controller/config/__init__.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/filters.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/serializers.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/urls.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/api/views.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/__init__.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/base.py
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/device.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/base/tag.py
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/controller/urls.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/controller/views.py
RENAMED
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/exceptions.py
RENAMED
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/openwisp_controller/config/exportable.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openwisp_controller-1.2 → openwisp_controller-1.2.2}/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
|