From 75f6015af3b80093c572dec5d82efd7a293a8561 Mon Sep 17 00:00:00 2001 From: ank Date: Thu, 3 Dec 2015 18:24:45 +0530 Subject: [PATCH] Classifier to support custom IP protocol numbers Change-Id: I7cb461bae0908844f4456ef7048afa319a1dfe80 Closes-Bug: #1499916 --- gbpui/fields.py | 19 ++++++++++++ gbpui/panels/application_policy/forms.py | 37 +++++++++++------------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/gbpui/fields.py b/gbpui/fields.py index 9bed2f4..8046a7e 100644 --- a/gbpui/fields.py +++ b/gbpui/fields.py @@ -12,7 +12,9 @@ from django.core import urlresolvers from django.forms import fields +from django.forms import TextInput from django.forms import widgets +from django.utils.safestring import mark_safe class DynamicMultiSelectWidget(widgets.SelectMultiple): @@ -65,3 +67,20 @@ class DynamicMultiChoiceField(fields.MultipleChoiceField): class CustomMultiChoiceField(DynamicMultiChoiceField): def validate(self, *args, **kwargs): return True + + +class DropdownEditWidget(TextInput): + def __init__(self, data_list, name, *args, **kwargs): + super(DropdownEditWidget, self).__init__(*args, **kwargs) + self._name = name + self._list = data_list + self.attrs.update({'list': 'list__%s' % self._name}) + + def render(self, name, value, attrs=None): + text_html = super(DropdownEditWidget, self).render( + name, value, attrs=attrs) + data_list = '' % self._name + for item in self._list: + data_list += '' + return mark_safe(text_html + data_list) diff --git a/gbpui/panels/application_policy/forms.py b/gbpui/panels/application_policy/forms.py index 943f217..fbfe473 100644 --- a/gbpui/panels/application_policy/forms.py +++ b/gbpui/panels/application_policy/forms.py @@ -23,17 +23,10 @@ from horizon import messages from gbpui import client from gbpui import column_filters as gfilters +from gbpui import fields -PROTOCOLS = [('tcp', _('TCP')), - ('udp', _('UDP')), - ('icmp', _('ICMP')), - ('http', _('HTTP')), - ('https', _('HTTPS')), - ('smtp', _('SMTP')), - ('dns', _('DNS')), - ('ftp', _('FTP')), - ('any', _('ANY')) - ] +PROTOCOLS = ('TCP', 'UDP', 'ICMP', 'HTTP', + 'HTTPS', 'SMTP', 'DNS', 'FTP', 'ANY') DIRECTIONS = [('in', _('IN')), ('out', _('OUT')), ('bi', _('BI'))] @@ -195,9 +188,7 @@ class UpdatePolicyActionForm(BaseUpdateForm): class AddPolicyClassifierForm(forms.SelfHandlingForm): name = forms.CharField(max_length=80, label=_("Name"), required=False) - protocol = forms.ChoiceField(label=_("Protocol"), choices=PROTOCOLS, - widget=forms.Select(attrs={'class': 'switchable', - 'data-slug': 'source'})) + protocol = forms.CharField(required=True) port_range = forms.CharField(max_length=80, label=_("Port/Range(min:max)"), required=False, widget=forms.TextInput(attrs={'class': 'switched', @@ -219,13 +210,16 @@ class AddPolicyClassifierForm(forms.SelfHandlingForm): def __init__(self, request, *args, **kwargs): super(AddPolicyClassifierForm, self).__init__(request, *args, **kwargs) + self.fields['protocol'].widget = fields.DropdownEditWidget( + data_list=PROTOCOLS, name='list') def handle(self, request, context): url = reverse('horizon:project:application_policy:index') try: - if context.get('protocol') in PROTOCOL_MAP: - context['protocol'] = PROTOCOL_MAP[context['protocol']] - elif context.get('protocol') == "any": + protocol = context.get('protocol').lower() + if protocol in PROTOCOL_MAP: + context['protocol'] = PROTOCOL_MAP[protocol] + elif protocol == "any": del context['protocol'] if not context.get('port_range'): context['port_range'] = None @@ -244,7 +238,7 @@ class AddPolicyClassifierForm(forms.SelfHandlingForm): class UpdatePolicyClassifierForm(BaseUpdateForm): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField(label=_("Description"), required=False) - protocol = forms.ChoiceField(label=_("Protocol"), choices=PROTOCOLS) + protocol = forms.CharField(required=True) port_range = forms.CharField(max_length=80, label=_("Port/Range(min:max)"), required=False) direction = forms.ChoiceField(label=_("Direction"), choices=DIRECTIONS) @@ -253,6 +247,8 @@ class UpdatePolicyClassifierForm(BaseUpdateForm): def __init__(self, request, *args, **kwargs): super(UpdatePolicyClassifierForm, self).__init__( request, *args, **kwargs) + self.fields['protocol'].widget = fields.DropdownEditWidget( + data_list=PROTOCOLS, name='list') try: policyclassifier_id = self.initial['policyclassifier_id'] classifier = client.policyclassifier_get( @@ -274,9 +270,10 @@ class UpdatePolicyClassifierForm(BaseUpdateForm): url = reverse('horizon:project:application_policy:index') try: policyclassifier_id = self.initial['policyclassifier_id'] - if context.get('protocol') in PROTOCOL_MAP: - context['protocol'] = PROTOCOL_MAP[context['protocol']] - elif context.get('protocol') == "any": + protocol = context.get('protocol').lower() + if protocol in PROTOCOL_MAP: + context['protocol'] = PROTOCOL_MAP[protocol] + elif protocol == "any": context['protocol'] = None if 'port_range' in context and context['port_range'] == '': context['port_range'] = None