models.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. # -*- coding: utf-8 -*-
  2. from django.db import models
  3. from django.core.exceptions import ValidationError
  4. from netfields import InetAddressField, NetManager
  5. from netaddr import IPAddress
  6. # TODO: validate DNS names with this regex
  7. REGEX = r'(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}|[A-Z0-9-]{2,})\.?$'
  8. class NameServer(models.Model):
  9. dns_name = models.CharField(max_length=255,
  10. help_text="Example: ns1.example.com")
  11. description = models.CharField(max_length=255, blank=True,
  12. verbose_name="human-readable name of the nameserver",
  13. help_text="Example: My first name server")
  14. owner = models.ForeignKey("members.Member")
  15. def __unicode__(self):
  16. return "{} ({})".format(self.description, self.dns_name) if self.description else self.dns_name
  17. class ReverseDNSEntry(models.Model):
  18. ip = InetAddressField(unique=True)
  19. reverse = models.CharField(max_length=255,
  20. verbose_name="hostname to associate to the IP")
  21. ip_subnet = models.ForeignKey('resources.IPSubnet')
  22. objects = NetManager()
  23. def clean(self):
  24. if self.reverse:
  25. # Check that the reverse ends with a "." (add it if necessary)
  26. if not self.reverse.endswith('.'):
  27. self.reverse += '.'
  28. if self.ip:
  29. if not self.ip in self.ip_subnet.inet:
  30. raise ValidationError('IP address must be included in the IP subnet.')
  31. def __unicode__(self):
  32. return u"{} → {}".format(self.ip, self.reverse)