You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.9 KiB
53 lines
1.9 KiB
from ipaddress import ip_network, ip_address
|
|
|
|
from django import forms
|
|
from django.core.exceptions import ValidationError
|
|
from django.utils.translation import ugettext as _
|
|
|
|
from ip_pool import models
|
|
|
|
|
|
class NetworkForm(forms.ModelForm):
|
|
|
|
def clean_network(self):
|
|
netw = self.data.get('network')
|
|
if netw is None:
|
|
return
|
|
try:
|
|
net = ip_network(netw)
|
|
return net.compressed
|
|
except ValueError as e:
|
|
raise ValidationError(e, code='invalid')
|
|
|
|
class Meta:
|
|
model = models.NetworkModel
|
|
fields = '__all__'
|
|
|
|
|
|
class LeaseForm(forms.Form):
|
|
def __init__(self, data=None, *args, **kwargs):
|
|
super(LeaseForm, self).__init__(data=data, *args, **kwargs)
|
|
nets = models.NetworkModel.objects.defer('groups')
|
|
if nets.exists():
|
|
self.fields['possible_networks'].choices = ((net.pk, str(net.get_network())) for net in nets.iterator())
|
|
|
|
def clean_ip_addr(self):
|
|
ip_addr = self.data.get('ip_addr')
|
|
if ip_addr is None:
|
|
return
|
|
ip_addr = ip_address(ip_addr)
|
|
net_id = self.data.get('possible_networks')
|
|
if net_id is None:
|
|
return ip_addr.compressed
|
|
net = models.NetworkModel.objects.get(pk=net_id)
|
|
if ip_addr not in net.get_network():
|
|
raise ValidationError(_('Ip that you typed is not in subnet that you have selected'))
|
|
if ip_addr < ip_address(net.ip_start):
|
|
raise ValidationError(_('Ip that you have passed is less than allowed network range'))
|
|
if ip_addr > ip_address(net.ip_end):
|
|
raise ValidationError(_('Ip that you have passed is greater than allowed network range'))
|
|
return ip_addr.compressed
|
|
|
|
ip_addr = forms.GenericIPAddressField(label=_('Ip address'))
|
|
is_dynamic = forms.BooleanField(label=_('Is dynamic'), required=False)
|
|
possible_networks = forms.ChoiceField(label=_('Possible networks'))
|