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" -%]