From 85c28e259d2b94b5c644272cdbdf4c05ebcf5d02 Mon Sep 17 00:00:00 2001 From: Gerhard Jungwirth Date: Wed, 10 Jul 2013 10:02:16 +0200 Subject: [PATCH] handle the preference rewrite_rule_set --- lib/NGCP/Panel/Controller/Domain.pm | 11 ++++- lib/NGCP/Panel/Controller/Peering.pm | 7 ++- lib/NGCP/Panel/Form/Preferences.pm | 12 ++++- lib/NGCP/Panel/Utils.pm | 61 +++++++++++++++++++++++++- share/templates/domain/preferences.tt | 1 + share/templates/helpers/pref_table.tt | 10 ++++- share/templates/peering/preferences.tt | 1 + 7 files changed, 97 insertions(+), 6 deletions(-) diff --git a/lib/NGCP/Panel/Controller/Domain.pm b/lib/NGCP/Panel/Controller/Domain.pm index a8d8c582cf..e9d04e893a 100644 --- a/lib/NGCP/Panel/Controller/Domain.pm +++ b/lib/NGCP/Panel/Controller/Domain.pm @@ -224,7 +224,11 @@ sub preferences_edit :Chained('preferences_base') :PathPart('edit') :Args(0) { ->search({dom_pref => 1}) ->all; - my $pref_rs = $c->stash->{preference}; + my $pref_rs = $c->model('DB') + ->resultset('voip_dom_preferences') + ->search({ + domain_id => $c->stash->{provisioning_domain_id} + }); NGCP::Panel::Utils::create_preference_form( c => $c, pref_rs => $pref_rs, @@ -253,6 +257,11 @@ sub load_preference_list :Private { ]; } + my $rewrite_rule_sets_rs = $c->model('DB') + ->resultset('voip_rewrite_rule_sets'); + $c->stash(rwr_sets_rs => $rewrite_rule_sets_rs, + rwr_sets => [$rewrite_rule_sets_rs->all]); + NGCP::Panel::Utils::load_preference_list( c => $c, pref_values => \%pref_values, dom_pref => 1, diff --git a/lib/NGCP/Panel/Controller/Peering.pm b/lib/NGCP/Panel/Controller/Peering.pm index 46f90cda96..8e4aa4ca5a 100644 --- a/lib/NGCP/Panel/Controller/Peering.pm +++ b/lib/NGCP/Panel/Controller/Peering.pm @@ -280,7 +280,12 @@ sub servers_preferences_list :Chained('servers_base') :PathPart('preferences') : map {$_->value} $value->voip_peer_preferences->all ]; } - + + my $rewrite_rule_sets_rs = $c->model('DB') + ->resultset('voip_rewrite_rule_sets'); + $c->stash(rwr_sets_rs => $rewrite_rule_sets_rs, + rwr_sets => [$rewrite_rule_sets_rs->all]); + NGCP::Panel::Utils::load_preference_list( c => $c, pref_values => \%pref_values, peer_pref => 1, diff --git a/lib/NGCP/Panel/Form/Preferences.pm b/lib/NGCP/Panel/Form/Preferences.pm index 1e3eeb7181..a3b3ef32c8 100644 --- a/lib/NGCP/Panel/Form/Preferences.pm +++ b/lib/NGCP/Panel/Form/Preferences.pm @@ -31,8 +31,18 @@ sub field_list { foreach my $row (@$fields_data) { my $meta = $row->{meta}; my $enums = $row->{enums}; + my $rwrs_rs = $row->{rwrs_rs}; my $field; - if($meta->data_type eq "enum") { + if($meta->attribute eq "rewrite_rule_set") { + my @options = map {{label => $_->name, value => $_->id}} + defined $rwrs_rs ? $rwrs_rs->all + : ("Could not fetch rewrite rule sets"); + $field = { + name => $meta->attribute, + type => 'Select', + options => \@options, + }; + } elsif($meta->data_type eq "enum") { my @options = map {{label => $_->label, value => $_->value}} @{ $enums }; $field = { name => $meta->attribute, diff --git a/lib/NGCP/Panel/Utils.pm b/lib/NGCP/Panel/Utils.pm index d741278c4c..04636225df 100644 --- a/lib/NGCP/Panel/Utils.pm +++ b/lib/NGCP/Panel/Utils.pm @@ -70,7 +70,7 @@ sub load_preference_list { my @pref_groups = $c->model('DB') ->resultset('voip_preference_groups') - ->search({ 'voip_preferences.internal' => 0, + ->search({ 'voip_preferences.internal' => { '<=' => 0 }, $peer_pref ? ('voip_preferences.peer_pref' => 1, -or => ['voip_preferences_enums.peer_pref' => 1, 'voip_preferences_enums.peer_pref' => undef]) : (), @@ -84,11 +84,18 @@ sub load_preference_list { prefetch => {'voip_preferences' => 'voip_preferences_enums'}, }) ->all; - + foreach my $group(@pref_groups) { my @group_prefs = $group->voip_preferences->all; foreach my $pref(@group_prefs) { + if($pref->attribute eq "rewrite_rule_set") { + $pref->{rwrs_id} = $pref_values->{rewrite_caller_in_dpid} ? + $c->stash->{rwr_sets_rs}->search({ + caller_in_dpid =>$pref_values->{rewrite_caller_in_dpid} + })->first->id + : undef; + } if($pref->data_type eq "enum") { $pref->{enums} = []; push @{ $pref->{enums} }, @@ -124,6 +131,7 @@ sub create_preference_form { fields_data => [{ meta => $c->stash->{preference_meta}, enums => $enums, + rwrs_rs => $c->stash->{rwr_sets_rs}, }], }); $form->create_structure([$c->stash->{preference_meta}->attribute]); @@ -149,6 +157,18 @@ sub create_preference_form { attribute_id => $c->stash->{preference_meta}->id, value => $form->field($c->stash->{preference_meta}->attribute)->value, }); + } elsif ($c->stash->{preference_meta}->attribute eq "rewrite_rule_set") { + my $selected_rwrs = $c->stash->{rwr_sets_rs}->find( + $form->field($c->stash->{preference_meta}->attribute)->value + ); + _set_rewrite_preferences( + c => $c, + rwrs_result => $selected_rwrs, + pref_rs => $pref_rs, + ); + $c->flash(messages => [{type => 'success', text => 'Preference '.$c->stash->{preference_meta}->attribute.' successfully updated.'}]); + $c->response->redirect($base_uri); + return; } else { $pref_rs->update_or_create({ id => $preference_id, @@ -184,6 +204,26 @@ sub create_preference_form { $c->stash(form => $form); } +sub _set_rewrite_preferences { + my %params = @_; + + my $c = $params{c}; + my $rwrs_result = $params{rwrs_result}; + my $pref_rs = $params{pref_rs}; + + for my $foo ("callee_in_dpid", "caller_in_dpid", + "callee_out_dpid", "caller_out_dpid") { + + my $attribute_id = $c->model('DB')->resultset('voip_preferences') + ->find({attribute => "rewrite_$foo"})->id; + my $preference = $pref_rs->search({ + attribute_id => $attribute_id, + })->update_or_create({}); + $preference->update({ value => $rwrs_result->$foo }); + } + +} + 1; =head1 NAME @@ -225,6 +265,8 @@ Parameters: Load preferences and groups. Fill them with pref_values. Put them to stash as "pref_groups". This will be used in F. +Also see "Special case rewrite_rule_set". + =head2 create_preference_form Parameters: @@ -239,6 +281,21 @@ form in case the request has be POSTed. Also parse the GET params "delete", "activate" and "deactivate" in order to operate on maxoccur != 1 preferences. Put the form to stash as "form". +=head3 Special case rewrite_rule_set + +In order to display the preference rewrite_rule_set correctly, the calling +controller must put rwr_sets_rs (as DBIx::Class::ResultSet) and rwr_sets +(for rendering in the template) to stash. A html select will then be displayed +with all the rewrite_rule_sets. + +On update 4 voip_*_preferences will be created with the attributes +rewrite_callee_in_dpid, rewrite_caller_in_dpid, rewrite_callee_out_dpid +and rewrite_caller_out_dpid (using the helper method _set_rewrite_preferences). + +For compatibility with ossbss and the www_admin panel, no preference with +the attribute rewrite_rule_set is created and caller_in_dpid is used to +check which rewrite_rule_set is currently set. + =head1 AUTHOR Andreas Granig, diff --git a/share/templates/domain/preferences.tt b/share/templates/domain/preferences.tt index 844bbae6bd..d60e5a78fa 100644 --- a/share/templates/domain/preferences.tt +++ b/share/templates/domain/preferences.tt @@ -11,6 +11,7 @@ helper.pref_groups = pref_groups; helper.form = form; helper.base_uri = c.uri_for(domain.id,'preferences'); + helper.rewrite_rule_sets = rwr_sets; helper.top_buttons = [ { name = 'Back', uri = c.uri_for(), icon = 'icon-arrow-left' }, diff --git a/share/templates/helpers/pref_table.tt b/share/templates/helpers/pref_table.tt index a29260b65e..d0202c0e35 100644 --- a/share/templates/helpers/pref_table.tt +++ b/share/templates/helpers/pref_table.tt @@ -54,7 +54,15 @@ [% r.attribute %] - [% IF r.data_type == "boolean" %] + [% IF r.attribute == "rewrite_rule_set" -%] + + + [% ELSIF r.data_type == "boolean" %] [% ELSIF r.data_type == "string" || r.data_type == "int" %] diff --git a/share/templates/peering/preferences.tt b/share/templates/peering/preferences.tt index 51ad5d3dd4..9e55015aa8 100644 --- a/share/templates/peering/preferences.tt +++ b/share/templates/peering/preferences.tt @@ -10,6 +10,7 @@ helper.form = form; helper.base_uri = c.uri_for_action("/peering/servers_preferences_root", [c.req.captures.0, c.req.captures.1]); + helper.rewrite_rule_sets = rwr_sets; helper.dt_buttons = [ { name = 'Edit', uri = c.uri_for_action("/peering/servers_preferences_root", [c.req.captures.0, c.req.captures.1]), class = 'btn-small btn-primary', icon = 'icon-edit' },