Revision 6d153302

b/flowspec/forms.py
3 3
from django.utils.translation import ugettext as _
4 4
from django.utils.translation import ugettext_lazy
5 5
from django.template.defaultfilters import filesizeformat
6
from flowspy.flowspec.models import * 
6
from flowspy.flowspec.models import *
7 7
from ipaddr import *
8
from django.core.urlresolvers import reverse
8 9
from django.contrib.auth.models import User
10
from django.db.models import Avg, Max, Min, Count
11

  
9 12

  
10 13
class RouteForm(forms.ModelForm):
11 14
#    name = forms.CharField(help_text=ugettext_lazy("A unique route name,"
......
39 42
                raise forms.ValidationError('Invalid network address format')
40 43

  
41 44
    def clean(self):
45
        name = self.cleaned_data.get('name', None)
42 46
        source = self.cleaned_data.get('source', None)
43 47
        sourceports = self.cleaned_data.get('sourceport', None)
44 48
        ports = self.cleaned_data.get('port', None)
49
        then = self.cleaned_data.get('then', None)
45 50
        destination = self.cleaned_data.get('destination', None)
46 51
        destinationports = self.cleaned_data.get('destinationport', None)
47 52
        user = self.cleaned_data.get('applier', None)
48
        networks = user.get_profile().peer.networks.all()
53
        peer = user.get_profile().peer
54
        networks = peer.networks.all()
49 55
        mynetwork = False
56
        route_pk_list = []
57
        
50 58
        if destination:
51 59
            for network in networks:
52 60
                net = IPNetwork(network.network)
......
64 72
            raise forms.ValidationError('Once destination port is matched, destination has to be filled as well. Either deselect destination port or fill destination address')
65 73
        if not (source or sourceports or ports or destination or destinationports):
66 74
            raise forms.ValidationError('Fill at least a Route Match Condition')
75
        existing_routes = Route.objects.exclude(status='EXPIRED').exclude(status='PENDING').exclude(status='ERROR').exclude(status='ADMININACTIVE')
76
        existing_routes = existing_routes.filter(applier__userprofile__peer=peer)
77
        if source:
78
            source = IPNetwork(source).compressed
79
            existing_routes = existing_routes.filter(source=source)
80
        else:
81
            existing_routes = existing_routes.filter(source=None)
82
        if sourceports:
83
            route_pk_list=get_matchingport_route_pks(sourceports, existing_routes)
84
            if route_pk_list:
85
                existing_routes = existing_routes.filter(pk__in=route_pk_list)
86
        else:
87
            existing_routes = existing_routes.filter(sourceport=None)
88
        if destinationports:
89
            route_pk_list=get_matchingport_route_pks(destinationports, existing_routes)
90
            if route_pk_list:
91
                existing_routes = existing_routes.filter(pk__in=route_pk_list)
92
        else:
93
            existing_routes = existing_routes.filter(destinationport=None)
94
        if ports:
95
            route_pk_list=get_matchingport_route_pks(ports, existing_routes)
96
            if route_pk_list:
97
                existing_routes = existing_routes.filter(pk__in=route_pk_list)              
98
        else:
99
            existing_routes = existing_routes.filter(port=None)
100
        
101
        for route in existing_routes:
102
            if name != route.name:
103
                existing_url = reverse('edit-route', args=[route.name])
104
                if IPNetwork(destination) in IPNetwork(route.destination):
105
                    raise forms.ValidationError('There is an exact %s rule, %s whose destination (%s) is supernet of (or the same as) network (%s).<br>To avoid overlapping try editing rule <a href=\'%s\'>%s</a>' %(route.status, route.name, route.destination, destination, existing_url, route.name))
106
                if IPNetwork(route.destination) in IPNetwork(destination):
107
                    raise forms.ValidationError('There is an exact %s rule, %s whose destination network (%s) belongs to the destination network %s.<br>To avoid overlapping try editing rule <a href=\'%s\'>%s</a>' %(route.status, route.name, route.destination, destination, existing_url, route.name))
108
        
109

  
67 110
        return self.cleaned_data
68 111

  
69 112
class ThenPlainForm(forms.ModelForm):
......
106 149
                raise forms.ValidationError('Port should be an integer')
107 150
        else:
108 151
            raise forms.ValidationError('Cannot be empty')
152

  
153
def value_list_to_list(valuelist):
154
    vl = []
155
    for val in valuelist:
156
        vl.append(val[0])
157
    return vl
158

  
159
def get_matchingport_route_pks(portlist, routes):
160
    route_pk_list = []
161
    ports_value_list = value_list_to_list(portlist.values_list('port').order_by('port'))
162
    for route in routes:
163
        rsp = value_list_to_list(route.destinationport.all().values_list('port').order_by('port'))
164
        if rsp and rsp == ports_value_list:
165
            route_pk_list.append(route.pk)
166
    return route_pk_list
b/templates/apply.html
150 150
{% endif %}
151 151
<form method="POST">
152 152
{% csrf_token %}
153
{% load unescape %}
153 154
{% if form.non_field_errors %}
154
<p class="error">{{ form.non_field_errors|join:", "}}</p>
155
<p class="error">{{ form.non_field_errors|unescape}}</p>
155 156
{% endif %}
156 157

  
157 158
<fieldset {% if edit %} style="display:none;" {% endif %}>

Also available in: Unified diff