#500 filtering in device/ports on native vlan duplicates entries

This commit is contained in:
Oliver Gorwits
2019-03-02 16:28:15 +00:00
parent 9952f0c6c7
commit 78e30a7926

View File

@@ -25,25 +25,6 @@ get '/ajax/content/device/ports' => require_login sub {
if ($f) { if ($f) {
if (($prefer eq 'vlan') or (not $prefer and $f =~ m/^\d+$/)) { if (($prefer eq 'vlan') or (not $prefer and $f =~ m/^\d+$/)) {
return unless $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 { else {
if (param('partial')) { 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 # now begin to join tables depending on the selected columns/options
# get vlans on the port # 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({}, { my $vlans = $set->search({}, {
select => [ select => [
'port', 'port',
@@ -131,7 +112,7 @@ get '/ajax/content/device/ports' => require_login sub {
group_by => 'me.port', 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 {( $vlans = { map {(
$_->port => { $_->port => {
# DBIC smart enough to work out this should be an arrayref :) # 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 # also get remote LLDP inventory if asked for
$set = $set->with_remote_inventory if param('n_inventory'); $set = $set->with_remote_inventory if param('n_inventory');
# sort ports (empty set would be a 'no records' msg) # run query
my $results = [ sort { &App::Netdisco::Util::Web::sort_port($a->port, $b->port) } $set->all ]; my @results = $set->all;
return unless scalar @$results;
# 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) { if (request->is_ajax) {
template 'ajax/device/ports.tt', { template 'ajax/device/ports.tt', {
results => $results, results => \@results,
nodes => $nodes_name, nodes => $nodes_name,
ips => $ips_name, ips => $ips_name,
device => $device, device => $device,
@@ -210,7 +215,7 @@ get '/ajax/content/device/ports' => require_login sub {
else { else {
header( 'Content-Type' => 'text/comma-separated-values' ); header( 'Content-Type' => 'text/comma-separated-values' );
template 'ajax/device/ports_csv.tt', { template 'ajax/device/ports_csv.tt', {
results => $results, results => \@results,
nodes => $nodes_name, nodes => $nodes_name,
ips => $ips_name, ips => $ips_name,
device => $device, device => $device,