diff --git a/mdb/admin.py b/mdb/admin.py index 3c7694c..3fc9f44 100644 --- a/mdb/admin.py +++ b/mdb/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin, messages - +from mdb.forms import InterfaceForm from mdb.models import Ip6Address, Interface, Ip4Address, DhcpOption, DhcpCustomField, DomainSrvRecord, DomainTxtRecord, \ DomainCnameRecord, DomainARecord, Domain, Host, Ip4Subnet, Ip6Subnet, Nameserver, MailExchange, OperatingSystem, \ HostType, DhcpConfig, DomainAAAARecord @@ -14,6 +14,7 @@ class InterfaceInline(admin.TabularInline): inlines = [Ip6AddressInline] model = Interface extra = 0 + form = InterfaceForm def get_queryset(self, request): return super(InterfaceInline, self).get_queryset(request).select_related() diff --git a/mdb/forms.py b/mdb/forms.py new file mode 100644 index 0000000..2a0d4d0 --- /dev/null +++ b/mdb/forms.py @@ -0,0 +1,24 @@ +from django import forms +from django.forms import ModelChoiceField + +from mdb.models import Interface, Ip4Address + + +class Ip4ModelChoiceField(ModelChoiceField): + def label_from_instance(self, obj): + if not hasattr(obj, 'interface'): + return obj.address + + return "{} ({})".format(obj.address, obj.interface.host.hostname) + + +class InterfaceForm(forms.ModelForm): + model = Interface + + def __init__(self, *args, **kwargs): + super(InterfaceForm, self).__init__(*args, **kwargs) + + # Join Ip4Address with tables interface and host, + # before printing the select labels that walk those two relations. + queryset = Ip4Address.objects.select_related('interface', 'interface__host') + self.fields['ip4address'] = Ip4ModelChoiceField(queryset=queryset) diff --git a/mdb/models.py b/mdb/models.py index eb3f3f1..5e55122 100644 --- a/mdb/models.py +++ b/mdb/models.py @@ -472,11 +472,7 @@ class Ip4Address(models.Model): ping_avg_rtt = models.FloatField(null=True, blank=True) def __str__(self): - # FIXME: generates 2 SQL queries? - if not hasattr(self, 'interface'): - return self.address - - return "{} ({})".format(self.address, self.interface.host.hostname) + return self.address def assigned_to_host(self): return self.interface.host diff --git a/mdbsite/settings.py b/mdbsite/settings.py index 1e0549c..bf04d3a 100644 --- a/mdbsite/settings.py +++ b/mdbsite/settings.py @@ -76,6 +76,7 @@ INSTALLED_APPS = ( 'django.contrib.admin', 'rest_framework', 'rest_framework.authtoken', + 'django_extensions', 'mdb', ) diff --git a/mdbsite/wsgi.py b/mdbsite/wsgi.py index cbb5e87..ac62e0d 100644 --- a/mdbsite/wsgi.py +++ b/mdbsite/wsgi.py @@ -1,5 +1,6 @@ -import os -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mdb.settings") - from django.core.wsgi import get_wsgi_application +import os + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mdbsite.settings") + application = get_wsgi_application()