From c6e03b7dedb2e7a2cc88e83a1d3682e89d95a1fb Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Tue, 26 Jul 2016 15:28:35 +0200 Subject: [PATCH] MT#21543 Implement emergency mapping preference Let new emergency mapping containers be assigned to subscribers, customers, domains. Change-Id: Ifef5234731604e8ee7373ef2f8d83f1e53431624 --- lib/NGCP/Panel/Controller/Customer.pm | 6 +++ lib/NGCP/Panel/Controller/Domain.pm | 6 +++ lib/NGCP/Panel/Controller/Subscriber.pm | 5 ++ lib/NGCP/Panel/Form/Preferences.pm | 10 ++++ lib/NGCP/Panel/Role/API/Preferences.pm | 47 ++++++++++++++++++ lib/NGCP/Panel/Utils/Preferences.pm | 60 ++++++++++++++++++++++- share/templates/customer/preferences.tt | 1 + share/templates/domain/preferences.tt | 1 + share/templates/helpers/pref_table.tt | 9 +++- share/templates/subscriber/preferences.tt | 1 + 10 files changed, 144 insertions(+), 2 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Customer.pm b/lib/NGCP/Panel/Controller/Customer.pm index 9a44f2a12c..878a284c54 100644 --- a/lib/NGCP/Panel/Controller/Customer.pm +++ b/lib/NGCP/Panel/Controller/Customer.pm @@ -2217,6 +2217,12 @@ sub load_preference_list :Private { $c->stash(ncos_levels_rs => $ncos_levels_rs, ncos_levels => [$ncos_levels_rs->all]); + my $emergency_mapping_containers_rs = $c->model('DB') + ->resultset('emergency_containers') + ->search_rs({ reseller_id => $reseller_id, }); + $c->stash(emergency_mapping_containers_rs => $emergency_mapping_containers_rs, + emergency_mapping_containers => [$emergency_mapping_containers_rs->all]); + NGCP::Panel::Utils::Preferences::load_preference_list( c => $c, pref_values => \%pref_values, contract_pref => 1, diff --git a/lib/NGCP/Panel/Controller/Domain.pm b/lib/NGCP/Panel/Controller/Domain.pm index f73e1b0b9f..d40e700c65 100644 --- a/lib/NGCP/Panel/Controller/Domain.pm +++ b/lib/NGCP/Panel/Controller/Domain.pm @@ -383,6 +383,12 @@ sub load_preference_list :Private { $c->stash(ncos_levels_rs => $ncos_levels_rs, ncos_levels => [$ncos_levels_rs->all]); + my $emergency_mapping_containers_rs = $c->model('DB') + ->resultset('emergency_containers') + ->search_rs({ reseller_id => $correct_reseller_id, }); + $c->stash(emergency_mapping_containers_rs => $emergency_mapping_containers_rs, + emergency_mapping_containers => [$emergency_mapping_containers_rs->all]); + my $sound_sets_rs = $c->model('DB') ->resultset('voip_sound_sets') ->search_rs({ reseller_id => $correct_reseller_id, contract_id => undef, }); diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index 39f1f9f0cd..c2740fa074 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -2055,6 +2055,11 @@ sub load_preference_list :Private { $c->stash(ncos_levels_rs => $ncos_levels_rs, ncos_levels => [$ncos_levels_rs->all]); + my $emergency_mapping_containers_rs = $c->model('DB') + ->resultset('emergency_containers')->search({ reseller_id => $reseller_id }); + $c->stash(emergency_mapping_containers_rs => $emergency_mapping_containers_rs, + emergency_mapping_containers => [$emergency_mapping_containers_rs->all]); + my $sound_sets_rs = $c->model('DB') ->resultset('voip_sound_sets')->search({ reseller_id => $reseller_id, diff --git a/lib/NGCP/Panel/Form/Preferences.pm b/lib/NGCP/Panel/Form/Preferences.pm index 6f8c5243b2..5b3b587a56 100644 --- a/lib/NGCP/Panel/Form/Preferences.pm +++ b/lib/NGCP/Panel/Form/Preferences.pm @@ -36,6 +36,7 @@ sub field_list { my $enums = $row->{enums}; my $rwrs_rs = $row->{rwrs_rs}; my $ncos_rs = $row->{ncos_rs}; + my $emergency_mapping_containers_rs = $row->{emergency_mapping_containers_rs}; my $sound_rs = $row->{sound_rs}; my $contract_sound_rs = $row->{contract_sound_rs}; my $field; @@ -59,6 +60,15 @@ sub field_list { type => 'Select', options => \@options, }; + } elsif ($meta->attribute eq "emergency_mapping_container") { + my @options = map {{label => $_->name, value => $_->id}} + defined $emergency_mapping_containers_rs ? $emergency_mapping_containers_rs->all : (); + unshift @options, {label => '', value => ''}; + $field = { + name => $meta->attribute, + type => 'Select', + options => \@options, + }; } elsif ($meta->attribute eq "sound_set") { my @options = map {{label => $_->name, value => $_->id}} defined $sound_rs ? $sound_rs->all : (); diff --git a/lib/NGCP/Panel/Role/API/Preferences.pm b/lib/NGCP/Panel/Role/API/Preferences.pm index 18486fdc08..6e085e02bb 100644 --- a/lib/NGCP/Panel/Role/API/Preferences.pm +++ b/lib/NGCP/Panel/Role/API/Preferences.pm @@ -131,6 +131,25 @@ sub get_resource { $processed = 1; last SWITCH; }; + /^emergency_mapping_container_id$/ && do { + my $pref_name = $pref->attribute->attribute; + $pref_name =~ s/_id$//; + + do { $processed = 1; last SWITCH; } + if($attr && !$self->_check_profile($c, $pref_name, \%profile_attrs)); + + my $container = $c->model('DB')->resultset('emergency_containers')->find({ + id => $pref->value, + }); + if($container) { + $resource->{$pref_name} = $container->name; + } else { + $c->log->error("no emergency mapping container for '".$pref->attribute->attribute."' with value '".$pref->value."' found, altough it's stored in preference id ".$pref->id); + # let it slip through + } + $processed = 1; + last SWITCH; + }; /^(contract_)?sound_set$/ && do { # TODO: not applicable for domains, but for subs, check for contract_id! do { $processed = 1; last SWITCH; } @@ -417,6 +436,7 @@ sub update_item { rewrite_callee_in_dpid rewrite_callee_out_dpid rewrite_caller_lnp_dpid rewrite_callee_lnp_dpid ncos_id adm_ncos_id adm_cf_ncos_id + emergency_mapping_container_id sound_set contract_sound_set allowed_ips_grp man_allowed_ips_grp /]; @@ -465,6 +485,14 @@ sub update_item { } last SWITCH; }; + /^emergency_mapping_container$/ && do { + unless(exists $resource->{$k}) { + my $rs = $self->get_preference_rs($c, $type, $elem, $k . '_id'); + last SWITCH unless $rs; # unknown resource, just ignore + $rs->delete; + } + last SWITCH; + }; /^(man_)?allowed_ips$/ && do { unless(exists $resource->{$k}) { my $rs = $self->get_preference_rs($c, $type, $elem, $k . '_grp'); @@ -576,6 +604,25 @@ sub update_item { } last SWITCH; }; + /^emergency_mapping_container$/ && do { + my $pref_name = $pref . "_id"; + my $container = $c->model('DB')->resultset('emergency_containers')->find({ + name => $resource->{$pref}, + reseller_id => $reseller_id, + }); + unless($container) { + $c->log->error("no emergency mapping container '".$resource->{$pref}."' for reseller id $reseller_id found"); + $self->error($c, HTTP_UNPROCESSABLE_ENTITY, "Unknown emergency mapping container '".$resource->{$pref}."'"); + return; + } + my $rs = $self->get_preference_rs($c, $type, $elem, $pref_name); + if($rs->first) { + $rs->first->update({ value => $container->id }); + } else { + $rs->create({ value => $container->id }); + } + last SWITCH; + }; /^(contract_)?sound_set$/ && do { # TODO: not applicable for domains, but for subs, check for contract_id! my $set = $c->model('DB')->resultset('voip_sound_sets')->find({ diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index 66745e5eaa..0f7f680b7b 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -119,6 +119,13 @@ sub load_preference_list { $pref->{adm_cf_ncos_id} = $tmp->id; } } + elsif($pref->attribute eq "emergency_mapping_container") { + if ($pref_values->{emergency_mapping_container_id} && + (my $tmp = $c->stash->{emergency_mapping_containers_rs} + ->find($pref_values->{emergency_mapping_container_id}) )) { + $pref->{emergency_mapping_container_id} = $tmp->id; + } + } elsif($pref->attribute eq "allowed_ips") { $pref->{allowed_ips_group_id} = $pref_values->{allowed_ips_grp}; $pref->{allowed_ips_rs} = $c->model('DB')->resultset('voip_allowed_ip_groups') @@ -241,6 +248,15 @@ sub create_preference_form { if (defined $ncos_id_preference) { $preselected_value = $ncos_id_preference->value; } + } elsif ($c->stash->{preference_meta}->attribute eq "emergency_mapping_container") { + my $container_id_preference = $pref_rs->search({ + 'attribute.attribute' => 'emergency_mapping_container_id' + },{ + join => 'attribute' + })->first; + if (defined $container_id_preference) { + $preselected_value = $container_id_preference->value; + } } elsif ($c->stash->{preference_meta}->attribute eq "allowed_ips") { my $allowed_ips_grp = $pref_rs->search({ 'attribute.attribute' => 'allowed_ips_grp' @@ -308,6 +324,7 @@ sub create_preference_form { enums => $enums, rwrs_rs => $c->stash->{rwr_sets_rs}, ncos_rs => $c->stash->{ncos_levels_rs}, + emergency_mapping_containers_rs => $c->stash->{emergency_mapping_containers_rs}, sound_rs => $c->stash->{sound_sets_rs}, contract_sound_rs => $c->stash->{contract_sound_sets_rs}, }], @@ -578,6 +595,39 @@ sub create_preference_form { } $c->response->redirect($base_uri); return 1; + } elsif ($attribute eq "emergency_mapping_container") { + my $selected_container = $c->stash->{emergency_mapping_containers_rs}->find( + $form->field($attribute)->value + ); + my $attribute_id = $c->model('DB')->resultset('voip_preferences') + ->find({attribute => $attribute."_id"})->id; + + try { + my $preference = $pref_rs->search({ attribute_id => $attribute_id }); + if(!defined $selected_container) { + $preference->first->delete if $preference->first; + } elsif($preference->first) { + $preference->first->update({ value => $selected_container->id }); + } else { + $preference->create({ value => $selected_container->id }); + } + NGCP::Panel::Utils::Message::info( + c => $c, + data => \%log_data, + desc => $c->loc('Preference [_1] successfully updated', $attribute), + ); + } catch($e) { + NGCP::Panel::Utils::Message::error( + c => $c, + error => $e, + data => \%log_data, + desc => $c->loc('Failed to update preference [_1]', $attribute), + ); + $c->response->redirect($base_uri); + return 1; + } + $c->response->redirect($base_uri); + return 1; } elsif ($attribute eq "sound_set") { my $selected_set = $c->stash->{sound_sets_rs}->find( $form->field($attribute)->value @@ -1024,7 +1074,7 @@ sub api_preferences_defs{ push @{ $fields->{enum_values} }, $efields; } } - if ($pref->attribute =~ m/^(rewrite_rule_set|ncos|adm_ncos|adm_cf_ncos|sound_set|contract_sound_set)$/) { + if ($pref->attribute =~ m/^(rewrite_rule_set|ncos|adm_ncos|adm_cf_ncos|emergency_mapping_container|sound_set|contract_sound_set)$/) { $fields->{data_type} = 'string'; } $resource->{$pref->attribute} = $fields; @@ -1097,6 +1147,14 @@ be set. The updated preferences are called ncos_id and adm_ncos_id. +=head3 Special case emergency_mapping_container + +Very similar to ncos (see above). The stashed variables are +emergency_mapping_containers_rs and emergency_mapping_containers. In the template +helper.ncos_levels needs to be set. + +The updated preferences are called ncos_id and adm_ncos_id. + =head3 Special case sound_set and contract_sound_set This is also similar to rewrite_rule_set and ncos. The stashed variables are diff --git a/share/templates/customer/preferences.tt b/share/templates/customer/preferences.tt index 6a4f18f458..5b7f379859 100644 --- a/share/templates/customer/preferences.tt +++ b/share/templates/customer/preferences.tt @@ -23,6 +23,7 @@ helper.base_uri = c.uri_for(contract.id,'preferences'); END; helper.ncos_levels = ncos_levels; + helper.emergency_mapping_containers = emergency_mapping_containers; helper.location_id = location_id; helper.top_buttons = [ diff --git a/share/templates/domain/preferences.tt b/share/templates/domain/preferences.tt index 2f10678c34..0cecf4df11 100644 --- a/share/templates/domain/preferences.tt +++ b/share/templates/domain/preferences.tt @@ -14,6 +14,7 @@ helper.base_uri = c.uri_for(domain.id,'preferences'); helper.rewrite_rule_sets = rwr_sets; helper.ncos_levels = ncos_levels; + helper.emergency_mapping_containers = emergency_mapping_containers; helper.sound_sets = sound_sets; helper.man_aip_grp_rs = man_aip_grp_rs; diff --git a/share/templates/helpers/pref_table.tt b/share/templates/helpers/pref_table.tt index fd5521fe1c..c28c6befc9 100644 --- a/share/templates/helpers/pref_table.tt +++ b/share/templates/helpers/pref_table.tt @@ -91,6 +91,13 @@ [% END -%] + [% ELSIF r.attribute == "emergency_mapping_container" -%] + [% ELSIF r.attribute == "sound_set" -%]