From 25e75e44208dd0d7f8623fabcb1de3961fa7495e Mon Sep 17 00:00:00 2001 From: Gerhard Jungwirth Date: Fri, 24 May 2013 16:14:17 +0200 Subject: [PATCH] Show/Edit peer preferences under peer servers * some code has been outsourced to NGCP::Panel::Utils --- lib/NGCP/Panel/Controller/Domain.pm | 117 ++------------- lib/NGCP/Panel/Controller/Peering.pm | 86 ++++++++++- lib/NGCP/Panel/Utils.pm | 194 +++++++++++++++++++++++++ share/templates/domain/preferences.tt | 3 +- share/templates/helpers/pref_table.tt | 4 +- share/templates/peering/preferences.tt | 18 +++ 6 files changed, 308 insertions(+), 114 deletions(-) create mode 100644 share/templates/peering/preferences.tt diff --git a/lib/NGCP/Panel/Controller/Domain.pm b/lib/NGCP/Panel/Controller/Domain.pm index f285f6508b..7913746720 100644 --- a/lib/NGCP/Panel/Controller/Domain.pm +++ b/lib/NGCP/Panel/Controller/Domain.pm @@ -5,7 +5,6 @@ use namespace::autoclean; BEGIN { extends 'Catalyst::Controller'; } use NGCP::Panel::Form::Domain; -use NGCP::Panel::Form::Preferences; sub dom_list :Chained('/') :PathPart('domain') :CaptureArgs(0) :Args(0) { my ($self, $c) = @_; @@ -166,94 +165,18 @@ sub preferences_edit :Chained('preferences_base') :PathPart('edit') :Args(0) { my ($self, $c) = @_; $c->stash(edit_preference => 1); - - my @enums = $c->stash->{preference_meta} - ->voip_preferences_enums - ->search({dom_pref => 1}) - ->all; - - my $form = NGCP::Panel::Form::Preferences->new({ - fields_data => [{ - meta => $c->stash->{preference_meta}, - enums => \@enums, - }], - }); - $form->create_structure([$c->stash->{preference_meta}->attribute]); - - my $posted = ($c->request->method eq 'POST'); - if($c->stash->{preference_meta}->max_occur == 1){ - $form->process( - posted => 1, - params => $posted ? $c->request->params : { $c->stash->{preference_meta}->attribute => $c->stash->{preference_values}->[0] }, - action => $c->uri_for($c->stash->{domain}->{id}, 'preferences', $c->stash->{preference_meta}->id, 'edit'), - ); - } else { - $form->process( - posted => 1, - params => $posted ? $c->request->params : {}, - action => $c->uri_for($c->stash->{domain}->{id}, 'preferences', $c->stash->{preference_meta}->id, 'edit'), - ); - } - if($posted && $form->validated) { - my $preference_id = $c->stash->{preference}->first ? $c->stash->{preference}->first->id : undef; - if ($c->stash->{preference_meta}->max_occur != 1) { - $c->model('provisioning') - ->resultset('voip_dom_preferences') - ->create({ - attribute_id => $c->stash->{preference_meta}->id, - domain_id => $c->stash->{provisioning_domain_id}, - value => $form->field($c->stash->{preference_meta}->attribute)->value, - }); - } else { - my $rs = $c->model('provisioning') - ->resultset('voip_dom_preferences') - ->update_or_create({ - id => $preference_id, - attribute_id => $c->stash->{preference_meta}->id, - domain_id => $c->stash->{provisioning_domain_id}, - value => $form->field($c->stash->{preference_meta}->attribute)->value, - }); - $c->flash(messages => [{type => 'success', text => 'Preference '.$c->stash->{preference_meta}->attribute.' successfully updated.'}]); - $c->response->redirect($c->uri_for($c->stash->{domain}->{id}, 'preferences')); - return; - } - } - my $delete_param = $c->request->params->{delete}; - my $deactivate_param = $c->request->params->{deactivate}; - my $activate_param = $c->request->params->{activate}; - my $param_id = $delete_param || $deactivate_param || $activate_param; - # only one parameter is processed at a time (?) - if($param_id) { - my $rs = $c->model('provisioning') - ->resultset('voip_dom_preferences') - ->find($param_id); - if($rs->attribute_id != $c->stash->{preference_meta}->id) { - # Invalid param (dom_pref does not belong to current pref) - } elsif($delete_param) { - $rs->delete(); - } elsif ($deactivate_param) { - $rs->update({value => "#".$rs->value}); - } elsif ($activate_param) { - my $new_value = $rs->value; - $new_value =~ s/^#//; - $rs->update({value => $new_value}); - } - } + my $pref_rs = $c->stash->{preference}; - $c->stash(form => $form); + NGCP::Panel::Utils::create_preference_form( c => $c, + pref_rs => $pref_rs, + base_uri => $c->uri_for_action('/domain/preferences', [$c->req->captures->[0]]), + edit_uri => $c->uri_for_action('/domain/preferences_edit', $c->req->captures), + ); } sub load_preference_list : Private { my ($self, $c) = @_; - - my @dom_pref_groups = $c->model('provisioning') - ->resultset('voip_preference_groups') - ->search({ 'voip_preferences.dom_pref' => 1, 'voip_preferences.internal' => 0, - }, { - prefetch => {'voip_preferences' => 'voip_preferences_enums'}, - }) - ->all; my $dom_pref_values = $c->model('provisioning') ->resultset('voip_preferences') @@ -271,30 +194,10 @@ sub load_preference_list : Private { ]; } - foreach my $group(@dom_pref_groups) { - my @group_prefs = $group->voip_preferences->all; - - foreach my $pref(@group_prefs) { - if($pref->data_type eq "enum") { - $pref->{enums} = []; - push @{ $pref->{enums} }, - $pref->voip_preferences_enums->search({dom_pref => 1})->all; - } - my @values = @{ - exists $pref_values{$pref->attribute} - ? $pref_values{$pref->attribute} - : [] - }; - next unless(scalar @values); - if($pref->max_occur != 1) { - $pref->{value} = \@values; - } else { - $pref->{value} = $values[0]; - } - } - $group->{prefs} = \@group_prefs; - } - $c->stash(pref_groups => \@dom_pref_groups); + NGCP::Panel::Utils::load_preference_list( c => $c, + pref_values => \%pref_values, + dom_pref => 1, + ); } __PACKAGE__->meta->make_immutable; diff --git a/lib/NGCP/Panel/Controller/Peering.pm b/lib/NGCP/Panel/Controller/Peering.pm index 24c502240e..d5e9d995d3 100644 --- a/lib/NGCP/Panel/Controller/Peering.pm +++ b/lib/NGCP/Panel/Controller/Peering.pm @@ -245,8 +245,74 @@ sub servers_delete :Chained('servers_base') :PathPart('delete') :Args(0) { $c->response->redirect($c->stash->{sr_list_uri}); } -sub servers_preferences :Chained('servers_base') :PathPart('preferences') :Args(0) { +sub servers_preferences_list :Chained('servers_base') :PathPart('preferences') :CaptureArgs(0) { + my ($self, $c) = @_; + + my $x_pref_values = $c->model('provisioning') + ->resultset('voip_preferences') + ->search({ + 'peer_host.id' => $c->stash->{server}->{id} + },{ + prefetch => {'voip_peer_preferences' => 'peer_host'}, + }); + + my %pref_values; + foreach my $value($x_pref_values->all) { + + $pref_values{$value->attribute} = [ + map {$_->value} $value->voip_peer_preferences->all + ]; + } + + NGCP::Panel::Utils::load_preference_list( c => $c, + pref_values => \%pref_values, + peer_pref => 1, + ); + + $c->stash(template => 'peering/preferences.tt'); +} + +sub servers_preferences_root :Chained('servers_preferences_list') :PathPart('') :Args(0) { + +} +sub servers_preferences_base :Chained('servers_preferences_list') :PathPart('') :CaptureArgs(1) { + my ($self, $c, $pref_id) = @_; + + $c->stash->{preference_meta} = $c->model('provisioning') + ->resultset('voip_preferences') + ->search({ + -or => ['voip_preferences_enums.peer_pref' => 1, + 'voip_preferences_enums.peer_pref' => undef] + },{ + prefetch => 'voip_preferences_enums', + }) + ->find({id => $pref_id}); + + $c->stash->{preference} = $c->model('provisioning') + ->resultset('voip_peer_preferences') + ->search({ + attribute_id => $pref_id, + 'peer_host.id' => $c->stash->{server}->{id}, + },{ + prefetch => 'peer_host', + }); + my @values = $c->stash->{preference}->get_column("value")->all; + $c->stash->{preference_values} = \@values; +} + +sub servers_preferences_edit :Chained('servers_preferences_base') :PathPart('edit') :Args(0) { + my ($self, $c) = @_; + + $c->stash(edit_preference => 1); + + my $pref_rs = $c->stash->{server_result}->voip_peer_preferences; + + NGCP::Panel::Utils::create_preference_form( c => $c, + pref_rs => $pref_rs, + base_uri => $c->uri_for_action('/peering/servers_preferences_root', [@{ $c->req->captures }[0,1]]), + edit_uri => $c->uri_for_action('/peering/servers_preferences_edit', $c->req->captures), + ); } sub rules_list :Chained('base') :PathPart('rules') :CaptureArgs(0) { @@ -439,9 +505,23 @@ Show a modal to edit a peering server. Delete a peering server. -=head2 servers_preferences +=head2 servers_preferences_list + +Basis to show preferences for a given peering host/sever. + +=head2 servers_preferences_root + +Shows the preferences. + +=head2 servers_preferences_base + +Load preference, preference_meta and preference_values for a captured +id to stash. Will be used by L. + +=head2 servers_preferences_edit -Not yet implemented. +Show a modal to edit one preference. Mainly uses +NGCP::Panel::Utils::create_preference_form. =head2 rules_list diff --git a/lib/NGCP/Panel/Utils.pm b/lib/NGCP/Panel/Utils.pm index 8b43a252cf..1f49c255b8 100644 --- a/lib/NGCP/Panel/Utils.pm +++ b/lib/NGCP/Panel/Utils.pm @@ -2,6 +2,8 @@ package NGCP::Panel::Utils; use strict; use warnings; +use NGCP::Panel::Form::Preferences; + sub check_redirect_chain { my %params = @_; @@ -53,5 +55,197 @@ sub check_form_buttons { return; } +sub load_preference_list { + my %params = @_; + + my $c = $params{c}; + my $pref_values = $params{pref_values}; + my $peer_pref = $params{peer_pref}; + my $dom_pref = $params{dom_pref}; + my $usr_pref = $params{usr_pref}; + + my @pref_groups = $c->model('provisioning') + ->resultset('voip_preference_groups') + ->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]) : (), + $dom_pref ? ('voip_preferences.dom_pref' => 1, + -or => ['voip_preferences_enums.dom_pref' => 1, + 'voip_preferences_enums.dom_pref' => undef]) : (), + $usr_pref ? ('voip_preferences.usr_pref' => 1, + -or => ['voip_preferences_enums.usr_pref' => 1, + 'voip_preferences_enums.usr_pref' => undef]) : (), + }, { + 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->data_type eq "enum") { + $pref->{enums} = []; + push @{ $pref->{enums} }, + $pref->voip_preferences_enums->all; + } + my @values = @{ + exists $pref_values->{$pref->attribute} + ? $pref_values->{$pref->attribute} + : [] + }; + next unless(scalar @values); + if($pref->max_occur != 1) { + $pref->{value} = \@values; + } else { + $pref->{value} = $values[0]; + } + } + $group->{prefs} = \@group_prefs; + } + $c->stash(pref_groups => \@pref_groups); +} + +sub create_preference_form { + my %params = @_; + + my $c = $params{c}; + my $pref_rs = $params{pref_rs}; + my $base_uri = $params{base_uri}; + my $edit_uri = $params{edit_uri}; + + my @enums = $c->stash->{preference_meta} + ->voip_preferences_enums + ->all; + + my $form = NGCP::Panel::Form::Preferences->new({ + fields_data => [{ + meta => $c->stash->{preference_meta}, + enums => \@enums, + }], + }); + $form->create_structure([$c->stash->{preference_meta}->attribute]); + + my $posted = ($c->request->method eq 'POST'); + if($c->stash->{preference_meta}->max_occur == 1){ + $form->process( + posted => 1, + params => $posted ? $c->request->params : { $c->stash->{preference_meta}->attribute => $c->stash->{preference_values}->[0] }, + action => $edit_uri, + ); + } else { + $form->process( + posted => 1, + params => $posted ? $c->request->params : {}, + action => $edit_uri, + ); + } + if($posted && $form->validated) { + my $preference_id = $c->stash->{preference}->first ? $c->stash->{preference}->first->id : undef; + if ($c->stash->{preference_meta}->max_occur != 1) { + $pref_rs->create({ + attribute_id => $c->stash->{preference_meta}->id, + value => $form->field($c->stash->{preference_meta}->attribute)->value, + }); + } else { + $pref_rs->update_or_create({ + id => $preference_id, + attribute_id => $c->stash->{preference_meta}->id, + value => $form->field($c->stash->{preference_meta}->attribute)->value, + }); + $c->flash(messages => [{type => 'success', text => 'Preference '.$c->stash->{preference_meta}->attribute.' successfully updated.'}]); + $c->response->redirect($base_uri); + return; + } + } + + my $delete_param = $c->request->params->{delete}; + my $deactivate_param = $c->request->params->{deactivate}; + my $activate_param = $c->request->params->{activate}; + my $param_id = $delete_param || $deactivate_param || $activate_param; + # only one parameter is processed at a time (?) + if($param_id) { + my $rs = $pref_rs->find($param_id); + if($rs->attribute_id != $c->stash->{preference_meta}->id) { + # Invalid param (dom_pref does not belong to current pref) + } elsif($delete_param) { + $rs->delete(); + } elsif ($deactivate_param) { + $rs->update({value => "#".$rs->value}); + } elsif ($activate_param) { + my $new_value = $rs->value; + $new_value =~ s/^#//; + $rs->update({value => $new_value}); + } + } + + $c->stash(form => $form); +} + 1; + +=head1 NAME + +NGCP::Panel::Utils + +=head1 DESCRIPTION + +Various utils to outsource common tasks in the controllers. + +=head1 METHODS + +=head2 check_redirect_chain + +Sets close_target to the next uri in our redirect_chain if it exists. +Puts close_target to stash, which will be read by the templates. + +=head2 check_form_buttons + +Parameters: + c + fields + form + back_uri - the uri we come from + redir_uri (optional) - the uri we go to, used for any button + +Checks the hidden field "submitid" and redirects to its "value" when it +matches a field. + +=head2 load_preference_list + +Parameters: + c - set this to $c + pref_values - hashref with all values (from voip_x_preferences) + peer_pref - boolean, only select peer_prefs + dom_pref - boolean, only select dom_prefs + usr_pref - boolean, only select dom_prefs + +Load preferences and groups. Fill them with pref_values. +Put them to stash as "pref_groups". This will be used in F. + +=head2 create_preference_form + +Parameters: + c - set this to $c + pref_rs - a resultset for voip_x_preferences with the specific "x" already set + base_uri - string, uri of the preferences list + edit_uri - string, uri to show the preferences edit modal + +Use preference and preference_meta from stash and create a form. Process that +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". + +=head1 AUTHOR + +Andreas Granig, +Gerhard Jungwirth + +=head1 LICENSE + +This library is free software. You can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut # vim: set tabstop=4 expandtab: diff --git a/share/templates/domain/preferences.tt b/share/templates/domain/preferences.tt index adce2b35fb..9d6aae6a8b 100644 --- a/share/templates/domain/preferences.tt +++ b/share/templates/domain/preferences.tt @@ -9,8 +9,7 @@ helper.preference_meta = preference_meta; helper.pref_groups = pref_groups; helper.form = form; - helper.domain_id = domain.id; - helper.domain_name = domain.domain; + helper.base_uri = c.uri_for(domain.id,'preferences'); PROCESS 'helpers/pref_table.tt'; %] diff --git a/share/templates/helpers/pref_table.tt b/share/templates/helpers/pref_table.tt index d6a261bc2d..7a6fc1426c 100644 --- a/share/templates/helpers/pref_table.tt +++ b/share/templates/helpers/pref_table.tt @@ -74,7 +74,7 @@ @@ -140,7 +140,7 @@ $(function() { $(function () { $('#mod_edit').modal({keyboard: false, backdrop: 'static'}); $('#mod_close').click(function(event) { - window.location.href="[% c.uri_for(helper.domain_id, 'preferences') %]"; + window.location.href="[% helper.base_uri %]"; }); }); diff --git a/share/templates/peering/preferences.tt b/share/templates/peering/preferences.tt new file mode 100644 index 0000000000..8152ab71f8 --- /dev/null +++ b/share/templates/peering/preferences.tt @@ -0,0 +1,18 @@ +[% site_config.title = 'Peer Host "' _ server.name _ '" – Preferences' -%] + +[% + #helper.name = 'Domain'; + helper.messages = messages; + + helper.edit_preference = edit_preference; + helper.preference = preference; + helper.preference_meta = preference_meta; + helper.pref_groups = pref_groups; + helper.form = form; + helper.base_uri = c.uri_for_action("/peering/servers_preferences_root", + [c.req.captures.0, c.req.captures.1]); + + PROCESS 'helpers/pref_table.tt'; +%] + +[% # vim: set tabstop=4 syntax=html expandtab: -%]