diff --git a/lib/NGCP/Panel/Form/Device/Preference.pm b/lib/NGCP/Panel/Form/Device/Preference.pm index fb8ab8483d..e5d80794d8 100644 --- a/lib/NGCP/Panel/Form/Device/Preference.pm +++ b/lib/NGCP/Panel/Form/Device/Preference.pm @@ -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: diff --git a/lib/NGCP/Panel/Role/API/PreferencesMetaEntries.pm b/lib/NGCP/Panel/Role/API/PreferencesMetaEntries.pm index 7d702df4af..fb5f48dff8 100644 --- a/lib/NGCP/Panel/Role/API/PreferencesMetaEntries.pm +++ b/lib/NGCP/Panel/Role/API/PreferencesMetaEntries.pm @@ -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: diff --git a/lib/NGCP/Panel/Utils/Preferences.pm b/lib/NGCP/Panel/Utils/Preferences.pm index 7fcb207f13..b9afdc85c4 100644 --- a/lib/NGCP/Panel/Utils/Preferences.pm +++ b/lib/NGCP/Panel/Utils/Preferences.pm @@ -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; }