diff --git a/lib/NGCP/Panel/Controller/Device.pm b/lib/NGCP/Panel/Controller/Device.pm index 9de8f0b1dc..149764c391 100644 --- a/lib/NGCP/Panel/Controller/Device.pm +++ b/lib/NGCP/Panel/Controller/Device.pm @@ -5,6 +5,7 @@ use NGCP::Panel::Form::Device::Model; use NGCP::Panel::Form::Device::ModelAdmin; use NGCP::Panel::Form::Device::Firmware; use NGCP::Panel::Form::Device::Config; +use NGCP::Panel::Form::Device::Profile; use NGCP::Panel::Utils::Navigation; @@ -43,7 +44,6 @@ sub base :Chained('/') :PathPart('device') :CaptureArgs(0) { { name => 'id', search => 1, title => '#' }, { name => 'device.vendor', search => 1, title => 'Device Vendor' }, { name => 'device.model', search => 1, title => 'Device Model' }, - { name => 'version', search => 1, title => 'Version' }, { name => 'filename', search => 1, title => 'Firmware File' }, ]); @@ -62,10 +62,28 @@ sub base :Chained('/') :PathPart('device') :CaptureArgs(0) { { name => 'version', search => 1, title => 'Version' }, ]); + my $devprof_rs = $c->model('DB')->resultset('autoprov_profiles'); + unless($c->user->is_superuser) { + $devprof_rs = $devprof_rs->search({ + 'device.reseller_id' => $c->user->reseller_id + }, { + join => 'device', + }); + } + $c->stash->{devprof_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [ + { name => 'id', search => 1, title => '#' }, + { name => 'name', search => 1, title => 'Name' }, + { name => 'config.device.vendor', search => 1, title => 'Device Vendor' }, + { name => 'config.device.model', search => 1, title => 'Device Model' }, + { name => 'firmware.filename', search => 1, title => 'Firmware File' }, + { name => 'config.version', search => 1, title => 'Configuration Version' }, + ]); + $c->stash( devmod_rs => $devmod_rs, devfw_rs => $devfw_rs, devconf_rs => $devconf_rs, + devprof_rs => $devprof_rs, template => 'device/list.tt', ); } @@ -281,8 +299,9 @@ sub devfw_create :Chained('base') :PathPart('firmware/create') :Args(0) { $form->params->{filename} = $file->filename; $form->params->{data} = $file->slurp; my $devmod = $c->stash->{devmod_rs}->find($form->params->{device}{id}); - $devmod->create_related('autoprov_firmwares', $form->params); + my $devfw = $devmod->create_related('autoprov_firmwares', $form->params); delete $c->session->{created_objects}->{device}; + $c->session->{created_objects}->{firmware} = { id => $devfw->id }; $c->flash(messages => [{type => 'success', text => 'Successfully created device firmware'}]); }); } catch($e) { @@ -443,8 +462,9 @@ sub devconf_create :Chained('base') :PathPart('config/create') :Args(0) { my $schema = $c->model('DB'); $schema->txn_do(sub { my $devmod = $c->stash->{devmod_rs}->find($form->params->{device}{id}); - $devmod->create_related('autoprov_configs', $form->params); + my $devconf = $devmod->create_related('autoprov_configs', $form->params); delete $c->session->{created_objects}->{device}; + $c->session->{created_objects}->{config} = { id => $devconf->id }; $c->flash(messages => [{type => 'success', text => 'Successfully created device configuration'}]); }); } catch($e) { @@ -563,6 +583,165 @@ sub devconf_download :Chained('devconf_base') :PathPart('download') :Args(0) { $c->response->body($conf->data); } +sub devprof_ajax :Chained('base') :PathPart('profile/ajax') :Args(0) { + my ($self, $c) = @_; + + my $resultset = $c->stash->{devprof_rs}; + NGCP::Panel::Utils::Datatables::process($c, $resultset, $c->stash->{devprof_dt_columns}); + $c->detach( $c->view("JSON") ); +} + +sub devprof_create :Chained('base') :PathPart('profile/create') :Args(0) { + my ($self, $c) = @_; + + my $posted = ($c->request->method eq 'POST'); + my $form = NGCP::Panel::Form::Device::Profile->new; + + my $params = {}; + $params = $params->merge($c->session->{created_objects}); + $form->process( + posted => $posted, + params => $c->request->params, + item => $params + ); + NGCP::Panel::Utils::Navigation::check_form_buttons( + c => $c, + form => $form, + fields => { + 'firmware.create' => $c->uri_for('/device/firmware/create'), + 'config.create' => $c->uri_for('/device/config/create'), + }, + back_uri => $c->req->uri, + ); + + if($posted && $form->validated) { + try { + my $schema = $c->model('DB'); + $schema->txn_do(sub { + $form->params->{firmware_id} = $form->params->{firmware}{id}; + delete $form->params->{firmware}; + $form->params->{config_id} = $form->params->{config}{id}; + delete $form->params->{config}; + + $c->model('DB')->resultset('autoprov_profiles')->create($form->params); + + delete $c->session->{created_objects}->{firmware}; + delete $c->session->{created_objects}->{config}; + $c->flash(messages => [{type => 'success', text => 'Successfully created device profile'}]); + }); + } catch($e) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => $e, + desc => "Failed to create device profile", + ); + } + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/device')); + } + + $c->stash( + devprof_create_flag => 1, + form => $form, + ); +} + +sub devprof_base :Chained('base') :PathPart('profile') :CaptureArgs(1) { + my ($self, $c, $devprof_id) = @_; + + unless($devprof_id->is_int) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => "invalid device profile id '$devprof_id'", + desc => "Invalid device profile id", + ); + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/device')); + } + + $c->stash->{devprof} = $c->stash->{devprof_rs}->find($devprof_id); + unless($c->stash->{devprof}) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => "device profile with id '$devprof_id' not found", + desc => "Device profile not found", + ); + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/device')); + } +} + +sub devprof_delete :Chained('devprof_base') :PathPart('delete') :Args(0) { + my ($self, $c) = @_; + + try { + $c->stash->{devprof}->delete; + $c->flash(messages => [{type => 'success', text => 'Device profile successfully deleted' }]); + } catch($e) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => "failed to delete device profile with id '".$c->stash->{devprof}->id."': $e", + desc => "Failed to delete device profile", + ); + } + + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/device')); +} + +sub devprof_edit :Chained('devprof_base') :PathPart('edit') :Args(0) { + my ($self, $c) = @_; + + my $posted = ($c->request->method eq 'POST'); + my $form; + my $params = { $c->stash->{devprof}->get_inflated_columns }; + $params->{firmware}{id} = delete $params->{firmware_id}; + $params->{config}{id} = delete $params->{config_id}; + $params = $params->merge($c->session->{created_objects}); + $form = NGCP::Panel::Form::Device::Profile->new; + + $form->process( + posted => $posted, + params => $c->request->params, + item => $params + ); + NGCP::Panel::Utils::Navigation::check_form_buttons( + c => $c, + form => $form, + fields => { + 'firmware.create' => $c->uri_for('/device/firmware/create'), + 'config.create' => $c->uri_for('/device/config/create'), + }, + back_uri => $c->req->uri, + ); + + if($posted && $form->validated) { + try { + my $schema = $c->model('DB'); + $schema->txn_do(sub { + $form->params->{firmware_id} = $form->params->{firmware}{id}; + delete $form->params->{firmware}; + $form->params->{config_id} = $form->params->{config}{id}; + delete $form->params->{config}; + + $c->stash->{devprof}->update($form->params); + + delete $c->session->{created_objects}->{firmware}; + delete $c->session->{created_objects}->{config}; + $c->flash(messages => [{type => 'success', text => 'Successfully updated device profile'}]); + }); + } catch($e) { + NGCP::Panel::Utils::Message->error( + c => $c, + error => $e, + desc => "Failed to update device profile", + ); + } + NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/device')); + } + + $c->stash( + devprof_edit_flag => 1, + form => $form, + ); +} + __PACKAGE__->meta->make_immutable; 1; diff --git a/lib/NGCP/Panel/Controller/Reseller.pm b/lib/NGCP/Panel/Controller/Reseller.pm index fa622d8289..7c130381a1 100644 --- a/lib/NGCP/Panel/Controller/Reseller.pm +++ b/lib/NGCP/Panel/Controller/Reseller.pm @@ -294,6 +294,8 @@ sub _handle_reseller_status_change { $reseller->voip_sound_sets->delete_all; #delete voip_rewrite_rule_sets $reseller->voip_rewrite_rule_sets->delete_all; + #delete autoprov_devices + $reseller->autoprov_devices->delete_all; } } diff --git a/lib/NGCP/Panel/Field/DeviceConfig.pm b/lib/NGCP/Panel/Field/DeviceConfig.pm new file mode 100644 index 0000000000..13cbb4c968 --- /dev/null +++ b/lib/NGCP/Panel/Field/DeviceConfig.pm @@ -0,0 +1,26 @@ +package NGCP::Panel::Field::DeviceConfig; +use HTML::FormHandler::Moose; +extends 'HTML::FormHandler::Field::Compound'; + +has_field 'id' => ( + type => '+NGCP::Panel::Field::DataTable', + label => 'Device Configuration', + do_label => 0, + do_wrapper => 0, + required => 1, + template => 'helpers/datatables_field.tt', + ajax_src => '/device/config/ajax', + table_titles => ['#', 'Device Vendor', 'Device Model', 'Version'], + table_fields => ['id', 'device_vendor', 'device_model', 'version'], +); + +has_field 'create' => ( + type => 'Button', + do_label => 0, + value => 'Create Device Configuration', + element_class => [qw/btn btn-tertiary pull-right/], +); + +1; + +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Field/DeviceFirmware.pm b/lib/NGCP/Panel/Field/DeviceFirmware.pm new file mode 100644 index 0000000000..8c023928fd --- /dev/null +++ b/lib/NGCP/Panel/Field/DeviceFirmware.pm @@ -0,0 +1,26 @@ +package NGCP::Panel::Field::DeviceFirmware; +use HTML::FormHandler::Moose; +extends 'HTML::FormHandler::Field::Compound'; + +has_field 'id' => ( + type => '+NGCP::Panel::Field::DataTable', + label => 'Device Firmware', + do_label => 0, + do_wrapper => 0, + required => 1, + template => 'helpers/datatables_field.tt', + ajax_src => '/device/firmware/ajax', + table_titles => ['#', 'Device Vendor', 'Device Model', 'Filename'], + table_fields => ['id', 'device_vendor', 'device_model', 'filename'], +); + +has_field 'create' => ( + type => 'Button', + do_label => 0, + value => 'Create Device Firmware', + element_class => [qw/btn btn-tertiary pull-right/], +); + +1; + +# vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Form/Device/Firmware.pm b/lib/NGCP/Panel/Form/Device/Firmware.pm index d856e7b215..d4adbdd630 100644 --- a/lib/NGCP/Panel/Form/Device/Firmware.pm +++ b/lib/NGCP/Panel/Form/Device/Firmware.pm @@ -18,12 +18,6 @@ has_field 'device' => ( label => 'Device Model', ); -has_field 'version' => ( - type => 'Text', - required => 1, - label => 'Version', -); - has_field 'data' => ( type => 'Upload', required => 1, @@ -41,7 +35,7 @@ has_field 'save' => ( has_block 'fields' => ( tag => 'div', class => [qw/modal-body/], - render_list => [qw/device data version/], + render_list => [qw/device data/], ); has_block 'actions' => ( diff --git a/lib/NGCP/Panel/Form/Device/Profile.pm b/lib/NGCP/Panel/Form/Device/Profile.pm new file mode 100644 index 0000000000..510d5bbbde --- /dev/null +++ b/lib/NGCP/Panel/Form/Device/Profile.pm @@ -0,0 +1,52 @@ +package NGCP::Panel::Form::Device::Profile; + +use HTML::FormHandler::Moose; +extends 'HTML::FormHandler'; +use Moose::Util::TypeConstraints; + +use HTML::FormHandler::Widget::Block::Bootstrap; + +has '+widget_wrapper' => ( default => 'Bootstrap' ); +has_field 'submitid' => ( type => 'Hidden' ); +sub build_render_list {[qw/submitid fields actions/]} +sub build_form_element_class {[qw(form-horizontal)]} + +has_field 'firmware' => ( + type => '+NGCP::Panel::Field::DeviceFirmware', + not_nullable => 0, + label => 'Device Firmware', +); + +has_field 'config' => ( + type => '+NGCP::Panel::Field::DeviceConfig', + not_nullable => 1, + label => 'Device Configuration', +); + +has_field 'name' => ( + type => 'Text', + required => 1, + label => 'Profile Name', +); + +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/firmware config name/], +); + +has_block 'actions' => ( + tag => 'div', + class => [qw/modal-footer/], + render_list => [qw/save/], +); + +1; +# vim: set tabstop=4 expandtab: diff --git a/share/templates/device/list.tt b/share/templates/device/list.tt index a953a1a7f9..750c283bfd 100644 --- a/share/templates/device/list.tt +++ b/share/templates/device/list.tt @@ -130,5 +130,42 @@ +