From 558bb1c2fcb24d33782d40ba81c46aab470ecc63 Mon Sep 17 00:00:00 2001 From: Irina Peshinskaya Date: Wed, 24 Jun 2015 04:20:15 +0300 Subject: [PATCH] MT#12939 Manage pbx groups and members order through the web-Panel Change-Id: I46e921cdbbe26ec2e0cf291abbb08bbabb4ae5b1 --- lib/NGCP/Panel/Controller/Subscriber.pm | 41 +++++++++++- lib/NGCP/Panel/Utils/Subscriber.pm | 67 ++++++++++++++++--- share/templates/subscriber/master.tt | 30 ++++++++- share/templates/subscriber/pbx_group_items.tt | 39 +++++++++++ 4 files changed, 163 insertions(+), 14 deletions(-) create mode 100644 share/templates/subscriber/pbx_group_items.tt diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index f3dd045e43..17923e9758 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -289,6 +289,11 @@ sub base :Chained('sub_list') :PathPart('') :CaptureArgs(1) { customer_id => $c->stash->{contract}->id , is_group => 1, ); + $c->stash->{subscriber_pbx_items} = NGCP::Panel::Utils::Subscriber::get_subscriber_pbx_items( + c => $c, + schema => $c->model('DB'), + subscriber => $c->stash->{subscriber} , + ); } } @@ -2563,7 +2568,41 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet } -sub aliases_ajax :Chained('master') :PathPart('aliases/ajax') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) :AllowedRole(subscriberadmin) { +sub order_pbx_items :Chained('master') :PathPart('orderpbxitems') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) : AllowedRole(reseller) :AllowedRole(subscriberadmin) { + my ($self, $c) = @_; + + my $move_id = $c->req->params->{move}; + my $direction = $c->req->params->{where}; + + my $subscriber = $c->stash->{subscriber}; + my $prov_subscriber = $subscriber->provisioning_voip_subscriber; + my $items = $c->stash->{subscriber_pbx_items}; + + if(defined $move_id){ + for( my $i=0; $i <= $#$items; $i++ ){ + if($move_id == $items->[$i]->id){ + my $i_subling = $i + ( ( $direction eq 'up' ) ? -1 : 1 ); + @{$items}[$i,$i_subling] = @{$items}[$i_subling,$i]; + last; + } + } + NGCP::Panel::Utils::Subscriber::manage_pbx_groups( + c => $c, + schema => $c->model('DB'), + subscriber => $subscriber, + ( $prov_subscriber->is_pbx_group ? 'groupmembers' : 'groups' ) => $items, + ); + } + $c->stash->{subscriber_pbx_items} = NGCP::Panel::Utils::Subscriber::get_subscriber_pbx_items( + c => $c, + schema => $c->model('DB'), + subscriber => $subscriber , + ); + $c->stash->{template} = 'subscriber/pbx_group_items.tt'; + $c->detach( $c->view('TT') ); +} + +sub aliases_ajax :Chained('master') :PathPart('ordergroups') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) :AllowedRole(subscriberadmin) { my ($self, $c) = @_; my $subscriber = $c->stash->{subscriber}; diff --git a/lib/NGCP/Panel/Utils/Subscriber.pm b/lib/NGCP/Panel/Utils/Subscriber.pm index 60996374c7..506eb05420 100644 --- a/lib/NGCP/Panel/Utils/Subscriber.pm +++ b/lib/NGCP/Panel/Utils/Subscriber.pm @@ -399,13 +399,13 @@ sub get_pbx_subscribers_by_ids{ my $ids = $params{ids} // []; my $customer_id = $params{customer_id} // 0; my $is_group = $params{is_group}; - + my $pbx_subscribers_rs = get_pbx_subscribers_rs(@_); my (@items,@absent_items_ids); @items = $pbx_subscribers_rs->all(); - + my %items_ids_exists = map{ $_->id => 0 } @items; if(@$ids){ @@ -413,12 +413,55 @@ sub get_pbx_subscribers_by_ids{ @$order_hash{@$ids} = (1..$#$ids+1); @items = sort { $order_hash->{$a->id} <=> $order_hash->{$b->id} } @items; } - + if($#items < $#$ids){ @absent_items_ids = grep { !exists $items_ids_exists{$_} } @{$params{ids}}; } - return \@items, (( 0 < @absent_items_ids) ? \@absent_items_ids : undef ) ; + return wantarray ? (\@items, (( 0 < @absent_items_ids) ? \@absent_items_ids : undef )) : \@items; +} +sub get_subscriber_pbx_items{ + my %params = @_; + + my $c = $params{c}; + my $schema = $params{schema} // $c->model('DB'); + my $subscriber = $params{subscriber}; + + my $prov_subscriber = $subscriber->provisioning_voip_subscriber; + my $items_are_groups = !($prov_subscriber->is_pbx_group); + my $ids = get_subscriber_pbx_items_ids(@_); + my $items = get_pbx_subscribers_by_ids( + c => $c, + schema => $schema, + customer_id => $subscriber->contract->id , + is_group => $items_are_groups, + ids => $ids, + ); + return wantarray ? ($items, $ids) : $items; +} + +sub get_subscriber_pbx_items_ids{ + my %params = @_; + + my $c = $params{c}; + my $schema = $params{schema} // $c->model('DB'); + my $subscriber = $params{subscriber}; + + my $prov_subscriber = $subscriber->provisioning_voip_subscriber; + my $items_are_groups = !($prov_subscriber->is_pbx_group); + my $select_attributes = { + 'order_by' => 'me.id', + 'select' => 'voip_subscriber.id', + 'as' => 'voip_subscriber_id', + 'join' => { ( $items_are_groups ? 'group' : 'subscriber' ) => 'voip_subscriber'}, + }; + my $ids; + if($items_are_groups){ + $ids = [ $prov_subscriber->voip_pbx_groups->search_rs(undef,$select_attributes)->get_column('voip_subscriber_id')->all]; + }else{ + $ids = [ $prov_subscriber->voip_pbx_group_members->search_rs(undef,$select_attributes)->get_column('voip_subscriber_id')->all]; + } + return $ids; } sub manage_pbx_groups{ @@ -431,14 +474,14 @@ sub manage_pbx_groups{ my $subscriber = $params{subscriber}; my $customer = $params{customer} // $subscriber->contract; - my ($groups) = $params{groups} // ( @$group_ids ? get_pbx_subscribers_by_ids( + my $groups = $params{groups} // ( @$group_ids ? get_pbx_subscribers_by_ids( c => $c, schema => $schema, ids => $group_ids, customer_id => $customer->id, is_group => 1, ) : [] ); - my ($groupmembers) = $params{groupmembers} // ( @$groupmember_ids ? get_pbx_subscribers_by_ids( + my $groupmembers = $params{groupmembers} // ( @$groupmember_ids ? get_pbx_subscribers_by_ids( c => $c, schema => $schema, ids => $groupmember_ids, @@ -462,15 +505,15 @@ sub manage_pbx_groups{ #create new groups foreach my $group(@{ $groups }) { - my $group_voip_subscriber = $group->provisioning_voip_subscriber; - next unless( $group_voip_subscriber && $group_voip_subscriber->is_pbx_group ); + my $group_prov_subscriber = $group->provisioning_voip_subscriber; + next unless( $group_prov_subscriber && $group_prov_subscriber->is_pbx_group ); $prov_subscriber->voip_pbx_groups->create({ - group_id => $group_voip_subscriber->id, + group_id => $group_prov_subscriber->id, }); my $preferences_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( c => $c, attribute => 'cloud_pbx_hunt_group', - prov_subscriber => $group_voip_subscriber, + prov_subscriber => $group_prov_subscriber, ); $preferences_rs->create({ value => $subscriber_uri }); } @@ -485,9 +528,11 @@ sub manage_pbx_groups{ $group_preferences_rs->delete; foreach my $member(@{ $groupmembers }) { + my $member_prov_subscriber = $member->provisioning_voip_subscriber; + next unless( $member_prov_subscriber && !$member_prov_subscriber->is_pbx_group ); my $member_uri = get_pbx_group_member_name( subscriber => $member ); $prov_subscriber->voip_pbx_group_members->create({ - subscriber_id => $member->provisioning_voip_subscriber->id, + subscriber_id => $member_prov_subscriber->id, }); $group_preferences_rs->create({ value => $member_uri }); } diff --git a/share/templates/subscriber/master.tt b/share/templates/subscriber/master.tt index 7579014bb7..0bf3c3b2fe 100644 --- a/share/templates/subscriber/master.tt +++ b/share/templates/subscriber/master.tt @@ -165,7 +165,9 @@ c.user.roles == 'subscriberadmin' -%] - + + + +
+ +
+
+[%PROCESS 'subscriber/pbx_group_items.tt' %] +
+
+
+
- + [%PROCESS 'subscriber/call_details_wrapper.tt' %] [% helper.name = 'Calls'; diff --git a/share/templates/subscriber/pbx_group_items.tt b/share/templates/subscriber/pbx_group_items.tt new file mode 100644 index 0000000000..5eb64e66ef --- /dev/null +++ b/share/templates/subscriber/pbx_group_items.tt @@ -0,0 +1,39 @@ + + + + + + + + + + + + + [% FOR item IN subscriber_pbx_items %] + + + + + + + [% END %] + +
#[%IF subscriber.provisioning_voip_subscriber.is_pbx_group; c.loc('Group member'); ELSE; c.loc('Group'); END%]
+ [%IF !loop.first() %] + + + + [%END%] + [%IF !loop.last() %] + + + + [%END%] + [% item.id %][% item.username %]@[% item.domain.domain %] + +