22 changed files with 370 additions and 230 deletions
-
18abonapp/forms.py
-
44abonapp/models.py
-
20abonapp/templates/abonapp/editAbon.html
-
11abonapp/templates/abonapp/peoples.html
-
2abonapp/urls.py
-
55abonapp/views.py
-
33agent/commands/dhcp.py
-
2agent/core.py
-
129agent/mod_mikrotik.py
-
17agent/structs.py
-
5djing/settings.py
-
2ip_pool/admin.py
-
84ip_pool/fields.py
-
30ip_pool/forms.py
-
96ip_pool/models.py
-
11ip_pool/templates/ip_pool/ip_leases_list.html
-
6ip_pool/templates/ip_pool/net_add.html
-
8ip_pool/templates/ip_pool/net_edit.html
-
4ip_pool/templates/ip_pool/network_list.html
-
2ip_pool/urls.py
-
5periodic.py
-
16static/js/cidr.js
@ -0,0 +1,84 @@ |
|||
from ipaddress import ip_network |
|||
from django.utils.translation import gettext_lazy as _ |
|||
from django.core.exceptions import ValidationError |
|||
from django.db import models |
|||
from django.forms.fields import CharField |
|||
|
|||
|
|||
def validate_ipv46_address_with_subnet(v: str): |
|||
try: |
|||
ip = ip_network(v) |
|||
return str(ip) |
|||
except ValueError as e: |
|||
raise ValidationError(e) |
|||
|
|||
|
|||
class GenericIPAddressFormField(CharField): |
|||
|
|||
def __init__(self, unpack_ipv4=False, *args, **kwargs): |
|||
self.unpack_ipv4 = unpack_ipv4 |
|||
self.default_validators = validate_ipv46_address_with_subnet, |
|||
del kwargs['protocol'] |
|||
super(GenericIPAddressFormField, self).__init__(*args, **kwargs) |
|||
|
|||
def to_python(self, value): |
|||
if value in self.empty_values: |
|||
return '' |
|||
value = value.strip() |
|||
if value and ':' in value: |
|||
ip = ip_network(value, strict=False) |
|||
return ip.compressed |
|||
return value |
|||
|
|||
|
|||
class GenericIpAddressWithPrefix(models.GenericIPAddressField): |
|||
description = _("IP address with prefix length, or subnet for ipv4") |
|||
|
|||
def __init__(self, prefix=None, *args, **kwargs): |
|||
self.prefix = prefix |
|||
super(GenericIpAddressWithPrefix, self).__init__(*args, **kwargs) |
|||
self.default_error_messages['invalid'] = _('Enter a valid IPv4 or IPv6 address with prefix length.') |
|||
self.max_length = 43 |
|||
|
|||
def deconstruct(self): |
|||
name, path, args, kwargs = super(GenericIpAddressWithPrefix, self).deconstruct() |
|||
if kwargs.get("max_length") == 43: |
|||
del kwargs['max_length'] |
|||
return name, path, args, kwargs |
|||
|
|||
@property |
|||
def validators(self): |
|||
return validate_ipv46_address_with_subnet, |
|||
|
|||
def to_python(self, value): |
|||
if value is None: |
|||
return None |
|||
value = value.strip() |
|||
if ':' in value: |
|||
ip = ip_network(value) |
|||
return ip.compressed |
|||
return value |
|||
|
|||
def get_db_prep_value(self, value, connection, prepared=False): |
|||
if not prepared: |
|||
value = self.get_prep_value(value) |
|||
return connection.ops.adapt_ipaddressfield_value(value) |
|||
|
|||
def get_prep_value(self, value): |
|||
value = super(GenericIpAddressWithPrefix, self).get_prep_value(value) |
|||
if value is None: |
|||
return None |
|||
if value and ':' in value: |
|||
try: |
|||
return ip_network(value) |
|||
except ValidationError: |
|||
pass |
|||
return value |
|||
|
|||
def formfield(self, **kwargs): |
|||
defaults = { |
|||
'protocol': self.protocol, |
|||
'form_class': GenericIPAddressFormField, |
|||
} |
|||
defaults.update(kwargs) |
|||
return super(GenericIpAddressWithPrefix, self).formfield(**defaults) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue