- Timestamp:
- Oct 1, 2008, 10:49:53 PM (17 years ago)
- Location:
- trunk/exodus
- Files:
-
- 1 added
- 5 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/exodus/models.py ¶
r6321 r6322 1 1 # (c) Roland van Laar 2006 2 # 2 # vi:et:ts=4 3 3 from django.db import models 4 4 from django.contrib import admin … … 30 30 ) 31 31 32 class Antenna(models.Model): 32 class 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 41 class Antenna(ExtendedModel): 33 42 type = models.CharField(max_length=20, unique=True) 34 43 gain = models.IntegerField(max_length=3) … … 37 46 return self.type 38 47 39 class Location( models.Model):48 class Location(ExtendedModel): 40 49 description = models.CharField(max_length=200, unique=True) 41 50 Longitude = models.DecimalField(max_digits=8,decimal_places=6) … … 47 56 48 57 #XXX: Name Domain perhaps? 49 class DnsServer( models.Model):58 class DnsServer(ExtendedModel): 50 59 ipaddress = models.IPAddressField() 51 60 domainname = models.CharField(max_length=50, unique=True) … … 54 63 return self.ipaddress 55 64 56 class Network( models.Model):65 class Network(ExtendedModel): 57 66 name = models.CharField(max_length=50, unique=True) 58 67 ipspacestart = models.IPAddressField() … … 63 72 64 73 65 class Node( models.Model):74 class Node(ExtendedModel): 66 75 name = models.CharField(max_length=30, unique=True) 67 76 location = models.ForeignKey(Location) … … 76 85 return self.name 77 86 78 class Interface( models.Model):87 class Interface(ExtendedModel): 79 88 node = models.ForeignKey(Node) 80 89 type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES, default=1) … … 95 104 96 105 def __str__(self): 97 return "%s :%s" % (self.node.name, self.iface)106 return "%s/%s" % (self.node, self.iface) 98 107 99 class InterfaceAlias( models.Model):108 class InterfaceAlias(ExtendedModel): 100 109 iface = models.ForeignKey(Interface,related_name='child') 101 110 ip = models.IPAddressField(unique=True) … … 113 122 # going to be activated as DHCP range, or only number of fixed clients needs to 114 123 # 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 125 class PublicAP(ExtendedModel): 126 iface = models.ForeignKey(Interface,related_name='ap', verbose_name="interface") 117 127 ip = models.IPAddressField(unique=True) 118 128 netmask = models.IntegerField(default=28) … … 125 135 return "%s:%s" % (self.iface,self.pk) 126 136 127 class DhcpStatic( models.Model):137 class DhcpStatic(ExtendedModel): 128 138 hostname = models.CharField(max_length=10,unique=True) 129 139 macaddress = models.CharField(max_length=17) -
TabularUnified trunk/exodus/templates/addomni.html ¶
r6317 r6322 6 6 <form method="post" action="."> 7 7 <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"> 9 10 </form> 10 11 -
TabularUnified trunk/exodus/templates/genericForm.html ¶
r6316 r6322 3 3 {% block content %} 4 4 5 <h1>Create a Node</h1> 5 <h1>{{ title }} - {{ mode }}</h1> 6 {% ifnotequal mode "delete" %} 6 7 <h2><em> {{ message }} </em></h2> 8 {% endifnotequal %} 7 9 8 10 <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 %} 9 17 <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"> 11 21 </form> 12 22 -
TabularUnified trunk/exodus/templates/node-detail.html ¶
r6320 r6322 23 23 <div style="border:1px solid #000000;"> 24 24 <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 /> 26 26 type: {{ nic.type }} <br> 27 27 description: {{ nic.shortdesc }} <br> … … 57 57 <p /> 58 58 <li>Public Access Point: {{ accessPoint.ip}}/{{accessPoint.netmask }} 59 <a href="{% url exodus.views. editPublicAPnode.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> 61 61 {% for dhcp in accessPoint.dhcpstatic.all %} 62 62 <ul> -
TabularUnified trunk/exodus/urls.py ¶
r6320 r6322 43 43 (r'^add/node/$', 'exodus.views.addNode'), 44 44 (r'^add/nic/$', 'exodus.views.addInterface'), 45 (r'^add/dhcp/$', 'exodus.views.addPublicAP'),46 45 47 46 # add urls … … 50 49 (r'^edit/nic/(?P<objectId>.+)/$', 'exodus.views.editInterface'), 51 50 (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'), 53 52 54 53 # 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'), 58 56 ) 59 57 -
TabularUnified trunk/exodus/views.py ¶
r6320 r6322 204 204 return render_to_response('addinterlink.html',{'form': form}) 205 205 206 class AddPublicAPForm(forms.ModelForm):206 class PublicAPForm(forms.ModelForm): 207 207 class Meta: 208 208 model = PublicAP 209 209 exclude = ('shortdesc', 'desc', 'ip', 'dhcpstart', 'dhcpstop') 210 210 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 211 def 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() 247 241 return HttpResponseRedirect(reverse('node-detail', args=[node])) 248 242 else: … … 250 244 else: 251 245 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 }) 265 251 266 252 def nodename2id(node):
Note:
See TracChangeset
for help on using the changeset viewer.