TT#36402 Add field device preferences API

Change-Id: I2ddcc58808f8bf370279c228a755a276372a0a88
changes/59/21059/23
Irina Peshinskaya 8 years ago
parent 3552d782b6
commit 17a788718d

@ -0,0 +1,20 @@
package NGCP::Panel::Controller::API::PbxFieldDevicePreferenceDefs;
use Sipwise::Base;
use parent qw/NGCP::Panel::Role::EntityPreferenceDefs NGCP::Panel::Role::API/;
use NGCP::Panel::Utils::Preferences;
sub allowed_methods{
return [qw/GET OPTIONS HEAD/];
}
__PACKAGE__->set_config({
preferences_group => 'fielddev_pref',
allowed_roles => [qw/admin reseller/],
});
1;
# vim: set tabstop=4 expandtab:

@ -0,0 +1,34 @@
package NGCP::Panel::Controller::API::PbxFieldDevicePreferences;
use NGCP::Panel::Utils::Generic qw(:all);
use Sipwise::Base;
use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::Preferences/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
});
sub allowed_methods{
return [qw/GET OPTIONS HEAD/];
}
sub item_name{
return 'pbxfielddevicepreference';
}
sub resource_name{
return 'pbxfielddevicepreferences';
}
sub container_resource_type{
return 'pbxdevices';
}
sub api_description {
return 'Specifies certain properties (preferences) for a <a href="#pbxdevices">PBX Deployed Devices</a>. The full list of properties can be obtained via <a href="/api/pbxfielddevicepreferencedefs/">PbxFieldDevicePreferenceDefs</a>.';
};
1;
# vim: set tabstop=4 expandtab:

@ -0,0 +1,43 @@
package NGCP::Panel::Controller::API::PbxFieldDevicePreferencesItem;
use NGCP::Panel::Utils::Generic qw(:all);
use Sipwise::Base;
use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::Preferences/;
__PACKAGE__->set_config({
PATCH => { ops => [qw/add replace remove copy/] },
allowed_roles => {
Default => [qw/admin reseller/],
Journal => [qw/admin reseller/],
}
});
sub allowed_methods{
return [qw/GET OPTIONS HEAD PATCH PUT/];
}
sub item_name{
return 'pbxfielddevicepreference';
}
sub resource_name{
return 'pbxfielddevicepreferences';
}
sub container_resource_type{
return 'pbxdevices';
}
sub journal_query_params {
my($self,$query_params) = @_;
return $self->get_journal_query_params($query_params);
}
sub get_journal_methods{
return [qw/handle_item_base_journal handle_journals_get handle_journalsitem_get handle_journals_options handle_journalsitem_options handle_journals_head handle_journalsitem_head/];
}
1;
# vim: set tabstop=4 expandtab:

@ -0,0 +1,100 @@
package NGCP::Panel::Controller::API::PreferencesMetaEntries;
use NGCP::Panel::Utils::Generic qw(:all);
use Sipwise::Base;
use NGCP::Panel::Utils::Preferences;
use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::PreferencesMetaEntries/;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
});
sub allowed_methods{
return [qw/GET OPTIONS HEAD POST/];
}
sub item_name{
return 'preferencesmetaentry';
}
sub resource_name{
return 'preferencesmetaentries';
}
sub api_description {
return 'Preferences meta information management.';
};
sub query_params {
return [
{
param => 'attribute',
description => 'Filter for dynamic preference with a specific name',
query => {
first => sub {
my $q = shift;
{ 'me.attribute' => NGCP::Panel::Utils::Preferences::dynamic_pref_attribute_to_db($q)};
},
second => sub { },
},
},
{
param => 'model_id',
description => 'Filter for dynamic preference relevant to the spcified pbx device model id',
query => {
first => sub {
my $q = shift;
{
'-or' => [
'voip_preference_relations.autoprov_device_id' => $q,
'voip_preference_relations.voip_preference_id' => undef
],
};
},
second => sub {
{
join => {'voip_preferences' => 'voip_preference_relations'},
}
},
},
},
{
param => 'reseller_id',
description => 'Filter for dynamic preference relevant to the spcified reseller id',
query => {
first => sub {
my $q = shift;
{
'-or' => [
'autoprov_devices.reseller_id' => $q,
'voip_preference_relations.reseller_id' => $q,
'voip_preference_relations.voip_preference_id' => undef
],
};
},
second => sub {
{
#left join for the
join => {'voip_preferences' => { 'voip_preference_relations' => 'autoprov_devices' } },
}
},
},
},
];
}
sub create_item {
my ($self, $c, $resource, $form, $process_extras) = @_;
my $preference = NGCP::Panel::Utils::Preferences::create_dynamic_preference(
$c,
$resource,
group_name => 'CPBX Device Administration',
);
return $preference;
}
1;
# vim: set tabstop=4 expandtab:

