Merge "Classifier to support custom IP protocol numbers"

This commit is contained in:
Jenkins 2015-12-11 18:50:08 +00:00 committed by Gerrit Code Review
commit 5d0c13b845
2 changed files with 36 additions and 20 deletions

View File

@ -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 = '<datalist id="list__%s">' % self._name
for item in self._list:
data_list += '<option value="%s">' % item
data_list += '</datalist>'
return mark_safe(text_html + data_list)

View File

@ -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