support for sound sets

3.4
Christian Veigl 14 years ago
parent db2368a102
commit c7e5ed12bc

2
debian/control vendored

@ -26,7 +26,7 @@ Description: Configuration templates for the web-based admin interface
Package: ngcp-www-admin
Architecture: all
Depends: ${shlibs:Depends}, ${misc:Depends}, ngcp-ossbss-billing (>= 2.1.1), ngcp-ossbss-voip (>= 3.1.0), libcatalyst-perl, libcatalyst-modules-perl, libcatalyst-engine-apache-perl, ngcp-templates-www-admin, libgd-gd2-perl
Depends: ${shlibs:Depends}, ${misc:Depends}, ngcp-ossbss-billing (>= 2.1.1), ngcp-ossbss-voip (>= 3.1.0), libcatalyst-perl, libcatalyst-modules-perl, libcatalyst-engine-apache-perl, ngcp-templates-www-admin, libgd-gd2-perl, libfile-type-perl
Description: administration framework to configure the Sipwise NGCP
This package provides an administration framework which is used to
configure the Sipwise NGCP.

@ -154,6 +154,18 @@ sub preferences : Local {
options => $enum_options,
} if eval { @$enum_options };
}
elsif ($$pref{preference} eq 'sound_set') {
my $sound_sets;
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_sound_sets_flat',
{},
\$sound_sets );
$$preferences{$$pref{preference}} = {
selected => $$preferences{$$pref{preference}},
options => $sound_sets,
} if eval { @$sound_sets };
}
}

