mirror of https://github.com/sipwise/www_admin.git
parent
db2368a102
commit
c7e5ed12bc
@ -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
|
||||
@ -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>
|
||||
Loading…
Reference in new issue