Coverage for ipam/api/field_serializers.py: 92%

26 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from django.utils.translation import gettext_lazy as _ 

2from netaddr import AddrFormatError, IPNetwork 

3from rest_framework import serializers 

4 

5__all__ = ( 

6 'IPAddressField', 

7 'IPNetworkField', 

8) 

9 

10 

11class IPAddressField(serializers.CharField): 

12 """ 

13 An IPv4 or IPv6 address with optional mask 

14 """ 

15 default_error_messages = { 

16 'invalid': _('Enter a valid IPv4 or IPv6 address with optional mask.'), 

17 } 

18 

19 def to_internal_value(self, data): 

20 try: 

21 return IPNetwork(data) 

22 except AddrFormatError: 

23 raise serializers.ValidationError(_("Invalid IP address format: {data}").format(data=data)) 

24 except (TypeError, ValueError) as e: 

25 raise serializers.ValidationError(e) 

26 

27 def to_representation(self, value): 

28 return str(value) 

29 

30 

31class IPNetworkField(serializers.CharField): 

32 """ 

33 An IPv4 or IPv6 prefix 

34 """ 

35 default_error_messages = { 

36 'invalid': _('Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation.'), 

37 } 

38 

39 def to_internal_value(self, data): 

40 try: 

41 return IPNetwork(data) 

42 except AddrFormatError: 

43 raise serializers.ValidationError(_("Invalid IP prefix format: {data}").format(data=data)) 

44 except (TypeError, ValueError) as e: 

45 raise serializers.ValidationError(e) 

46 

47 def to_representation(self, value): 

48 return str(value)