@ -573,6 +573,18 @@ sub preferences : Local {
options => $enum_options,
} if eval { @$enum_options };
}
elsif ($$pref{preference} eq 'sound_set') {
my $sound_sets;
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_sound_sets_flat',
{},
\$sound_sets );
$$preferences{$$pref{preference}} = {
selected => $$preferences{$$pref{preference}},
options => $sound_sets,
} if eval { @$sound_sets };
}
}
if(eval { @$db_prefs }) {

@ -0,0 +1,227 @@
package admin::Controller::sound;
use strict;
use warnings;
use base 'Catalyst::Controller';
=head1 NAME
admin::Controller::sound - Catalyst Controller
=head1 DESCRIPTION
Catalyst Controller.
=head1 METHODS
=head2 index
Edit sound sets.
=cut
sub base : Chained('/') PathPrefix CaptureArgs(0) {
my ($self, $c) = @_;
return unless ( $c->stash->{sets} = $c->forward ('load_sets'));
if (defined $c->session->{refill}) {
foreach my $s (@{$c->stash->{sets}}) {
next if ($s->{id} ne $c->session->{refill}->{set_id});
foreach my $h (@{$s->{handles}}) {
next if ($h->{id} ne $c->session->{refill}->{handle_id});
$h->{filename} = $c->session->{refill}->{filename};
$h->{err} = 1;
}
}
$c->session->{refill} = undef;
}
$c->stash->{template} = 'tt/sound.tt';
}
sub list : Chained('base') PathPart('') Args(0) {
my ($self, $c) = @_;
$c->stash->{template} = 'tt/sound.tt';
}
sub set_get : Chained('base') PathPart('set') CaptureArgs(1) {
my ($self, $c, $set_id) = @_;
$c->stash->{set_id} = $set_id if ($set_id != 0);
}
sub set_add : Chained('base') PathPart('set') CaptureArgs(0) {
my ($self, $c, $set_id) = @_;
}
sub handle_get : Chained('set_get') PathPart('handle') CaptureArgs(1) {
my ($self, $c, $handle_id) = @_;
$c->stash->{handle_id} = $handle_id;
}
sub upload_soundfile : Chained('handle_get') PathPart('soundfile/upload') Args(0) {
my ($self, $c) = @_;
my %messages;
my $upload = $c->req->upload('soundfile');
my ($file, $filename);
if (defined $upload) {
$file = eval { $upload->slurp };
$filename = eval { $upload->filename };
}
# ne radi :(
# my $checkresult;
# return unless $c->model('Provisioning')->call_prov( $c, 'voip',
# 'check_filetype',
# { filetype => 'audio/x-wav',
# file => $file,
# },
# \$checkresult
# );
# if ($checkresult) {
use File::Type;
my $ft = File::Type->new();
if ($ft->checktype_contents($file) eq 'audio/x-wav') {
if ($c->model('Provisioning')->call_prov($c, 'voip',
'add_sound_file',
{ set_id => $c->stash->{set_id},
handle_id => $c->stash->{handle_id},
soundfile => $file,
filename => $filename,
},
undef))
{
$messages{topmsg} = 'Server.Voip.SavedSettings';
} else {
$messages{toperr} = 'Client.Voip.InputErrorFound';
}
}
else {
$messages{file_err} = 'Client.Syntax.InvalidFileType';
$c->session->{refill} = { set_id => $c->stash->{set_id}, handle_id => $c->stash->{handle_id}, filename => $filename };
}
$c->session->{messages} = \%messages;
$c->response->redirect('/sound/set/' . $c->stash->{set_id} . '/edit#set_' . $c->stash->{set_id});
}
sub get_soundfile : Chained('handle_get') PathPart('soundfile/get') Args(0) {
my ($self, $c) = @_;
my $soundfile;
if ($c->model('Provisioning')->call_prov($c, 'voip',
'get_sound_file',
{ set_id => $c->stash->{set_id},
handle_id => $c->stash->{handle_id},
},
\$soundfile))
{}
$c->response->header ('Content-Disposition' => 'attachment; filename="' . $soundfile->{filename} . '"');
$c->response->body($soundfile->{data});
}
sub edit_set : Chained('set_get') PathPart('edit') Args(0) {
my ($self, $c) = @_;
$c->stash->{edit_set_id} = $c->stash->{set_id}; # meh
$c->stash->{template} = 'tt/sound.tt';
}
sub delete_set : Chained('set_get') PathPart('delete') Args(0) {
my ($self, $c) = @_;
$c->stash->{template} = 'tt/sound.tt';
my %messages;
if ($c->model('Provisioning')->call_prov($c, 'voip',
'delete_sound_set',
{ id => $c->stash->{set_id} },
undef))
{
$messages{topmsg} = 'Server.Voip.SoundsetDeleted';
}
else {
$messages{toperr} = 'Client.Voip.InputErrorFound';
}
$c->response->redirect("/sound");
}
# deletes an sound file, not the handle
# usage of 'handle' here is from users perspective
sub delete_handle : Chained('handle_get') PathPart('delete') Args(0) {
my ($self, $c) = @_;
$c->stash->{template} = 'tt/sound.tt';
my %messages;
if ($c->model('Provisioning')->call_prov($c, 'voip',
'delete_sound_file',
{ set_id => $c->stash->{set_id},
handle_id => $c->stash->{handle_id}
},
undef))
{
$messages{topmsg} = 'Server.Voip.SoundHandleDeleted';
}
else {
$messages{toperr} = 'Client.Voip.InputErrorFound';
}
$c->response->redirect('/sound/set/' . $c->stash->{set_id} . '/edit#set_' . $c->stash->{set_id});
}
sub save_set : Chained('set_get') PathPart('save') Args(0) {
my ($self, $c) = @_;
$c->stash->{template} = 'tt/sound.tt';
my %messages;
$c->stash->{set_name} = $c->request->params->{set_name};
if ($c->stash->{set_id}) {
if ($c->model('Provisioning')->call_prov($c, 'voip',
'update_sound_set',
{ id => $c->stash->{set_id},
set_name => $c->stash->{set_name},
},
undef))
{
$messages{topmsg} = 'Server.Voip.SavedSettings';
}
}
else {
if ($c->model('Provisioning')->call_prov($c, 'voip',
'create_sound_set',
{ set_name => $c->request->params->{set_name} },
undef ))
{
$messages{topmsg} = 'Server.Voip.SavedSettings';
}
}
$messages{toperr} = 'Client.Voip.InputErrorFound';
$c->response->redirect("/sound");
}
sub load_sets :Private {
my ( $self, $c, $params) = @_;
my $sets;
return unless $c->model('Provisioning')->call_prov(
$c,
'voip',
'get_sound_sets',
# TODO: remove comment
# handle_request (called from call_prov) will add
# reseller_id
# { reseller_id => $params->{reseller_id} },
undef, # parameters
\$sets,
);
return $sets;
}
# Ends, some people will rob their mothers for the ends ...
1

@ -824,6 +824,17 @@ sub preferences : Local {
options => $enum_options,
} if eval { @$enum_options };
}
elsif ($$pref{preference} eq 'sound_set') {
my $sound_sets;
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_sound_sets_flat',
{},
\$sound_sets );
$$preferences{$$pref{preference}} = {
selected => $$preferences{$$pref{preference}},
options => $sound_sets,
} if eval { @$sound_sets };
}
push @stashprefs,
{ key => $$pref{preference},

@ -39,6 +39,9 @@
<li [% 'class="active_menu"' IF menu.active == "peering" %]><a href="/peering">SIP Peerings</a></li>
[% END %]
<li [% 'class="active_menu"' IF menu.active == "rewrite" %]><a href="/rewrite">Rewrite Rule Sets</a></li>
[% IF Catalyst.config.domain.audiofile_features %]
<li [% 'class="active_menu"' IF menu.active == "sound" %]><a href="/sound">Sound sets</a></li>
[% END %]
</ul>
</div>

@ -145,6 +145,24 @@
[% END %]
</div>
</li>
[% ELSIF preference.key == "sound_set" AND Catalyst.config.domain.audiofile_features %]
<li class="ui-state-default">
<div class="span-5" title="[% preference.description %]">[% preference.key %]:</div>
<div class="span-1"><span class="ui-icon ui-icon-help help" title="[% preference.description %]"></span></div>
<div class="span-10 last">
<select size="1" name="[% preference.key %]" [% IF !edit_preferences %]disabled="disabled"[% END %] />
<option value=""></option>
[% FOREACH option IN preference.value.options %]
<option value="[% option.id %]"
[% IF option.id == preference.value.selected %]
selected="selected"
[% END %]>
[% option.name %]
</option>
[% END %]
</select>
</div>
</li>
[% ELSIF preference.data_type == "boolean" %]
<li class="ui-state-default">
<div class="span-5" title="[% preference.description %]">[% preference.key %]:</div>

@ -142,6 +142,24 @@
[% END %]
</div>
</li>
[% ELSIF preference.key == "sound_set" AND Catalyst.config.domain.audiofile_features %]
<li class="ui-state-default">
<div class="span-5" title="[% preference.description %]">[% preference.key %]:</div>
<div class="span-1"><span class="ui-icon ui-icon-help help" title="[% preference.description %]"></span></div>
<div class="span-10 last">
<select size="1" name="[% preference.key %]" [% IF !edit_preferences %]disabled="disabled"[% END %] />
<option value=""></option>
[% FOREACH option IN preference.value.options %]
<option value="[% option.id %]"
[% IF option.id == preference.value.selected %]
selected="selected"
[% END %]>
[% option.name %]
</option>
[% END %]
</select>
</div>
</li>
[% ELSIF preference.data_type == "boolean" %]
<li class="ui-state-default">
<div class="span-5" title="[% preference.description %]">[% preference.key %]:</div>

@ -0,0 +1,109 @@
<h3>Manage sound sets</h3>
<ul class="cleanlist">
<li class="ui-state-default">
<div class="prepend-3 span-3">Handle</div>
<div class="prepend-1 span-2 last">Filename</div>
</li>
[% FOREACH set IN sets %]
<li class="ui-state-default"><a name="set_[% set.id %]"></a></li>
[% IF set.id == edit_set_id %]
<li class="ui-state-default">
<form action="/sound/set/[% set.id %]/save#set_[% set.id %]" method="post">
<div class="span-6">
<input type="text" name="set_name" value="[% set.name %]" size="10"/>
</div>
<div class="prepend-8 span-1">
<button class="button-save" id="setsave[% id %]">Save</button>
</div>
<div class="span-1 last">
<a href="/sound"><span class="button-cancel">Cancel</span></a>
</div>
</form>
</li>
[% FOREACH h IN set.handles %]
<li class="ui-state-default">
<div class="prepend-3 span-3">[% h.name %]</div>
[% IF h.filename.length AND NOT h.err %]
<div class="prepend-1 span-4">[% h.filename %]</div>
<form action="/sound/set/[% set.id %]/handle/[% h.id %]/delete" method="post">
<div class="prepend-4 span-1">
[% UNLESS Catalyst.session.admin.read_only %]
<button class="button-delete" id="setdel[% id %]">Delete</button>
[% END %]
</form>
</div>
[% ELSE %]
<form action="/sound/set/[% set.id %]/handle/[% h.id %]/soundfile/upload" method="post" enctype="multipart/form-data">
<div class="prepend-1 span-4">
[%# value='' is ignored by browsers for security reasons for file-input-fields %]
<input id="soundfile" name="soundfile" class="file" type="file" size="10" value="[% IF h.filename.length %][% h.filename %][% END %]">
</div>
<div class="prepend-4 span-1">
<button class="button-add" id="soundadd" />
</div>
</form>
[% END %]
</li>
[% END %]
[% IF messages.file_err %]
<div class="error">[% messages.file_err %]</div>
[% END %]
[% ELSE %]
[% count = set.mapped.domains + set.mapped.users + set.mapped.peers %]
[% plural = 's' IF count > 1 %]
<li class="ui-state-default">
<div class="span-6">
[% set.name %]
[% IF set.mapped %]
<font class="small"><i>(mapped [% count %] time[% plural %])</i></font>
[% END %]
</div>
<div class="prepend-8 span-1">
[% UNLESS Catalyst.session.admin.read_only %]
<a href="/sound/set/[% set.id %]/edit#set_[% set.id %]"><span class="button-edit">Edit</span></a>
[% END %]
</div>
<div class="span-1 last">
[% IF count < 1 %]
<form action="/sound/set/[% set.id %]/delete" method="post">
[% UNLESS Catalyst.session.admin.read_only %]
<button class="button-delete" id="setdel[% id %]">Delete</button>
[% END %]
</form>
[% END %]
</div>
</li>
[% FOREACH h IN set.handles %]
<li class="ui-state-default">
<div class="prepend-3 span-3">[% h.name %]</div>
<div class="prepend-1 span-4"><a href="/sound/set/[% set.id %]/handle/[% h.id %]/soundfile/get">[% h.filename %]</a></div>
</li>
[% END %]
[% END %]
<br>
[% END %]
</ul>
<hr>
<ul class="cleanlist">
<li class="ui-state-default">
<form action="/sound/set/0/save" method="post">
<div class="prepend-7 span-3">New soundset</div>
<div class="span-5">
<input type="text" name="set_name" value="" size="10"/>
</div>
<div class="span-1">
<button class="button-add" id="setsave">Add soundset</button>
</div>
</form>
</li>
</ul>

@ -93,6 +93,24 @@
[% END %]
</div>
</li>
[% ELSIF preference.key == "sound_set" AND Catalyst.config.domain.audiofile_features %]
<li class="ui-state-default">
<div class="span-5" title="[% preference.description %]">[% preference.key %]:</div>
<div class="span-1"><span class="ui-icon ui-icon-help help" title="[% preference.description %]"></span></div>
<div class="span-10 last">
<select size="1" name="[% preference.key %]" [% IF !edit_preferences %]disabled="disabled"[% END %] />
<option value=""></option>
[% FOREACH option IN preference.value.options %]
<option value="[% option.id %]"
[% IF option.id == preference.value.selected %]
selected="selected"
[% END %]>
[% option.name %]
</option>
[% END %]
</select>
</div>
</li>
[% ELSIF preference.data_type == "boolean" %]
<li class="ui-state-default">
<div class="span-5" title="[% preference.description %]">[% preference.key %]:</div>

Loading…
Cancel
Save