MT#6461 Let admin rebrand reseller.

Reseller rebranding itself not yet there.
agranig/selfsignup
Andreas Granig 12 years ago
parent 51b508fd60
commit 7cbb8633ab

@ -4,13 +4,15 @@ use namespace::sweep;
BEGIN { extends 'Catalyst::Controller'; }
use DateTime qw();
use HTTP::Status qw(HTTP_SEE_OTHER);
use File::Type;
use NGCP::Panel::Form::Reseller;
use NGCP::Panel::Form::Reseller::Branding;
use NGCP::Panel::Utils::Contract;
use NGCP::Panel::Utils::DateTime;
use NGCP::Panel::Utils::Message;
use NGCP::Panel::Utils::Navigation;
sub auto :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
sub auto {
my ($self, $c) = @_;
$c->log->debug(__PACKAGE__ . '::auto');
NGCP::Panel::Utils::Navigation::check_redirect_chain(c => $c);
@ -45,11 +47,11 @@ sub list_reseller :Chained('/') :PathPart('reseller') :CaptureArgs(0) {
]);
}
sub root :Chained('list_reseller') :PathPart('') :Args(0) {
sub root :Chained('list_reseller') :PathPart('') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
}
sub ajax :Chained('list_reseller') :PathPart('ajax') :Args(0) {
sub ajax :Chained('list_reseller') :PathPart('ajax') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
my $resellers = $c->stash->{resellers};
NGCP::Panel::Utils::Datatables::process($c, $resellers, $c->stash->{reseller_dt_columns});
@ -57,7 +59,7 @@ sub ajax :Chained('list_reseller') :PathPart('ajax') :Args(0) {
return;
}
sub create :Chained('list_reseller') :PathPart('create') :Args(0) {
sub create :Chained('list_reseller') :PathPart('create') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
$c->detach('/denied_page')
@ -116,6 +118,9 @@ sub base :Chained('list_reseller') :PathPart('') :CaptureArgs(1) {
$c->response->redirect($c->uri_for());
return;
}
$c->detach('/denied_page')
if($c->user->roles eq "reseller" && $c->user->reseller_id != $reseller_id);
$c->stash->{contact_dt_columns} = NGCP::Panel::Utils::Datatables::set_columns($c, [
{ name => "id", search => 1, title => $c->loc('#') },
{ name => "firstname", search => 1, title => $c->loc('First Name') },
@ -159,9 +164,12 @@ sub base :Chained('list_reseller') :PathPart('') :CaptureArgs(1) {
);
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for('/reseller'));
}
$c->stash->{branding} = $c->stash->{reseller}->first->branding;
}
sub reseller_contacts :Chained('base') :PathPart('contacts/ajax') :Args(0) {
sub reseller_contacts :Chained('base') :PathPart('contacts/ajax') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
my $rs = $c->stash->{reseller}->first->contract->search_related_rs('contact');
NGCP::Panel::Utils::Datatables::process($c, $rs, $c->stash->{contact_dt_columns});
@ -169,7 +177,7 @@ sub reseller_contacts :Chained('base') :PathPart('contacts/ajax') :Args(0) {
return;
}
sub reseller_single :Chained('base') :PathPart('single/ajax') :Args(0) {
sub reseller_single :Chained('base') :PathPart('single/ajax') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
NGCP::Panel::Utils::Datatables::process($c, $c->stash->{reseller}, $c->stash->{reseller_dt_columns});
@ -177,7 +185,7 @@ sub reseller_single :Chained('base') :PathPart('single/ajax') :Args(0) {
return;
}
sub reseller_admin :Chained('base') :PathPart('admins/ajax') :Args(0) {
sub reseller_admin :Chained('base') :PathPart('admins/ajax') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
my $rs = $c->stash->{reseller}->first->search_related_rs('admins');
NGCP::Panel::Utils::Datatables::process($c, $rs, $c->stash->{admin_dt_columns});
@ -185,7 +193,7 @@ sub reseller_admin :Chained('base') :PathPart('admins/ajax') :Args(0) {
return;
}
sub edit :Chained('base') :PathPart('edit') :Args(0) {
sub edit :Chained('base') :PathPart('edit') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
$c->detach('/denied_page')
@ -247,7 +255,7 @@ sub edit :Chained('base') :PathPart('edit') :Args(0) {
return;
}
sub terminate :Chained('base') :PathPart('terminate') :Args(0) {
sub terminate :Chained('base') :PathPart('terminate') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
my $reseller = $c->stash->{reseller}->first;
@ -305,13 +313,13 @@ sub _handle_reseller_status_change {
}
}
sub details :Chained('base') :PathPart('details') :Args(0) {
sub details :Chained('base') :PathPart('details') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
$c->stash(template => 'reseller/details.tt');
return;
}
sub ajax_contract :Chained('list_reseller') :PathPart('ajax_contract') :Args(0) {
sub ajax_contract :Chained('list_reseller') :PathPart('ajax_contract') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
my $edit_contract_id = $c->session->{edit_contract_id};
@ -334,7 +342,7 @@ sub ajax_contract :Chained('list_reseller') :PathPart('ajax_contract') :Args(0)
$c->detach( $c->view("JSON") );
}
sub create_defaults :Path('create_defaults') :Args(0) {
sub create_defaults :Path('create_defaults') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) {
my ($self, $c) = @_;
$c->detach('/denied_page') unless $c->request->method eq 'POST';
$c->detach('/denied_page')
@ -412,6 +420,128 @@ sub create_defaults :Path('create_defaults') :Args(0) {
return;
}
sub edit_branding_css :Chained('base') :PathPart('css/edit') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) {
my ($self, $c) = @_;
$c->detach('/denied_page')
if($c->user->read_only);
$c->stash(template => 'reseller/details.tt');
my $reseller = $c->stash->{reseller}->first;
my $branding = $reseller->branding;
my $posted = $c->request->method eq 'POST';
my $form = NGCP::Panel::Form::Reseller::Branding->new;
if($posted) {
$c->req->params->{logo} = $c->req->upload('logo');
}
my $params = $branding ? { $branding->get_inflated_columns } : {};
$form->process(
posted => $posted,
params => $c->request->params,
item => $params,
);
NGCP::Panel::Utils::Navigation::check_form_buttons(
c => $c,
form => $form,
fields => {},
back_uri => $c->uri_for('/reseller/details', $c->req->captures),
);
if($posted && $form->validated) {
try {
$c->model('DB')->txn_do(sub {
if($c->user->roles eq "admin") {
$form->params->{reseller_id} = $reseller->id;
} elsif($c->user->roles eq "reseller") {
$form->params->{reseller_id} = $c->user->reseller_id;
}
delete $form->params->{reseller};
delete $form->params->{back};
my $ft = File::Type->new();
if($form->params->{logo}) {
my $logo = delete $form->params->{logo};
$form->params->{logo} = $logo->slurp;
$form->params->{logo_image_type} = $ft->mime_type($form->params->{logo});
} else {
delete $form->params->{logo};
}
unless(defined $branding) {
$c->model('DB')->resultset('reseller_brandings')->create($form->params);
} else {
$branding->update($form->params);
}
});
$c->flash(messages => [{type => 'success', text => $c->loc('Reseller branding successfully updated')}]);
} catch($e) {
NGCP::Panel::Utils::Message->error(
c => $c,
error => $e,
desc => $c->loc('Failed to update reseller branding'),
);
}
NGCP::Panel::Utils::Navigation::back_or($c, $c->uri_for_action('/reseller/details', $c->req->captures));
}
$c->stash(close_target => $c->uri_for());
$c->stash(branding_form => $form);
$c->stash(branding_edit_flag => 1);
$c->stash(close_target => $c->uri_for_action('/reseller/details', $c->req->captures));
return;
}
sub get_branding_logo :Chained('base') :PathPart('css/logo/download') :Args(0) {
my ($self, $c) = @_;
my $reseller = $c->stash->{reseller}->first;
my $branding = $reseller->branding;
unless($branding || $branding->logo) {
$c->response->body($c->loc('404 - No branding logo available for this reseller'));
$c->response->status(404);
return;
}
$c->response->content_type($branding->logo_image_type);
$c->response->body($branding->logo);
}
sub delete_branding_logo :Chained('base') :PathPart('css/logo/delete') :Args(0) :Does(ACL) :ACLDetachTo('/denied_page') :AllowedRole(admin) :AllowedRole(reseller) {
my ($self, $c) = @_;
my $reseller = $c->stash->{reseller}->first;
my $branding = $reseller->branding;
if($branding) {
$branding->update({ logo => undef, logo_image_type => undef });
}
$c->response->redirect($c->uri_for_action('/reseller/details', $c->req->captures));
}
sub get_branding_css :Chained('base') :PathPart('css/download') :Args(0) {
my ($self, $c) = @_;
my $reseller = $c->stash->{reseller}->first;
my $branding = $reseller->branding;
unless($branding || $branding->css) {
$c->response->body($c->loc('404 - No branding css available for this reseller'));
$c->response->status(404);
return;
}
$c->response->content_type('text/css');
$c->response->body($branding->css);
}
__PACKAGE__->meta->make_immutable;
__END__

@ -0,0 +1,51 @@
package NGCP::Panel::Form::Reseller::Branding;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
use Moose::Util::TypeConstraints;
use HTML::FormHandler::Widget::Block::Bootstrap;
has '+widget_wrapper' => ( default => 'Bootstrap' );
has '+enctype' => ( default => 'multipart/form-data');
has_field 'submitid' => ( type => 'Hidden' );
sub build_render_list {[qw/submitid fields actions/]}
sub build_form_element_class {[qw(form-horizontal)]}
has_field 'logo' => (
type => 'Upload',
required => 0,
label => 'Logo',
max_size => '67108864', # 64MB
);
has_field 'css' => (
type => 'TextArea',
label => 'CSS',
cols => 200,
rows => 10,
maxlength => '67108864', # 64MB
element_class => [qw/ngcp-autoconf-area/],
);
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/logo css/],
);
has_block 'actions' => (
tag => 'div',
class => [qw/modal-footer/],
render_list => [qw/save/],
);
1;
# vim: set tabstop=4 expandtab:

@ -34,6 +34,15 @@
<script type="text/javascript" src="/js/plugins/msgbox/jquery.msgbox.js"></script>
<link rel="stylesheet" type="text/css" href="/js/plugins/msgbox/jquery.msgbox.css" />
<link rel="stylesheet" type="text/css" href="/css/main.css" />
[% IF c.user -%]
[% IF c.user.roles == "reseller" && c.user.reseller.branding.css -%]
<link rel="stylesheet" href="[% c.uri_for_action('/reseller/get_branding_css', [c.user.reseller_id]) %]">
[% ELSIF c.user.roles != "admin" && c.user.contract.contact.reseller.branding.css -%]
<link rel="stylesheet" href="[% c.uri_for_action('/reseller/get_branding_css', [c.user.contract.contact.reseller_id]) %]">
[% END -%]
[% END -%]
</head>
[% content %]
</html>

@ -220,5 +220,68 @@
</div>
</div>
<div class="accordion-group">
<div class="accordion-heading">
<a class="accordion-toggle" data-toggle="collapse" data-parent="#reseller_details" href="#collapse_branding">[% c.loc('Branding') %]</a>
</div>
<div class="accordion-body collapse" id="collapse_branding">
<div class="accordion-inner">
[% UNLESS c.user.read_only -%]
<span>
<a href="[% c.uri_for_action('/reseller/edit_branding_css', c.req.captures) %]" class="btn btn-large btn-primary"><i class="icon-edit"></i> Edit Branding</a>
[% IF branding.logo -%]
<a href="[% c.uri_for_action('/reseller/delete_branding_logo', c.req.captures) %]" class="btn btn-large btn-primary"><i class="icon-trash"></i> Delete Logo</a>
[% END -%]
</span>
<div class="ngcp-separator"></div>
[% END -%]
[% IF branding.defined -%]
[% IF branding.logo.defined -%]
<h3>Custom Logo</h3>
<img src="[% c.uri_for_action('/reseller/get_branding_logo', c.req.captures) %]">
<p>
[% c.loc("You can use the logo by adding the following CSS to the Custom CSS below:") %]
<pre>
#header .brand {
background: url([% c.uri_for_action('/reseller/get_branding_logo', c.req.captures) %]) no-repeat 0 0;
background-size: 280px 32px;
}
</pre>
</p>
[% ELSE -%]
No logo uploaded.
[% END -%]
<h3>Custom CSS</h3>
<p>
<pre style="color:#000">
[% branding.css %]
</pre>
</p>
[% ELSE -%]
No branding specified, using standard branding.
[% END -%]
</div>
</div>
</div>
[% IF branding_edit_flag == 1 -%]
[%
IF form.has_for_js;
form.render_repeatable_js;
END;
PROCESS "helpers/modal.tt";
modal_header(m.edit_flag = branding_edit_flag,
m.name = "Reseller Branding");
translate_form(branding_form).render;
modal_footer();
modal_script(m.close_target = close_target);
-%]
[% END -%]
[% # vim: set tabstop=4 syntax=html expandtab: -%]

Loading…
Cancel
Save