MT#12937 Replace groups managements different code parts with common methods

Change-Id: If598ff0b3cef7c9c8c21ad2c509bce0d9fc4edb7
changes/06/1906/5
Irina Peshinskaya 11 years ago
parent 6c03eddc05
commit 003e717c02

@ -304,6 +304,7 @@ sub POST :Allow {
my $alias_numbers = $r->{alias_numbers};
my $preferences = $r->{preferences};
my $groups = $r->{groups};
my $groupmembers = $r->{groupmembers};
$resource = $r->{resource};
try {
@ -334,24 +335,14 @@ sub POST :Allow {
subscriber_id => $subscriber->id,
);
$subscriber->discard_changes; # reload row because of new number
foreach my $group(@{ $groups }) {
$subscriber->provisioning_voip_subscriber->voip_pbx_groups->create({
group_id => $group->provisioning_voip_subscriber->id,
});
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $group->id,
username => $subscriber->username,
domain => $subscriber->domain->domain,
group_rs => $schema->resultset('voip_subscribers')->search({
contract_id => $customer->id,
status => { '!=' => 'terminated' },
}),
);
}
NGCP::Panel::Utils::Subscriber::manage_pbx_groups(
c => $c,
schema => $schema,
groups => $groups,
groupmembers => $groupmembers,
customer => $customer,
subscriber => $subscriber,
);
} catch(DBIx::Class::Exception $e where { /Duplicate entry '([^']+)' for key 'number_idx'/ }) {
$e =~ /Duplicate entry '([^']+)' for key 'number_idx'/;

