diff --git a/openstack_dashboard/dashboards/project/networks/subnets/workflows.py b/openstack_dashboard/dashboards/project/networks/subnets/workflows.py index 85ca977eb4..0f4366e182 100644 --- a/openstack_dashboard/dashboards/project/networks/subnets/workflows.py +++ b/openstack_dashboard/dashboards/project/networks/subnets/workflows.py @@ -32,6 +32,19 @@ LOG = logging.getLogger(__name__) class CreateSubnetInfoAction(network_workflows.CreateSubnetInfoAction): with_subnet = forms.BooleanField(initial=True, required=False, widget=forms.HiddenInput()) + cidr = forms.IPField(label=_("Network Address"), + initial="", + error_messages={ + 'required': _("Specify network address")}, + widget=forms.TextInput(attrs={ + 'class': 'switched', + 'data-switch-on': 'source', + 'data-source-manual': _("Network Address"), + }), + help_text=_("Network address in CIDR format " + "(e.g. 192.168.0.0/24, 2001:DB8::/48)"), + version=forms.IPv4 | forms.IPv6, + mask=True) class Meta(object): name = _("Subnet") @@ -41,7 +54,7 @@ class CreateSubnetInfoAction(network_workflows.CreateSubnetInfoAction): def clean(self): cleaned_data = workflows.Action.clean(self) - self._check_subnet_data(cleaned_data, with_network_form=False) + self._check_subnet_data(cleaned_data) return cleaned_data @@ -105,6 +118,23 @@ class UpdateSubnetInfoAction(CreateSubnetInfoAction): ip_version = forms.ThemableChoiceField(choices=[(4, 'IPv4'), (6, 'IPv6')], widget=forms.HiddenInput(), label=_("IP Version")) + gateway_ip = forms.IPField( + label=_("Gateway IP"), + widget=forms.TextInput(attrs={ + 'class': 'switched', + 'data-switch-on': 'gateway_ip', + 'data-source-manual': _("Gateway IP") + }), + initial="", + error_messages={ + 'required': _('Specify IP address of gateway or ' + 'check "Disable Gateway" checkbox.') + }, + help_text=_("IP address of Gateway (e.g. 192.168.0.254) " + "If you do not want to use a gateway, " + "check 'Disable Gateway' below."), + version=forms.IPv4 | forms.IPv6, + mask=False) class Meta(object): name = _("Subnet") @@ -114,8 +144,7 @@ class UpdateSubnetInfoAction(CreateSubnetInfoAction): def clean(self): cleaned_data = workflows.Action.clean(self) - self._check_subnet_data(cleaned_data, is_create=False, - with_network_form=False) + self._check_subnet_data(cleaned_data) return cleaned_data diff --git a/openstack_dashboard/dashboards/project/networks/workflows.py b/openstack_dashboard/dashboards/project/networks/workflows.py index 81e81ab915..dcefe988ec 100644 --- a/openstack_dashboard/dashboards/project/networks/workflows.py +++ b/openstack_dashboard/dashboards/project/networks/workflows.py @@ -139,11 +139,13 @@ class CreateSubnetInfoAction(workflows.Action): required=False) cidr = forms.IPField(label=_("Network Address"), - required=False, initial="", + error_messages={ + 'required': _('Specify "Network Address" or ' + 'clear "Create Subnet" checkbox ' + 'in previous step.')}, widget=forms.TextInput(attrs={ 'class': 'switched', - 'data-required-when-shown': 'true', 'data-switch-on': 'source', 'data-source-manual': _("Network Address"), }), @@ -202,13 +204,6 @@ class CreateSubnetInfoAction(workflows.Action): def __init__(self, request, context, *args, **kwargs): super(CreateSubnetInfoAction, self).__init__(request, context, *args, **kwargs) - if 'with_subnet' in context: - self.fields['with_subnet'] = forms.BooleanField( - initial=context['with_subnet'], - required=False, - widget=forms.HiddenInput() - ) - if not getattr(settings, 'OPENSTACK_NEUTRON_NETWORK', {}).get('enable_ipv6', True): self.fields['ip_version'].widget = forms.HiddenInput() @@ -279,8 +274,7 @@ class CreateSubnetInfoAction(workflows.Action): 'allowed': range_str}) raise forms.ValidationError(msg) - def _check_subnet_data(self, cleaned_data, is_create=True, - with_network_form=True): + def _check_subnet_data(self, cleaned_data): cidr = cleaned_data.get('cidr') ip_version = int(cleaned_data.get('ip_version')) gateway_ip = cleaned_data.get('gateway_ip') @@ -293,14 +287,9 @@ class CreateSubnetInfoAction(workflows.Action): '"Enter Network Address manually" and specify ' '"Network Address".') raise forms.ValidationError(msg) - if not cidr and address_source != 'subnetpool': - if with_network_form: - msg = _('Specify "Network Address" or ' - 'clear "Create Subnet" checkbox in previous step.') - else: - msg = _("Specify network address") - raise forms.ValidationError(msg) - if cidr: + if address_source == 'subnetpool' and 'cidr' in self._errors: + del self._errors['cidr'] + elif cidr: subnet = netaddr.IPNetwork(cidr) if subnet.version != ip_version: msg = _('Network Address and IP version are inconsistent.') @@ -316,18 +305,18 @@ class CreateSubnetInfoAction(workflows.Action): if netaddr.IPAddress(gateway_ip).version is not ip_version: msg = _('Gateway IP and IP version are inconsistent.') raise forms.ValidationError(msg) - if not is_create and not no_gateway and not gateway_ip: - msg = _('Specify IP address of gateway or ' - 'check "Disable Gateway" checkbox.') - raise forms.ValidationError(msg) if no_gateway and 'gateway_ip' in self._errors: del self._errors['gateway_ip'] + def _remove_fields_errors(self): + self._errors = {} + def clean(self): - cleaned_data = super(CreateSubnetInfoAction, self).clean() - with_subnet = cleaned_data.get('with_subnet') + with_subnet = self.initial.get('with_subnet') if not with_subnet: - return cleaned_data + self._remove_fields_errors() + return None + cleaned_data = super(CreateSubnetInfoAction, self).clean() self._check_subnet_data(cleaned_data) return cleaned_data