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;
|