diff options
Diffstat (limited to 'perllib/FixMyStreet')
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin/ManifestTheme.pm | 21 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Form/ManifestTheme.pm | 39 | ||||
-rw-r--r-- | perllib/FixMyStreet/PhotoStorage.pm | 6 |
3 files changed, 62 insertions, 4 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Admin/ManifestTheme.pm b/perllib/FixMyStreet/App/Controller/Admin/ManifestTheme.pm index d2eed4839..66e22b483 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/ManifestTheme.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/ManifestTheme.pm @@ -39,7 +39,14 @@ sub item :PathPart('admin/manifesttheme') :Chained :CaptureArgs(1) { sub edit :PathPart('') :Chained('item') :Args(0) { my ($self, $c) = @_; - return $self->form($c, $c->stash->{obj}); + + my $form = $self->form($c, $c->stash->{obj}); + + # We need to do this after form processing, in case a form POST has deleted + # an icon. + $c->forward('/offline/_stash_manifest_icons', [ $c->stash->{obj}->cobrand, 1 ]); + + return $form; } @@ -59,6 +66,7 @@ sub form { my ($self, $c, $theme) = @_; if ($c->get_param('delete_theme')) { + $c->forward('_delete_all_manifest_icons'); $theme->delete; $c->forward('/admin/log_edit', [ $theme->id, 'manifesttheme', 'delete' ]); $c->response->redirect($c->uri_for($self->action_for('index'))); @@ -68,13 +76,22 @@ sub form { my $action = $theme->in_storage ? 'edit' : 'add'; my $form = FixMyStreet::App::Form::ManifestTheme->new( cobrand => $c->cobrand->moniker ); $c->stash(template => 'admin/manifesttheme/form.html', form => $form); - $form->process(item => $theme, params => $c->req->params); + my $params = $c->req->params; + $params->{icon} = $c->req->upload('icon') if $params->{icon}; + $form->process(item => $theme, params => $params); return unless $form->validated; $c->forward('/admin/log_edit', [ $theme->id, 'manifesttheme', $action ]); $c->response->redirect($c->uri_for($self->action_for('index'))); } +sub _delete_all_manifest_icons :Private { + my ($self, $c) = @_; + $c->forward('/offline/_stash_manifest_icons', [ $c->stash->{obj}->cobrand, 1 ]); + foreach my $icon ( @{ $c->stash->{manifest_icons} } ) { + unlink FixMyStreet->path_to('web', $icon->{src}); + } +} 1; diff --git a/perllib/FixMyStreet/App/Form/ManifestTheme.pm b/perllib/FixMyStreet/App/Form/ManifestTheme.pm index 17e43ff58..7f3b629c0 100644 --- a/perllib/FixMyStreet/App/Form/ManifestTheme.pm +++ b/perllib/FixMyStreet/App/Form/ManifestTheme.pm @@ -1,5 +1,9 @@ package FixMyStreet::App::Form::ManifestTheme; +use Path::Tiny; +use File::Copy; +use Digest::SHA qw(sha1_hex); +use File::Basename; use HTML::FormHandler::Moose; use FixMyStreet::App::Form::I18N; extends 'HTML::FormHandler::Model::DBIC'; @@ -15,6 +19,8 @@ has_field 'name' => ( required => 1 ); has_field 'short_name' => ( required => 1 ); has_field 'background_colour' => ( required => 0 ); has_field 'theme_colour' => ( required => 0 ); +has_field 'icon' => ( required => 0, type => 'Upload', label => "Add icon" ); +has_field 'delete_icon' => ( type => 'Multiple' ); before 'update_model' => sub { my $self = shift; @@ -23,6 +29,39 @@ before 'update_model' => sub { sub _build_language_handle { FixMyStreet::App::Form::I18N->new } +sub validate { + my $self = shift; + + my $value = $self->value; + my $cobrand = $value->{cobrand} || $self->cobrand; + my $upload = $value->{icon}; + + if ( $upload ) { + if( $upload->type !~ /^image/ ) { + $self->field('icon')->add_error( _("File type not recognised. Please upload an image.") ); + return; + } + + my $uri = '/theme/' . $cobrand; + my $theme_path = path(FixMyStreet->path_to('web' . $uri)); + $theme_path->mkpath; + FixMyStreet::PhotoStorage::base64_decode_upload(undef, $upload); + my ($p, $n, $ext) = fileparse($upload->filename, qr/\.[^.]*/); + my $key = sha1_hex($upload->slurp) . $ext; + my $out = path($theme_path, $key); + unless (copy($upload->tempname, $out)) { + $self->field('icon')->add_error( _("Sorry, we couldn't save your file(s), please try again.") ); + return; + } + } + + foreach my $delete_icon ( @{ $value->{delete_icon} } ) { + unlink FixMyStreet->path_to('web', $delete_icon); + } + + return 1; +} + __PACKAGE__->meta->make_immutable; 1; diff --git a/perllib/FixMyStreet/PhotoStorage.pm b/perllib/FixMyStreet/PhotoStorage.pm index 9b0e5c9c3..256d46361 100644 --- a/perllib/FixMyStreet/PhotoStorage.pm +++ b/perllib/FixMyStreet/PhotoStorage.pm @@ -58,8 +58,10 @@ sub base64_decode_upload { print $fh $decoded; close $fh } else { - $c->log->info('Couldn\'t open temp file to save base64 decoded image: ' . $!); - $c->stash->{photo_error} = _("Sorry, we couldn't save your file(s), please try again."); + if ($c) { + $c->log->info('Couldn\'t open temp file to save base64 decoded image: ' . $!); + $c->stash->{photo_error} = _("Sorry, we couldn't save your file(s), please try again."); + } return (); } } |