diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index 73cd47587b..3e5377547f 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -193,13 +193,18 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) { params => $c->request->params, item => $params, ); + my $fields = { + 'domain.create' => $c->uri_for('/domain/create'), + 'group.create' => $c->uri_for_action('/customer/pbx_group_create', $c->req->captures), + }; + if($pbxadmin) { + $fields->{'domain.create'} = $c->uri_for_action('/domain/create', + $c->stash->{contract}->contact->reseller_id, 'pbx'); + } NGCP::Panel::Utils::Navigation::check_form_buttons( c => $c, form => $form, - fields => { - 'domain.create' => $c->uri_for('/domain/create'), - 'group.create' => $c->uri_for_action('/customer/pbx_group_create', $c->req->captures), - }, + fields => $fields, back_uri => $c->req->uri, ); if($form->validated) { @@ -242,7 +247,7 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) { ->find($form->params->{pbx_group_id}) ->provisioning_voip_subscriber; if($grp_subscriber) { - my $grp_pref_rs = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $grp_pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, attribute => 'cloud_pbx_hunt_group', prov_subscriber => $grp_subscriber ); $grp_pref_rs->create({ value => 'sip:'.$form->params->{username}.'@'. @@ -504,7 +509,7 @@ sub pbx_group_edit :Chained('pbx_group_base') :PathPart('edit') :Args(0) { my $schema = $c->model('DB'); $schema->txn_do(sub { $c->stash->{pbx_group}->update($form->params); - my $hunt_policy = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $hunt_policy = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $c->stash->{pbx_group}->provisioning_voip_subscriber, attribute => 'cloud_pbx_hunt_policy' @@ -514,7 +519,7 @@ sub pbx_group_edit :Chained('pbx_group_base') :PathPart('edit') :Args(0) { } else { $hunt_policy->create({ value => $form->params->{hunt_policy} }); } - my $hunt_timeout = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $hunt_timeout = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $c->stash->{pbx_group}->provisioning_voip_subscriber, attribute => 'cloud_pbx_hunt_timeout' diff --git a/lib/NGCP/Panel/Controller/Domain.pm b/lib/NGCP/Panel/Controller/Domain.pm index f89abf6105..a5b76f372e 100644 --- a/lib/NGCP/Panel/Controller/Domain.pm +++ b/lib/NGCP/Panel/Controller/Domain.pm @@ -5,6 +5,7 @@ use Sipwise::Base; BEGIN { extends 'Catalyst::Controller'; } use NGCP::Panel::Form::Domain::Reseller; +use NGCP::Panel::Form::Domain::ResellerPbx; use NGCP::Panel::Form::Domain::Admin; use NGCP::Panel::Utils::Message; use NGCP::Panel::Utils::Navigation; @@ -53,12 +54,35 @@ sub root :Chained('dom_list') :PathPart('') :Args(0) { my ($self, $c) = @_; } -sub create :Chained('dom_list') :PathPart('create') :Args(0) { - my ($self, $c) = @_; +sub create :Chained('dom_list') :PathPart('create') :Args() { + my ($self, $c, $reseller_id, $type) = @_; my $posted = ($c->request->method eq 'POST'); - my $form; - if($c->user->is_superuser) { + my $form; my $pbx; + if($type && $type eq 'pbx') { + unless($reseller_id && $reseller_id->is_int) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => 'invalid reseller id for creating pbx domain', + desc => 'Invalid reseller id detected.', + ); + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain')); + } + if(!$c->user->is_superuser && $reseller_id != $c->user->reseller_id) { + $c->detach('/denied_page'); + } + $c->stash->{reseller} = $c->model('DB')->resultset('resellers')->find($reseller_id); + unless($c->stash->{reseller}) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => "reseller with id $reseller_id not found when creating pbx domain", + desc => 'Reseller not found.', + ); + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/domain')); + } + $form = NGCP::Panel::Form::Domain::ResellerPbx->new(ctx => $c); + $pbx = 1; + } elsif($c->user->is_superuser) { $form = NGCP::Panel::Form::Domain::Admin->new; } else { $form = NGCP::Panel::Form::Domain::Reseller->new; @@ -74,12 +98,22 @@ sub create :Chained('dom_list') :PathPart('create') :Args(0) { if($posted && $form->validated) { try { $c->model('DB')->schema->txn_do( sub { - $c->model('DB')->resultset('voip_domains') + my $prov_dom = $c->model('DB')->resultset('voip_domains') ->create({domain => $form->value->{domain}}); my $new_dom = $c->stash->{dom_rs} ->create({domain => $form->value->{domain}}); - my $reseller_id = $c->user->is_superuser ? $form->values->{reseller}{id} : - $c->user->reseller_id; + unless($pbx) { + $reseller_id = $c->user->is_superuser ? + $form->values->{reseller}{id} : $c->user->reseller_id; + } elsif($form->values->{rwr_set}) { + my $rwr_set = $c->model('DB')->resultset('voip_rewrite_rule_sets') + ->find($form->values->{rwr_set}); + NGCP::Panel::Utils::Preferences::set_rewrite_preferences( + c => $c, + rwrs_result => $rwr_set, + pref_rs => $prov_dom->voip_dom_preferences, + ) if($rwr_set); + } $new_dom->create_related('domain_resellers', { reseller_id => $reseller_id diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index b0da03e461..06fe2027b9 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -293,7 +293,7 @@ sub terminate :Chained('base') :PathPart('terminate') :Args(0) { if($prov_subscriber->voip_pbx_group) { my $group_subscriber = $prov_subscriber->voip_pbx_group->provisioning_voip_subscriber; if($group_subscriber) { - my $hunt_group = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $hunt_group = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $group_subscriber, attribute => 'cloud_pbx_hunt_group' @@ -352,7 +352,7 @@ sub preferences :Chained('base') :PathPart('preferences') :Args(0) { } $c->stash(cf_destinations => $cfs); - my $ringtimeout_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $ringtimeout_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, attribute => 'ringtimeout', prov_subscriber => $prov_subscriber) ->first; $c->stash(cf_ringtimeout => $ringtimeout_preference ? $ringtimeout_preference->value : undef); @@ -425,9 +425,9 @@ sub preferences_callforward :Chained('base') :PathPart('preferences/callforward' my $posted = ($c->request->method eq 'POST'); my $prov_subscriber = $c->stash->{subscriber}->provisioning_voip_subscriber; - my $cf_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $cf_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $prov_subscriber, attribute => $cf_type); - my $ringtimeout_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $ringtimeout_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $prov_subscriber, attribute => 'ringtimeout'); my $cf_mapping = $prov_subscriber->voip_cf_mappings->search_rs({ type => $cf_type }); my $destination; @@ -675,9 +675,9 @@ sub preferences_callforward_advanced :Chained('base') :PathPart('preferences/cal my $prov_subscriber = $c->stash->{subscriber}->provisioning_voip_subscriber; my $cf_mapping = $prov_subscriber->voip_cf_mappings->search_rs({ type => $cf_type }); - my $cf_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $cf_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $prov_subscriber, attribute => $cf_type); - my $ringtimeout_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $ringtimeout_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $prov_subscriber, attribute => 'ringtimeout'); # TODO: we can have more than one active, no? @@ -943,11 +943,11 @@ sub preferences_callforward_destinationset_edit :Chained('preferences_callforwar my $posted = ($c->request->method eq 'POST'); - my $cf_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $cf_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, attribute => $cf_type, ); - my $ringtimeout_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $ringtimeout_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, attribute => 'ringtimeout', ); @@ -1086,11 +1086,11 @@ sub preferences_callforward_destinationset_edit :Chained('preferences_callforwar sub preferences_callforward_destinationset_delete :Chained('preferences_callforward_destinationset_base') :PathPart('delete') :Args(1) { my ($self, $c, $cf_type) = @_; - my $cf_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $cf_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, attribute => $cf_type, ); - my $ringtimeout_preference = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $ringtimeout_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, attribute => 'ringtimeout', ); @@ -1363,7 +1363,7 @@ sub preferences_callforward_delete :Chained('base') :PathPart('preferences/callf my $prov_subscriber = $c->stash->{subscriber}->provisioning_voip_subscriber; $prov_subscriber->voip_cf_mappings->search({ type => $cf_type }) ->delete_all; - my $cf_pref = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + my $cf_pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, attribute => $cf_type, prov_subscriber => $prov_subscriber, @@ -1454,7 +1454,7 @@ sub master :Chained('base') :PathPart('details') :CaptureArgs(0) { template => 'subscriber/master.tt', ); - $c->stash->{prov_lock} = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + $c->stash->{prov_lock} = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, attribute => 'lock', prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, @@ -1467,7 +1467,7 @@ sub master :Chained('base') :PathPart('details') :CaptureArgs(0) { sub details :Chained('master') :PathPart('') :Args(0) { my ($self, $c) = @_; - $c->stash->{prov_lock} = NGCP::Panel::Utils::Subscriber::get_usr_preference_rs( + $c->stash->{prov_lock} = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, attribute => 'lock', prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber, diff --git a/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm b/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm index 891e633a6d..2407ebf3ce 100644 --- a/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm +++ b/lib/NGCP/Panel/Form/Customer/PbxAdminSubscriber.pm @@ -54,7 +54,7 @@ has_field 'domain' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/webusername webpassword e164 username domain password status external_id/ ], + render_list => [qw/domain webusername webpassword e164 username password status external_id/ ], ); sub validate { diff --git a/lib/NGCP/Panel/Form/Domain/ResellerPbx.pm b/lib/NGCP/Panel/Form/Domain/ResellerPbx.pm new file mode 100644 index 0000000000..6b71d98ef2 --- /dev/null +++ b/lib/NGCP/Panel/Form/Domain/ResellerPbx.pm @@ -0,0 +1,38 @@ +package NGCP::Panel::Form::Domain::ResellerPbx; + +use HTML::FormHandler::Moose; +extends 'NGCP::Panel::Form::Domain::Reseller'; + +has_field 'rwr_set' => ( + type => 'Select', + label => 'Rewrite Rule Set', + options_method => \&build_rwr_sets, + default => undef, +); + +sub build_rwr_sets { + my ($self) = @_; + + my $c = $self->form->ctx; + my @options; + + push @options, { label => '', value => undef }; + if(defined $c) { + my $sets = $c->stash->{reseller}->voip_rewrite_rule_sets; + use Data::Printer; p $sets->all; + foreach my $s($sets->all) { + push @options, { label => $s->name, value => $s->id }; + } + } + + return \@options; +} + +has_block 'fields' => ( + tag => 'div', + class => [qw/modal-body/], + render_list => [qw/id domain rwr_set/], +); + +1; +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index b4259e2079..2e36a83e82 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -240,7 +240,7 @@ sub create_preference_form { my $selected_rwrs = $c->stash->{rwr_sets_rs}->find( $form->field($attribute)->value ); - _set_rewrite_preferences( + set_rewrite_preferences( c => $c, rwrs_result => $selected_rwrs, pref_rs => $pref_rs, @@ -365,7 +365,7 @@ sub create_preference_form { man_aip_grp_rs => $man_aip_grp_rs); } -sub _set_rewrite_preferences { +sub set_rewrite_preferences { my %params = @_; my $c = $params{c}; @@ -392,6 +392,36 @@ sub _set_rewrite_preferences { } +sub get_usr_preference_rs { + my %params = @_; + + my $c = $params{c}; + my $attribute = $params{attribute}; + my $prov_subscriber= $params{prov_subscriber}; + + my $preference = $c->model('DB')->resultset('voip_preferences')->find({ + attribute => $attribute, 'usr_pref' => 1, + })->voip_usr_preferences->search_rs({ + subscriber_id => $prov_subscriber->id, + }); + return $preference; +} + +sub get_dom_preference_rs { + my %params = @_; + + my $c = $params{c}; + my $attribute = $params{attribute}; + my $prov_domain = $params{prov_domain}; + + my $preference = $c->model('DB')->resultset('voip_preferences')->find({ + attribute => $attribute, 'dom_pref' => 1, + })->voip_usr_preferences->search_rs({ + domain_id => $prov_domain->id, + }); + return $preference; +} + 1; =head1 NAME @@ -443,7 +473,7 @@ set in the template (to be used by F). On update 4 voip_*_preferences will be created with the attributes rewrite_callee_in_dpid, rewrite_caller_in_dpid, rewrite_callee_out_dpid -and rewrite_caller_out_dpid (using the helper method _set_rewrite_preferences). +and rewrite_caller_out_dpid (using the helper method set_rewrite_preferences). For compatibility with ossbss and the www_admin panel, no preference with the attribute rewrite_rule_set is created and caller_in_dpid is used to @@ -470,7 +500,7 @@ The preference with the attribute sound_set will contain the id of a sound_set. Also something special here. The table containing data is provisioning.voip_allowed_ip_groups. -=head2 _set_rewrite_preferences +=head2 set_rewrite_preferences See "Special case rewrite_rule_set". diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 24afab9adf..54a1d38f90 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -5,6 +5,7 @@ use warnings; use Sipwise::Base; use DBIx::Class::Exception; use NGCP::Panel::Utils::DateTime; +use NGCP::Panel::Utils::Preferences; use UUID qw/generate unparse/; my %LOCK = ( @@ -15,20 +16,6 @@ my %LOCK = ( 4, 'global', ); -sub get_usr_preference_rs { - my %params = @_; - - my $c = $params{c}; - my $attribute = $params{attribute}; - my $prov_subscriber= $params{prov_subscriber}; - - my $preference = $c->model('DB')->resultset('voip_preferences')->find({ - attribute => $attribute, 'usr_pref' => 1, - })->voip_usr_preferences->search_rs({ - subscriber_id => $prov_subscriber->id, - }); - return $preference; -} sub period_as_string { my $set = shift; @@ -98,7 +85,7 @@ sub lock_provisoning_voip_subscriber { return unless $prov_subscriber; - my $rs = get_usr_preference_rs( + my $rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, prov_subscriber => $prov_subscriber, attribute => 'lock' @@ -210,7 +197,7 @@ sub create_subscriber { if(defined $cli); foreach my $k(keys %{ $preferences } ) { - my $pref = get_usr_preference_rs( + my $pref = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, attribute => $k, prov_subscriber => $prov_subscriber); if($pref->first && $pref->first->attribute->max_occur == 1) { $pref->first->update({ @@ -289,15 +276,6 @@ A temporary helper to manipulate subscriber data =head1 METHODS -=head2 get_usr_preference_rs - -Parameters: - c The controller - prov_subscriber The provisioning_voip_subscriber row - attribute The name of the usr preference - -Returns a result set for the voip_usr_preference of the given subscriber. - =head1 AUTHOR Andreas Granig,