aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/App/Form/ManifestTheme.pm
blob: aa2d467d60dfff4bd88e7f59932c8ebc7be4ffb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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;
use List::MoreUtils qw(uniq);
extends 'HTML::FormHandler::Model::DBIC';
use namespace::autoclean;

has 'cobrand' => ( isa => 'Str', is => 'ro' );

has '+widget_name_space' => ( default => sub { ['FixMyStreet::App::Form::Widget'] } );
has '+widget_tags' => ( default => sub { { wrapper_tag => 'p' } } );
has '+item_class' => ( default => 'ManifestTheme' );
has_field 'cobrand' => ( type => 'Select', empty_select => 'Select a cobrand', required => 1 );
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' );

sub _build_language_handle { FixMyStreet::App::Form::I18N->new }

sub options_cobrand {
    my @cobrands = uniq sort map { $_->{moniker} } FixMyStreet::Cobrand->available_cobrand_classes;
    return map { $_ => $_ } @cobrands;
}

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;