TT#154351 Sound set propagation

* Contract default sound set - subscriber propagation for cases:
    - New customer sound set is created as default.
    - Customer sound set is changed to default.
    - New subscriber creation - setting contract default sound set id.
  * The mentioned cases were implemented for both UI and API.

Change-Id: Ia4733c972ae388d3457d0336e3f85b85eec6e9a2
mr10.4
Oleksandr Duts 4 years ago
parent 81afa6680d
commit 8af29b6470

@ -60,6 +60,8 @@ sub create_item {
contract_default => 1,
id => { '!=' => $item->id },
})->update({ contract_default => 0 });
NGCP::Panel::Utils::Sounds::contract_sound_set_propagate($c, $item->contract, $item->id);
}
if ($copy_from_default_params->{copy_from_default}) {
my $error;

@ -53,17 +53,7 @@ sub update_item_model {
id => { '!=' => $item->id },
})->update({ contract_default => 0 });
foreach my $bill_subscriber($item->contract->voip_subscribers->all) {
my $prov_subscriber = $bill_subscriber->provisioning_voip_subscriber;
if($prov_subscriber) {
my $pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, prov_subscriber => $prov_subscriber, attribute => 'contract_sound_set',
);
unless($pref_rs->first) {
$pref_rs->create({ value => $item->id });
}
}
}
NGCP::Panel::Utils::Sounds::contract_sound_set_propagate($c, $item->contract, $item->id);
}
return $item;
@ -87,7 +77,7 @@ sub delete_item {
join => 'attribute',
})->delete_all; # explicit delete_all, otherwise query fails
}
$item->delete;
return 1;

@ -912,11 +912,21 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
$form->values->{lock} = 0;
}
my $provisioning_voip_subscriber = $billing_subscriber->provisioning_voip_subscriber;
my $default_contract_sound_set_row = $c->stash->{contract}->voip_sound_sets->search(
{ contract_default => 1 })->first;
if ($default_contract_sound_set_row) {
NGCP::Panel::Utils::Sounds::subcriber_sound_set_update_or_create(
$c, $provisioning_voip_subscriber, $default_contract_sound_set_row->id);
}
NGCP::Panel::Utils::Subscriber::lock_provisoning_voip_subscriber(
c => $c,
prov_subscriber => $billing_subscriber->provisioning_voip_subscriber,
prov_subscriber => $provisioning_voip_subscriber,
level => $form->values->{lock},
) if ($billing_subscriber->provisioning_voip_subscriber);
) if ($provisioning_voip_subscriber);
NGCP::Panel::Utils::ProfilePackages::underrun_lock_subscriber(c => $c, subscriber => $billing_subscriber);

