Change-Id: I2ddcc58808f8bf370279c228a755a276372a0a88changes/59/21059/23
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:
|
||||
@ -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:
|
||||
@ -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:
|
||||
@ -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:
|
||||
Loading…
Reference in new issue