#500 filtering in device/ports on native vlan duplicates entries
This commit is contained in:
		| @@ -25,25 +25,6 @@ get '/ajax/content/device/ports' => require_login sub { | ||||
|     if ($f) { | ||||
|         if (($prefer eq 'vlan') or (not $prefer and $f =~ m/^\d+$/)) { | ||||
|             return unless $f =~ m/^\d+$/; | ||||
|  | ||||
|             if (param('invert')) { | ||||
|                 $set = $set->search({ | ||||
|                   'me.vlan' => { '!=' => $f }, | ||||
|                   'port_vlans.vlan' => [ | ||||
|                     '-or' => { '!=' => $f }, { '=' => undef } | ||||
|                   ], | ||||
|                 }, { join => 'port_vlans' }); | ||||
|             } | ||||
|             else { | ||||
|                 $set = $set->search({ | ||||
|                   -or => { | ||||
|                     'me.vlan' => $f, | ||||
|                     'port_vlans.vlan' => $f, | ||||
|                   }, | ||||
|                 }, { join => 'port_vlans' }); | ||||
|             } | ||||
|  | ||||
|             return unless $set->count; | ||||
|         } | ||||
|         else { | ||||
|             if (param('partial')) { | ||||
| @@ -120,7 +101,7 @@ get '/ajax/content/device/ports' => require_login sub { | ||||
|     # now begin to join tables depending on the selected columns/options | ||||
|  | ||||
|     # get vlans on the port | ||||
|     # leave this query dormant (lazy) unless c_vmember is set | ||||
|     # leave this query dormant (lazy) unless c_vmember is set or vlan filtering | ||||
|     my $vlans = $set->search({}, { | ||||
|       select => [ | ||||
|         'port', | ||||
| @@ -131,7 +112,7 @@ get '/ajax/content/device/ports' => require_login sub { | ||||
|       group_by => 'me.port', | ||||
|     }); | ||||
|  | ||||
|     if (param('c_vmember')) { | ||||
|     if (param('c_vmember') or ($prefer eq 'vlan') or (not $prefer and $f =~ m/^\d+$/)) { | ||||
|         $vlans = { map {( | ||||
|           $_->port => { | ||||
|             # DBIC smart enough to work out this should be an arrayref :) | ||||
| @@ -194,13 +175,37 @@ get '/ajax/content/device/ports' => require_login sub { | ||||
|     # also get remote LLDP inventory if asked for | ||||
|     $set = $set->with_remote_inventory if param('n_inventory'); | ||||
|  | ||||
|     # sort ports (empty set would be a 'no records' msg) | ||||
|     my $results = [ sort { &App::Netdisco::Util::Web::sort_port($a->port, $b->port) } $set->all ]; | ||||
|     return unless scalar @$results; | ||||
|     # run query | ||||
|     my @results = $set->all; | ||||
|  | ||||
|     # filter for tagged vlan using existing agg query, | ||||
|     # which is better than join inflation | ||||
|     if (($prefer eq 'vlan') or (not $prefer and $f =~ m/^\d+$/)) { | ||||
|       if (param('invert')) { | ||||
|         @results = grep { | ||||
|             (!defined $_->vlan or $_->vlan ne $f) | ||||
|               and | ||||
|             (0 == scalar grep {defined and $_ ne $f} @{ $vlans->{$_->port}->{vlan_set} }) | ||||
|         } @results; | ||||
|       } | ||||
|       else { | ||||
|         @results = grep { | ||||
|             ($_->vlan eq $f) | ||||
|               or | ||||
|             (scalar grep {defined and $_ eq $f} @{ $vlans->{$_->port}->{vlan_set} }) | ||||
|         } @results; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     # sort ports | ||||
|     @results = sort { &App::Netdisco::Util::Web::sort_port($a->port, $b->port) } @results; | ||||
|  | ||||
|     # empty set would be a 'no records' msg | ||||
|     return unless scalar @results; | ||||
|  | ||||
|     if (request->is_ajax) { | ||||
|         template 'ajax/device/ports.tt', { | ||||
|           results => $results, | ||||
|           results => \@results, | ||||
|           nodes => $nodes_name, | ||||
|           ips   => $ips_name, | ||||
|           device => $device, | ||||
| @@ -210,7 +215,7 @@ get '/ajax/content/device/ports' => require_login sub { | ||||
|     else { | ||||
|         header( 'Content-Type' => 'text/comma-separated-values' ); | ||||
|         template 'ajax/device/ports_csv.tt', { | ||||
|           results => $results, | ||||
|           results => \@results, | ||||
|           nodes => $nodes_name, | ||||
|           ips   => $ips_name, | ||||
|           device => $device, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user