diff options
Diffstat (limited to 'portal-gui/rpkigui/myrpki/forms.py')
-rw-r--r-- | portal-gui/rpkigui/myrpki/forms.py | 67 |
1 files changed, 45 insertions, 22 deletions
diff --git a/portal-gui/rpkigui/myrpki/forms.py b/portal-gui/rpkigui/myrpki/forms.py index 866be7dd..d0ddc462 100644 --- a/portal-gui/rpkigui/myrpki/forms.py +++ b/portal-gui/rpkigui/myrpki/forms.py @@ -3,6 +3,7 @@ from django import forms import models from rpkigui.myrpki.misc import str_to_addr +from rpkigui.myrpki.asnset import asnset def ConfCertForm(request): class CertForm(forms.ModelForm): @@ -62,7 +63,8 @@ def RangeForm(field_type, *args, **kwargs): hi = self.cleaned_data.get('hi') if lo > hi: # should we just fix it? - raise forms.ValidationError, 'Lower bound is higher than upper.' + raise forms.ValidationError, \ + 'Lower bound is higher than upper.' return self.cleaned_data return wrapped(*args, **kwargs) @@ -92,8 +94,8 @@ def get_pk(child): def SubOrAssignForm(handle, addr, field_type, *args, **kwargs): '''Closure to select child of the specified handle.''' class Wrapper(forms.Form): - '''Form for the address view to allow the user to subdivide or assign - the block to a child.''' + '''Form for the address view to allow the user to subdivide or + assign the block to a child.''' lo = field_type(required=False, label='Lower bound') hi = field_type(required=False, label='Upper bound') child = forms.ModelChoiceField(required=False, label='Assign to child', @@ -107,7 +109,8 @@ def SubOrAssignForm(handle, addr, field_type, *args, **kwargs): lo = None if lo != None: if lo < addr.lo or lo > addr.hi: - raise forms.ValidationError, 'Value is out of range of parent.' + raise forms.ValidationError, \ + 'Value is out of range of parent.' # ensure there is no overlap with other children for c in addr.children.all(): if lo >= c.lo and lo <= c.hi: @@ -162,7 +165,8 @@ def SubOrAssignAsnForm(handle, asn, *args, **kwargs): return SubOrAssignForm(handle, asn, forms.IntegerField, *args, **kwargs) def RoaForm(handle, pk=None, initval=[], *args, **kwargs): - vals = models.AddressRange.objects.filter(from_parent__in=handle.parents.all()) + vals = models.AddressRange.objects.filter( + from_parent__in=handle.parents.all()) class Wrapped(forms.Form): asn = AsnField(initial=pk) @@ -186,9 +190,11 @@ def PrefixSplitForm(prefix, *args, **kwargs): pfx_loaddr = str_to_addr(prefix.lo) pfx_hiaddr = str_to_addr(prefix.hi) if type(loaddr) != type(pfx_hiaddr): - raise forms.ValidationError, 'Not the same IP address type as parent' + raise forms.ValidationError, \ + 'Not the same IP address type as parent' if loaddr < pfx_loaddr or loaddr > pfx_hiaddr: - raise forms.ValidationError, 'Value out of range of parent prefix' + raise forms.ValidationError, \ + 'Value out of range of parent prefix' return lo def clean_hi(self): @@ -201,9 +207,11 @@ def PrefixSplitForm(prefix, *args, **kwargs): pfx_loaddr = str_to_addr(prefix.lo) pfx_hiaddr = str_to_addr(prefix.hi) if type(hiaddr) != type(pfx_loaddr): - raise forms.ValidationError, 'Not the same IP address type as parent' + raise forms.ValidationError, \ + 'Not the same IP address type as parent' if hiaddr < pfx_loaddr or hiaddr > pfx_hiaddr: - raise forms.ValidationError, 'Value out of range of parent prefix' + raise forms.ValidationError, \ + 'Value out of range of parent prefix' return hi def clean(self): @@ -224,21 +232,35 @@ def PrefixSplitForm(prefix, *args, **kwargs): def PrefixAllocateForm(iv, child_set, *args, **kwargs): class _wrapper(forms.Form): - child = forms.ModelChoiceField(initial=iv, queryset=child_set, required=False) + child = forms.ModelChoiceField(initial=iv, queryset=child_set, + required=False) return _wrapper(*args, **kwargs) -class PrefixRoaForm(forms.Form): - asns = forms.CharField(max_length=200, required=False) +def PrefixRoaForm(prefix, *args, **kwargs): + prefix_range = prefix.as_resource_range() - def clean_asns(self): - try: - v = [int(d) for d in self.cleaned_data['asns'].split(',') if d.strip() != ''] - if any([x for x in v if x < 0]): - raise forms.ValidationError, 'must be a positive integer' - return ','.join(str(x) for x in sorted(v)) - except ValueError: - raise forms.ValidationError, 'must be a list of integers separated by commas' - return self.cleaned_data['asns'] + class _wrapper(forms.Form): + asns = forms.CharField(max_length=200, required=False, help_text='Comma-separated list of ASNs') + max_length = forms.IntegerField(required=False, + min_value=prefix_range._prefixlen(), + max_value=prefix_range.datum_type.bits) + + def clean_max_length(self): + v = self.cleaned_data.get('max_length') + if not v: + v = prefix_range._prefixlen() + return v + + def clean_asns(self): + try: + v = asnset(self.cleaned_data.get('asns')) + return ','.join(str(x) for x in sorted(v)) + except ValueError: + raise forms.ValidationError, \ + 'Must be a list of integers separated by commas.' + return self.cleaned_data['asns'] + + return _wrapper(*args, **kwargs) def PrefixDeleteForm(prefix, *args, **kwargs): class _wrapped(forms.Form): @@ -248,7 +270,8 @@ def PrefixDeleteForm(prefix, *args, **kwargs): v = self.cleaned_data.get('delete') if v: if not prefix.parent: - raise forms.ValidationError, 'Can not delete prefix received from parent' + raise forms.ValidationError, \ + 'Can not delete prefix received from parent' if prefix.allocated: raise forms.ValidationError, 'Prefix is allocated to child' if prefix.asns: |