From 7205cac8b2fcc7dc2915f6927cf88e3efa8b55c4 Mon Sep 17 00:00:00 2001 From: Andreas Granig Date: Wed, 10 Jul 2013 16:09:10 +0200 Subject: [PATCH] Add subscriber preferences. Also fix preference handling for deleting preferences when they are set to false (boolean), empty (string/int) or defaults (enum). --- lib/NGCP/Panel/Controller/Subscriber.pm | 87 +++++++++++++++++++++++ lib/NGCP/Panel/Form/Preferences.pm | 2 + lib/NGCP/Panel/Utils.pm | 49 +++++++++---- share/templates/domain/preferences.tt | 1 - share/templates/helpers/pref_table.tt | 11 +-- share/templates/subscriber/preferences.tt | 23 ++++++ 6 files changed, 155 insertions(+), 18 deletions(-) create mode 100644 share/templates/subscriber/preferences.tt diff --git a/lib/NGCP/Panel/Controller/Subscriber.pm b/lib/NGCP/Panel/Controller/Subscriber.pm index fb228f8d1c..c5f8afbdf6 100644 --- a/lib/NGCP/Panel/Controller/Subscriber.pm +++ b/lib/NGCP/Panel/Controller/Subscriber.pm @@ -221,6 +221,93 @@ sub terminate :Chained('base') :PathPart('terminate') :Args(0) { } } +sub preferences :Chained('base') :PathPart('preferences') :Args(0) { + my ($self, $c) = @_; + + $self->load_preference_list($c); + $c->stash(template => 'subscriber/preferences.tt'); +} + +sub preferences_base :Chained('base') :PathPart('preferences') :CaptureArgs(1) { + my ($self, $c, $pref_id) = @_; + + $self->load_preference_list($c); + + $c->stash->{preference_meta} = $c->model('DB') + ->resultset('voip_preferences') + ->single({id => $pref_id}); + + $c->stash->{preference} = $c->model('DB') + ->resultset('voip_usr_preferences') + ->search({ + attribute_id => $pref_id, + subscriber_id => $c->stash->{subscriber}->provisioning_voip_subscriber->id + }); + my @values = $c->stash->{preference}->get_column("value")->all; + $c->stash->{preference_values} = \@values; + $c->stash(template => 'subscriber/preferences.tt'); +} + +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({usr_pref => 1}) + ->all; + + my $pref_rs = $c->model('DB') + ->resultset('voip_usr_preferences') + ->search({ + subscriber_id => $c->stash->{subscriber}->provisioning_voip_subscriber->id + }); + + NGCP::Panel::Utils::create_preference_form( c => $c, + pref_rs => $pref_rs, + enums => \@enums, + base_uri => $c->uri_for_action('/subscriber/preferences', [$c->req->captures->[0]]), + edit_uri => $c->uri_for_action('/subscriber/preferences_edit', $c->req->captures), + ); +} + + +sub load_preference_list :Private { + my ($self, $c) = @_; + + my $usr_pref_values = $c->model('DB') + ->resultset('voip_preferences') + ->search({ + 'subscriber.id' => $c->stash->{subscriber}->provisioning_voip_subscriber->id + },{ + prefetch => {'voip_usr_preferences' => 'subscriber'}, + }); + + my %pref_values; + foreach my $value($usr_pref_values->all) { + + $pref_values{$value->attribute} = [ + map {$_->value} $value->voip_usr_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]); + + my $ncos_levels_rs = $c->model('DB') + ->resultset('ncos_levels'); + $c->stash(ncos_levels_rs => $ncos_levels_rs, + ncos_levels => [$ncos_levels_rs->all]); + + NGCP::Panel::Utils::load_preference_list( c => $c, + pref_values => \%pref_values, + usr_pref => 1, + ); +} + sub master :Chained('/') :PathPart('subscriber') :Args(1) { my ($self, $c, $subscriber_id) = @_; diff --git a/lib/NGCP/Panel/Form/Preferences.pm b/lib/NGCP/Panel/Form/Preferences.pm index c341797b76..504eb8dded 100644 --- a/lib/NGCP/Panel/Form/Preferences.pm +++ b/lib/NGCP/Panel/Form/Preferences.pm @@ -37,6 +37,7 @@ sub field_list { if($meta->attribute eq "rewrite_rule_set") { my @options = map {{label => $_->name, value => $_->id}} defined $rwrs_rs ? $rwrs_rs->all : (); + unshift @options, {label => '', value => ''}; $field = { name => $meta->attribute, type => 'Select', @@ -45,6 +46,7 @@ sub field_list { } elsif ($meta->attribute eq "ncos" || $meta->attribute eq "adm_ncos") { my @options = map {{label => $_->level, value => $_->id}} defined $ncos_rs ? $ncos_rs->all : (); + unshift @options, {label => '', value => ''}; $field = { name => $meta->attribute, type => 'Select', diff --git a/lib/NGCP/Panel/Utils.pm b/lib/NGCP/Panel/Utils.pm index 47d5a3f4e3..5fc4ddefe4 100644 --- a/lib/NGCP/Panel/Utils.pm +++ b/lib/NGCP/Panel/Utils.pm @@ -217,18 +217,35 @@ sub create_preference_form { ); my $attribute_id = $c->model('DB')->resultset('voip_preferences') ->find({attribute => $attribute."_id"})->id; - $pref_rs->update_or_create({ - attribute_id => $attribute_id, - })->update({ value => $selected_level->id }); + + + my $preference = $pref_rs->search({ attribute_id => $attribute_id }); + if(!defined $selected_level) { + $preference->first->delete if $preference->first; + } elsif($preference->first) { + $preference->first->update({ value => $selected_level->id }); + } else { + $preference->create({ value => $selected_level->id }); + } + $c->flash(messages => [{type => 'success', text => "Preference $attribute successfully updated."}]); $c->response->redirect($base_uri); return; } else { - $pref_rs->update_or_create({ - id => $preference_id, - attribute_id => $c->stash->{preference_meta}->id, - value => $form->field($attribute)->value, - }); + if($form->field($attribute)->value eq '') { + my $preference = $pref_rs->find($preference_id); + $preference->delete if $preference; + } elsif($c->stash->{preference_meta}->data_type eq 'boolean' && + $form->field($attribute)->value == 0) { + my $preference = $pref_rs->find($preference_id); + $preference->delete if $preference; + } else { + $pref_rs->update_or_create({ + id => $preference_id, + attribute_id => $c->stash->{preference_meta}->id, + value => $form->field($attribute)->value, + }); + } $c->flash(messages => [{type => 'success', text => "Preference $attribute successfully updated."}]); $c->response->redirect($base_uri); return; @@ -255,6 +272,7 @@ sub create_preference_form { } } + $form->process if $posted; $c->stash(form => $form); } @@ -265,15 +283,22 @@ sub _set_rewrite_preferences { my $rwrs_result = $params{rwrs_result}; my $pref_rs = $params{pref_rs}; - for my $foo ("callee_in_dpid", "caller_in_dpid", + for my $rules ("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; + ->find({attribute => "rewrite_$rules"})->id; my $preference = $pref_rs->search({ attribute_id => $attribute_id, - })->update_or_create({}); - $preference->update({ value => $rwrs_result->$foo }); + }); + + if(!defined $rwrs_result) { + $preference->first->delete if $preference->first; + } elsif($preference->first) { + $preference->first->update({ value => $rwrs_result->$rules }); + } else { + $preference->create({ value => $rwrs_result->$rules }); + } } } diff --git a/share/templates/domain/preferences.tt b/share/templates/domain/preferences.tt index ceea556613..d1f2f55c49 100644 --- a/share/templates/domain/preferences.tt +++ b/share/templates/domain/preferences.tt @@ -2,7 +2,6 @@ [% helper.name = 'Domain'; - helper.show_create_button = 1; helper.messages = messages; helper.edit_preference = edit_preference; diff --git a/share/templates/helpers/pref_table.tt b/share/templates/helpers/pref_table.tt index 86dd833b33..9abd18d5b0 100644 --- a/share/templates/helpers/pref_table.tt +++ b/share/templates/helpers/pref_table.tt @@ -140,22 +140,23 @@ $(function() { [% IF helper.preference_meta.max_occur != 1 %] [% ELSE %] diff --git a/share/templates/subscriber/preferences.tt b/share/templates/subscriber/preferences.tt new file mode 100644 index 0000000000..94f4a468ef --- /dev/null +++ b/share/templates/subscriber/preferences.tt @@ -0,0 +1,23 @@ +[% site_config.title = 'Subscriber "' _ subscriber.username _ '@' _ subscriber.domain.domain _ '" – Preferences' -%] + +[% + helper.name = 'Subscriber'; + 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(subscriber.id,'preferences'); + helper.rewrite_rule_sets = rwr_sets; + helper.ncos_levels = ncos_levels; + + helper.top_buttons = [ + { name = 'Back', uri = c.uri_for(), icon = 'icon-arrow-left' }, + ]; + + PROCESS 'helpers/pref_table.tt'; +%] + +[% # vim: set tabstop=4 syntax=html expandtab: -%]