Changeset 6403


Ignore:
Timestamp:
Dec 4, 2008, 1:09:24 AM (16 years ago)
Author:
roland
Message:

First try of the new admin thing. Need to add a master ip in a transparent way.

Location:
branches/exodus-roland/exodus
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/exodus-roland/exodus/admin.py

    r6398 r6403  
    33from django import forms
    44from exodus.models import *
     5from exodus.forms import NodeForm
    56
    6 from exodus.wllogic import free_masterip, newSSIDName, addInterlinkIP, \
    7      freeInterlinkIP, freePublicAPIP
    8 
    9 from exodus.contrib import ReadOnlyAdminFields
    10 
    11 class InterfaceCommon(ReadOnlyAdminFields):
    12     readonly = ('ip', )
    13     def save_model(self, request, obj, form, change):
    14         if obj.link and (obj.type != obj.link.type):
    15             raise ValueError,'Type of local and remote interface needs to match'
    16         if str(obj.type) != "eth":
    17             obj.ssid = newSSIDName(obj.node, obj.iface, 'unused')
    18             obj.channel = '1'
    19             obj.mode = 1 # set to master
    20 
    21         # Only change IP if changes in interface link/mask or new of course :-)
    22         #if change or self.is_changed.has_key('link') or \
    23         #        self.is_changed.has_key('netmask'):
    24         if not obj.link:
    25             obj.ip = freeInterlinkIP(obj)
    26         else:
    27             obj.ip = addInterlinkIP(obj.link)
    28 
    29         # XXX: Change in netmask requires full range of netmask changes \
    30         # on slaves
    31         obj.save()
    32         #Dirty to hack to get reference to self working
    33         if not obj.link:
    34             obj.link = obj
    35             obj.save()
     7class InterfaceInline(admin.TabularInline):
     8    model = Interface
     9    extra = 1
     10    fieldsets = (
     11        (None, {
     12            'classes': ('collapse',),
     13            'fields': ('type', 'iface', 'polar', 'antenna', 'link')
     14        }),
     15    )
    3616
    3717
    38 class PublicAPInline(ReadOnlyAdminFields,admin.TabularInline):
    39     model = PublicAP
    40     extra = 1
     18class NodeAdmin(admin.ModelAdmin):
     19    form = NodeForm
     20    list_display = ('name', 'location','network')
     21    search_fields = ['name']
     22    list_filter = ('network',)
     23    fieldsets = (
     24        (None, {
     25            'fields' : (('name', 'status') , 'location', 'network', 'masterip')
     26        }),
     27    )
    4128
    42 class InterfaceAdmin(InterfaceCommon, admin.ModelAdmin):
    43     inlines = (PublicAPInline,)
    44     pass
    45 
    46 class InterfaceInline(InterfaceCommon, admin.TabularInline):
    47     model = Interface
    48     extra = 1
    49 
    50 class DhcpStaticInline(admin.TabularInline):
    51     model = DhcpStatic
    52     extra = 1
    53 
    54 class PublicAPAdmin(ReadOnlyAdminFields,admin.ModelAdmin):
    55     inlines = (DhcpStaticInline,)
    56 
    57 class NodeAdmin(admin.ModelAdmin):
    58     exclude = ('masterip',)
    59 # Inline forms sucks bigtime, editing deleting, making readonly broken or non existing
    60 # XXX: Every save creates a new interface :-(
    61     inlines = (InterfaceInline,)
    62 
    63     def save_model(self, request, obj, form, change):
    64         #XXX: Testing hidden field commits
    65         obj.masterip = free_masterip(obj.network)
    66         obj.save()
     29class LocationAdmin(admin.ModelAdmin):
     30    search_fields = ['description']
    6731
    6832admin.site.register(Antenna)
    69 admin.site.register(Location)
     33admin.site.register(Location, LocationAdmin)
    7034admin.site.register(DnsServer)
    7135admin.site.register(Network)
    72 admin.site.register(Node,NodeAdmin)
    73 admin.site.register(Interface,InterfaceAdmin)
    74 admin.site.register(PublicAP, PublicAPAdmin)
     36admin.site.register(Node, NodeAdmin)
     37admin.site.register(Interface)
     38admin.site.register(PublicAP)
    7539admin.site.register(DhcpStatic)
    7640
  • branches/exodus-roland/exodus/models.py

    r6398 r6403  
    33from django.db import models
    44from django.contrib import admin
     5from django import forms
    56
    67# Create your models here.
     
    3031                        )
    3132
    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):
     33class Antenna(models.Model):
    4434    type = models.CharField(max_length=20, unique=True)
    4535    gain = models.IntegerField(max_length=3)
     
    5141        return self.type
    5242
    53 class Location(ExtendedModel):
     43class Location(models.Model):
    5444    description = models.CharField(max_length=200, unique=True)
    5545    longitude = models.DecimalField(max_digits=8,decimal_places=6)
     
    6454
    6555#XXX: Name Domain perhaps?
    66 class DnsServer(ExtendedModel):
     56class DnsServer(models.Model):
    6757    ipaddress = models.IPAddressField()
    6858    domainname = models.CharField(max_length=50, unique=True)
     
    7565
    7666
    77 class Network(ExtendedModel):
     67class Network(models.Model):
    7868        name = models.CharField(max_length=50, unique=True)
    7969        ipspacestart = models.IPAddressField()
     
    8676                return self.name
    8777
    88 
    89 
    90 
    91 class Node(ExtendedModel):
     78class Node(models.Model):
    9279    name = models.CharField(max_length=30, unique=True)
    9380    location = models.ForeignKey(Location)
     
    10390        return self.name
    10491
    105 class Interface(ExtendedModel):
     92
     93class Interface(models.Model):
    10694        node = models.ForeignKey(Node)
    10795        type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES, \
     
    127115                return "%s/%s" % (self.node, self.iface)
    128116
    129 class InterfaceAlias(ExtendedModel):
     117class InterfaceAlias(models.Model):
    130118        iface = models.ForeignKey(Interface,related_name='child')
    131119        ip = models.IPAddressField(unique=True)
     
    144132# be defined, all other could be calculated on the fly if needed
    145133
    146 class PublicAP(ExtendedModel):
     134class PublicAP(models.Model):
    147135    iface = models.ForeignKey(Interface,related_name='ap', verbose_name="interface")
    148136    ip = models.IPAddressField(unique=True)
     
    159147        return "%s:%s" % (self.iface,self.pk)
    160148
    161 class DhcpStatic(ExtendedModel):
     149class DhcpStatic(models.Model):
    162150    hostname = models.CharField(max_length=10,unique=True)
    163151    macaddress = models.CharField(max_length=17)
Note: See TracChangeset for help on using the changeset viewer.