@ -308,13 +308,12 @@ sub base :Chained('list_customer') :PathPart('') :CaptureArgs(1) {
join => 'provisioning_voip_subscriber',
});
if($c->config->{features}->{cloudpbx}) {
$c->stash->{pbx_groups} = $c->model('DB')->resultset('voip_subscribers')->search({
contract_id => $contract_id,
status => { '!=' => 'terminated' },
'provisioning_voip_subscriber.is_pbx_group' => 1,
}, {
join => 'provisioning_voip_subscriber',
});
$c->stash->{pbx_groups} = NGCP::Panel::Utils::Subscriber::get_pbx_subscribers_rs(
c => $c,
schema => $c->model('DB'),
customer_id => $contract_id,
is_group => 1,
);
}
my $field_devs = [ $c->model('DB')->resultset('autoprov_field_devices')->search({
@ -644,12 +643,12 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
my $schema = $c->model('DB');
$schema->txn_do(sub {
my $preferences = {};
my $pbxgroups = [];
my $pbx_group_ids = [];
if($pbx && !$pbxadmin) {
my $pilot = $c->stash->{pilot};
$form->params->{domain}{id} = $pilot->domain_id;
if ($form->params->{group_select}) {
$pbxgroups = decode_json($form->params->{group_select});
$pbx_group_ids = decode_json($form->params->{group_select});
}
my $base_number = $pilot->primary_number;
if($base_number) {
@ -712,24 +711,14 @@ sub subscriber_create :Chained('base') :PathPart('subscriber/create') :Args(0) {
alias_selected => decode_json($form->value->{alias_select}),
sadmin => $c->stash->{pilot},
);
foreach my $group_id(@{ $pbxgroups }) {
my $group = $c->model('DB')->resultset('voip_subscribers')->find($group_id);
next unless($group && $group->provisioning_voip_subscriber && $group->provisioning_voip_subscriber->is_pbx_group);
$billing_subscriber->provisioning_voip_subscriber->voip_pbx_groups->create({
group_id => $group->provisioning_voip_subscriber->id,
});
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $group_id,
username => $billing_subscriber->username,
domain => $billing_subscriber->domain->domain,
);
}
NGCP::Panel::Utils::Subscriber::manage_pbx_groups(
c => $c,
schema => $schema,
group_ids => $pbx_group_ids,
customer => $c->stash->{contract},
subscriber => $billing_subscriber,
);
}
});
delete $c->session->{created_objects}->{domain};
@ -1071,10 +1060,10 @@ sub pbx_group_edit :Chained('pbx_group_base') :PathPart('edit') :Args(0) {
$schema->txn_do(sub {
my $old_extension = $c->stash->{pbx_group}->provisioning_voip_subscriber->pbx_extension;
$c->stash->{pbx_group}->provisioning_voip_subscriber->update($form->values);
NGCP::Panel::Utils::Subscriber::update_subscriber_pbx_policy(
NGCP::Panel::Utils::Subscriber::update_preferences(
c => $c,
prov_subscriber => $c->stash->{pbx_group}->provisioning_voip_subscriber,
'values' => {
'preferences' => {
cloud_pbx_hunt_policy => $form->values->{pbx_hunt_policy},
cloud_pbx_hunt_timeout => $form->values->{pbx_hunt_timeout},
}

@ -283,13 +283,12 @@ sub base :Chained('sub_list') :PathPart('') :CaptureArgs(1) {
]);
if($c->stash->{billing_mapping}->product->class eq "pbxaccount") {
$c->stash->{pbx_groups} = $c->model('DB')->resultset('voip_subscribers')->search({
contract_id => $c->stash->{subscriber}->contract->id,
status => { '!=' => 'terminated' },
'provisioning_voip_subscriber.is_pbx_group' => 1,
}, {
join => 'provisioning_voip_subscriber',
});
$c->stash->{pbx_groups} = NGCP::Panel::Utils::Subscriber::get_pbx_subscribers_rs(
c => $c,
schema => $c->model('DB'),
customer_id => $c->stash->{contract}->id ,
is_group => 1,
);
}
}
@ -2388,48 +2387,14 @@ sub edit_master :Chained('master') :PathPart('edit') :Args(0) :Does(ACL) :ACLDet
type => $type, old => $old_profile, new => $prov_subscriber->profile_id
);
}
my @old_groups = $prov_subscriber->voip_pbx_groups->get_column('group_id')->all;
my $new_group_ids = defined $form->value->{group_select} ?
decode_json($form->value->{group_select}) : [];
my @new_groups = ();
foreach my $group_id(@{ $new_group_ids }) {
# add subscriber to group if not there yet
my $group = $schema->resultset('voip_subscribers')->find($group_id);
next unless($group && $group->provisioning_voip_subscriber && $group->provisioning_voip_subscriber->is_pbx_group);
push @new_groups, $group->provisioning_voip_subscriber->id;
unless(grep { $group->provisioning_voip_subscriber->id eq $_ } @old_groups) {
$prov_subscriber->voip_pbx_groups->create({
group_id => $group->provisioning_voip_subscriber->id,
});
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $group_id,
username => $subscriber->username,
domain => $subscriber->domain->domain,
);
}
}
foreach my $group_id(@old_groups) {
# remove subscriber from group if not there anymore
unless(grep { $group_id eq $_ } @new_groups) {
my $group = $schema->resultset('provisioning_voip_subscribers')->find($group_id);
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $group->voip_subscriber->id,
new_group_id => undef,
username => $subscriber->username,
domain => $subscriber->domain->domain,
);
$prov_subscriber->voip_pbx_groups->search({
group_id => $group_id,
subscriber_id => $prov_subscriber->id,
})->delete;
}
}
NGCP::Panel::Utils::Subscriber::manage_pbx_groups(
c => $c,
schema => $schema,
group_ids => $new_group_ids,
subscriber => $subscriber,
);
my $old_ext_id = $subscriber->external_id;
$subscriber->update({

@ -65,12 +65,12 @@ sub resource_from_item {
if($customer->get_column('product_class') eq 'pbxaccount') {
$resource{pbx_group_ids} = [];
foreach my $group($item->provisioning_voip_subscriber->voip_pbx_groups->all) {
foreach my $group($item->provisioning_voip_subscriber->voip_pbx_groups->search_rs(undef,{'order_by' => 'me.id'})->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) {
foreach my $member($item->provisioning_voip_subscriber->voip_pbx_group_members->search_rs(undef,{'order_by' => 'me.id'})->all) {
push @{ $resource{pbx_groupmember_ids} }, int($member->subscriber->voip_subscriber->id);
}
}
@ -219,8 +219,8 @@ sub get_billing_profile {
sub prepare_resource {
my ($self, $c, $schema, $resource, $item) = @_;
my @groups = ();
my @groupmembers = ();
my $groups = [];
my $groupmembers = [];
my $domain;
if($resource->{domain}) {
$domain = $c->model('DB')->resultset('domains')
@ -361,19 +361,17 @@ sub prepare_resource {
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid pbx_group_ids parameter, must be an array.");
return;
}
foreach my $group_id(@{ $resource->{pbx_group_ids} }) {
my $group_subscriber = $c->model('DB')->resultset('voip_subscribers')->find({
id => $group_id,
contract_id => $resource->{customer_id},
'provisioning_voip_subscriber.is_pbx_group' => 1,
},{
join => 'provisioning_voip_subscriber',
});
unless($group_subscriber) {
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid id '$group_id' in pbx_group_ids, does not exist for this customer.");
return;
}
push @groups, $group_subscriber;
my $absent_ids;
($groups,$absent_ids) = NGCP::Panel::Utils::Subscriber::get_pbx_subscribers_by_ids(
c => $c,
schema => $schema,
ids => $resource->{pbx_group_ids},
customer_id => $resource->{customer_id},
is_group => 1,
);
if($absent_ids){
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid id '".$absent_ids->[0]."' in pbx_group_ids, does not exist for this customer.");
return;
}
}
} else {
@ -385,20 +383,19 @@ sub prepare_resource {
$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;
my $absent_ids;
($groupmembers,$absent_ids) = NGCP::Panel::Utils::Subscriber::get_pbx_subscribers_by_ids(
c => $c,
schema => $schema,
ids => $resource->{pbx_groupmember_ids},
customer_id => $resource->{customer_id},
is_group => 0,
);
if($absent_ids){
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Invalid id '".$absent_ids->[0]."' in pbx_groupmember_ids, does not exist for this customer.");
return;
}
}
}
}
@ -480,8 +477,8 @@ sub prepare_resource {
customer => $customer,
alias_numbers => $alias_numbers,
preferences => $preferences,
groups => \@groups,
groupmembers => \@groupmembers,
groups => $groups,
groupmembers => $groupmembers,
};
return $r;
@ -633,10 +630,10 @@ sub update_item {
if($self->is_true($resource->{is_pbx_group})) {
$provisioning_res->{pbx_hunt_policy} = $resource->{pbx_hunt_policy};
$provisioning_res->{pbx_hunt_timeout} = $resource->{pbx_hunt_timeout};
NGCP::Panel::Utils::Subscriber::update_subscriber_pbx_policy(
NGCP::Panel::Utils::Subscriber::update_preferences(
c => $c,
prov_subscriber => $prov_subscriber,
'values' => {
'preferences' => {
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},
}
@ -665,85 +662,19 @@ sub update_item {
}
NGCP::Panel::Utils::Subscriber::update_preferences(
c => $c,
c => $c,
prov_subscriber => $prov_subscriber,
preferences => $preferences,
);
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) {
$prov_subscriber->voip_pbx_groups->create({
group_id => $group->provisioning_voip_subscriber->id,
});
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => undef,
new_group_id => $group->id,
username => $subscriber->username,
domain => $subscriber->domain->domain,
group_rs => $schema->resultset('voip_subscribers')->search({
contract_id => $customer->id,
status => { '!=' => 'terminated' },
}),
);
}
}
foreach my $group_id(@old_groups) {
# remove subscriber from group if not there anymore
unless(grep { $group_id eq $_ } @new_groups) {
my $group = $schema->resultset('provisioning_voip_subscribers')->find($group_id);
NGCP::Panel::Utils::Subscriber::update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $group->voip_subscriber->id,
new_group_id => undef,
username => $subscriber->username,
domain => $subscriber->domain->domain,
group_rs => $schema->resultset('voip_subscribers')->search({
contract_id => $customer->id,
status => { '!=' => 'terminated' },
}),
);
$prov_subscriber->voip_pbx_groups->search({
group_id => $group_id,
subscriber_id => $prov_subscriber->id,
})->delete;
}
}
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,
NGCP::Panel::Utils::Subscriber::manage_pbx_groups(
c => $c,
schema => $schema,
groups => $groups,
groupmembers => $groupmembers,
customer => $customer,
subscriber => $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;
}

@ -343,29 +343,6 @@ sub create_subscriber {
return $billing_subscriber;
});
}
sub update_subscriber_pbx_policy {
my (%params) = @_;
my $c = $params{c};
my $prov_subscriber = $params{prov_subscriber};
my $values = $params{values};
#todo: use update_preferences instead?
foreach(qw/cloud_pbx_hunt_policy cloud_pbx_hunt_timeout/){
my $preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c,
prov_subscriber => $prov_subscriber,
attribute => $_
);
if($preference) {
if($preference && $preference->first) {
$preference->first->update({ value => $values->{$_} });
} else {
$preference->create({ value => $values->{$_} });
}
}
}
}
sub update_preferences {
my (%params) = @_;
my $c = $params{c};
@ -392,52 +369,134 @@ sub update_preferences {
return;
}
sub update_pbx_group_prefs {
sub get_pbx_subscribers_rs{
my %params = @_;
my $c = $params{c};
my $schema = $params{schema} // $c->model('DB');
my $old_group_id = $params{old_group_id};
my $new_group_id = $params{new_group_id};
my $username = $params{username};
my $domain = $params{domain};
my $group_rs = $params{group_rs} // $c->stash->{pbx_groups};
my $c = $params{c};
my $schema = $params{schema} // $c->model('DB');
my $ids = $params{ids} // [];
my $customer_id = $params{customer_id} // 0;
my $is_group = $params{is_group};
my $rs = $schema->resultset('voip_subscribers')->search_rs(
{
'status' => { '!=' => 'terminated' },
@$ids ? ( 'me.id' => { -in => $ids } ) : (),
$customer_id ? ( 'contract_id' => $customer_id ) : (),
$is_group ? ( 'provisioning_voip_subscriber.is_pbx_group' => $is_group ) : (),
},{
join => 'provisioning_voip_subscriber',
}
);
return $rs;
}
#the method named "item" as it can return both groups or groups members
sub get_pbx_subscribers_by_ids{
my %params = @_;
return if(defined $old_group_id && defined $new_group_id && $old_group_id == $new_group_id);
unless ($group_rs) {
$c->log->warn('update_pbx_group_prefs: need a group_rs');
return;
my $c = $params{c};
my $schema = $params{schema} // $c->model('DB');
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){
my $order_hash = { %items_ids_exists };
@$order_hash{@$ids} = (1..$#$ids+1);
@items = sort { $order_hash->{$a->id} <=> $order_hash->{$b->id} } @items;
}
my $old_grp_subscriber;
my $new_grp_subscriber;
my $uri = "sip:$username\@$domain";
if($old_group_id) {
$old_grp_subscriber= $group_rs
->find($old_group_id)
->provisioning_voip_subscriber;
if($old_grp_subscriber) {
my $grp_pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, attribute => 'cloud_pbx_hunt_group', prov_subscriber => $old_grp_subscriber
);
my $pref = $grp_pref_rs->find({ value => $uri });
$pref->delete if($pref);
}
if($#items < $#$ids){
@absent_items_ids = grep { !exists $items_ids_exists{$_} } @{$params{ids}};
}
if($new_group_id) {
$new_grp_subscriber = $group_rs
->find($new_group_id)
->provisioning_voip_subscriber;
if($new_grp_subscriber) {
my $grp_pref_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c, attribute => 'cloud_pbx_hunt_group', prov_subscriber => $new_grp_subscriber
);
unless($grp_pref_rs->find({ value => $uri })) {
$grp_pref_rs->create({ value => $uri });
}
}
return \@items, (( 0 < @absent_items_ids) ? \@absent_items_ids : undef ) ;
}
sub manage_pbx_groups{
my %params = @_;
my $c = $params{c};
my $schema = $params{schema} // $c->model('DB');
my $group_ids = $params{group_ids} // [];
my $groupmember_ids = $params{groupmember_ids} // [];
my $subscriber = $params{subscriber};
my $customer = $params{customer} // $subscriber->contract;
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(
c => $c,
schema => $schema,
ids => $groupmember_ids,
customer_id => $customer->id,
is_group => 0,
) : [] );
#delete all old groups, to support correct order
my $prov_subscriber = $subscriber->provisioning_voip_subscriber;
my $subscriber_uri = get_pbx_group_member_name( subscriber => $subscriber );
my $member_preferences_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c,
attribute => 'cloud_pbx_hunt_group',
)->search_rs({
subscriber_id => { -in => [ $prov_subscriber->voip_pbx_groups->get_column('group_id')->all ] },
value => $subscriber_uri,
});
$member_preferences_rs->delete;
$prov_subscriber->voip_pbx_groups->delete;
#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 );
$prov_subscriber->voip_pbx_groups->create({
group_id => $group_voip_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,
);
$preferences_rs->create({ value => $subscriber_uri });
}
#delete old members to support correct order
$prov_subscriber->voip_pbx_group_members->delete;
my $group_preferences_rs = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
c => $c,
attribute => 'cloud_pbx_hunt_group',
prov_subscriber => $prov_subscriber,
);
$group_preferences_rs->delete;
foreach my $member(@{ $groupmembers }) {
my $member_uri = get_pbx_group_member_name( subscriber => $member );
$prov_subscriber->voip_pbx_group_members->create({
subscriber_id => $member->provisioning_voip_subscriber->id,
});
$group_preferences_rs->create({ value => $member_uri });
}
}
sub get_pbx_group_member_name{
my %params = @_;
my $c = $params{c};
my $subscriber = $params{subscriber};
return "sip:".$subscriber->username."\@".$subscriber->domain->domain;
}
sub update_subscriber_numbers {
@ -871,21 +930,12 @@ sub terminate {
});
}
if($prov_subscriber) {
foreach my $groups($prov_subscriber->voip_pbx_groups->all) {
my $group_sub = $groups->group;
update_pbx_group_prefs(
c => $c,
schema => $schema,
old_group_id => $group_sub->voip_subscriber->id,
new_group_id => undef,
username => $prov_subscriber->username,
domain => $prov_subscriber->domain->domain,
group_rs => $schema->resultset('voip_subscribers')->search({
contract_id => $subscriber->contract_id,
status => { '!=' => 'terminated' },
}),
);
}
manage_pbx_groups(
c => $c,
schema => $schema,
groups => [],
subscriber => $subscriber,
);
NGCP::Panel::Utils::Kamailio::delete_location($c,
$prov_subscriber);
foreach my $pref(qw/allowed_ips_grp man_allowed_ips_grp/) {
@ -894,8 +944,8 @@ sub terminate {
);
if($aig_rs && $aig_rs->first) {
$c->model('DB')->resultset('voip_allowed_ip_groups')
->search_rs({ group_id => $aig_rs->first->value })
->delete;
->search_rs({ group_id => $aig_rs->first->value })
->delete;
}
}

Loading…
Cancel
Save