From ed5fee0b133183c57ca0fb76be009d61cd87397d Mon Sep 17 00:00:00 2001 From: Sebastian Lohff Date: Sun, 26 Mar 2017 05:23:00 +0200 Subject: [PATCH] Noot --- api/views.py | 43 ++++++++++++++++++++++++++----------------- whoisdb/formfields.py | 34 ++++++++++++++++++++++++++++++++++ whoisdb/forms.py | 16 +++++++++++++++- 3 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 whoisdb/formfields.py diff --git a/api/views.py b/api/views.py index b721b52..0359f73 100644 --- a/api/views.py +++ b/api/views.py @@ -84,25 +84,34 @@ def freeSubnet(request): raise ValidationError("Given prefix length is out of range") except ValueError: raise ValidationError("PrefixLen is not a number") - nets = list(parentRange.getNetwork().subnets()) - for subRange in parentRange.inetnum_set.all(): - newNet = None - for net in nets: - if subRange.getNetwork().network_address in net: - newNet = net - if not newNet: - # critical error, we want a 500 here - raise ValueError("Subnet not in range") - - nets.remove(newNet) - nets.extend(newNet.address_exclude(subRange.getNetwork())) - nets = sorted(nets) usableNet = None - for net in nets: - if net.prefixlen <= prefixLen: - usableNet = net - break + # FIXME: use first biggest usable netblock... + #biggestNet = parentRange.inetnum_set.order_by("-address") + #if biggestNet + # candidateNet = + # and (biggestNet.getNetwork().broadcast_address.: + + if not usableNet: + # search for free network + nets = list(parentRange.getNetwork().subnets()) + for subRange in parentRange.inetnum_set.all(): + newNet = None + for net in nets: + if subRange.getNetwork().network_address in net: + newNet = net + if not newNet: + # critical error, we want a 500 here + raise ValueError("Subnet not in range") + + nets.remove(newNet) + nets.extend(newNet.address_exclude(subRange.getNetwork())) + + nets = sorted(nets) + for net in nets: + if net.prefixlen <= prefixLen: + usableNet = net + break if not usableNet: raise ValidationError("No space left in given range") diff --git a/whoisdb/formfields.py b/whoisdb/formfields.py new file mode 100644 index 0000000..f6e60aa --- /dev/null +++ b/whoisdb/formfields.py @@ -0,0 +1,34 @@ +from django import forms + + +class MultiTextInput(forms.widgets.Input): + input_type = "text" + + def render(self, name, value, attrs=None): + if value is not None: + selectedOptions = [] + for val in value: + for k, v in self.choices: + if val == k: + selectedOptions.append(v) + + value = " ".join(selectedOptions) + + return super(MultiTextInput, self).render(name, value, attrs) + + def value_from_datadict(self, data, files, name): + values = list(filter(bool, map(lambda _x: _x.strip(), data.get(name).split(" ")))) + + result = [] + for value in values: + # FIXME: using value here throws a weird error message at some point + # could be handled by overriding the messages in ChoiceField + # or... well, don't know + kId = value + for k, v in self.choices: + if v.lower() == value.lower(): + kId = str(k) + break + result.append(kId) + + return result diff --git a/whoisdb/forms.py b/whoisdb/forms.py index 66e2451..eed08b1 100644 --- a/whoisdb/forms.py +++ b/whoisdb/forms.py @@ -3,6 +3,7 @@ from django.db.models import Case, When, IntegerField from .models import Maintainer, Contact, InetNum, ASBlock, ASNumber from .validators import HandleValidatorWithSuffix, IP46CIDRValidator +from .formfields import MultiTextInput import ipaddress @@ -69,7 +70,20 @@ class MntFormMixin(object): class MntForm(WhoisObjectFormMixin, forms.ModelForm): class Meta: model = Maintainer - fields = ['handle', 'description', 'admin_c'] + fields = ['handle', 'description', 'admin_c', 'auth'] + widgets = {'auth': MultiTextInput()} + + help_texts = { + 'auth': 'Enter names of users which can edit this object (space separated; ' + 'and yes, validation is somewhat broken (values disappear on error - just reload))' + } + + def __init__(self, *args, **kwargs): + super(MntForm, self).__init__(*args, **kwargs) + print(args, kwargs) + + #if self._create: + # self.fields['auth'].text("noot") class MntInitialForm(MntForm):