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