Changeset 6496


Ignore:
Timestamp:
Dec 29, 2008, 1:58:07 AM (16 years ago)
Author:
roland
Message:

Worked on field validation if forms. This is complete.
Except for channelplanning, on which Lodewijk is working.

(Almost) no unittests are written for forms.py
And some code cleaning needs to be done as some parts
are kinda hackish.

Location:
trunk/exodus
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/exodus/admin.py

    r6495 r6496  
    3232    fieldsets = (
    3333        (None, {
    34             'fields' : ('node', 'iface', 'type', ('ip', 'netmask'), 'link')}),
     34            'fields' : ('node', 'iface', 'type', ('ip', 'netmask'), 'link',
     35                        'accesspoint')}),
    3536        ('Wireless', {
    3637            'classes' : ('collapse', ),
    37             'fields' : ('ssid', 'channel', 'antenna', 'polar', 'mode')}),
     38            'fields' : ('ssid', 'channel', 'antenna', 'polar', 'direction',
     39                        'mode')}),
    3840        )
    3941    class Media:
    40         js = ("/static/showandhide.js",)
     42        js = ("/exodus/media/js/admin/CollapsedFieldsets.js",
     43                "/static/showandhide.js", )       
    4144       
    4245
  • trunk/exodus/forms.py

    r6495 r6496  
    22from exodus.models import Location, Node, Interface
    33from exodus.wllogic import free_master_ip, link_has_compat_type, \
    4         link_is_wireless, new_ssid
     4        link_is_wireless, new_ssid, new_ssid_for_existing_interface
    55from exodus.wllogic import MASTER, MANAGED, calc_subnet
    66from exodus.settings import AP_NETMASK
     
    2222        else:
    2323            # check if network has changed
    24             old_network = Node.objects.get(pk=self.instance.pk).network
    25             if old_network == self.cleaned_data.get('network'):
     24            if self.instance.network == new_network:
    2625                masterip = self.cleaned_data.get('masterip')
    2726            else:
     
    2928                #XXX: Need to set netmask for interfaces
    3029                masterip = free_master_ip(new_network)
     30                masterlinks = ( i for i in self.instance.interface_set.all()
     31                        if i.id == i.link_id )
     32                for i in masterlinks:
     33                    all_links = i.interface_set.all()
     34                    if i.accesspoint:
     35                        netmask = AP_NETMASK
     36                    else:
     37                        ip_size = len(all_links)
     38                        netmask = calc_subnet(ip_size)
     39
     40                    try:
     41                        new_ip = IPCalc(self.instance, netmask, i.id,
     42                                masterip = masterip)
     43                    except Exception:
     44                        raise forms.ValidationError(
     45                            "Not enough free ips for this node.")
     46
     47                    new_ip.ips.reverse()
     48                    i.ip = new_ip.ips.pop()
     49                    i.ssid = new_ssid(new_network, self.instance, i.iface,
     50                            i.accesspoint, i.direction)
     51                    for j in (j for j in all_links if not j.id == i.pk):
     52                        j.ip  = new_ip.ips.pop()
     53                        j.netmask = netmask
     54                        j.ssid = i.ssid
     55                        j.save()
     56                    i.save()
    3157        return masterip       
    3258
     
    128154                    new_slave.type = MANAGED
    129155                # update ssids
    130                 ssid = new_ssid(new_master)
     156                ssid = new_ssid_for_existing_interface(new_master)
    131157                new_master.ssid = ssid
    132158                new_slave.ssid = ssid
     
    258284    def clean_netmask(self):
    259285        """Cleaning happens in clean_ip."""
    260         return self.cleaned_data.get('netmask')
     286        netmask = self.cleaned_data.get('netmask')
     287        link = self.cleaned_data.get('link')
     288        edit = bool(self.instance.pk)
     289        accesspoint = self.cleaned_data.get('accesspoint')
     290
     291        if accesspoint:
     292            return AP_NETMASK
     293
     294        if not edit and not link:
     295            return 32
     296         
     297        if not edit and link:
     298            return link.netmask
     299
     300        if self.instance.pk != link.id:
     301            return link.netmask
     302           
     303        if self.instance.pk == link.id:
     304            all_links = link.interface_set.all()
     305            ip_size = len(all_links)
     306            # up ip_size with one if self is not in all_links
     307            if not [ x for x in all_links if x.id == self.instance.pk ]:
     308                ip_size += 1
     309            return calc_subnet(ip_size)
    261310
    262311    def clean_ssid(self):
    263312        self.type = self.cleaned_data.get('type')
    264313        edit = bool(self.instance.pk)
     314        node = self.cleaned_data.get('node')
     315        iface = self.cleaned_data.get('iface')
     316        accesspoint = self.cleaned_data.get('accesspoint')
     317        direction = self.cleaned_data.get('direction')
     318        link = self.cleaned_data.get('link')
     319        orig_ssid = self.cleaned_data.get('ssid')
     320       
    265321        if not link_is_wireless(self):
    266322            return None
    267         if not edit:
    268             return new_ssid
    269 
    270        
    271 
    272 
     323
     324        # iface is saved for the first time
     325        if not edit and not link:
     326            return new_ssid(node, iface, accesspoint, direction)
     327
     328        # iface is in managed mode
     329        if not edit and link:
     330            return link.ssid
     331        if self.instance.pk != link.id:
     332            return link.ssid
     333
     334        # iface has become master or
     335        # iface changed having accesspoint
     336        if self.instance.link_id != link.id or \
     337                self.instance.accesspoint != accesspoint:
     338            return new_ssid(node, iface, accesspoint, direction)
     339       
     340        # else, don't change ssid and return original
     341        return orig_ssid
     342
     343    def clean_mode(self):
     344        edit = bool(self.instance.pk)
     345        link = self.cleaned_data.get('link')
     346       
     347        if not edit and not link:
     348            return MASTER
     349
     350        if not edit and link:
     351            return MANAGED
     352
     353        if self.instance.pk == link.id:
     354            return MASTER
     355       
     356        return MANAGED
  • trunk/exodus/static/showandhide.js

    r6495 r6496  
    1 var RolandSpecial = {
     1var ShowAndHide = {
    22    init: function() {
    3         document.getElementById('id_type').onchange = new Function('RolandSpecial.change(); return false;');
     3        document.getElementById('id_type').onchange = new Function('ShowAndHide.change(); return false;');
     4        var newValue = document.getElementById('id_type').value;
     5        if (newValue != 'eth') {
     6            CollapsedFieldsets.show(1);
     7        }
    48    },
    59    change: function() {
     
    1317}
    1418
    15 addEvent(window, 'load', RolandSpecial.init);
     19addEvent(window, 'load', ShowAndHide.init);
  • trunk/exodus/wlipcalc.py

    r6477 r6496  
    99    """
    1010
    11     def __init__(self, node, free_netmask, link_id = None):
     11    def __init__(self, node, free_netmask, link_id = None, masterip = None):
    1212        if free_netmask <= MASTERIP_NETMASK or free_netmask > 32:
    1313            raise ValueError, 'Netmask out of bounds.'
    1414
    1515        self.node = node
    16         self.master_ip = node.masterip
     16        #XXX: unittest masterip
     17        if masterip == None:
     18            self.master_ip = node.masterip
     19        else:
     20            self.master_ip = masterip
    1721        master_netmask = MASTERIP_NETMASK
    1822        self.master_network = wl.get_network(self.master_ip, master_netmask)
     
    7175        """Calculate a new network address with a used_list and given netmask.
    7276        """
    73         #XXX: network_addr in for loop(generator expression)/list comprehension
    7477        for i in xrange(self.master_ip_size/self.new_ip_size):
    7578            network_addr = wl.parse_addr(self.master_network) + \
  • trunk/exodus/wllogic.py

    r6495 r6496  
    99MANAGED = WIFI_MODE_CHOICES[1][0]
    1010
    11 def new_ssid_for_save_iface(nic):
    12     return new_ssid(nic.node, nic.iface, nic.accesspoint, nic.direction)
     11def new_ssid_for_existing_interface(nic):
     12    return new_ssid(nic.network,nic.node, nic.iface, nic.accesspoint,
     13            nic.direction)
    1314
    14 def new_ssid(node, iface, accesspoint=False, direction=None):
     15def new_ssid(network, node, iface, accesspoint=False, direction=None):
    1516    """Generates a new ssid name for a new wifi NIC.
    1617   
     
    2021
    2122    nodename = node.name
    22     network = node.network.name
     23    networkname = network.name
    2324
    2425    if accesspoint:
    2526        ssid_list = set([i.ssid for i in \
    2627                node.interface_set.filter(accesspoint=True)])
    27         ssid = "ap%%s.%s.%s" % ( nodename, network)
     28        ssid = "ap%%s.%s.%s" % ( nodename, networkname)
    2829   
    2930        free_list = set()
     
    3940
    4041    else:
    41         ssid = "%%S.%s.%s" % (nodename, network)
     42        ssid = "%%s.%s.%s" % (nodename, networkname)
    4243        if direction:
    4344            return ssid % (direction)
Note: See TracChangeset for help on using the changeset viewer.