From 03a6f4a68beef8b34717b5fb9ee62883da07ea96 Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Fri, 19 Dec 2014 15:40:23 +0100 Subject: [PATCH] MT#10705 Set group members from within group. Change-Id: I91695bc1baedb189e978a4269648b1e62dd5b680 --- lib/NGCP/Panel/Field/PbxGroupMemberAPI.pm | 15 ++++ .../Panel/Form/Subscriber/SubscriberAPI.pm | 15 ++++ lib/NGCP/Panel/Role/API/Subscribers.pm | 87 ++++++++++++++++--- 3 files changed, 104 insertions(+), 13 deletions(-) create mode 100644 lib/NGCP/Panel/Field/PbxGroupMemberAPI.pm diff --git a/lib/NGCP/Panel/Field/PbxGroupMemberAPI.pm b/lib/NGCP/Panel/Field/PbxGroupMemberAPI.pm new file mode 100644 index 0000000000..666b24e819 --- /dev/null +++ b/lib/NGCP/Panel/Field/PbxGroupMemberAPI.pm @@ -0,0 +1,15 @@ +package NGCP::Panel::Field::PbxGroupMemberAPI; +use HTML::FormHandler::Moose; + +extends 'HTML::FormHandler::Field'; + +has_field 'dummy' => ( + type => 'Text', + required => 0, + label => 'PBX Subscriber IDs', + do_label => 1, +); + +1; + +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm b/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm index eb3cd745f0..018e7ad668 100644 --- a/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm +++ b/lib/NGCP/Panel/Form/Subscriber/SubscriberAPI.pm @@ -94,6 +94,21 @@ has_field 'pbx_group_ids' => ( }, ); +has_field 'pbx_groupmember_ids' => ( + type => '+NGCP::Panel::Field::PbxGroupMemberAPI', + setup_for_js => 1, + do_wrapper => 1, + do_label => 0, + tags => { + controls_div => 1, + }, + wrapper_class => [qw/hfh-rep/], + element_attr => { + rel => ['tooltip'], + title => ['An array of PBX subscriber ids belonging to this group.'], + }, +); + has_field 'pbx_hunt_policy' => ( type => 'Select', options => [ diff --git a/lib/NGCP/Panel/Role/API/Subscribers.pm b/lib/NGCP/Panel/Role/API/Subscribers.pm index 825d5c1b2d..523fd7ff84 100644 --- a/lib/NGCP/Panel/Role/API/Subscribers.pm +++ b/lib/NGCP/Panel/Role/API/Subscribers.pm @@ -68,6 +68,12 @@ sub resource_from_item { foreach my $group($item->provisioning_voip_subscriber->voip_pbx_groups->all) { push @{ $resource{pbx_group_ids} }, int($group->group->voip_subscriber->id); } + if($item->provisioning_voip_subscriber->is_pbx_group) { + $resource{pbx_groupmember_ids} = []; + foreach my $member($item->provisioning_voip_subscriber->voip_pbx_group_members->all) { + push @{ $resource{pbx_groupmember_ids} }, int($member->subscriber->voip_subscriber->id); + } + } } if($item->primary_number) { @@ -212,6 +218,7 @@ sub prepare_resource { my ($self, $c, $schema, $resource, $item) = @_; my @groups = (); + my @groupmembers = (); my $domain; if($resource->{domain}) { $domain = $c->model('DB')->resultset('domains') @@ -367,6 +374,30 @@ sub prepare_resource { push @groups, $group_subscriber; } } + } else { + if(exists $resource->{pbx_groupmember_ids}) { + if(ref $resource->{pbx_groupmember_ids} eq "") { + $resource->{pbx_groupmember_ids} = [ $resource->{pbx_groupmember_ids} ]; + } + unless(ref $resource->{pbx_groupmember_ids} eq "ARRAY") { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid pbx_groupmember_ids parameter, must be an array."); + return; + } + foreach my $sub_id(@{ $resource->{pbx_groupmember_ids} }) { + my $group_subscriber = $c->model('DB')->resultset('voip_subscribers')->find({ + id => $sub_id, + contract_id => $resource->{customer_id}, + 'provisioning_voip_subscriber.is_pbx_group' => 0, + },{ + join => 'provisioning_voip_subscriber', + }); + unless($group_subscriber) { + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid id '$sub_id' in pbx_groupmember_ids, does not exist for this customer."); + return; + } + push @groupmembers, $group_subscriber; + } + } } } @@ -448,6 +479,7 @@ sub prepare_resource { alias_numbers => $alias_numbers, preferences => $preferences, groups => \@groups, + groupmembers => \@groupmembers, }; return $r; @@ -461,6 +493,7 @@ sub update_item { my $alias_numbers = $full_resource->{alias_numbers}; my $preferences = $full_resource->{preferences}; my $groups = $full_resource->{groups}; + my $groupmembers = $full_resource->{groupmembers}; my $prov_subscriber = $subscriber->provisioning_voip_subscriber; if($subscriber->provisioning_voip_subscriber->is_pbx_pilot && !$self->is_true($resource->{is_pbx_pilot})) { @@ -527,9 +560,9 @@ sub update_item { } # if the profile changed, clear any preferences which are not in the new profile - if($subscriber->provisioning_voip_subscriber->voip_subscriber_profile) { + if($prov_subscriber->voip_subscriber_profile) { my %old_profile_attributes = map { $_ => 1 } - $subscriber->provisioning_voip_subscriber->voip_subscriber_profile + $prov_subscriber->voip_subscriber_profile ->profile_attributes->get_column('attribute_id')->all; if($profile) { foreach my $attr_id($profile->profile_attributes->get_column('attribute_id')->all) { @@ -541,10 +574,10 @@ sub update_item { id => { -in => [ keys %old_profile_attributes ] }, attribute => { -in => [qw/cfu cfb cft cfna/] }, }); - $subscriber->provisioning_voip_subscriber->voip_usr_preferences->search({ + $prov_subscriber->voip_usr_preferences->search({ attribute_id => { -in => [ keys %old_profile_attributes ] }, })->delete; - $subscriber->provisioning_voip_subscriber->voip_cf_mappings->search({ + $prov_subscriber->voip_cf_mappings->search({ type => { -in => [ map { $_->attribute } $cfs->all ] }, })->delete; } @@ -600,7 +633,7 @@ sub update_item { $provisioning_res->{pbx_hunt_timeout} = $resource->{pbx_hunt_timeout}; NGCP::Panel::Utils::Subscriber::update_subscriber_pbx_policy( c => $c, - prov_subscriber => $subscriber->provisioning_voip_subscriber, + prov_subscriber => $prov_subscriber, 'values' => { cloud_pbx_hunt_policy => $resource->{cloud_pbx_hunt_policy} // $resource->{pbx_hunt_policy}, cloud_pbx_hunt_timeout => $resource->{cloud_pbx_hunt_policy} // $resource->{pbx_hunt_timeout}, @@ -610,8 +643,9 @@ sub update_item { my $old_profile = $prov_subscriber->profile_id; $subscriber->update($billing_res); - $subscriber->provisioning_voip_subscriber->update($provisioning_res); $subscriber->discard_changes; + $prov_subscriber->update($provisioning_res); + $prov_subscriber->discard_changes; if(($prov_subscriber->profile_id // 0) != ($old_profile // 0)) { my $type; @@ -630,17 +664,16 @@ sub update_item { NGCP::Panel::Utils::Subscriber::update_preferences( c => $c, - prov_subscriber => $subscriber->provisioning_voip_subscriber, + prov_subscriber => $prov_subscriber, preferences => $preferences, ); - my @old_groups = $subscriber->provisioning_voip_subscriber - ->voip_pbx_groups->get_column('group_id')->all; + my @old_groups = $prov_subscriber->voip_pbx_groups->get_column('group_id')->all; my @new_groups = (); foreach my $group(@{ $groups }) { push @new_groups, $group->provisioning_voip_subscriber->id; unless(grep { $group->provisioning_voip_subscriber->id eq $_ } @old_groups) { - $subscriber->provisioning_voip_subscriber->voip_pbx_groups->create({ + $prov_subscriber->voip_pbx_groups->create({ group_id => $group->provisioning_voip_subscriber->id, }); NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs( @@ -673,14 +706,42 @@ sub update_item { status => { '!=' => 'terminated' }, }), ); - $subscriber->provisioning_voip_subscriber->voip_pbx_groups->search({ + $prov_subscriber->voip_pbx_groups->search({ group_id => $group_id, - subscriber_id => $subscriber->provisioning_voip_subscriber->id, + subscriber_id => $prov_subscriber->id, })->delete; } } - # TODO: status handling (termination, ...) + my @old_members = $prov_subscriber->voip_pbx_group_members->get_column('subscriber_id')->all; + my @new_members = (); + my $grp_pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs( + c => $c, attribute => 'cloud_pbx_hunt_group', + prov_subscriber => $prov_subscriber, + ); + foreach my $member(@{ $groupmembers }) { + my $uri = 'sip:' . $member->username . '@' . $member->domain->domain; + push @new_members, $member->provisioning_voip_subscriber->id; + unless($prov_subscriber->voip_pbx_group_members->find({ + subscriber_id => $member->provisioning_voip_subscriber->id, + })) { + $prov_subscriber->voip_pbx_group_members->create({ + subscriber_id => $member->provisioning_voip_subscriber->id, + }); + $grp_pref_rs->create({ value => $uri }); + } + } + foreach my $old_member_id(@old_members) { + unless(grep { $old_member_id eq $_ } @new_members) { + my $grp = $prov_subscriber->voip_pbx_group_members + ->find({ subscriber_id => $old_member_id }); + my $oldsub = $grp->subscriber; + $grp->delete; + $grp_pref_rs->find( + { value => 'sip:' . $oldsub->username . '@' . $oldsub->domain->domain } + )->delete; + } + } return $subscriber; }