MT#10705 Set group members from within group.

Change-Id: I91695bc1baedb189e978a4269648b1e62dd5b680
changes/76/676/1
Andreas Granig 11 years ago
parent 64093a0a88
commit 03a6f4a68b

@ -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:

@ -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 => [

@ -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;
}

Loading…
Cancel
Save