TT#36402 Fix preferencesmetaentries enum processing

And move form checking to the form validate method from API

Change-Id: Ic66758666e04e60d784128ea807fc93daec6d52a
changes/02/21302/3
Irina Peshinskaya 8 years ago
parent 8cba6b5d10
commit bfb760c3fb

@ -6,6 +6,7 @@ with 'NGCP::Panel::Render::RepeatableJs';
use HTML::FormHandler::Widget::Block::Bootstrap;
use NGCP::Panel::Utils::Preferences;
use Storable qw();
has '+widget_wrapper' => ( default => 'Bootstrap' );
sub build_render_list {[qw/fields actions/]}
@ -180,5 +181,42 @@ sub validate_enum_value {
$field->add_error($err_msg);
}
}
sub validate {
my ($self, $field) = @_;
my $c = $self->ctx;
return unless $c;
my $schema = $c->model('DB');
my $resource = Storable::dclone($self->values);
if ($resource->{dev_pref}) {
if ($resource->{reseller_id}) {
if ($resource->{autoprov_device_id}) {
my $err = "reseller_id and autoprov_device_id can't be specified together.";
$c->log->error($err);
$self->field('autoprov_device_id')->add_error($err);
$self->field('reseller_id')->add_error($err);
}
if ($c->user->roles ne "reseller") {
unless($schema->resultset('resellers')->find($resource->{reseller_id})) {
my $err = "Invalid reseller_id '$$resource{reseller_id}'";
$c->log->error($err);
$self->field('reseller_id')->add_error($err);
}
}
} elsif ($resource->{autoprov_device_id}) {
my $rs = $schema->resultset('autoprov_devices')->search({
id => $resource->{autoprov_device_id},
($c->user->roles eq "reseller") ? (reseller_id => $c->user->reseller_id) : (),
});
unless ($rs->first) {
my $err = "Invalid reseller_id '$$resource{reseller_id}'";
$c->log->error($err);
$self->field('autoprov_device_id')->add_error($err);
}
}
}
}
1;
# vim: set tabstop=4 expandtab:

@ -44,49 +44,22 @@ sub get_form {
return NGCP::Panel::Form::get("NGCP::Panel::Form::Device::PreferenceAPI", $c);
}
sub check_resource{
my($self, $c, $item, $old_resource, $resource, $form) = @_;
my $schema = $c->model('DB');
if ($resource->{dev_pref}) {
if ($resource->{reseller_id}) {
if ($resource->{autoprov_device_id}) {
$c->log->error("reseller_id and autoprov_device_id can't be specified together.");
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "reseller_id and autoprov_device_id can't be specified together.");
return;
}
if ($c->user->roles eq "reseller") {
$resource->{reseller_id} = $c->user->reseller_id;
} else {
unless($schema->resultset('resellers')->find($resource->{reseller_id})) {
$c->log->error("Invalid reseller_id '$$resource{reseller_id}'");
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "invalid reseller_id '$$resource{reseller_id}'");
return;
}
}
} elsif ($resource->{autoprov_device_id}) {
my $rs = $schema->resultset('autoprov_devices')->search({
id => $resource->{autoprov_device_id},
($c->user->roles eq "reseller") ? (reseller_id => $c->user->reseller_id) : (),
});
unless ($rs->first) {
$c->log->error("Invalid autoprov_device_id '$$resource{autoprov_device_id}'");
$self->error($c, HTTP_UNPROCESSABLE_ENTITY, "invalid autoprov_device_id '$$resource{autoprov_device_id}'");
return;
}
}
}
return 1;
}
sub process_form_resource{
my($self,$c, $item, $old_resource, $resource, $form, $process_extras) = @_;
if ($resource->{dev_pref} && !$resource->{reseller_id} && !$resource->{autoprov_device_id} ) {
sub process_form_resource {
my ($self,$c, $item, $old_resource, $resource, $form, $process_extras) = @_;
if ( $resource->{dev_pref} && !$resource->{autoprov_device_id} ) {
if ($c->user->roles eq "reseller") {
$resource->{reseller_id} = $c->user->reseller_id;
}
}
return $resource;
}
sub resource_from_item {
my ($self, $c, $item) = @_;
my $resource = { $item->get_inflated_columns };
$resource->{enum} = [ map { my $e = {$_->get_inflated_columns}; delete $e->{preference_id}; $e; } $item->voip_preferences_enums->all ];
return $resource;
}
1;
# vim: set tabstop=4 expandtab:

@ -1337,23 +1337,19 @@ sub update_dynamic_preference {
my @flags = grep {$_ =~/^[a-z]+_pref$/} keys %$resource;
if(defined $enums and ref $enums eq 'ARRAY'){
my $enums_rs = $preference->voip_preferences_enums;
my @old_enum_ids = $enums_rs->get_column('id')->all;
my %old_enum_ids;
@old_enum_ids{@old_enum_ids} = @old_enum_ids;
$enums_rs->search_rs({
id => { -not_in => [ map { $_->{id} } @$enums ] },
})->delete;
foreach my $enum (@$enums) {
my $id = delete $enum->{id};
my $enum_exists = $enums_rs->find($id);
@{$enum}{@flags} = (1) x @flags;
if ($enum_exists) {
$enum_exists->update($enum);
delete $old_enum_ids{$id};
} else {
$preference->create_related('voip_preferences_enums', $enum);
}
}
$enums_rs->search_rs({
id => { -in => [ keys %old_enum_ids ] },
})->delete;
} else {
$preference->voip_preferences_enums->delete;
}

Loading…
Cancel
Save