@ -0,0 +1,48 @@
package NGCP::Panel::Controller::API::PreferencesMetaEntriesItem;
use NGCP::Panel::Utils::Generic qw(:all);
use Sipwise::Base;
use NGCP::Panel::Utils::Preferences;
use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::PreferencesMetaEntries/;
__PACKAGE__->set_config({
allowed_roles => {
Default => [qw/admin reseller/],
Journal => [qw/admin reseller/],
}
});
sub allowed_methods{
return [qw/GET OPTIONS HEAD PATCH PUT DELETE/];
}
sub item_name{
return 'preferencesmetaentry';
}
sub resource_name{
return 'preferencesmetaentries';
}
sub journal_query_params {
my($self,$query_params) = @_;
return $self->get_journal_query_params($query_params);
}
sub get_journal_methods{
return [qw/handle_item_base_journal handle_journals_get handle_journalsitem_get handle_journals_options handle_journalsitem_options handle_journals_head handle_journalsitem_head/];
}
sub update_item_model{
my($self, $c, $item, $old_resource, $resource, $form, $process_extras) = @_;
NGCP::Panel::Utils::Preferences::update_dynamic_preference(
$c, $item, $resource
);
return $item;
}
1;
# vim: set tabstop=4 expandtab:

@ -62,6 +62,7 @@ sub GET : Allow {
"PeeringServerPreferenceDefs" => 1,
"PbxDevicePreferenceDefs" => 1,
"PbxDeviceProfilePreferenceDefs" => 1,
"PbxFieldDevicePreferenceDefs" => 1,
"MetaConfigDefs" => 1,
};

@ -0,0 +1,28 @@
package NGCP::Panel::Form::Device::PreferenceAPI;
use HTML::FormHandler::Moose;
extends 'NGCP::Panel::Form::Device::Preference';
has_field 'autoprov_device_id' => (
type => 'PosInteger',
#see comment for the dev_pref
required => 0,
label => 'Model id for the dynamic device model preferences',
);
has_field 'reseller_id' => (
type => 'PosInteger',
#see comment for the dev_pref
required => 0,
label => 'Reseller id for the dynamic device model preferences',
);
has_field 'dev_pref' => (
type => 'Boolean',
label => 'This is device model preference.',
#until we don't create any other preference type as dynamic preference, we can keep this field required, to don't create unnecessary form validation code
required => 1,
);
1;
# vim: set tabstop=4 expandtab:

