MT#56693 parent_name, allow empty sound files, sems audio cache

* /api/soundsets new parent_name field
* /api/soundfiles now allow POST to be done without the upload,
  for cases when an empty record needs to be added to define
  "use_parent" behaviour
* improve sems audio cache clear on sound files change, now
  sems instances that are not available (not running/request timeout)
  are skipped instead of raising an error

Change-Id: I83af2ee2fd3672ab35cf330464ace68416ab52be
mr11.4
Kirill Solomko 2 years ago
parent fd9c003c8b
commit 6a922c5cfb

@ -116,16 +116,26 @@ sub POST :Allow {
if ($upload) { if ($upload) {
$recording = eval { $upload->slurp }; $recording = eval { $upload->slurp };
} }
last unless $recording;
my $json_raw = encode_utf8($c->req->params->{json}); my $json_raw = encode_utf8($c->req->params->{json});
$resource = JSON::from_json($json_raw, { utf8 => 0 }); $resource = JSON::from_json($json_raw, { utf8 => 0 });
} else { } else {
$recording = $self->get_valid_raw_post_data( my $ctype = $self->get_content_type($c);
c => $c, if ($ctype eq 'application/json') {
media_type => ['audio/x-wav', 'audio/mpeg', 'audio/ogg'], $resource = $self->get_valid_post_data(
); c => $c,
$resource = $c->req->query_params; media_type => 'application/json',
);
last unless $resource;
} else {
$recording = $self->get_valid_raw_post_data(
c => $c,
media_type => ['application/json', 'audio/x-wav', 'audio/mpeg', 'audio/ogg'],
);
last unless $recording;
$resource = $c->req->query_params;
}
} }
last unless $recording;
$resource->{data} = $recording; $resource->{data} = $recording;
my $form = $self->get_form($c); my $form = $self->get_form($c);
my $item; my $item;

