From 5415d6e0e6f7698f678cee2c1c299876160f20f7 Mon Sep 17 00:00:00 2001 From: Irina Peshinskaya Date: Sat, 16 Jul 2016 11:58:16 +0300 Subject: [PATCH] MT#20971 Add concurrent_max* preferences to device config variables Change-Id: I045a12280896d24f6725435a80e048bed6c588d1 --- lib/NGCP/Panel/Controller/Device.pm | 70 ++++++++++------------------- lib/NGCP/Panel/Utils/Generic.pm | 34 +++++++++++++- lib/NGCP/Panel/Utils/Preferences.pm | 53 +++++++++++++++------- 3 files changed, 92 insertions(+), 65 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Device.pm b/lib/NGCP/Panel/Controller/Device.pm index 76332c5857..79489b0389 100644 --- a/lib/NGCP/Panel/Controller/Device.pm +++ b/lib/NGCP/Panel/Controller/Device.pm @@ -1327,63 +1327,41 @@ sub dev_field_config :Chained('/') :PathPart('device/autoprov/config') :Args() { }; foreach my $line($linerange->autoprov_field_device_lines->search({ device_id => $dev->id })->all) { my $sub = $line->provisioning_voip_subscriber; - my $display_name = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - c => $c, - prov_subscriber => $sub, - attribute => 'display_name', - ); - if($display_name->first) { - $display_name = $display_name->first->value; - } else { - $display_name = $sub->username; - }; - my $cc = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - c => $c, - prov_subscriber => $sub, - attribute => 'cc', + my %sub_preferences_vars = ( + display_name => $sub->username, + enable_t38 => 0, + concurrent_max => 0, + concurrent_max_per_account => 0, + cc => '', + ac => '', ); - if($cc->first) { - $cc = $cc->first->value; - } else { - $cc = ''; - } - my $ac = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + my $pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preferences_rs( c => $c, prov_subscriber => $sub, - attribute => 'ac', + #attribute => [keys %sub_preferences_vars], ); - if($ac->first) { - $ac = $ac->first->value; - } else { - $ac = ''; + my $preferences = get_inflated_columns_all($pref_rs, 'hash' => 'attribute', 'column' => 'value' ); + foreach my $key (keys %sub_preferences_vars){ + if(exists $preferences->{$key}){ + $sub_preferences_vars{$key} = $preferences->{$key}; + } } - my $t38 = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - c => $c, - prov_subscriber => $sub, - attribute => 'enable_t38', - ); - if($t38->first) { - $t38 = $t38->first->value; - } else { - $t38 = 0; - }; + $sub_preferences_vars{displayname} = delete $sub_preferences_vars{display_name}; # TODO: only push password for private/shared line? my $aliases = [ $sub->voip_dbaliases->search({ is_primary => 0 })->get_column("username")->all ]; my $primary = $sub->voip_dbaliases->search({ is_primary => 1 })->get_column("username")->first; push @{ $range->{lines} }, { - alias_numbers => $aliases, + alias_numbers => $aliases, primary_number => $primary, - extension => $sub->pbx_extension, - username => $sub->username, - domain => $sub->domain->domain, - password => $sub->password, - displayname => $display_name, - keynum => $line->key_num, - type => $line->line_type, - t38 => $t38, - cc => $cc, - ac => $ac, + extension => $sub->pbx_extension, + username => $sub->username, + domain => $sub->domain->domain, + password => $sub->password, + keynum => $line->key_num, + type => $line->line_type, + preferences => $preferences, + %sub_preferences_vars, }; if(!$ldap_attr_set && $linerange->name eq "Full Keys" && $line->line_type eq "private") { $vars->{ldap}->{dn} = "uid=".$sub->uuid . ",o=" . $sub->account_id . $vars->{ldap}->{dn}; diff --git a/lib/NGCP/Panel/Utils/Generic.pm b/lib/NGCP/Panel/Utils/Generic.pm index 2fb66bf4dd..df01fc680f 100644 --- a/lib/NGCP/Panel/Utils/Generic.pm +++ b/lib/NGCP/Panel/Utils/Generic.pm @@ -7,9 +7,9 @@ use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); $VERSION = 1.00; @ISA = qw(Exporter); @EXPORT = (); -@EXPORT_OK = qw(is_int is_integer is_decimal merge compare is_false is_true); +@EXPORT_OK = qw(is_int is_integer is_decimal merge compare is_false is_true get_inflated_columns_all); %EXPORT_TAGS = ( DEFAULT => [qw(&is_int &is_integer &is_decimal &merge &compare &is_false &is_true)], - all => [qw(&is_int &is_integer &is_decimal &merge &compare &is_false &is_true)]); + all => [qw(&is_int &is_integer &is_decimal &merge &compare &is_false &is_true &get_inflated_columns_all)]); use Hash::Merge; use Data::Compare qw//; @@ -67,4 +67,34 @@ sub compare { return Data::Compare::Compare(@_); } +sub get_inflated_columns_all{ + my ($rs,%params) = @_; + my ($res); + $rs->result_class('DBIx::Class::ResultClass::HashRefInflator'); + if(my $hashkey_column = $params{hash}){ + my %lres; + my $register_value = sub { + my($hash,$key,$value) = @_; + if(exists $hash->{$key}){ + if('ARRAY' eq ref $hash->{$key}){ + push @{$hash->{$key}}, $value; + }else{ + $hash->{$key} = [$hash->{$key}, $value]; + } + }else{ + $hash->{$key} = $value; + } + }; + my $hashvalue_column = $params{column}; + foreach($rs->all){ + $register_value->(\%lres,$_->{$hashkey_column}, $hashvalue_column ? $_->{$hashvalue_column} : $_); + } + $res = \%lres; + }else{ + $res = [$rs->all]; + } + return $res; + #return [ map { { $_->get_inflated_columns }; } $rs->all ]; +} + 1; diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index 81c74b6a78..66745e5eaa 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -44,7 +44,7 @@ sub load_preference_list { my $customer_view = $params{customer_view} // 0; my $cloudpbx_enabled = $c->config->{features}{cloudpbx}; - + my $pref_rs = $c->model('DB') ->resultset('voip_preference_groups') ->search({ 'voip_preferences.internal' => { '<=' => 0 }, @@ -81,7 +81,7 @@ sub load_preference_list { foreach my $group(@pref_groups) { my @group_prefs = $group->voip_preferences->all; - + foreach my $pref(@group_prefs) { my @values = @{ @@ -129,7 +129,7 @@ sub load_preference_list { $pref->{man_allowed_ips_rs} = $c->model('DB')->resultset('voip_allowed_ip_groups') ->search_rs({ group_id => $pref_values->{man_allowed_ips_grp} }); } - elsif($c->stash->{subscriber} && + elsif($c->stash->{subscriber} && ($pref->attribute eq "block_in_list" || $pref->attribute eq "block_out_list")) { foreach my $v(@values) { my $prefix = ""; @@ -486,7 +486,7 @@ sub create_preference_form { return 1; } } elsif ($c->stash->{preference_meta}->max_occur != 1) { - if($c->stash->{subscriber} && + if($c->stash->{subscriber} && ($c->stash->{preference_meta}->attribute eq "block_in_list" || $c->stash->{preference_meta}->attribute eq "block_out_list")) { my $v = $form->values->{$c->stash->{preference_meta}->attribute}; @@ -666,7 +666,7 @@ sub create_preference_form { $c->response->redirect($base_uri); return 1; } - } elsif($c->stash->{preference_meta}->data_type eq 'boolean' && + } elsif($c->stash->{preference_meta}->data_type eq 'boolean' && $form->field($attribute)->value == 0) { try { my $preference = $pref_rs->find($preference_id); @@ -775,6 +775,28 @@ sub set_rewrite_preferences { } +sub get_usr_preferences_rs { + my %params = @_; + + my $c = $params{c}; + my $attribute = $params{attribute}; + my $prov_subscriber = $params{prov_subscriber}; + my $schema = $params{schema} // $c->model('DB'); + my $get_rows = $params{get_rows}; + + my $pref_rs = $schema->resultset('voip_usr_preferences')->search({ + 'attribute.usr_pref' => 1, + $attribute ? ( 'attribute.attribute' => (('ARRAY' eq ref $attribute) ? { '-in' => $attribute } : $attribute ) ) : () , + $prov_subscriber ? ('me.subscriber_id' => $prov_subscriber->id) : (), + },{ + '+select' => ['attribute.attribute'], + '+as' => ['attribute'], + 'join' => 'attribute', + }); + + return $pref_rs; +} + sub get_usr_preference_rs { my %params = @_; @@ -899,8 +921,8 @@ sub get_peer_auth_params { foreach my $attribute (qw/peer_auth_user peer_auth_realm peer_auth_pass peer_auth_register/){ my $rs; $rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - c => $c, - attribute => $attribute, + c => $c, + attribute => $attribute, prov_subscriber => $prov_subscriber ); $prefs->{$attribute} = $rs->first ? $rs->first->value : undef; @@ -930,8 +952,8 @@ sub set_provisoning_voip_subscriber_first_int_attr_value { return unless $prov_subscriber; my $rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - c => $c, - prov_subscriber => $prov_subscriber, + c => $c, + prov_subscriber => $prov_subscriber, attribute => $attribute, ); try { @@ -960,8 +982,8 @@ sub get_provisoning_voip_subscriber_first_int_attr_value { return undef unless $prov_subscriber; my $rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - c => $c, - prov_subscriber => $prov_subscriber, + c => $c, + prov_subscriber => $prov_subscriber, attribute => $attribute, ); try { @@ -971,6 +993,7 @@ sub get_provisoning_voip_subscriber_first_int_attr_value { $e->rethrow; } } + sub api_preferences_defs{ my %params = @_; @@ -986,9 +1009,7 @@ sub api_preferences_defs{ for my $pref($preferences->all) { my $fields = { $pref->get_inflated_columns }; # remove internal fields - for my $del(qw/type attribute expose_to_customer internal peer_pref usr_pref dom_pref contract_pref contract_location_pref prof_pref voip_preference_groups_id id modify_timestamp/) { - delete $fields->{$del}; - } + delete @{$fields}{qw/type attribute expose_to_customer internal peer_pref usr_pref dom_pref contract_pref contract_location_pref prof_pref voip_preference_groups_id id modify_timestamp/}; $fields->{max_occur} = int($fields->{max_occur}); $fields->{read_only} = JSON::Types::bool($fields->{read_only}); if($fields->{data_type} eq "enum") { @@ -998,9 +1019,7 @@ sub api_preferences_defs{ $fields->{enum_values} = []; foreach my $enum(@enums) { my $efields = { $enum->get_inflated_columns }; - for my $del(qw/id preference_id usr_pref prof_pref dom_pref peer_pref contract_pref contract_location_pref/) { - delete $efields->{$del}; - } + delete @{$efields}{qw/id preference_id usr_pref prof_pref dom_pref peer_pref contract_pref contract_location_pref/}; $efields->{default_val} = JSON::Types::bool($efields->{default_val}); push @{ $fields->{enum_values} }, $efields; }