TT#57653 Sync missed email templates on demand

Change-Id: I379539210fc250b2b86b9995adb19374878d176a
changes/87/29487/17
Irina Peshinskaya 7 years ago
parent 5dc3065cdf
commit 33dc1a0a22

@ -8,6 +8,7 @@ use NGCP::Panel::Form;
use NGCP::Panel::Utils::Email;
use NGCP::Panel::Utils::Message;
use JSON qw/encode_json decode_json/;
sub auto :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) {
my ($self, $c) = @_;
@ -22,21 +23,65 @@ sub tmpl_list :Chained('/') :PathPart('emailtemplate') :CaptureArgs(0) {
my ( $self, $c ) = @_;
my $tmpl_rs = $c->model('DB')->resultset('email_templates');
$c->stash->{template_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => 'id', search => 1, title => $c->loc('#') },
{ name => 'reseller.name', search => 1, title => $c->loc('Reseller') },
{ name => 'name', search => 1, title => $c->loc('Name') },
{ name => 'from_email', search => 1, title => $c->loc('From') },
{ name => 'subject', search => 1, title => $c->loc('Subject') },
]);
#select r.id as reseller_id,r.name as reseller_name, etd.id as email_template_id, etd.name as email_template_name from resellers r
#join email_templates etd on etd.reseller_id is null
#left join email_templates et on et.name=etd.name and et.reseller_id=r.id
#where et.id is null order by r.id,etd.id;
my $tmpl_missed_rs = $c->model('DB')->resultset('resellers')->search_rs({
'et.id' => undef,
},{
'select' => [
{ '' => \'concat(me.id,"/",etd.id)', -as => 'id' },
{ '' => \['me.id'], -as => 'reseller_id' },
{ '' => \['me.name'], -as => 'reseller_name' },
{ '' => \['etd.id'], -as => 'email_template_id' },
{ '' => \['etd.name'], -as => 'email_template_name' },
],
'as' => [qw/id reseller_id reseller_name email_template_id email_template_name/],
alias => 'me',
order_by => [qw/reseller_id email_template_id/],
from => [
{ 'me' => 'billing.resellers' },
[
{ 'etd' => 'billing.email_templates' },
[
{ 'etd.reseller_id' => { -value => undef } },
],
],
[
{ 'et' => 'billing.email_templates', '-join_type' => 'left' },
[
{
'-and' => [
{
'et.name' => { '-ident' => 'etd.name'} ,
'et.reseller_id' => { '-ident' => 'me.id'} ,
},
],
},
],
],
],
}
);
if($c->user->roles eq "admin") {
} elsif($c->user->roles eq "reseller") {
$tmpl_rs = $tmpl_rs->search({
reseller_id => $c->user->reseller_id,
});
$tmpl_missed_rs = $tmpl_missed_rs->search_rs({ reseller_id => $c->user->reseller_id });
}
$c->stash->{tmpl_rs} = $tmpl_rs;
$c->stash->{template_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => 'id', search => 1, title => $c->loc('#') },
{ name => 'reseller.name', search => 1, title => $c->loc('Reseller') },
{ name => 'name', search => 1, title => $c->loc('Name') },
{ name => 'from_email', search => 1, title => $c->loc('From') },
{ name => 'subject', search => 1, title => $c->loc('Subject') },
]);
$c->stash->{tmpl_missed_rs} = $tmpl_missed_rs;
$c->stash->{email_template_external_filter} = $c->session->{email_template_external_filter};
@ -86,6 +131,17 @@ sub tmpl_ajax_default :Chained('tmpl_list') :PathPart('ajax/default') :Args(0) {
$c->detach( $c->view("JSON") );
}
sub tmpl_ajax_missed :Chained('tmpl_list') :PathPart('ajax/missed') :Args(0) {
my ($self, $c) = @_;
my $dt_columns = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => 'id', literal_sql => 'concat(me.id,"/",etd.id)', search => 1, title => $c->loc('#') },
{ name => 'reseller_name', literal_sql => 'me.name', search => 1, title => $c->loc('Reseller') },
{ name => 'email_template_name', literal_sql => 'etd.name', search => 1, title => $c->loc('Email template') },
]);
NGCP::Panel::Utils::Datatables::process($c, $c->stash->{tmpl_missed_rs}, $dt_columns );
$c->detach( $c->view("JSON") );
}
sub tmpl_create :Chained('tmpl_list') :PathPart('create') :Args(0) {
my ($self, $c) = @_;
@ -120,6 +176,57 @@ sub tmpl_create :Chained('tmpl_list') :PathPart('create') :Args(0) {
);
}
sub tmpl_sync :Chained('tmpl_list') :PathPart('sync') :Args(0) {
my ($self, $c) = @_;
my $posted = ($c->request->method eq 'POST');
my $form = NGCP::Panel::Form::get("NGCP::Panel::Form::EmailTemplate::Sync", $c);
my $params = { id => encode_json([map { $_->id } $c->stash->{tmpl_missed_rs}->all]) };
$form->process(
posted => $posted,
params => $c->request->params,
item => $params,
);
if($posted) {
if($form->validated && $form->values->{id}) {
try {
my $schema = $c->model('DB');
my $pairs = decode_json($form->values->{id});
foreach my $ids (@$pairs) {
(my($reseller_id,$tmpl_id)) = $ids=~/(\d+)\D+(\d+)/;
if($c->user->roles eq "reseller") {
$form->values->{reseller_id} = $c->user->reseller_id;
}
my $template_rs = $schema->resultset('email_templates')->find($tmpl_id);
my $template = { $template_rs->get_inflated_columns };
delete $template->{id};
$template->{reseller_id} = $reseller_id;
$template->{attachment_name} //= '';
$schema->txn_do(sub {
my $tmpl = $c->stash->{tmpl_rs}->create($template);
});
}
NGCP::Panel::Utils::Message::info(
c => $c,
desc => $c->loc('Email template successfully synced'),
);
} catch($e) {
NGCP::Panel::Utils::Message::error(
c => $c,
error => $e,
desc => $c->loc('Failed to sync email template'),
);
}
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/emailtemplate'));
}
}
$c->stash(
form => $form,
create_flag => 1,
);
}
sub tmpl_base :Chained('tmpl_list') :PathPart('') :CaptureArgs(1) {
my ($self, $c, $tmpl_id) = @_;

@ -15,10 +15,12 @@ has 'table_fields' => ( isa => 'ArrayRef', is => 'rw' );
has 'table_titles' => ( isa => 'ArrayRef', is => 'rw' );
has 'custom_renderers' => ( isa => 'HashRef', is => 'rw' );
has 'no_ordering' => ( isa => 'Bool', is => 'rw' );
has 'no_pagination' => ( isa => 'Bool', is => 'rw', default => 0 );
has 'only_visible_values' => ( isa => 'Bool', is => 'rw', default => 0 );
has 'language_file' => (isa => 'Str', is => 'rw', default => 'dataTables.default.js' );
has 'search_tooltip' => (isa => 'Str', is => 'rw', default => 'Filter for column values matching the pattern string, e.g. 12*45. The * (wildcard) is implicitly prepended and appended.' );
#didn't want to incude some complex role related logic here,
#didn't want to include some complex role related logic here,
#as these DataTable fields also are used in API
#To don't slow down API
#traits => ['Code']
@ -40,6 +42,8 @@ sub render_element {
table_titles => $self->table_titles,
custom_renderers => $self->custom_renderers,
no_ordering => $self->no_ordering,
no_pagination => $self->no_pagination,
only_visible_values => $self->only_visible_values,
errors => $self->errors,
language_file => $self->language_file,
search_tooltip => $self->search_tooltip,

@ -0,0 +1,50 @@
package NGCP::Panel::Form::EmailTemplate::Sync;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
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 'id' => (
type => '+NGCP::Panel::Field::DataTable',
label => 'Missed email templates',
do_label => 0,
do_wrapper => 0,
required => 1,
no_pagination => 1,
no_ordering => 1,
only_visible_values => 1,
template => 'helpers/datatables_multifield.tt',
ajax_src => '/emailtemplate/ajax/missed',
table_titles => ['#', 'Reseller', 'Email template'],
table_fields => ['id', 'reseller_name', 'email_template_name'],
);
has_block 'fields' => (
tag => 'div',
class => [qw/modal-body/],
render_list => [qw/id/],
);
has_field 'save' => (
type => 'Submit',
value => 'Sync',
element_class => [qw/btn btn-primary/],
label => '',
);
has_block 'actions' => (
tag => 'div',
class => [qw/modal-footer/],
render_list => [qw/save/],
);
1;
# vim: set tabstop=4 expandtab:

@ -475,6 +475,7 @@ sub get_column_order_name{
}
return $name;
}
sub _get_joined_column_name {
my $cname = shift;
my $name;

@ -9,6 +9,11 @@
<span>
<a class="btn btn-primary btn-large" href="[% c.uri_for('/emailtemplate/create') %]"><i class="icon-star"></i> [% c.loc('Create Email Template') %]</a>
</span>
[% IF tmpl_missed_rs.count -%]
<span>
<a class="btn btn-primary btn-large" href="[% c.uri_for('/emailtemplate/sync') %]"><i class="icon-star"></i> [% c.loc('Sync Email Templates') %]</a>
</span>
[% END -%]
[% END -%]
</div>
[% back_created = 1 -%]

@ -2,6 +2,7 @@
<script type="text/javascript">
var checked_fields[%table_id%] = [];
var unchecked_fields[%table_id%] = [];
$(document).ready(function() {
[%IF value%]
@ -11,28 +12,31 @@ $(document).ready(function() {
checked_fields[%table_id%].push(val);
});
[%END%]
function update_hidden_value () {
$("#[% hidden_id %]").val( JSON.stringify(checked_fields[%table_id%]) );
}
$('#[% table_id %] tr td input[type="checkbox"]').live( "click", function() {
var my_id = $(this).parents("tr").find("td:first").text();
var indexOfId = checked_fields[%table_id%].indexOf(my_id)
if($(this).attr("checked") == "checked") {
if(indexOfId < 0){
checked_fields[%table_id%].push(my_id);
checked_fields[%table_id%].push(my_id);
unchecked_fields[%table_id%].splice(indexOfId,1);
}
} else {
if( indexOfId >= 0){
checked_fields[%table_id%].splice(indexOfId,1);
unchecked_fields[%table_id%].push(my_id);
}
}
$("#[% hidden_id %]").val( JSON.stringify(checked_fields[%table_id%]) );
update_hidden_value ();
});
$('#[% table_id %]')
.dataTable( {
"sDom": "<'row-fluid'<'pull-left'r><'pull-right'f>>t<'row-fluid'<'pull-left'i><'pull-right'p>>",
"bProcessing": true,
"bServerSide": true,
"bPaginate": true,
"bPaginate": [%IF no_pagination; 'false'; ELSE; 'true'; END%],
"sPaginationType": "bootstrap",
"bLengthChange": false,
"bSort": [%IF no_ordering; 'false'; ELSE; 'true'; END%],
@ -78,6 +82,41 @@ $(document).ready(function() {
"fnServerParams": function ( aoData ) {
//aoData.push( {"name":"iIdOnTop","value":"[% value %]"} );
},
[%IF only_visible_values %]
"fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
oSettings.jqXHR = $.ajax( {
"dataType": 'json',
"url": sSource,
"data": aoData,
"success": function(data, textStatus, jqXHR) {
var aadata_length = data.aaData.length;
var serverArray = [];
for (var i = 0; i < aadata_length; i++) {
serverArray.push(data.aaData[i].id);
}
var checked_fields_length = checked_fields[%table_id%].length;
for (var i = 0; i < checked_fields_length; i++) {
var id_checked = checked_fields[%table_id%][i];
var serverIndexOf = serverArray.indexOf(id_checked);
if ( serverIndexOf < 0 ) {
checked_fields[%table_id%].splice(serverIndexOf,1);
}
}
var server_length = serverArray.length;
for (var i = 0; i < server_length; i++) {
var id_server = serverArray[i];
var uncheckedIndexOf = unchecked_fields[%table_id%].indexOf(id_server);
var checkedIndexOf = checked_fields[%table_id%].indexOf(id_server);
if (uncheckedIndexOf < 0 && checkedIndexOf < 0) {
checked_fields[%table_id%].push(id_server);
}
}
update_hidden_value();
fnCallback(data, textStatus, jqXHR);
}
} );
},
[%END%]
"initComplete": function(settings, json) {
if ("[% c.loc(search_tooltip) %]".length > 0) {
$( "#[% table_id %]_filter input" ).tooltip({

Loading…
Cancel
Save