From fc70bcd3ba420cdf1cd117ef4cbad1898965ac8a Mon Sep 17 00:00:00 2001 From: Rene Krenn Date: Thu, 3 Aug 2017 16:07:23 +0200 Subject: [PATCH] TT#19855 align writing the 'lock' pref value Change-Id: Ibd03f3624fe31d670df14a38cf18d1f75fe9040f --- lib/NGCP/Panel/Role/API/Preferences.pm | 20 ++++++++++++++--- lib/NGCP/Panel/Utils/Preferences.pm | 30 ++++++++++++++++++++++++-- lib/NGCP/Panel/Utils/Subscriber.pm | 8 +++++++ 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/lib/NGCP/Panel/Role/API/Preferences.pm b/lib/NGCP/Panel/Role/API/Preferences.pm index ef33e348f8..ee6e70e156 100644 --- a/lib/NGCP/Panel/Role/API/Preferences.pm +++ b/lib/NGCP/Panel/Role/API/Preferences.pm @@ -641,8 +641,12 @@ sub update_item { }; } + my %nullable = ( + lock => 1, + ); + foreach my $pref(keys %{ $resource }) { - next unless(defined $resource->{$pref}); + next if (not defined $resource->{$pref} and not $nullable{$pref}); my $pref_rs = $self->get_preference_rs($c, $type, $elem, $pref); unless($pref_rs) { $c->log->debug("removing unknown preference '$pref' from update"); @@ -667,14 +671,14 @@ sub update_item { my $maxlen = 128; if($vtype eq "") { - if(length($resource->{$pref}) > $maxlen) { + if(defined $resource->{$pref} and length($resource->{$pref}) > $maxlen) { $c->log->error("preference '$pref' exceeds maximum length of $maxlen characters"); $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Preference '$pref' exceeds maximum length of $maxlen characters"); return; } } elsif($vtype eq "ARRAY") { foreach my $a(@{ $resource->{$pref} }) { - if(length($a) > $maxlen) { + if(defined $a and length($a) > $maxlen) { $c->log->error("element in preference '$pref' exceeds maximum length of $maxlen characters"); $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Element in preference '$pref' exceeds maximum length of $maxlen characters"); return; @@ -810,6 +814,16 @@ sub update_item { # in contrast to panel, it does not drop the allowed_ips_grp pref, if empty ipnets. last SWITCH; }; + /^lock$/ && do { + my $v = $resource->{$pref}; + return unless $self->check_pref_value($c, $meta, $v, $pref_type); + NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber( + c => $c, + prov_subscriber => $elem, + level => $v, # || 0 + ); + last SWITCH; + }; # default if($meta->max_occur != 1) { $pref_rs->delete; diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index 34a4bd14fe..c66446c486 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -724,6 +724,32 @@ sub create_preference_form { } $c->response->redirect($base_uri); return 1; + } elsif ($attribute eq "lock") { + my $v = $form->field($attribute)->value; + undef $v if (defined $v && $v eq ''); + try { + NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber( + c => $c, + prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, + level => $v, + ); + NGCP::Panel::Utils::Message::info( + c => $c, + data => \%log_data, + desc => $c->loc('Preference [_1] successfully updated', $attribute), + ); + } catch($e) { + NGCP::Panel::Utils::Message::error( + c => $c, + error => $e, + data => \%log_data, + desc => $c->loc('Failed to update preference [_1]', $attribute), + ); + $c->response->redirect($base_uri); + return 1; + } + $c->response->redirect($base_uri); + return 1; } else { if( ($c->stash->{preference_meta}->data_type ne 'enum' && (!defined $form->field($attribute)->value || $form->field($attribute)->value eq '')) || @@ -1117,12 +1143,12 @@ sub set_provisoning_voip_subscriber_first_int_attr_value { ); try { if($rs->first) { - if($new_value == 0) { + if(($new_value // 0) == 0) { $rs->first->delete; } else { $rs->first->update({ value => $new_value }); } - } elsif($new_value > 0) { + } elsif(($new_value // 0) > 0) { $rs->create({ value => $new_value }); } # nothing to do for level 0, if no lock is set yet } catch($e) { diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index fdd4ca3a1f..11b4f152b0 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -108,6 +108,14 @@ sub destination_as_string { sub lock_provisoning_voip_subscriber { my %params = @_; + if ($params{c} and $params{prov_subscriber}) { + if ($params{level}) { + $params{c}->log->debug('set subscriber ' . $params{prov_subscriber}->username . ' lock level: ' . $params{level}); + } else { + $params{c}->log->debug('remove subscriber ' . $params{prov_subscriber}->username . ' lock level'); + } + } + NGCP::Panel::Utils::Preferences::set_provisoning_voip_subscriber_first_int_attr_value(%params, value => $params{level}, attribute => 'lock'