@ -166,9 +166,9 @@ sub edit :Chained('base') :PathPart('edit') {
$params->{reseller}{id} = delete $params->{reseller_id};
$params->{contract}{id} = delete $params->{contract_id};
$params = merge($params, $c->session->{created_objects});
if($c->user->roles eq "admin") {
if ($c->user->roles eq "admin") {
$form = NGCP::Panel::Form::get("NGCP::Panel::Form::Sound::AdminSet", $c);
} elsif($c->user->roles eq "reseller") {
} elsif ($c->user->roles eq "reseller") {
$form = NGCP::Panel::Form::get("NGCP::Panel::Form::Sound::ResellerSet", $c);
} else {
$form = NGCP::Panel::Form::get("NGCP::Panel::Form::Sound::CustomerSet", $c);
@ -190,17 +190,17 @@ sub edit :Chained('base') :PathPart('edit') {
},
back_uri => $c->req->uri,
);
if($posted && $form->validated) {
if ($posted && $form->validated) {
try {
if($c->user->roles eq "admin") {
if ($c->user->roles eq "admin") {
$form->values->{reseller_id} = $form->values->{reseller}{id};
$form->values->{contract_id} = $form->values->{contract}{id} // undef;
if(defined $form->values->{contract_id}) {
if (defined $form->values->{contract_id}) {
$form->values->{contract_default} //= 0;
} else {
$form->values->{contract_default} = 0;
}
} elsif($c->user->roles eq "reseller") {
} elsif ($c->user->roles eq "reseller") {
if(defined $c->stash->{set_result}->contract_id) {
$form->values->{contract_default} //= 0;
} else {
@ -213,7 +213,7 @@ sub edit :Chained('base') :PathPart('edit') {
delete $form->values->{contract};
$c->model('DB')->txn_do(sub {
# if contract default is set, clear old ones first
if($c->stash->{set_result}->contract_id && $form->values->{contract_default} == 1) {
if ($c->stash->{set_result}->contract_id && $form->values->{contract_default} == 1) {
$c->stash->{sets_rs}->search({
reseller_id => $c->stash->{set_result}->reseller_id,
contract_id => $c->stash->{set_result}->contract_id,
@ -221,25 +221,12 @@ sub edit :Chained('base') :PathPart('edit') {
})->update_all({ contract_default => 0 });
}
my $old_contract_default = $c->stash->{set_result}->contract_default;
$c->stash->{set_result}->update($form->values);
if($c->stash->{set_result}->contract &&
$c->stash->{set_result}->contract_default == 1 && $old_contract_default != 1) {
# go over each subscriber in the contract and set the contract_sound_set
# preference if it doesn't have one set yet
my $contract = $c->stash->{set_result}->contract;
foreach my $bill_subscriber($contract->voip_subscribers->all) {
my $prov_subscriber = $bill_subscriber->provisioning_voip_subscriber;
if($prov_subscriber) {
my $pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, prov_subscriber => $prov_subscriber, attribute => 'contract_sound_set',
);
unless($pref_rs->first) {
$pref_rs->create({ value => $c->stash->{set_result}->id });
}
}
}
if ($c->stash->{set_result}->contract &&
$c->stash->{set_result}->contract_default == 1) {
NGCP::Panel::Utils::Sounds::contract_sound_set_propagate(
$c, $c->stash->{set_result}->contract, $c->stash->{set_result}->id);
}
});
delete $c->session->{created_objects}->{reseller};
@ -248,7 +235,7 @@ sub edit :Chained('base') :PathPart('edit') {
c => $c,
desc => $c->loc('Sound set successfully updated'),
);
} catch($e) {
} catch ($e) {
NGCP::Panel::Utils::Message::error(
c => $c,
error => $e,
@ -391,20 +378,8 @@ sub create :Chained('sets_list') :PathPart('create') :Args() {
my $set = $c->stash->{sets_rs}->create($form->values);
if($set->contract && $set->contract_default == 1) {
# go over each subscriber in the contract and set the contract_sound_set
# preference if it doesn't have one set yet
my $contract = $set->contract;
foreach my $bill_subscriber($contract->voip_subscribers->all) {
my $prov_subscriber = $bill_subscriber->provisioning_voip_subscriber;
if($prov_subscriber) {
my $pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, prov_subscriber => $prov_subscriber, attribute => 'contract_sound_set',
);
unless($pref_rs->first) {
$pref_rs->create({ value => $set->id });
}
}
}
NGCP::Panel::Utils::Sounds::contract_sound_set_propagate(
$c, $set->contract, $set->id);
}
});

@ -2391,11 +2391,13 @@ sub get_usr_preference_rs {
})->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 => $pref_rs->id,
attribute_id => $attribute_id,
})->first;
unless ($found_attr) {
$c->log->debug("get_usr_preference_rs skipping attr '$attribute' not in profile");
@ -2407,8 +2409,10 @@ sub get_usr_preference_rs {
if($prov_subscriber) {
$pref_rs = $pref_rs->search({
subscriber_id => $prov_subscriber->id,
attribute_id => $attribute_id
});
}
return $pref_rs;
}

@ -5,6 +5,7 @@ use warnings;
use IPC::System::Simple qw/capturex/;
use File::Temp qw/tempfile/;
use NGCP::Panel::Utils::Sems;
use NGCP::Panel::Utils::Preferences;
use File::Slurp;
use File::Basename;
@ -13,7 +14,7 @@ sub transcode_file {
my $out;
my @conv_args;
## quite snappy, but breaks SOAP (sigpipe's) and the catalyst devel server
## need instead to redirect like below
@ -43,9 +44,9 @@ sub transcode_file {
};
# default
} # SWITCH
$out = capturex([0], "/usr/bin/sox", @conv_args);
return $out;
}
@ -55,7 +56,7 @@ sub transcode_data {
print $fh (ref $data ? $$data : $data);
close $fh;
my $out = transcode_file($filename, $source_codec, $target_codec);
unlink $filename;
unlink $filename;
return \$out;
}
@ -64,7 +65,7 @@ sub stash_soundset_list {
my (%params) = @_;
my $c = $params{c};
my $contract = $params{contract};
my $contract = $params{contract};
my $sets_rs = $c->model('DB')->resultset('voip_sound_sets');
if($contract) {
@ -101,7 +102,7 @@ sub get_handles_rs {
my (%params) = @_;
my $c = $params{c};
my $set_rs = $params{set_rs};
my $set_rs = $params{set_rs};
my $handles_rs = $c->model('DB')->resultset('voip_sound_groups')
->search({
@ -150,7 +151,7 @@ sub apply_default_soundset_files{
my (%params) = @_;
my ($c, $lang, $set_id, $handles_rs, $loopplay, $override, $error_ref) = @params{qw/c lang set_id handles_rs loopplay override error_ref/};
$loopplay = $loopplay ? 1 : 0;
my $schema = $c->model('DB');
@ -219,6 +220,34 @@ sub apply_default_soundset_files{
}
}
sub contract_sound_set_propagate {
my ($c, $contract, $value) = @_;
for my $bill_subscriber ($contract->voip_subscribers->all) {
my $prov_subscriber = $bill_subscriber->provisioning_voip_subscriber;
if ($prov_subscriber) {
&subcriber_sound_set_update_or_create($c, $prov_subscriber, $value);
}
}
}
sub subcriber_sound_set_update_or_create {
my ($c, $prov_subscriber, $value) = @_;
my $pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(c => $c,
prov_subscriber => $prov_subscriber, attribute => 'contract_sound_set',
);
my $row = $pref_rs->first;
if (!$row) {
$pref_rs->create({ value => $value });
} else {
# Update only undefined sound set value.
$row->update({ value => $value }) if ! defined $row->value;
}
}
1;
# vim: set tabstop=4 expandtab:

@ -518,12 +518,6 @@ sub prepare_resource {
$preferences->{display_name} = $resource->{display_name}
if(defined $resource->{display_name});
my $default_sound_set = $customer->voip_sound_sets
->search({ contract_default => 1 })->first;
if($default_sound_set) {
$preferences->{contract_sound_set} = $default_sound_set->id;
}
# TODO: if we edit the primary of the pilot, will we not get the old primary number here?
my $base_number = $pilot ? $pilot->primary_number : undef;
if($base_number) {
@ -627,12 +621,6 @@ sub create_subscriber {
die("invalid timezone name '$params->{timezone}' detected");
}
# if there is a contract default sound set, use it.
my $default_sound_set = $contract->voip_sound_sets->search({ contract_default => 1 })->first;
if($default_sound_set) {
$preferences->{contract_sound_set} = $default_sound_set->id;
}
my $passlen = $c->config->{security}->{password_min_length} || 8;
if($c->config->{security}->{password_sip_autogenerate} and not defined $params->{password}) {
$params->{password} = String::MkPasswd::mkpasswd(
@ -1012,10 +1000,6 @@ sub update_preferences {
unless(defined $preferences->{$k}) {
$pref->first->delete;
} else {
# # contract_sound_set
# if ($k eq 'contract_sound_set') {
# next if $pref->first->value;
# }
$pref->first->update({
'value' => $preferences->{$k},
});

Loading…
Cancel
Save