From f1cc84c34f88f7a97cc94e92fabacde47645313b Mon Sep 17 00:00:00 2001 From: Kirill Solomko Date: Tue, 20 Dec 2022 18:54:35 +0100 Subject: [PATCH] MT#56234 add voip_preferences.expose_to_subscriber support * expose_to_subscriber is a new preferences flag that indicates that the preference can be read/modified by 'subscriber' role * expose_to_customer now only does the same as expose_to_subscriber but for 'subscriberadmin' role * get_usr_preference() not expects $params{$c} to be passed as an argument * fix update_voicemail_number() behaviour, it correctly updates number for subscribers of a subscriberadmin as well as no longer fails with an error if echo_voicemail_number or cli are not available (not set or not visible) Change-Id: I95fade92efb541146e9e56ba4f517af79fa71b5a --- lib/NGCP/Panel/Controller/Subscriber.pm | 13 ++++-- lib/NGCP/Panel/Utils/Preferences.pm | 56 +++++++++++++++---------- lib/NGCP/Panel/Utils/Subscriber.pm | 14 ++++--- 3 files changed, 52 insertions(+), 31 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index f69152f747..891f045790 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -782,8 +782,10 @@ sub preferences_base :Chained('base') :PathPart('preferences') :CaptureArgs(1) { $c->stash->{preference_meta} = $c->model('DB') ->resultset('voip_preferences') ->single({id => $pref_id}); - if(($c->user->roles eq 'subscriber' || $c->user->roles eq 'subscriberadmin') && - !$c->stash->{preference_meta}->expose_to_customer) { + if (($c->user->roles eq 'subscriberadmin' && + !$c->stash->{preference_meta}->expose_to_customer) || + ($c->user->roles eq 'subscriber' && + !$c->stash->{preference_meta}->expose_to_subscriber)) { NGCP::Panel::Utils::Message::error( c => $c, type => 'internal', @@ -845,7 +847,9 @@ sub preferences_edit :Chained('preferences_base') :PathPart('edit') :Args(0) { my $attr = $c->stash->{preference_meta}->attribute; if ($c->req->method eq "POST" && $attr && ($attr eq "voicemail_echo_number" || $attr eq "cli")) { NGCP::Panel::Utils::Subscriber::update_voicemail_number( - schema => $c->model('DB'), subscriber => $c->stash->{subscriber}); + c => $c, + subscriber => $c->stash->{subscriber}, + ); } } catch($e) { NGCP::Panel::Utils::Message::error( @@ -2648,7 +2652,8 @@ sub load_preference_list :Private { NGCP::Panel::Utils::Preferences::load_preference_list( c => $c, pref_values => \%pref_values, usr_pref => 1, - customer_view => (($c->user->roles eq 'subscriber' || $c->user->roles eq 'subscriberadmin') ? 1 : 0) + customer_view => ($c->user->roles eq 'subscriberdmin' ? 1 : 0), + subscriber_view => ($c->user->roles eq 'subscriber' ? 1 : 0), ); } diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index b969a04b6e..79d7898a4c 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -178,11 +178,16 @@ sub prepare_resource { if ($c->user->roles eq 'subscriberadmin' || $c->user->roles eq 'subscriber') { my $attrname = $pref->attribute->attribute; - unless ( $pref->attribute->expose_to_customer ) { + if ($c->user->roles eq 'subscriberadmin' && ! $pref->attribute->expose_to_customer ) { $c->log->debug("skipping attribute $attrname, not exposing to customer"); next; } + if ($c->user->roles eq 'subscriber' && ! $pref->attribute->expose_to_subscriber ) { + $c->log->debug("skipping attribute $attrname, not exposing to subscriber"); + next; + } + if ($has_profile && !$profile_allowed_attrs{$pref->attribute_id}) { $c->log->debug("skipping attribute $attrname, not in profile"); next; @@ -473,7 +478,9 @@ sub update_preferences { $full_rs = $elem->voip_usr_preferences; if ($c->user->roles eq 'subscriberadmin' || $c->user->roles eq 'subscriber') { $full_rs = $full_rs->search_rs({ - 'attribute.expose_to_customer' => 1, + $c->user->roles eq 'subscriberadmin' + ? ('attribute.expose_to_customer' => 1) + : ('attribute.expose_to_subscriber' => 1), },{ join => 'attribute', }); @@ -656,7 +663,9 @@ sub update_preferences { $rs->delete; if ($type eq "subscribers" && ($k eq 'voicemail_echo_number' || $k eq 'cli')) { NGCP::Panel::Utils::Subscriber::update_voicemail_number( - schema => $c->model('DB'), subscriber => $item); + c => $c, + subscriber => $item, + ); } } } # SWITCH @@ -985,7 +994,9 @@ sub update_preferences { } # SWITCH if ($type eq "subscribers" && ($pref eq 'voicemail_echo_number' || $pref eq 'cli')) { NGCP::Panel::Utils::Subscriber::update_voicemail_number( - schema => $c->model('DB'), subscriber => $item); + c => $c, + subscriber => $item, + ); } } catch($e) { $c->log->error("failed to update preference for '$accessor': $e"); @@ -1208,6 +1219,7 @@ sub load_preference_list { my $profile = $params{sub_profile}; my $customer_view = $params{customer_view} // 0; + my $subscriber_view = $params{subscriber_view} // 0; my $cloudpbx_enabled = $c->config->{features}{cloudpbx}; my $search_conditions = $params{search_conditions}; @@ -1246,6 +1258,7 @@ sub load_preference_list { -or => ['voip_preferences_enums.usr_pref' => 1, 'voip_preferences_enums.usr_pref' => undef]) : (), $customer_view ? ('voip_preferences.expose_to_customer' => 1) : (), + $subscriber_view ? ('voip_preferences.expose_to_subscriber' => 1) : (), $cloudpbx_enabled ? () : ('me.name' => { '!=' => 'Cloud PBX'}), }, { prefetch => {'voip_preferences' => 'voip_preferences_enums'}, @@ -2282,7 +2295,6 @@ sub get_preference_rs { my ($c, $type, $elem, $attr, $params) = @_; my $location_id = $params->{location_id} // undef; - my $subscriberadmin = $params->{subscriberadmin} // ($c->user->roles eq "subscriberadmin" || $c->user->roles eq "subscriber") ? 1 : 0; my $rs; if($type eq "dom") { @@ -2302,7 +2314,6 @@ sub get_preference_rs { c => $c, attribute => $attr, prov_subscriber => $elem, - $subscriberadmin ? (subscriberadmin => 1) : (), ); } elsif($type eq "peer") { $rs = get_peer_preference_rs( @@ -2407,31 +2418,34 @@ sub get_usr_preference_rs { my $attribute = $params{attribute}; my $prov_subscriber = $params{prov_subscriber}; my $schema = $params{schema} // $c->model('DB'); - my $is_subadmin = $params{subscriberadmin}; my $pref_rs = $schema->resultset('voip_preferences')->search_rs({ attribute => $attribute, usr_pref => 1, - $is_subadmin ? (expose_to_customer => 1) : (), + $c->user->roles eq 'subscriberadmin' + ? (expose_to_customer => 1) : (), + $c->user->roles eq 'subscriber' + ? (expose_to_subscriber => 1) : (), })->first; return unless($pref_rs); my $attribute_id = $pref_rs->id; # filter by allowed attrs from profile - if ($is_subadmin && $prov_subscriber && $prov_subscriber->voip_subscriber_profile) { - my $found_attr = $prov_subscriber->voip_subscriber_profile - ->profile_attributes->search_rs({ - attribute_id => $attribute_id, - })->first; - unless ($found_attr) { - $c->log->debug("get_usr_preference_rs skipping attr '$attribute' not in profile"); - return; - } + if (($c->user->roles eq 'subscriberadmin' || $c->user->roles eq 'subscriber') && + $prov_subscriber && $prov_subscriber->voip_subscriber_profile) { + my $found_attr = $prov_subscriber->voip_subscriber_profile + ->profile_attributes->search_rs({ + attribute_id => $attribute_id, + })->first; + unless ($found_attr) { + $c->log->debug("get_usr_preference_rs skipping attr '$attribute' not in profile"); + return; + } } $pref_rs = $pref_rs->voip_usr_preferences; - if($prov_subscriber) { + if ($prov_subscriber) { $pref_rs = $pref_rs->search({ subscriber_id => $prov_subscriber->id, attribute_id => $attribute_id @@ -2693,19 +2707,16 @@ sub api_preferences_defs { my $schema = $params{schema} // $c->model('DB'); my $preferences_group = $params{preferences_group}; - my $is_subadmin = ($c->user->roles eq 'subscriberadmin' || $c->user->roles eq 'subscriber'); - my $preferences = $c->model('DB')->resultset('voip_preferences')->search({ internal => { '!=' => 1 }, # also fetch -1 for ncos, rwr $preferences_group => 1, - $is_subadmin ? (expose_to_customer => 1) : (), }); my $resource = {}; for my $pref($preferences->all) { my $fields = { $pref->get_inflated_columns }; # remove internal fields - delete @{$fields}{qw/type attribute expose_to_customer internal peer_pref reseller_pref usr_pref dom_pref contract_pref contract_location_pref prof_pref voip_preference_groups_id id modify_timestamp/}; + delete @{$fields}{qw/type attribute expose_to_customer expose_to_subscriber internal peer_pref reseller_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") { @@ -2773,6 +2784,7 @@ sub create_dynamic_preference { $resource->{dynamic} = 1; $resource->{internal} = 0; $resource->{expose_to_customer} = 1; + $resource->{expose_to_subscriber} = 1; $relations->{autoprov_device_id} = delete $resource->{autoprov_device_id}; $relations->{reseller_id} = delete $resource->{reseller_id}; diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index fe5996a192..e659c84635 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -2246,20 +2246,22 @@ sub check_dset_autoattendant_status { sub update_voicemail_number { my (%params) = @_; - my $schema = $params{schema}; + my $c = $params{c}; my $subscriber = $params{subscriber}; + my $subscriberadmin = $params{subscriberadmin}; + my $schema = $c->model('DB'); my $prov_subs = $subscriber->provisioning_voip_subscriber; return unless $prov_subs; my $voicemail_user = $prov_subs->voicemail_user; my $echonumber_pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - schema => $schema, + c => $c, prov_subscriber => $prov_subs, attribute => 'voicemail_echo_number', ); my $cli_pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( - schema => $schema, + c => $c, prov_subscriber => $prov_subs, attribute => 'cli', ); @@ -2272,10 +2274,12 @@ sub update_voicemail_number { $cf_cli = $echo_cli = $subscriber->uuid; } - if (defined $echonumber_pref_rs->first) { + if ($echonumber_pref_rs && defined $echonumber_pref_rs->first) { $echo_cli = $echonumber_pref_rs->first->value; - } elsif (defined $cli_pref_rs->first) { + } elsif ($cli_pref_rs && defined $cli_pref_rs->first) { $echo_cli = $cli_pref_rs->first->value; + } else { + return; } if (defined $voicemail_user) {