You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ngcp-panel/lib/NGCP/Panel/Form/Device/Preference.pm

223 lines
5.8 KiB

package NGCP::Panel::Form::Device::Preference;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
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/]}
sub build_form_element_class {[qw(form-horizontal)]}
has_field 'id' => (
type => 'Hidden'
);
has_field 'attribute' => (
type => 'Text',
required => 1,
label => 'Name',
maxlength => '31',
element_attr => {
rel => ['tooltip'],
title => ['Name will be prefixed with double underscore.']
},
);
has_field 'label' => (
type => 'Text',
maxlength => '255',
required => 1,
label => 'Label',
);
has_field 'description' => (
type => 'Text',
required => 1,
label => 'Description',
);
has_field 'fielddev_pref' => (
type => 'Boolean',
default => 1,
label => 'Override on deployed device',
);
has_field 'max_occur' => (
type => 'Boolean',
default => '0',
label => 'Only one is allowed.',
);
has_field 'data_type' => (
type => 'Select',
required => 1,
label => 'Data type',
options => [
{ value => '', label => 'none' },
{ value => 'boolean', label => 'Boolean' },
{ value => 'string', label => 'String' },
{ value => 'int', label => 'Integer' },
{ value => 'enum', label => 'Enum' },
],
element_attr => {
rel => ['tooltip'],
title => ['Preference data type.']
},
);
has_field 'enum' => (
type => 'Repeatable',
required => 0,
setup_for_js => 1,
num_when_empty => 0,
do_wrapper => 1,
do_label => 1,
label => 'Enum values',
tags => {
controls_div => 1,
},
wrapper_class => [qw/hfh-rep-block/],
element_attr => {
rel => ['tooltip'],
title => ['An Array of enum.'],
},
);
has_field 'enum.id' => (
type => 'Hidden',
);
has_field 'enum.label' => (
type => 'Text',
wrapper_class => [qw/hfh-rep-field/],
);
has_field 'enum.value' => (
type => 'Text',
wrapper_class => [qw/hfh-rep-field/],
element_attr => {
rel => ['tooltip'],
title => ['Name will be prefixed with double underscore.']
},
);
has_field 'enum.default_val' => (
type => 'Boolean',
wrapper_class => [qw/hfh-rep-field/],
);
has_field 'enum.rm' => (
type => 'RmElement',
value => 'Remove enum value description',
order => 100,
element_class => [qw/btn btn-primary pull-right/],
);
has_field 'enum_add' => (
type => 'AddElement',
repeatable => 'enum',
value => 'Add enum value',
element_class => [qw/btn btn-primary pull-right/],
);
has_field 'save' => (
type => 'Submit',
value => 'Save',
element_class => [qw/btn btn-primary/],
label => '',
);
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/id attribute fielddev_pref label max_occur description data_type enum enum_add/],
);
has_block 'actions' => (
tag => 'div',
class => [qw/modal-footer/],
render_list => [qw/save/],
);
sub validate_attribute {
my ($self, $field) = @_;
my $c = $self->form->ctx;
return unless $c;
unless ($field->value =~ /^[a-z0-9_]+$/) {
my $err_msg = 'Only lower-case, digits and _ allowed';
$field->add_error($err_msg);
}
my $existing = $c->model('DB')->resultset('voip_preferences')->search_rs({
attribute => NGCP::Panel::Utils::Preferences::dynamic_pref_attribute_to_db($field->value)
})->first;
#TODO: make it common, but what package to use?
my $edit_id = -1;
if (uc($c->req->method) eq 'PUT' || uc($c->req->method) eq 'PATCH') {
$edit_id = $c->req->args->[0];
} elsif($self->form->field('id')) {
$edit_id = $self->form->field('id')->value
}
#/TODO
if ( $existing && $existing->id != $edit_id ) {
my $err_msg = 'This dynamic attribute already exists.';
$field->add_error($err_msg);
}
}
sub validate_enum_value {
my ($self, $field) = @_;
my $c = $self->form->ctx;
return unless $c;
unless($field->value =~ /^[a-z0-9_]+$/) {
my $err_msg = 'Only lower-case, digits and _ allowed';
$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: