| 1 | # (c) Roland van Laar 2006
|
|---|
| 2 | # vi:et:ts=4
|
|---|
| 3 | from django.db import models
|
|---|
| 4 | from django.contrib import admin
|
|---|
| 5 |
|
|---|
| 6 | # Create your models here.
|
|---|
| 7 |
|
|---|
| 8 | #No need to formalize it; CHOICES don't change much
|
|---|
| 9 |
|
|---|
| 10 | STATUS_CHOICES = (
|
|---|
| 11 | ('up', 'up'),
|
|---|
| 12 | ('dw', 'down'),
|
|---|
| 13 | ('pl', 'planned'),
|
|---|
| 14 | )
|
|---|
| 15 |
|
|---|
| 16 | POLAR_CHOICES = (
|
|---|
| 17 | ('hr', 'horizontal'),
|
|---|
| 18 | ('vr', 'vertical'),
|
|---|
| 19 | )
|
|---|
| 20 |
|
|---|
| 21 | INTERFACE_TYPE_CHOICES = (
|
|---|
| 22 | ('eth', 'eth'),
|
|---|
| 23 | ('11a', '11a'),
|
|---|
| 24 | ('11b', '11b'),
|
|---|
| 25 | ('11g', '11g'),
|
|---|
| 26 | )
|
|---|
| 27 | WIFI_MODE_CHOICES = (
|
|---|
| 28 | ('ms', 'master'),
|
|---|
| 29 | ('mn', 'managed'),
|
|---|
| 30 | )
|
|---|
| 31 |
|
|---|
| 32 | class ExtendedModel(models.Model):
|
|---|
| 33 | class Meta:
|
|---|
| 34 | abstract = True
|
|---|
| 35 | verbose_name = 'ExtendedModel'
|
|---|
| 36 |
|
|---|
| 37 | def as_list(self):
|
|---|
| 38 | meta = self._meta
|
|---|
| 39 | values = [(f.verbose_name, getattr(self, f.attname)) \
|
|---|
| 40 | for f in meta.local_fields if f.verbose_name not in ( 'ID')]
|
|---|
| 41 | return values
|
|---|
| 42 |
|
|---|
| 43 | class Antenna(ExtendedModel):
|
|---|
| 44 | type = models.CharField(max_length=20, unique=True)
|
|---|
| 45 | gain = models.IntegerField(max_length=3)
|
|---|
| 46 |
|
|---|
| 47 | def __str__(self):
|
|---|
| 48 | return self.type
|
|---|
| 49 |
|
|---|
| 50 | class Location(ExtendedModel):
|
|---|
| 51 | description = models.CharField(max_length=200, unique=True)
|
|---|
| 52 | longitude = models.DecimalField(max_digits=8,decimal_places=6)
|
|---|
| 53 | latitude = models.DecimalField(max_digits=8,decimal_places=6)
|
|---|
| 54 |
|
|---|
| 55 | class Meta:
|
|---|
| 56 | verbose_name = 'Location'
|
|---|
| 57 |
|
|---|
| 58 | def __str__(self):
|
|---|
| 59 | return self.description
|
|---|
| 60 |
|
|---|
| 61 |
|
|---|
| 62 | #XXX: Name Domain perhaps?
|
|---|
| 63 | class DnsServer(ExtendedModel):
|
|---|
| 64 | ipaddress = models.IPAddressField()
|
|---|
| 65 | domainname = models.CharField(max_length=50, unique=True)
|
|---|
| 66 |
|
|---|
| 67 | class Meta:
|
|---|
| 68 | verbose_name = 'Dns Server'
|
|---|
| 69 |
|
|---|
| 70 | def __str__(self):
|
|---|
| 71 | return self.ipaddress
|
|---|
| 72 |
|
|---|
| 73 | class Network(ExtendedModel):
|
|---|
| 74 | name = models.CharField(max_length=50, unique=True)
|
|---|
| 75 | ipspacestart = models.IPAddressField()
|
|---|
| 76 | netmask = models.IntegerField()
|
|---|
| 77 |
|
|---|
| 78 | class Meta:
|
|---|
| 79 | verbose_name = 'Network'
|
|---|
| 80 |
|
|---|
| 81 | def __str__(self):
|
|---|
| 82 | return self.name
|
|---|
| 83 |
|
|---|
| 84 |
|
|---|
| 85 | class Node(ExtendedModel):
|
|---|
| 86 | name = models.CharField(max_length=30, unique=True)
|
|---|
| 87 | location = models.ForeignKey(Location)
|
|---|
| 88 | status = models.CharField(max_length=10, choices=STATUS_CHOICES, default=1)
|
|---|
| 89 | masterip = models.IPAddressField(unique=True)
|
|---|
| 90 | network = models.ForeignKey(Network,default=1)
|
|---|
| 91 |
|
|---|
| 92 | class Meta:
|
|---|
| 93 | ordering = ['name']
|
|---|
| 94 | verbose_name = 'Node'
|
|---|
| 95 |
|
|---|
| 96 | def __str__(self):
|
|---|
| 97 | return self.name
|
|---|
| 98 |
|
|---|
| 99 | class Interface(ExtendedModel):
|
|---|
| 100 | node = models.ForeignKey(Node)
|
|---|
| 101 | type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES, \
|
|---|
| 102 | default=1)
|
|---|
| 103 | iface = models.CharField(max_length=10, verbose_name="interface", \
|
|---|
| 104 | default='eth0')
|
|---|
| 105 | ip = models.IPAddressField(unique=True)
|
|---|
| 106 | netmask = models.IntegerField(default=30)
|
|---|
| 107 | polar = models.CharField(blank=True, max_length=10, choices=POLAR_CHOICES)
|
|---|
| 108 | ssid = models.CharField(max_length=30, blank=True, null=True)
|
|---|
| 109 | mode = models.CharField(max_length=10, choices=WIFI_MODE_CHOICES)
|
|---|
| 110 | channel = models.IntegerField(blank=True, null=True)
|
|---|
| 111 | antenna = models.ForeignKey(Antenna, blank=True, null=True)
|
|---|
| 112 | shortdesc = models.CharField(blank=True, max_length=10)
|
|---|
| 113 | desc = models.CharField(blank=True, max_length=100)
|
|---|
| 114 | link = models.ForeignKey('self', blank=True, null=True)
|
|---|
| 115 |
|
|---|
| 116 | class Meta:
|
|---|
| 117 | unique_together = ('node', 'iface')
|
|---|
| 118 | verbose_name = 'Interface'
|
|---|
| 119 |
|
|---|
| 120 | def __str__(self):
|
|---|
| 121 | return "%s/%s" % (self.node, self.iface)
|
|---|
| 122 |
|
|---|
| 123 | class InterfaceAlias(ExtendedModel):
|
|---|
| 124 | iface = models.ForeignKey(Interface,related_name='child')
|
|---|
| 125 | ip = models.IPAddressField(unique=True)
|
|---|
| 126 | netmask = models.IntegerField(default=30)
|
|---|
| 127 | shortdesc = models.CharField(blank=True, max_length=10)
|
|---|
| 128 | desc = models.CharField(blank=True, max_length=100)
|
|---|
| 129 | linkAlias = models.ForeignKey('self', blank=True, null=True)
|
|---|
| 130 | link = models.ForeignKey(Interface, blank=True, null=True)
|
|---|
| 131 |
|
|---|
| 132 | def __str__(self):
|
|---|
| 133 | return "Alias %s" % (self.iface)
|
|---|
| 134 |
|
|---|
| 135 | #
|
|---|
| 136 | # XXX: Needs rethinking, dhcp[start|stop] could be removed if whole publicAP is
|
|---|
| 137 | # going to be activated as DHCP range, or only number of fixed clients needs to
|
|---|
| 138 | # be defined, all other could be calculated on the fly if needed
|
|---|
| 139 |
|
|---|
| 140 | class PublicAP(ExtendedModel):
|
|---|
| 141 | iface = models.ForeignKey(Interface,related_name='ap', verbose_name="interface")
|
|---|
| 142 | ip = models.IPAddressField(unique=True)
|
|---|
| 143 | netmask = models.IntegerField(default=28)
|
|---|
| 144 | dhcpstart = models.IPAddressField()
|
|---|
| 145 | dhcpstop = models.IPAddressField()
|
|---|
| 146 | shortdesc = models.CharField(max_length=10)
|
|---|
| 147 | desc = models.CharField(max_length=100)
|
|---|
| 148 |
|
|---|
| 149 | class Meta:
|
|---|
| 150 | verbose_name = "Public Access Point"
|
|---|
| 151 |
|
|---|
| 152 | def __str__(self):
|
|---|
| 153 | return "%s:%s" % (self.iface,self.pk)
|
|---|
| 154 |
|
|---|
| 155 | class DhcpStatic(ExtendedModel):
|
|---|
| 156 | hostname = models.CharField(max_length=10,unique=True)
|
|---|
| 157 | macaddress = models.CharField(max_length=17)
|
|---|
| 158 | address = models.IPAddressField()
|
|---|
| 159 | PublicAP = models.ForeignKey(PublicAP)
|
|---|
| 160 |
|
|---|
| 161 | class Meta:
|
|---|
| 162 | verbose_name = "Static host"
|
|---|
| 163 |
|
|---|
| 164 | def __str__(self):
|
|---|
| 165 | return self.hostname
|
|---|