Changeset 6322


Ignore:
Timestamp:
Oct 1, 2008, 10:49:53 PM (17 years ago)
Author:
RIck van der Zwet
Message:

Rewrote code to match the DRY principel, which should be a framework for all
the additions as well. Might even need to think of creating a Class for it to
make it even more generic. But first have a look wether this is gonna work well

Location:
trunk/exodus
Files:
1 added
5 edited
1 copied

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/exodus/models.py

    r6321 r6322  
    11# (c) Roland van Laar 2006
    2 #
     2# vi:et:ts=4
    33from django.db import models
    44from django.contrib import admin
     
    3030                        )
    3131
    32 class Antenna(models.Model):
     32class ExtendedModel(models.Model):
     33    class Meta:
     34        abstract = True
     35
     36    def as_list(self):
     37        meta = self._meta
     38        values = [(f.verbose_name, getattr(self, f.attname)) for f in meta.local_fields if f.verbose_name not in ( 'ID')]
     39        return values
     40
     41class Antenna(ExtendedModel):
    3342    type = models.CharField(max_length=20, unique=True)
    3443    gain = models.IntegerField(max_length=3)
     
    3746        return self.type
    3847
    39 class Location(models.Model):
     48class Location(ExtendedModel):
    4049    description = models.CharField(max_length=200, unique=True)
    4150    Longitude = models.DecimalField(max_digits=8,decimal_places=6)
     
    4756
    4857#XXX: Name Domain perhaps?
    49 class DnsServer(models.Model):
     58class DnsServer(ExtendedModel):
    5059        ipaddress = models.IPAddressField()
    5160        domainname = models.CharField(max_length=50, unique=True)
     
    5463                return self.ipaddress
    5564
    56 class Network(models.Model):
     65class Network(ExtendedModel):
    5766        name = models.CharField(max_length=50, unique=True)
    5867        ipspacestart = models.IPAddressField()
     
    6372
    6473
    65 class Node(models.Model):
     74class Node(ExtendedModel):
    6675    name = models.CharField(max_length=30, unique=True)
    6776    location = models.ForeignKey(Location)
     
    7685        return self.name
    7786
    78 class Interface(models.Model):
     87class Interface(ExtendedModel):
    7988        node = models.ForeignKey(Node)
    8089        type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES, default=1)
     
    95104       
    96105        def __str__(self):
    97                 return "%s:%s" % (self.node.name, self.iface)
     106                return "%s/%s" % (self.node, self.iface)
    98107
    99 class InterfaceAlias(models.Model):
     108class InterfaceAlias(ExtendedModel):
    100109        iface = models.ForeignKey(Interface,related_name='child')
    101110        ip = models.IPAddressField(unique=True)
     
    113122# going to be activated as DHCP range, or only number of fixed clients needs to
    114123# be defined, all other could be calculated on the fly if needed
    115 class PublicAP(models.Model):
    116     iface = models.ForeignKey(Interface,related_name='ap')
     124
     125class PublicAP(ExtendedModel):
     126    iface = models.ForeignKey(Interface,related_name='ap', verbose_name="interface")
    117127    ip = models.IPAddressField(unique=True)
    118128    netmask = models.IntegerField(default=28)
     
    125135        return "%s:%s" % (self.iface,self.pk)
    126136
    127 class DhcpStatic(models.Model):
     137class DhcpStatic(ExtendedModel):
    128138    hostname = models.CharField(max_length=10,unique=True)
    129139    macaddress = models.CharField(max_length=17)
  • TabularUnified trunk/exodus/templates/addomni.html

    r6317 r6322  
    66<form method="post" action=".">
    77<table>{{ form.as_table }}</table>
    8 <input type="submit" value="submit">
     8<input type="submit" name="cancel" value="NO, cancel">
     9<input type="submit" name="proceed" value="OK, proceed">
    910</form>
    1011
  • TabularUnified trunk/exodus/templates/genericForm.html

    r6316 r6322  
    33{% block content %}
    44
    5 <h1>Create a Node</h1>
     5<h1>{{ title }} - {{ mode }}</h1>
     6{% ifnotequal mode "delete" %}
    67<h2><em> {{ message }} </em></h2>
     8{% endifnotequal %}
    79
    810<form method="post" action=".">
     11{# On delete, make sure not to enable editing #}
     12{% ifequal mode "delete" %}
     13{% include delInclude %}
     14
     15<h3>Are you sure you want to <b>DELETE</b> this data <b>PERMANENTLY</b>?</h3>
     16{% else %}
    917<table>{{ form.as_table }}</table>
    10 <input type="submit" value="submit">
     18{% endifequal %}
     19<input type="submit" name="cancel" value="NO, cancel">
     20<input type="submit" name="proceed" value="OK, proceed">
    1121</form>
    1222
  • TabularUnified trunk/exodus/templates/node-detail.html

    r6320 r6322  
    2323        <div style="border:1px solid #000000;">
    2424        <h3>iface: {{ nic.iface }} </h3>
    25         <a href="{% url exodus.views.addPublicAP %}?iface={{ nic }}">Add new public access point</a><p />
     25        <a href="{% url exodus.views.genericPublicAP "add" node nic.iface "new" %}">Add new public access point</a><p />
    2626        type: {{ nic.type }} <br>
    2727        description: {{ nic.shortdesc }} <br>
     
    5757                <p />
    5858                <li>Public Access Point: {{ accessPoint.ip}}/{{accessPoint.netmask }}
    59                 <a href="{% url exodus.views.editPublicAP node.name nic.iface accessPoint.pk %}">EDIT</a>
    60                 <a href="{% url exodus.views.delPublicAP accessPoint %}">DELETE</a>
     59                <a href="{% url exodus.views.genericPublicAP "edit" node.name nic.iface accessPoint.pk %}">EDIT</a>
     60                <a href="{% url exodus.views.genericPublicAP "delete" node.name nic.iface accessPoint.pk %}">DELETE</a>
    6161                {% for dhcp in accessPoint.dhcpstatic.all %}
    6262                        <ul>
  • TabularUnified trunk/exodus/urls.py

    r6320 r6322  
    4343        (r'^add/node/$', 'exodus.views.addNode'),
    4444        (r'^add/nic/$', 'exodus.views.addInterface'),
    45         (r'^add/dhcp/$', 'exodus.views.addPublicAP'),
    4645
    4746        # add urls
     
    5049        (r'^edit/nic/(?P<objectId>.+)/$', 'exodus.views.editInterface'),
    5150        (r'^edit/link/(?P<object_id>.+)/$', 'exodus.views.addLink'),
    52         (r'^edit/dhcp/(?P<node>.+)/(?P<interface>.+)/(?P<publicAP>.+)/$', 'exodus.views.editPublicAP'),
     51        (r'^(?P<mode>(add|edit|delete))/dhcp/(?P<node>.+)/(?P<interface>.+)/(?P<publicAP>.+)/$', 'exodus.views.genericPublicAP'),
    5352
    5453        # delete/remove urls
    55         (r'^delete/node/(?P<objectId>.+)/$', 'exodus.views.delNode'),
    56         (r'^delete/nic/(?P<objectId>.+)/$', 'exodus.views.delInterface'),
    57         (r'^delete/dhcp/(?P<objectId>.+)/$', 'exodus.views.delPublicAP'),
     54        (r'^del/node/(?P<objectId>.+)/$', 'exodus.views.delNode'),
     55        (r'^del/nic/(?P<objectId>.+)/$', 'exodus.views.delInterface'),
    5856)
    5957
  • TabularUnified trunk/exodus/views.py

    r6320 r6322  
    204204        return render_to_response('addinterlink.html',{'form': form})
    205205
    206 class AddPublicAPForm(forms.ModelForm):
     206class PublicAPForm(forms.ModelForm):
    207207        class Meta:
    208208                model = PublicAP
    209209                exclude = ('shortdesc', 'desc', 'ip', 'dhcpstart', 'dhcpstop')
    210210
    211 def addPublicAP(request):
    212         if request.POST:
    213                 form = AddPublicAPForm(request.POST)
    214                 if form.is_valid():
    215                         instance = form.save(commit=False)
    216                         # Find IP range inside interface range with disired size/subnet
    217                         instance.ip = freePublicAPIP(instance.iface, instance.netmask)
    218                         instance.dhcpstart = 1
    219                         instance.dhcpstop = 2
    220                         # If wireless generate ssid name
    221                         instance.ssid = newSSIDName(instance.iface.node, instance.iface, 'omni')
    222                         instance.save()
    223                         nodeName = instance.iface.node
    224                         return HttpResponseRedirect(reverse('node-detail', args=[nodeName]))
    225         else:
    226                 #XXX: Link, master interfaces only
    227                 if 'iface' in request.GET:
    228                         nodeName, interfaceName = request.GET['iface'].split(':')
    229                         newPublicAP = PublicAP()
    230                         newPublicAP.iface = Interface.objects.get(iface=interfaceName, node=nodename2id(nodeName))
    231                         form = AddPublicAPForm(instance=newPublicAP)
    232                 else:
    233                         form = AddPublicAPForm()
    234         return render_to_response('addomni.html', {'form': form })
    235 
    236 def editPublicAP(request, node, interface, publicAP):
    237         nodeID = Node.objects.get(name=node)
    238         iface = Interface.objects.get(node=nodeID, iface=interface)
    239         publicAP = PublicAP.objects.get(iface=iface, pk=publicAP)
    240         if request.POST:
    241                 form = AddPublicAPForm(request.POST, instance=publicAP)
    242                 if form.is_valid():
    243                         form.save()
    244                         #Properly redirect to view/<Node> needed
    245                         message = 'Node Updated succesfully'
    246                         node = publicAP.iface.node
     211def genericPublicAP(request, node, interface, publicAP, mode):
     212        # Find dependencies
     213        node = Node.objects.get(name=node)
     214        iface = Interface.objects.get(node=node, iface=interface)
     215        publicAP = PublicAP(iface=iface) if mode == 'add' else PublicAP.objects.get(iface=iface, pk=publicAP)
     216       
     217        title = 'Public access point'
     218        delInclude = 'deletePublicAP.html'
     219       
     220        if request.POST.has_key('cancel'):
     221                return HttpResponseRedirect(reverse('node-detail', args=[node]))
     222        elif request.POST.has_key('proceed'):
     223                if mode == 'delete':
     224                        publicAP.delete()
     225                        return HttpResponseRedirect(reverse('node-detail', args=[node]))
     226       
     227                # First checking whether form is valid, then add/edit actions
     228                form = PublicAPForm(request.POST, instance=publicAP)
     229                if form.is_valid():
     230                        if mode == 'add':
     231                                instance = form.save(commit=False)
     232                                # Find IP range inside interface range with disired size/subnet
     233                                instance.ip = freePublicAPIP(instance.iface, instance.netmask)
     234                                instance.dhcpstart = 1
     235                                instance.dhcpstop = 2
     236                                # If wireless generate ssid name
     237                                instance.ssid = newSSIDName(instance.iface.node, instance.iface, 'omni')
     238                                instance.save()
     239                        elif mode == 'edit':
     240                                form.save()
    247241                        return HttpResponseRedirect(reverse('node-detail', args=[node]))
    248242                else:
     
    250244        else:
    251245                message = 'Please edit and submit'
    252                 form = AddPublicAPForm(instance=publicAP)
    253         return render_to_response('addnode.html', {'form': form, 'message' : message })
    254 
    255 def delPublicAP(request, objectId):
    256         publicAP = PublicAP.objects.get(name=objectId)
    257         node = publicAP.iface.node
    258         if request.POST.has_key('cancel'):
    259                 return HttpResponseRedirect(reverse('node-detail', args=[node]))
    260         elif request.POST.has_key('proceed'):
    261                 publicAP.delete()
    262                 return HttpResponseRedirect(reverse('node-detail', args=[node]))
    263         else:
    264                 return render_to_response('delomni.html', {'object': publicAP })
     246                form = PublicAPForm(instance=publicAP)
     247       
     248        return render_to_response('genericForm.html', {'form': form,
     249                'message' : message, 'title' : title, 'mode' : mode,
     250                'delInclude' : delInclude, 'object': publicAP })
    265251
    266252def nodename2id(node):
Note: See TracChangeset for help on using the changeset viewer.