@ -306,11 +306,13 @@ sub validate_fields {
if (defined $resource->{$k} &&
$fields->{$k}->$_isa('HTML::FormHandler::Field::Repeatable') &&
"ARRAY" eq ref $resource->{$k} ) {
for my $elem (@{ $resource->{$k} }) {
my ($subfield_instance) = $fields->{$k}->fields;
"ARRAY" eq ref $resource->{$k}) {
my ($subfield_instance) = $fields->{$k}->fields;
if ($subfield_instance) {
my %subfields = map { $_->name => $_ } $subfield_instance->fields;
$self->validate_fields($c, $elem, \%subfields, $run);
for my $elem (@{ $resource->{$k} }) {
$self->validate_fields($c, $elem, \%subfields, $run);
}
}
}

@ -97,6 +97,8 @@ sub get_resource {
$prefs = $item->voip_dev_preferences;
} elsif($type eq "pbxdeviceprofiles") {
$prefs = $item->voip_devprof_preferences;
} elsif($type eq "pbxdevices") {
$prefs = $item->voip_fielddev_preferences;
}
$prefs = $prefs->search({
}, {
@ -269,6 +271,9 @@ sub get_resource {
} elsif($type eq "pbxdeviceprofiles") {
$resource->{profile_id} = int($item->id);
$resource->{id} = int($item->id);
} elsif($type eq "pbxdevices") {
$resource->{device_id} = int($item->id);
$resource->{id} = int($item->id);
} elsif($type eq "contracts") {
$resource->{customer_id} = int($item->id);
$resource->{id} = int($item->id);
@ -366,6 +371,16 @@ sub _item_rs {
'join' => {'config' => 'device'},
});
}
} elsif($type eq "pbxdevices") {
if($c->user->roles eq "admin") {
$item_rs = $c->model('DB')->resultset('autoprov_field_devices');
} else {
$item_rs = $c->model('DB')->resultset('autoprov_field_devices')->search({
'device.reseller_id' => $c->user->reseller_id
},{
'join' => {'profile' => {'config' => 'device'}},
});
}
} elsif($type eq "contracts") {
if($c->user->roles eq "admin") {
$item_rs = $c->model('DB')->resultset('contracts')->search({
@ -428,6 +443,12 @@ sub get_preference_rs {
attribute => $attr,
profile => $elem,
);
} elsif($type eq "pbxdevices") {
$rs = NGCP::Panel::Utils::Preferences::get_fielddev_preference_rs(
c => $c,
attribute => $attr,
device => $elem,
);
} elsif($type eq "contracts") {
$rs = NGCP::Panel::Utils::Preferences::get_contract_preference_rs(
c => $c,
@ -532,7 +553,7 @@ sub update_item {
$reseller_id = $item->reseller_id;
} elsif($type eq "pbxdeviceprofiles") {
delete $resource->{profile_id};
delete $old_resource->{prof};
delete $old_resource->{profile_id};
delete $resource->{pbxdeviceprofilepreferences_id};
delete $old_resource->{pbxdeviceprofilepreferences_id};
$accessor = $item->id;
@ -540,6 +561,16 @@ sub update_item {
$full_rs = $elem->voip_devprof_preferences->search_rs();
$pref_type = 'devprof_pref';
$reseller_id = $item->config->device->reseller_id;
} elsif($type eq "pbxdevices") {
delete $resource->{device_id};
delete $old_resource->{device_id};
delete $resource->{pbxfielddevicepreferences_id};
delete $old_resource->{pbxfielddevicepreferences_id};
$accessor = $item->id;
$elem = $item;
$full_rs = $elem->voip_fielddev_preferences->search_rs();
$pref_type = 'fielddev_pref';
$reseller_id = $item->profile->config->device->reseller_id;
} else {
return;
}

@ -0,0 +1,92 @@
package NGCP::Panel::Role::API::PreferencesMetaEntries;
use NGCP::Panel::Utils::Generic qw(:all);
use Sipwise::Base;
use parent 'NGCP::Panel::Role::API';
use boolean qw(true);
use Data::HAL qw();
use Data::HAL::Link qw();
use HTTP::Status qw(:constants);
sub _item_rs {
my ($self, $c) = @_;
my $item_rs = $c->model('DB')->resultset('voip_preferences')->search_rs({
'me.dynamic' => 1,
},{
'+columns' => {'autoprov_device_id' => 'voip_preference_relations.autoprov_device_id'},
'join' => 'voip_preference_relations',
});
my $reseller_id;
if ($c->user->roles eq "admin") {
} elsif ($c->user->roles eq "reseller") {
my $reseller_id = $c->user->reseller_id;
} elsif ($c->user->roles eq "subscriberadmin" || $c->user->roles eq "subscriber") {
my $reseller_id = $c->user->contract->contact->reseller_id;
}
if ($reseller_id) {
$item_rs = $item_rs->search({
'-or' => [
'autoprov_devices.reseller_id' => $c->user->reseller_id ,
'voip_preference_relations.reseller_id' => $c->user->reseller_id ,
'voip_preference_relations.voip_preference_id' => undef,
],
},{
'join' => { 'voip_preference_relations' => 'autoprov_devices' },
});
}
return $item_rs;
}
sub get_form {
my ($self, $c) = @_;
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} ) {
if ($c->user->roles eq "reseller") {
$resource->{reseller_id} = $c->user->reseller_id;
}
}
return $resource;
}
1;
# vim: set tabstop=4 expandtab:

@ -24,6 +24,7 @@ $fake_data->set_data_from_script({
domain_id => sub { return shift->get_id('domains',@_); },
profile_id => sub { return shift->get_id('subscriberprofiles',@_); },
pbxdevice_id => sub { return shift->get_id('pbxdevicemodels',@_); },
pbxfielddevice_id => sub { return shift->get_id('pbxdevices',@_); },
pbxdeviceprofile_id => sub { return shift->get_id('pbxdeviceprofiles',@_); },
emergencymappingcontainer_id => sub { return shift->get_id('emergencymappingcontainers',@_); },
@ -38,7 +39,7 @@ $fake_data->set_data_from_script({
$test_machine->DATA_ITEM_STORE($fake_data->process('preferences'));
$test_machine->form_data_item( );
my @apis = qw/subscriber domain peeringserver customer profile pbxdevice pbxdeviceprofile/;
my @apis = qw/subscriber domain peeringserver customer profile pbxdevice pbxfielddevice pbxdeviceprofile/;
#my @apis = qw/pbxdevice/;
foreach my $api (@apis){

@ -0,0 +1,66 @@
use strict;
use warnings;
use Test::More;
use Test::Collection;
use Test::FakeData;
use Data::Dumper;
my $test_machine = Test::Collection->new(
name => 'preferencesmetaentries',
QUIET_DELETION => 1,
);
my $fake_data = Test::FakeData->new;
$test_machine->methods->{collection}->{allowed} = {map {$_ => 1} qw(GET HEAD OPTIONS POST)};
$test_machine->methods->{item}->{allowed} = {map {$_ => 1} qw(GET HEAD OPTIONS PUT PATCH DELETE)};
$fake_data->set_data_from_script({
'preferencesmetaentries' => {
data => {
label => "Custom pbx device model preference",
description => "Custom pbx device model preference description",
attribute => "123123123123123api_test",
fielddev_pref => 1,
max_occur => 1,
data_type => 'enum',
autoprov_device_id => sub { return shift->get_id('pbxdevicemodels',@_); },
dev_pref => 1,
enum => [
{
label => "api_test_enum1",
value => 1,
default_val => 0,
},
{
label => "api_test_enum2",
value => 2,
default_val => 1,
}
],
},
'query' => ['attribute'],
'data_callbacks' => {
'uniquizer_cb' => sub {
Test::FakeData::string_uniquizer(\$_[0]->{attribute});
},
},
},
});
$test_machine->DATA_ITEM_STORE($fake_data->process('preferencesmetaentries'));
$test_machine->form_data_item( );
# create 3 new preferences from DATA_ITEM
$test_machine->check_create_correct( 3, sub{ $_[0]->{attribute} .= time().$_[1]->{i} ; } );
$test_machine->check_get2put();
$test_machine->check_bundle();
$fake_data->clear_test_data_all();
$test_machine->clear_test_data_all();
undef $fake_data;
undef $test_machine;
done_testing;
# vim: set tabstop=4 expandtab:

@ -108,6 +108,8 @@ $ua = Test::Collection->new()->ua();
pbxdeviceprofilepreferencedefs => 1,
pbxdeviceprofilepreferences => 1,
pbxdeviceprofiles => 1,
pbxfielddevicepreferencedefs => 1,
pbxfielddevicepreferences => 1,
pbxdevices => 1,
peeringgroups => 1,
peeringrules => 1,
@ -116,6 +118,7 @@ $ua = Test::Collection->new()->ua();
peeringserverpreferences => 1,
peeringservers => 1,
phonebookentries => 1,
preferencesmetaentries => 1,
profilepackages => 1,
profilepreferencedefs => 1,
profilepreferences => 1,

Loading…
Cancel
Save