aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/App/Controller/Council.pm
blob: 2e2dce0f77238d954b886bcc4d6c2dc97fd1f848 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package FixMyStreet::App::Controller::Council;
use Moose;
use namespace::autoclean;

BEGIN {extends 'Catalyst::Controller'; }

=head1 NAME

FixMyStreet::App::Controller::Council - Catalyst Controller

=head1 DESCRIPTION

Catalyst Controller.

=head1 METHODS

=head2 load_and_check_areas_and_wards

Try to load areas and wards for this location and check that we have at least one. If
there are no areas then return false.

=cut

sub load_and_check_areas_and_wards : Private {
    my ( $self, $c ) = @_;
    my $area_types = [ @{$c->cobrand->area_types}, @{$c->cobrand->area_types_children} ];
    $c->stash->{area_types} = $area_types;
    $c->forward('load_and_check_areas');
}

=head2 load_and_check_areas

Try to load areas for this location and check that we have at least one. If
there are no areas then return false.

=cut

sub load_and_check_areas : Private {
    my ( $self, $c, $prefetched_all_areas ) = @_;

    my $latitude  = $c->stash->{latitude};
    my $longitude = $c->stash->{longitude};

    # Look up areas and do checks for the point we've got
    my $area_types;
    if ( $c->stash->{area_types} and scalar @{ $c->stash->{area_types} } ) {
        $area_types = $c->stash->{area_types};
    } else {
        $area_types = $c->cobrand->area_types;
    }

    # Cobrand may wish to add area types to look up for a point at runtime.
    # This can be used for, e.g., parish councils on a particular council
    # cobrand. NB three-tier councils break the alerts pages, so don't run the
    # hook if we're on an alerts page.
    unless ($c->stash->{area_check_action} eq 'alert') {
        $area_types = $c->cobrand->call_hook("add_extra_area_types" => $area_types) || $area_types;
    }

    my $all_areas;

    my %params;
    $params{generation} = $c->config->{MAPIT_GENERATION}
        if $c->config->{MAPIT_GENERATION};

    if ($prefetched_all_areas) {
        $all_areas = {
            map { $_ => { id => $_ } }
            @$prefetched_all_areas
        };
    } elsif ( $c->stash->{fetch_all_areas} ) {
        my %area_types = map { $_ => 1 } @$area_types;
        $all_areas =
          mySociety::MaPit::call( 'point',
            "4326/$longitude,$latitude", %params );
        $c->stash->{all_areas_mapit} = $all_areas;
        $all_areas = {
            map { $_ => $all_areas->{$_} }
            grep { $area_types{ $all_areas->{$_}->{type} } }
            keys %$all_areas
        };
    } else {
        $all_areas =
          mySociety::MaPit::call( 'point',
            "4326/$longitude,$latitude", %params,
            type => $area_types );
    }
    if ($all_areas->{error}) {
        $c->stash->{location_error_mapit_error} = 1;
        $c->stash->{location_error} = $all_areas->{error};
        return;
    }

    # Let cobrand do a check
    my ( $success, $error_msg ) =
      $c->cobrand->area_check( { all_areas => $all_areas },
        $c->stash->{area_check_action} );
    if ( !$success ) {
        $c->stash->{location_error_cobrand_check} = 1;
        $c->stash->{location_error} = $error_msg;
        return;
    }

    # edit hash in-place
    $c->cobrand->remove_redundant_areas($all_areas) if $c->stash->{remove_redundant_areas};

    # If we don't have any areas we can't accept the report
    if ( !scalar keys %$all_areas ) {
        $c->stash->{location_error_no_areas} = 1;
        $c->stash->{location_error} = _('That location does not appear to be covered by a council; perhaps it is offshore or outside the country. Please try again.');
        return;
    }

    # all good if we have some areas left
    $c->stash->{all_areas} = $all_areas;
    $c->stash->{all_area_names} =
      [ map { $_->{name} } values %$all_areas ];
    return 1;
}

=head1 AUTHOR

Struan Donald

=head1 LICENSE

This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.

=cut

__PACKAGE__->meta->make_immutable;

1;