Admin optimizations and formatting fixes
- Removes model OSArchitecture - Denormalizes OS.architecture into OS.arch
This commit is contained in:
1 parent
ab2546a521
commit
bc6029e289
6 files changed
+135
-80
No files matched your search
+20
-10
@@ -12,6 +12,9 @@ class InterfaceInline(admin.TabularInline):
|
|||||||
model = Interface
|
model = Interface
|
||||||
extra = 0
|
extra = 0
|
||||||
|
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return super(InterfaceInline, self).get_queryset(request).select_related()
|
||||||
|
|
||||||
|
|
||||||
class HostAdmin(admin.ModelAdmin):
|
class HostAdmin(admin.ModelAdmin):
|
||||||
ordering = ('hostname',)
|
ordering = ('hostname',)
|
||||||
@@ -27,21 +30,25 @@ class HostAdmin(admin.ModelAdmin):
|
|||||||
'fields': ('owner', 'location', 'description' )
|
'fields': ('owner', 'location', 'description' )
|
||||||
}),
|
}),
|
||||||
('Hardware and Software Information', {
|
('Hardware and Software Information', {
|
||||||
'fields': (('brand', 'model'), 'serial_number', ('hostname', 'host_type'), ('operating_system', 'virtual'))
|
'fields': (('brand', 'model', 'serial_number'), ('hostname', 'host_type'), ('operating_system', 'virtual'))
|
||||||
}),
|
|
||||||
('Domain and Kerberos Information', {
|
|
||||||
'description': 'If this host is a member of the LDAP domain, you need to tick the request kerberos principal checkbox. A principal will then be created for the host.',
|
|
||||||
'classes': ['collapse'],
|
|
||||||
'fields': ('request_kerberos_principal', 'kerberos_principal_created',
|
|
||||||
('kerberos_principal_name', 'kerberos_principal_created_date'))
|
|
||||||
}),
|
}),
|
||||||
|
# FIXME: Not in use
|
||||||
|
# ('Domain and Kerberos Information', {
|
||||||
|
# 'description': 'If this host is a member of the LDAP domain, you need to tick the request kerberos principal checkbox. A principal will then be created for the host.',
|
||||||
|
# 'classes': ['collapse'],
|
||||||
|
# 'fields': ('request_kerberos_principal', 'kerberos_principal_created',
|
||||||
|
# ('kerberos_principal_name', 'kerberos_principal_created_date'))
|
||||||
|
# }),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_queryset(self, request):
|
||||||
|
return super(HostAdmin, self).get_queryset(request).select_related()
|
||||||
|
|
||||||
|
|
||||||
class Ip4AddressInline(admin.TabularInline):
|
class Ip4AddressInline(admin.TabularInline):
|
||||||
model = Ip4Address
|
model = Ip4Address
|
||||||
extra = 0
|
extra = 0
|
||||||
readonly_fields = ['address']
|
readonly_fields = ['address', 'assigned_to_host']
|
||||||
|
|
||||||
|
|
||||||
class DhcpOptionInline(admin.TabularInline):
|
class DhcpOptionInline(admin.TabularInline):
|
||||||
@@ -58,6 +65,10 @@ class SubnetAdmin(admin.ModelAdmin):
|
|||||||
list_display = ['name', 'network', 'netmask', 'num_addresses', 'broadcast_address', 'first_address', 'last_address']
|
list_display = ['name', 'network', 'netmask', 'num_addresses', 'broadcast_address', 'first_address', 'last_address']
|
||||||
inlines = [DhcpOptionInline, DhcpCustomFieldInline, Ip4AddressInline]
|
inlines = [DhcpOptionInline, DhcpCustomFieldInline, Ip4AddressInline]
|
||||||
|
|
||||||
|
def get_queryset(self, request):
|
||||||
|
# TODO: optimize
|
||||||
|
return super(SubnetAdmin, self).get_queryset(request)
|
||||||
|
|
||||||
|
|
||||||
class DomainSrvRecordInline(admin.TabularInline):
|
class DomainSrvRecordInline(admin.TabularInline):
|
||||||
model = DomainSrvRecord
|
model = DomainSrvRecord
|
||||||
@@ -90,7 +101,7 @@ class HostTypeAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
|
|
||||||
class OperatingSystemAdmin(admin.ModelAdmin):
|
class OperatingSystemAdmin(admin.ModelAdmin):
|
||||||
list_display = ['name', 'version', 'architecture']
|
list_display = ['name', 'version', 'arch']
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(Domain, DomainAdmin)
|
admin.site.register(Domain, DomainAdmin)
|
||||||
@@ -101,7 +112,6 @@ admin.site.register(Ip6Address)
|
|||||||
admin.site.register(Nameserver)
|
admin.site.register(Nameserver)
|
||||||
admin.site.register(MailExchange)
|
admin.site.register(MailExchange)
|
||||||
admin.site.register(OperatingSystem, OperatingSystemAdmin)
|
admin.site.register(OperatingSystem, OperatingSystemAdmin)
|
||||||
admin.site.register(OsArchitecture)
|
|
||||||
admin.site.register(HostType, HostTypeAdmin)
|
admin.site.register(HostType, HostTypeAdmin)
|
||||||
admin.site.register(DhcpConfig)
|
admin.site.register(DhcpConfig)
|
||||||
admin.site.register(DhcpOption)
|
admin.site.register(DhcpOption)
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
import django.core.validators
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mdb', '0002_auto_20141229_2309'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='operatingsystem',
|
||||||
|
name='arch',
|
||||||
|
field=models.CharField(blank=True, max_length=255, null=True, choices=[(b'mips', 'MIPS'), (b'arm', 'ARM'), (b'broadcom', 'Broadcom'), (b'rc32300', 'RC32300'), (b'powerpc', 'PowerPC'), (b'powerpc403ga', 'PowerPC403GA'), (b'unknown', 'Unknown'), (b'x86_64', 'x86-64'), (b'i386', 'x86')]),
|
||||||
|
preserve_default=True,
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='interface',
|
||||||
|
name='macaddr',
|
||||||
|
field=models.CharField(max_length=17, validators=[django.core.validators.RegexValidator(regex=re.compile(b'^([0-9A-F]{2}[:]){5}([0-9A-F]{2})$', 2), message='Enter a valid MAC address', code=b'invalid')]),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
from django.db.migrations import RunPython
|
||||||
|
|
||||||
|
|
||||||
|
def flatten_architecture(apps, schema_editor):
|
||||||
|
OperatingSystem = apps.get_model("mdb", "OperatingSystem")
|
||||||
|
for os in OperatingSystem.objects.all():
|
||||||
|
os.arch = os.architecture.architecture
|
||||||
|
os.save()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
('mdb', '0003_auto_20150822_2156'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
RunPython(flatten_architecture),
|
||||||
|
]
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('mdb', '0004_auto_20150822_2157'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='operatingsystem',
|
||||||
|
name='architecture',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='OsArchitecture',
|
||||||
|
),
|
||||||
|
]
|
||||||
+44
-69
@@ -1,6 +1,9 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models import Count
|
||||||
from django.db.models.signals import post_save, pre_save, pre_delete
|
from django.db.models.signals import post_save, pre_save, pre_delete
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
from validators import validate_hostname, validate_macaddr
|
from validators import validate_hostname, validate_macaddr
|
||||||
|
|
||||||
@@ -418,7 +421,7 @@ class DhcpCustomField(models.Model):
|
|||||||
value = models.CharField(max_length=255)
|
value = models.CharField(max_length=255)
|
||||||
ip4subnet = models.ForeignKey(Ip4Subnet)
|
ip4subnet = models.ForeignKey(Ip4Subnet)
|
||||||
|
|
||||||
class meta:
|
class Meta:
|
||||||
verbose_name = 'DHCP custom field'
|
verbose_name = 'DHCP custom field'
|
||||||
|
|
||||||
|
|
||||||
@@ -429,16 +432,18 @@ class Ip4Address(models.Model):
|
|||||||
ping_avg_rtt = models.FloatField(null=True, blank=True)
|
ping_avg_rtt = models.FloatField(null=True, blank=True)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
# FIXME needs optimizing, runs a SQL query for each run
|
# FIXME: generates 2 SQL queries
|
||||||
if self.interface_set.count() == 0:
|
_if = self.interface_set.all()
|
||||||
|
if not _if:
|
||||||
return self.address
|
return self.address
|
||||||
else:
|
|
||||||
return "%s (%s)" % (
|
return "{} ({})".format(
|
||||||
self.address,
|
self.address,
|
||||||
self.interface_set.get().host.hostname)
|
_if.get().host.hostname
|
||||||
|
)
|
||||||
|
|
||||||
def assigned_to_host(self):
|
def assigned_to_host(self):
|
||||||
self.interface_set.get().host
|
return self.interface_set.get().host
|
||||||
|
|
||||||
assigned_to_host.short_description = "Assigned to Host"
|
assigned_to_host.short_description = "Assigned to Host"
|
||||||
|
|
||||||
@@ -461,23 +466,24 @@ class HostType(models.Model):
|
|||||||
ordering = ("host_type",)
|
ordering = ("host_type",)
|
||||||
|
|
||||||
|
|
||||||
class OsArchitecture(models.Model):
|
|
||||||
architecture = models.CharField(max_length=64)
|
|
||||||
|
|
||||||
def __unicode__(self):
|
|
||||||
return self.architecture
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = 'OS architecture'
|
|
||||||
|
|
||||||
|
|
||||||
class OperatingSystem(models.Model):
|
class OperatingSystem(models.Model):
|
||||||
|
OS_ARCHITECTURES = (
|
||||||
|
('mips', _('MIPS')),
|
||||||
|
('arm', _('ARM')),
|
||||||
|
('broadcom', _('Broadcom')),
|
||||||
|
('rc32300', _('RC32300')),
|
||||||
|
('powerpc', _('PowerPC')),
|
||||||
|
('powerpc403ga', _('PowerPC403GA')),
|
||||||
|
('unknown', _('Unknown')),
|
||||||
|
('x86_64', _('x86-64')),
|
||||||
|
('i386', _('x86')),
|
||||||
|
)
|
||||||
name = models.CharField(max_length=256)
|
name = models.CharField(max_length=256)
|
||||||
version = models.CharField(max_length=64)
|
version = models.CharField(max_length=64)
|
||||||
architecture = models.ForeignKey(OsArchitecture)
|
arch = models.CharField(max_length=255, choices=OS_ARCHITECTURES, blank=True, null=True)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.name + " " + self.version + " (" + unicode(self.architecture) + ")"
|
return self.name + " " + self.version + " (" + self.arch + ")"
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ("name", "version")
|
ordering = ("name", "version")
|
||||||
@@ -498,61 +504,32 @@ class Host(models.Model):
|
|||||||
|
|
||||||
request_kerberos_principal = models.BooleanField(default=False)
|
request_kerberos_principal = models.BooleanField(default=False)
|
||||||
kerberos_principal_created = models.BooleanField(default=False, editable=False)
|
kerberos_principal_created = models.BooleanField(default=False, editable=False)
|
||||||
kerberos_principal_name = models.CharField(max_length = 256, editable=False)
|
kerberos_principal_name = models.CharField(max_length=256, editable=False)
|
||||||
kerberos_principal_created_date = models.DateTimeField(null=True, blank=True, editable=False)
|
kerberos_principal_created_date = models.DateTimeField(null=True, blank=True, editable=False)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.hostname
|
return self.hostname
|
||||||
|
|
||||||
def in_domain(self):
|
def in_domain(self):
|
||||||
domains = []
|
domains = self.interface_set.values_list('domain__domain_name', flat=True)
|
||||||
for interface in self.interface_set.all():
|
return u",".join(domains)
|
||||||
if interface.domain:
|
|
||||||
domains.append(unicode(interface.domain))
|
|
||||||
return ",".join(domains)
|
|
||||||
|
|
||||||
in_domain.short_description = "in domains"
|
in_domain.short_description = "in domains"
|
||||||
|
|
||||||
def ipv6_enabled(self):
|
def ipv6_enabled(self):
|
||||||
for interface in self.interface_set.all():
|
ipv6_ifs = self.interface_set.annotate(num_ipv6=Count('ip6address')).filter(num_ipv6__gt=0)
|
||||||
if interface.ipv6_enabled():
|
return ipv6_ifs.exists()
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
# ipv6_enabled.boolean = True
|
ipv6_enabled.boolean = True
|
||||||
|
|
||||||
def mac_addresses(self):
|
def mac_addresses(self):
|
||||||
addresses = []
|
addresses = self.interface_set.filter(macaddr__isnull=False).values_list('macaddr', flat=True)
|
||||||
for interface in self.interface_set.all():
|
|
||||||
if interface.macaddr is None:
|
|
||||||
continue
|
|
||||||
addresses.append(interface.macaddr)
|
|
||||||
return ",".join(addresses)
|
return ",".join(addresses)
|
||||||
|
|
||||||
def ip_addresses(self):
|
def ip_addresses(self):
|
||||||
addresses = []
|
addresses = self.interface_set.filter(ip4address__isnull=False).values_list('ip4address__address', flat=True)
|
||||||
for interface in self.interface_set.all():
|
|
||||||
if interface.ip4address is None:
|
|
||||||
continue
|
|
||||||
addresses.append(interface.ip4address.address)
|
|
||||||
return ",".join(addresses)
|
return ",".join(addresses)
|
||||||
|
|
||||||
def get_ip_addresses(self):
|
|
||||||
addresses = []
|
|
||||||
for interface in self.interface_set.all():
|
|
||||||
if interface.ip4address is None:
|
|
||||||
continue
|
|
||||||
addresses.append(interface.ip4address.address)
|
|
||||||
return addresses
|
|
||||||
|
|
||||||
def get_ip_addresses_for_domain(self, domain):
|
|
||||||
addresses = []
|
|
||||||
for interface in self.interface_set.all():
|
|
||||||
if interface.ip4address is None:
|
|
||||||
continue
|
|
||||||
addresses.append(interface.ip4address.address)
|
|
||||||
return addresses
|
|
||||||
|
|
||||||
|
|
||||||
class Interface(models.Model):
|
class Interface(models.Model):
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
@@ -649,13 +626,13 @@ def set_domain_name_for_subnet(sender, instance, **kwargs):
|
|||||||
instance.domain_name = "%s.in-addr.arpa" % rev
|
instance.domain_name = "%s.in-addr.arpa" % rev
|
||||||
|
|
||||||
# update it's own serial
|
# update it's own serial
|
||||||
#if instance.domain_serial is not None:
|
# if instance.domain_serial is not None:
|
||||||
# instance.domain_serial = format_domain_serial_and_add_one(instance.domain_serial)
|
# instance.domain_serial = format_domain_serial_and_add_one(instance.domain_serial)
|
||||||
|
|
||||||
# lets update the serial of the dhcp config
|
# lets update the serial of the dhcp config
|
||||||
# when the subnet is changed
|
# when the subnet is changed
|
||||||
if instance.dhcp_config:
|
if instance.dhcp_config:
|
||||||
# instance.dhcp_config.serial = instance.dhcp_config.serial + 1
|
# instance.dhcp_config.serial = instance.dhcp_config.serial + 1
|
||||||
instance.dhcp_config.serial = format_domain_serial_and_add_one(instance.dhcp_config.serial)
|
instance.dhcp_config.serial = format_domain_serial_and_add_one(instance.dhcp_config.serial)
|
||||||
instance.dhcp_config.save()
|
instance.dhcp_config.save()
|
||||||
|
|
||||||
@@ -687,13 +664,11 @@ def update_domain_serial_when_change_to_host(sender, instance, created, **kwargs
|
|||||||
for interface in instance.interface_set.all():
|
for interface in instance.interface_set.all():
|
||||||
if interface.domain is not None:
|
if interface.domain is not None:
|
||||||
domain = interface.domain
|
domain = interface.domain
|
||||||
domain.domain_serial = \
|
domain.domain_serial = format_domain_serial_and_add_one(domain.domain_serial)
|
||||||
format_domain_serial_and_add_one(domain.domain_serial)
|
|
||||||
domain.save()
|
domain.save()
|
||||||
if interface.ip4address is not None:
|
if interface.ip4address is not None:
|
||||||
subnet = interface.ip4address.subnet
|
subnet = interface.ip4address.subnet
|
||||||
subnet.domain_serial = \
|
subnet.domain_serial = format_domain_serial_and_add_one(subnet.domain_serial)
|
||||||
format_domain_serial_and_add_one(subnet.domain_serial)
|
|
||||||
subnet.save()
|
subnet.save()
|
||||||
|
|
||||||
|
|
||||||
@@ -701,14 +676,14 @@ def update_domain_serial_when_change_to_host(sender, instance, created, **kwargs
|
|||||||
def update_domain_serial_when_interface_deleted(sender, instance, **kwargs):
|
def update_domain_serial_when_interface_deleted(sender, instance, **kwargs):
|
||||||
if instance.domain is not None:
|
if instance.domain is not None:
|
||||||
domain = instance.domain
|
domain = instance.domain
|
||||||
domain.domain_serial = domain.domain_serial + 1
|
domain.domain_serial += 1
|
||||||
domain.save()
|
domain.save()
|
||||||
|
|
||||||
if instance.ip4address is not None:
|
if instance.ip4address is not None:
|
||||||
subnet = instance.ip4address.subnet
|
subnet = instance.ip4address.subnet
|
||||||
subnet.domain_serial = subnet.domain_serial + 1
|
subnet.domain_serial += 1
|
||||||
subnet.save()
|
subnet.save()
|
||||||
|
|
||||||
#@receiver(pre_save, sender=Domain)
|
# @receiver(pre_save, sender=Domain)
|
||||||
#def update_domain_serial_when_domain_is_saved(sender, instance, **kwargs):
|
# def update_domain_serial_when_domain_is_saved(sender, instance, **kwargs):
|
||||||
# instance.domain_serial = format_domain_serial_and_add_one(instance.domain_serial)
|
# instance.domain_serial = format_domain_serial_and_add_one(instance.domain_serial)
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
Django==1.7
|
Django>=1.7,<1.8
|
||||||
MySQL-python==1.2.5
|
MySQL-python==1.2.5
|
||||||
ipaddr==2.1.11
|
ipaddr==2.1.11
|
||||||
django-auth-ldap
|
django-auth-ldap
|
||||||
|
|||||||
Reference in new issue
Block a user