@ -16,7 +16,7 @@ has_field 'reseller_id' => (
has_block 'fields' => ( has_block 'fields' => (
tag => 'div', tag => 'div',
class => [qw/modal-body/], class => [qw/modal-body/],
render_list => [qw/reseller_id customer_id name description expose_to_customer contract_default parent_id copy_from_default language loopplay replace_existing/], render_list => [qw/reseller_id customer_id name description expose_to_customer contract_default parent_id parent_name copy_from_default language loopplay replace_existing/],
); );

@ -30,7 +30,7 @@ has_field 'use_parent' => (
has_field 'filename' => ( has_field 'filename' => (
type => 'Text', type => 'Text',
required => 1, required => 0,
element_attr => { element_attr => {
rel => ['tooltip'], rel => ['tooltip'],
title => ['The filename of the sound file (for informational purposes only).'], title => ['The filename of the sound file (for informational purposes only).'],

@ -24,7 +24,7 @@ has_field 'expose_to_customer' => (
has_block 'fields' => ( has_block 'fields' => (
tag => 'div', tag => 'div',
class => [qw/modal-body/], class => [qw/modal-body/],
render_list => [qw/customer_id name description expose_to_customer contract_default parent_id copy_from_default language loopplay replace_existing/], render_list => [qw/customer_id name description expose_to_customer contract_default parent_id parent_name copy_from_default language loopplay replace_existing/],
); );

@ -51,6 +51,15 @@ has_field 'parent_id' => (
}, },
); );
has_field 'parent_name' => (
type => 'Text',
element_attr => {
rel => ['tooltip'],
title => ['Parent sound set name'],
},
);
has_field 'copy_from_default' => ( has_field 'copy_from_default' => (
type => 'Boolean', type => 'Boolean',
label => 'Use system default sound files', label => 'Use system default sound files',
@ -60,7 +69,7 @@ has_field 'copy_from_default' => (
has_block 'fields' => ( has_block 'fields' => (
tag => 'div', tag => 'div',
class => [qw/modal-body/], class => [qw/modal-body/],
render_list => [qw/name description contract_id contract_default parent_id copy_from_default language loopplay replace_existing/], render_list => [qw/name description contract_id contract_default parent_id parent_name copy_from_default language loopplay replace_existing/],
); );
# TODO: inheritance? # TODO: inheritance?

@ -143,6 +143,12 @@ sub update_item {
$resource->{loopplay} = ($resource->{loopplay} eq "true" || is_int($resource->{loopplay}) && $resource->{loopplay}) ? 1 : 0; $resource->{loopplay} = ($resource->{loopplay} eq "true" || is_int($resource->{loopplay}) && $resource->{loopplay}) ? 1 : 0;
if ($resource->{data} && !$resource->{filename}) {
$c->log->error("filename is required when there is data to upload'");
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "'filename' cannot be empty during upload");
return;
}
my $set_rs = $c->model('DB')->resultset('voip_sound_sets')->search({ my $set_rs = $c->model('DB')->resultset('voip_sound_sets')->search({
id => $resource->{set_id}, id => $resource->{set_id},
}); });
@ -177,6 +183,7 @@ sub update_item {
join => 'group', join => 'group',
}); });
$handle = $handle_rs->first; $handle = $handle_rs->first;
$resource->{handle} //= '';
unless($handle) { unless($handle) {
$c->log->error("invalid handle '$$resource{handle}'"); $c->log->error("invalid handle '$$resource{handle}'");
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid handle"); $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid handle");

@ -18,20 +18,25 @@ sub resource_name{
sub _item_rs { sub _item_rs {
my ($self, $c) = @_; my ($self, $c) = @_;
my $item_rs = $c->model('DB')->resultset('voip_sound_sets'); my $item_rs = $c->model('DB')->resultset('voip_sound_sets')->search({
},{
join => 'parent',
'+select' => [ 'parent.name' ],
'+as' => [ 'parent_name' ],
});
if ($c->user->roles eq "admin") { if ($c->user->roles eq "admin") {
} elsif ($c->user->roles eq "reseller") { } elsif ($c->user->roles eq "reseller") {
$item_rs = $item_rs->search({ $item_rs = $item_rs->search({
'reseller_id' => $c->user->reseller_id, 'me.reseller_id' => $c->user->reseller_id,
}); });
} elsif ($c->user->roles eq "subscriberadmin") { } elsif ($c->user->roles eq "subscriberadmin") {
my $contract = $c->model('DB')->resultset('contracts')->find($c->user->account_id); my $contract = $c->model('DB')->resultset('contracts')->find($c->user->account_id);
$item_rs = $item_rs->search_rs({ $item_rs = $item_rs->search_rs({
-or => [ -or => [
'contract_id' => $c->user->account_id, 'me.contract_id' => $c->user->account_id,
-and => [ 'contract_id' => undef, -and => [ 'me.contract_id' => undef,
'reseller_id' => $contract->contact->reseller_id, 'me.reseller_id' => $contract->contact->reseller_id,
'expose_to_customer' => 1, 'me.expose_to_customer' => 1,
], ],
] ]
}); });
@ -97,6 +102,8 @@ sub process_form_resource{
$resource->{reseller_id} = $c->user->contract->contact->reseller_id; $resource->{reseller_id} = $c->user->contract->contact->reseller_id;
} }
$resource->{contract_default} //= 0; $resource->{contract_default} //= 0;
delete $resource->{parent_name};
return $resource; return $resource;
} }

@ -406,7 +406,7 @@ sub _clear_audio_cache_service {
</methodCall> </methodCall>
EOF EOF
if(grep { $$_[1] == 0 or $$_[2] !~ m#<value>OK</value># } @ret) { # error if (grep { $$_[1] == 0 || ($$_[1] != -1 && $$_[2] !~ m#<value>OK</value>#) } @ret) { # error
die "failed to clear SEMS audio cache"; die "failed to clear SEMS audio cache";
} }

Loading…
Cancel
Save