aboutsummaryrefslogtreecommitdiffstats
path: root/perllib
diff options
context:
space:
mode:
Diffstat (limited to 'perllib')
-rw-r--r--perllib/FixMyStreet/App.pm43
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm5
-rw-r--r--perllib/FixMyStreet/App/Controller/Alert.pm2
-rw-r--r--perllib/FixMyStreet/App/Controller/Around.pm13
-rw-r--r--perllib/FixMyStreet/App/Controller/Open311.pm2
-rw-r--r--perllib/FixMyStreet/App/Controller/Photo.pm68
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Questionnaire.pm5
-rw-r--r--perllib/FixMyStreet/App/Controller/Report.pm3
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/New.pm106
-rw-r--r--perllib/FixMyStreet/App/Controller/Report/Update.pm7
-rw-r--r--perllib/FixMyStreet/App/Controller/Reports.pm48
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Rss.pm4
-rwxr-xr-xperllib/FixMyStreet/App/Controller/Static.pm7
-rw-r--r--perllib/FixMyStreet/Cobrand/Base.pm2
-rw-r--r--perllib/FixMyStreet/Cobrand/FixMyStreet.pm26
-rw-r--r--perllib/FixMyStreet/Cobrand/UKCouncils.pm2
-rw-r--r--perllib/FixMyStreet/DB/Result/Comment.pm11
-rw-r--r--perllib/FixMyStreet/DB/Result/Problem.pm13
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Nearby.pm2
-rw-r--r--perllib/FixMyStreet/DB/ResultSet/Problem.pm53
-rw-r--r--perllib/FixMyStreet/Map.pm4
-rw-r--r--perllib/FixMyStreet/Map/OSM.pm5
-rw-r--r--perllib/FixMyStreet/TestMech.pm2
23 files changed, 236 insertions, 197 deletions
diff --git a/perllib/FixMyStreet/App.pm b/perllib/FixMyStreet/App.pm
index 21552a066..262379b79 100644
--- a/perllib/FixMyStreet/App.pm
+++ b/perllib/FixMyStreet/App.pm
@@ -11,6 +11,7 @@ use mySociety::EmailUtil;
use mySociety::Random qw(random_bytes);
use FixMyStreet::Map;
+use Path::Class;
use URI;
use URI::QueryParam;
@@ -151,8 +152,7 @@ sub setup_request {
my $cobrand = $c->cobrand;
# append the cobrand templates to the include path
- $c->stash->{additional_template_paths} =
- [ $cobrand->path_to_web_templates->stringify ]
+ $c->stash->{additional_template_paths} = $cobrand->path_to_web_templates
unless $cobrand->is_default;
# work out which language to use
@@ -402,6 +402,45 @@ sub finalize {
delete $c->stash->{cobrand};
}
+=head2 render_fragment
+
+If a page needs to render a template fragment internally (e.g. for an Ajax
+call), use this method.
+
+=cut
+
+sub render_fragment {
+ my ($c, $template, $vars) = @_;
+ $vars->{additional_template_paths} = $c->cobrand->path_to_web_templates
+ if $vars && !$c->cobrand->is_default;
+ $c->view('Web')->render($c, $template, $vars);
+}
+
+=head2 get_photo_params
+
+Returns a hashref of details of any attached photo for use in templates.
+Hashref contains height, width and url keys.
+
+=cut
+
+sub get_photo_params {
+ my ($self, $key) = @_;
+ $key = ($key eq 'id') ? '' : "/$key";
+
+ return {} unless $self->photo;
+
+ my $photo = {};
+ if (length($self->photo) == 40) {
+ $photo->{url_full} = '/photo' . $key . '/' . $self->id . '.full.jpeg';
+ } else {
+ ( $photo->{width}, $photo->{height} ) =
+ Image::Size::imgsize( \$self->photo );
+ }
+ $photo->{url} = '/photo' . $key . '/' . $self->id . '.jpeg';
+
+ return $photo;
+}
+
=head1 SEE ALSO
L<FixMyStreet::App::Controller::Root>, L<Catalyst>
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm
index 0e34ea64b..83f77f401 100644
--- a/perllib/FixMyStreet/App/Controller/Admin.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin.pm
@@ -627,10 +627,6 @@ sub report_edit : Path('report_edit') : Args(1) {
$problem->photo(undef);
}
- if ( $new_state ne $old_state ) {
- $problem->lastupdate( \'ms_current_timestamp()' );
- }
-
if ( $new_state eq 'confirmed' and $old_state eq 'unconfirmed' ) {
$problem->confirmed( \'ms_current_timestamp()' );
}
@@ -639,6 +635,7 @@ sub report_edit : Path('report_edit') : Args(1) {
$problem->discard_changes;
}
else {
+ $problem->lastupdate( \'ms_current_timestamp()' ) if $edited || $new_state ne $old_state;
$problem->update;
if ( $new_state ne $old_state ) {
diff --git a/perllib/FixMyStreet/App/Controller/Alert.pm b/perllib/FixMyStreet/App/Controller/Alert.pm
index 40dde455e..2698c6ac0 100644
--- a/perllib/FixMyStreet/App/Controller/Alert.pm
+++ b/perllib/FixMyStreet/App/Controller/Alert.pm
@@ -505,6 +505,8 @@ sub setup_request : Private {
$c->stash->{rznvy} ||= $c->user->email;
}
+ $c->stash->{template} = 'alert/list-ajax.html' if $c->req->param('ajax');
+
return 1;
}
diff --git a/perllib/FixMyStreet/App/Controller/Around.pm b/perllib/FixMyStreet/App/Controller/Around.pm
index 148a22368..e110cf8d7 100644
--- a/perllib/FixMyStreet/App/Controller/Around.pm
+++ b/perllib/FixMyStreet/App/Controller/Around.pm
@@ -189,7 +189,7 @@ sub display_location : Private {
{
latitude => $p->latitude,
longitude => $p->longitude,
- colour => $p->is_fixed ? 'green' : 'red',
+ colour => 'yellow', # $p->is_fixed ? 'green' : 'red',
id => $p->id,
title => $p->title,
}
@@ -258,12 +258,11 @@ sub ajax : Path('/ajax') {
FixMyStreet::Map::map_pins( $c, $interval );
# render templates to get the html
- my $on_map_list_html =
- $c->view('Web')
- ->render( $c, 'around/on_map_list_items.html', { on_map => $on_map } );
-
- my $around_map_list_html = $c->view('Web')->render(
- $c,
+ my $on_map_list_html = $c->render_fragment(
+ 'around/on_map_list_items.html',
+ { on_map => $on_map }
+ );
+ my $around_map_list_html = $c->render_fragment(
'around/around_map_list_items.html',
{ around_map => $around_map, dist => $dist }
);
diff --git a/perllib/FixMyStreet/App/Controller/Open311.pm b/perllib/FixMyStreet/App/Controller/Open311.pm
index fe1494b95..34e2b7cd3 100644
--- a/perllib/FixMyStreet/App/Controller/Open311.pm
+++ b/perllib/FixMyStreet/App/Controller/Open311.pm
@@ -283,7 +283,7 @@ sub output_requests : Private {
my $display_photos = $c->cobrand->allow_photo_display;
if ($display_photos && $problem->photo) {
my $url = $c->cobrand->base_url();
- my $imgurl = $url . "/photo?id=$id";
+ my $imgurl = $url . "/photo/$id.full.jpeg";
$request->{'media_url'} = [ $imgurl ];
}
push(@problemlist, $request);
diff --git a/perllib/FixMyStreet/App/Controller/Photo.pm b/perllib/FixMyStreet/App/Controller/Photo.pm
index 27dd6f184..8711b19e9 100644
--- a/perllib/FixMyStreet/App/Controller/Photo.pm
+++ b/perllib/FixMyStreet/App/Controller/Photo.pm
@@ -5,6 +5,7 @@ use namespace::autoclean;
BEGIN {extends 'Catalyst::Controller'; }
use DateTime::Format::HTTP;
+use Path::Class;
=head1 NAME
@@ -25,17 +26,30 @@ Display a photo
=cut
-sub index :Path :Args(0) {
+sub during :LocalRegex('^([0-9a-f]{40})\.temp\.jpeg$') {
my ( $self, $c ) = @_;
+ my ( $hash ) = @{ $c->req->captures };
- my $id = $c->req->param('id');
- my $comment = $c->req->param('c');
- $c->detach( 'no_photo' ) unless $id || $comment;
+ my $file = file( $c->config->{UPLOAD_DIR}, "$hash.jpeg" );
+ my $photo = $file->slurp;
+
+ if ( $c->cobrand->default_photo_resize ) {
+ $photo = _shrink( $photo, $c->cobrand->default_photo_resize );
+ } else {
+ $photo = _shrink( $photo, 'x250' );
+ }
+
+ $c->forward( 'output', [ $photo ] );
+}
+
+sub index :LocalRegex('^(c/)?(\d+)(?:\.(full|tn|fp))?\.jpeg$') {
+ my ( $self, $c ) = @_;
+ my ( $is_update, $id, $size ) = @{ $c->req->captures };
my @photo;
- if ( $comment ) {
+ if ( $is_update ) {
@photo = $c->model('DB::Comment')->search( {
- id => $comment,
+ id => $id,
state => 'confirmed',
photo => { '!=', undef },
} );
@@ -56,12 +70,30 @@ sub index :Path :Args(0) {
$c->detach( 'no_photo' ) unless @photo;
my $photo = $photo[0]->photo;
- if ( $c->req->param('tn' ) ) {
- $photo = _resize( $photo, 'x100' );
+
+ # If photo field contains a hash
+ if (length($photo) == 40) {
+ my $file = file( $c->config->{UPLOAD_DIR}, "$photo.jpeg" );
+ $photo = $file->slurp;
+ }
+
+ if ( $size eq 'tn' ) {
+ $photo = _shrink( $photo, 'x100' );
+ } elsif ( $size eq 'fp' ) {
+ $photo = _crop( $photo );
+ } elsif ( $size eq 'full' ) {
} elsif ( $c->cobrand->default_photo_resize ) {
- $photo = _resize( $photo, $c->cobrand->default_photo_resize );
+ $photo = _shrink( $photo, $c->cobrand->default_photo_resize );
+ } else {
+ $photo = _shrink( $photo, 'x250' );
}
+ $c->forward( 'output', [ $photo ] );
+}
+
+sub output : Private {
+ my ( $self, $c, $photo ) = @_;
+
my $dt = DateTime->now()->add( years => 1 );
$c->res->content_type( 'image/jpeg' );
@@ -74,7 +106,8 @@ sub no_photo : Private {
$c->detach( '/page_error_404_not_found', [ 'No photo' ] );
}
-sub _resize {
+# Shrinks a picture to the specified size, but keeping in proportion.
+sub _shrink {
my ($photo, $size) = @_;
use Image::Magick;
my $image = Image::Magick->new;
@@ -86,6 +119,21 @@ sub _resize {
return $blobs[0];
}
+# Shrinks a picture to 90x60, cropping so that it is exactly that.
+sub _crop {
+ my ($photo) = @_;
+ use Image::Magick;
+ my $image = Image::Magick->new;
+ $image->BlobToImage($photo);
+ my $err = $image->Resize( geometry => "90x60^" );
+ throw Error::Simple("resize failed: $err") if "$err";
+ $err = $image->Extent( geometry => '90x60', gravity => 'Center' );
+ throw Error::Simple("resize failed: $err") if "$err";
+ my @blobs = $image->ImageToBlob();
+ undef $image;
+ return $blobs[0];
+}
+
=head1 AUTHOR
Struan Donald
diff --git a/perllib/FixMyStreet/App/Controller/Questionnaire.pm b/perllib/FixMyStreet/App/Controller/Questionnaire.pm
index f0cb02115..6ed7ddd9d 100755
--- a/perllib/FixMyStreet/App/Controller/Questionnaire.pm
+++ b/perllib/FixMyStreet/App/Controller/Questionnaire.pm
@@ -205,10 +205,7 @@ sub submit_standard : Private {
}
);
if ( my $fileid = $c->stash->{upload_fileid} ) {
- my $file = file( $c->config->{UPLOAD_CACHE}, "$fileid.jpg" );
- my $blob = $file->slurp;
- $file->remove;
- $update->photo($blob);
+ $update->photo( $fileid );
}
$update->insert;
}
diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm
index 166f9d58e..59e3a4410 100644
--- a/perllib/FixMyStreet/App/Controller/Report.pm
+++ b/perllib/FixMyStreet/App/Controller/Report.pm
@@ -127,7 +127,8 @@ sub generate_map_tags : Private {
? [ {
latitude => $problem->latitude,
longitude => $problem->longitude,
- colour => 'blue',
+ colour => 'yellow',
+ type => 'big',
} ]
: [],
);
diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm
index 1e5825460..8d249b899 100644
--- a/perllib/FixMyStreet/App/Controller/Report/New.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/New.pm
@@ -5,6 +5,7 @@ use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; }
use FixMyStreet::Geocode;
+use Digest::SHA1 qw(sha1_hex);
use Encode;
use Image::Magick;
use List::MoreUtils qw(uniq);
@@ -23,7 +24,7 @@ FixMyStreet::App::Controller::Report::New
=head1 DESCRIPTION
-Create a new report, or complete a partial one .
+Create a new report, or complete a partial one.
=head1 PARAMETERS
@@ -47,7 +48,10 @@ back into lat/lng by the map code.
=head2 image related
-Parameters are 'photo' or 'upload_fileid'. The 'photo' is used when a user has selected a file. Once it has been uploaded it is cached on disk so that if there are errors on the form it need not be uploaded again. The cache location is stored in 'upload_fileid'.
+Parameters are 'photo' or 'upload_fileid'. The 'photo' is used when a user has
+selected a file. Once it has been uploaded it is cached on disk so that if
+there are errors on the form it need not be uploaded again. The hash of the
+photo is stored in 'upload_fileid'.
=head2 optional
@@ -112,8 +116,8 @@ sub report_form_ajax : Path('ajax') : Args(0) {
$c->forward('setup_categories_and_councils');
# render templates to get the html
- my $category = $c->view('Web')->render( $c, 'report/new/category.html');
- my $councils_text = $c->view('Web')->render( $c, 'report/new/councils_text.html');
+ my $category = $c->render_fragment( 'report/new/category.html');
+ my $councils_text = $c->render_fragment( 'report/new/councils_text.html');
my $has_open311 = keys %{ $c->stash->{category_extras} };
my $body = JSON->new->utf8(1)->encode(
@@ -150,7 +154,7 @@ sub category_extras_ajax : Path('category_extras') : Args(0) {
$c->stash->{report} = { category => $c->req->param('category') };
$c->stash->{category_extras} = { $c->req->param('category' ) => $c->stash->{category_extras}->{ $c->req->param('category') } };
- $category_extra= $c->view('Web')->render( $c, 'report/new/category_extras.html');
+ $category_extra= $c->render_fragment( 'report/new/category_extras.html');
}
my $body = JSON->new->utf8(1)->encode(
@@ -200,8 +204,8 @@ sub report_import : Path('/import') {
}
# handle the photo upload
- $c->forward( 'process_photo_upload', [ { rotate_photo => 1 } ] );
- my $photo = $c->stash->{upload_fileid};
+ $c->forward( 'process_photo_upload' );
+ my $fileid = $c->stash->{upload_fileid};
if ( my $error = $c->stash->{photo_error} ) {
push @errors, $error;
}
@@ -224,7 +228,7 @@ sub report_import : Path('/import') {
if $@;
}
- unless ( $photo || ( $latitude || $longitude ) ) {
+ unless ( $fileid || ( $latitude || $longitude ) ) {
push @errors, 'Either a location or a photo must be provided.';
}
@@ -292,11 +296,8 @@ sub report_import : Path('/import') {
);
# If there was a photo add that too
- if ( $photo ) {
- my $file = file( $c->config->{UPLOAD_CACHE}, "$photo.jpg" );
- my $blob = $file->slurp;
- $file->remove;
- $report->photo($blob);
+ if ( $fileid ) {
+ $report->photo($fileid);
}
# save the report;
@@ -647,7 +648,7 @@ sub process_user : Private {
# The user is trying to sign in. We only care about email from the params.
if ( $c->req->param('submit_sign_in') || $c->req->param('password_sign_in') ) {
unless ( $c->forward( '/auth/sign_in' ) ) {
- $c->stash->{field_errors}->{password} = _('There was a problem with your email/password combination. Passwords and user accounts are a brand <strong>new</strong> service, so you probably do not have one yet &ndash; please fill in the right hand side of this form to get one.');
+ $c->stash->{field_errors}->{password} = _('There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form.');
return 1;
}
my $user = $c->user->obj;
@@ -825,11 +826,7 @@ sub process_photo : Private {
}
sub process_photo_upload : Private {
- my ( $self, $c, $args ) = @_;
-
- # setup args and set defaults
- $args ||= {};
- $args->{rotate_photo} ||= 0;
+ my ( $self, $c ) = @_;
# check for upload or return
my $upload = $c->req->upload('photo')
@@ -842,9 +839,13 @@ sub process_photo_upload : Private {
return;
}
- # convert the photo into a blob (also resize etc)
- my $photo_blob =
- eval { _process_photo( $upload->fh, $args->{rotate_photo} ) };
+ # get the photo into a variable
+ my $photo_blob = eval {
+ my $filename = $upload->tempname;
+ my $out = `jhead -se -autorot $filename`;
+ my $photo = $upload->slurp;
+ return $photo;
+ };
if ( my $error = $@ ) {
my $format = _(
"That image doesn't appear to have uploaded correctly (%s), please try again."
@@ -853,21 +854,18 @@ sub process_photo_upload : Private {
return;
}
- # we have an image we can use - save it to the cache in case there is an
- # error
- my $cache_dir = dir( $c->config->{UPLOAD_CACHE} );
+ # we have an image we can use - save it to the upload dir for storage
+ my $cache_dir = dir( $c->config->{UPLOAD_DIR} );
$cache_dir->mkpath;
unless ( -d $cache_dir && -w $cache_dir ) {
warn "Can't find/write to photo cache directory '$cache_dir'";
return;
}
- # create a random name and store the file there
- my $fileid = int rand 1_000_000_000;
- my $file = $cache_dir->file("$fileid.jpg");
- $file->openw->print($photo_blob);
+ my $fileid = sha1_hex($photo_blob);
+ $upload->copy_to( file($cache_dir, $fileid . '.jpeg') );
- # stick the random number on the stash
+ # stick the hash on the stash, so don't have to reupload in case of error
$c->stash->{upload_fileid} = $fileid;
return 1;
@@ -883,12 +881,12 @@ does return true and put fileid on stash, otherwise false.
sub process_photo_cache : Private {
my ( $self, $c ) = @_;
- # get the fileid and make sure it is just a number
+ # get the fileid and make sure it is just a hex number
my $fileid = $c->req->param('upload_fileid') || '';
- $fileid =~ s{\D+}{}g;
+ $fileid =~ s{[^0-9a-f]}{}gi;
return unless $fileid;
- my $file = file( $c->config->{UPLOAD_CACHE}, "$fileid.jpg" );
+ my $file = file( $c->config->{UPLOAD_DIR}, "$fileid.jpeg" );
return unless -e $file;
$c->stash->{upload_fileid} = $fileid;
@@ -980,10 +978,7 @@ sub save_user_and_report : Private {
# If there was a photo add that too
if ( my $fileid = $c->stash->{upload_fileid} ) {
- my $file = file( $c->config->{UPLOAD_CACHE}, "$fileid.jpg" );
- my $blob = $file->slurp;
- $file->remove;
- $report->photo($blob);
+ $report->photo($fileid);
}
# Set a default if possible
@@ -1031,7 +1026,7 @@ sub generate_map : Private {
pins => [ {
latitude => $latitude,
longitude => $longitude,
- colour => 'purple',
+ colour => 'green', # 'yellow',
} ],
);
}
@@ -1123,41 +1118,6 @@ sub redirect_to_around : Private {
return $c->res->redirect($around_uri);
}
-sub _process_photo {
- my $fh = shift;
- my $import = shift;
-
- my $blob = join('', <$fh>);
- close $fh;
- my ($handle, $filename) = mySociety::TempFiles::named_tempfile('.jpeg');
- print $handle $blob;
- close $handle;
-
- my $photo = Image::Magick->new;
- my $err = $photo->Read($filename);
- unlink $filename;
- throw Error::Simple("read failed: $err") if "$err";
- $err = $photo->Scale(geometry => "250x250>");
- throw Error::Simple("resize failed: $err") if "$err";
- my @blobs = $photo->ImageToBlob();
- undef $photo;
- $photo = $blobs[0];
- return $photo unless $import; # Only check orientation for iPhone imports at present
-
- # Now check if it needs orientating
- ($fh, $filename) = mySociety::TempFiles::named_tempfile('.jpeg');
- print $fh $photo;
- close $fh;
- my $out = `jhead -se -autorot $filename`;
- if ($out) {
- open(FP, $filename) or throw Error::Simple($!);
- $photo = join('', <FP>);
- close FP;
- }
- unlink $filename;
- return $photo;
-}
-
__PACKAGE__->meta->make_immutable;
1;
diff --git a/perllib/FixMyStreet/App/Controller/Report/Update.pm b/perllib/FixMyStreet/App/Controller/Report/Update.pm
index 29933e2f6..15444f556 100644
--- a/perllib/FixMyStreet/App/Controller/Report/Update.pm
+++ b/perllib/FixMyStreet/App/Controller/Report/Update.pm
@@ -122,7 +122,7 @@ sub process_user : Private {
# The user is trying to sign in. We only care about email from the params.
if ( $c->req->param('submit_sign_in') || $c->req->param('password_sign_in') ) {
unless ( $c->forward( '/auth/sign_in', [ $email ] ) ) {
- $c->stash->{field_errors}->{password} = _('There was a problem with your email/password combination. Passwords and user accounts are a brand <strong>new</strong> service, so you probably do not have one yet &ndash; please fill in the right hand side of this form to get one.');
+ $c->stash->{field_errors}->{password} = _('There was a problem with your email/password combination. If you cannot remember your password, or do not have one, please fill in the &lsquo;sign in by email&rsquo; section of the form.');
return 1;
}
my $user = $c->user->obj;
@@ -282,10 +282,7 @@ sub save_update : Private {
# If there was a photo add that too
if ( my $fileid = $c->stash->{upload_fileid} ) {
- my $file = file( $c->config->{UPLOAD_CACHE}, "$fileid.jpg" );
- my $blob = $file->slurp;
- $file->remove;
- $update->photo($blob);
+ $update->photo($fileid);
}
if ( $update->in_storage ) {
diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm
index 68dbd6359..e7620f755 100644
--- a/perllib/FixMyStreet/App/Controller/Reports.pm
+++ b/perllib/FixMyStreet/App/Controller/Reports.pm
@@ -102,7 +102,6 @@ sub ward : Path : Args(2) {
$c->forward( 'load_parent' );
$c->forward( 'check_canonical_url', [ $council ] );
$c->forward( 'load_and_group_problems' );
- $c->forward( 'sort_problems' );
my $council_short = $c->cobrand->short_name( $c->stash->{council}, $c->stash->{areas_info} );
$c->stash->{rss_url} = '/rss/reports/' . $council_short;
@@ -344,6 +343,8 @@ sub load_and_group_problems : Private {
'id', 'council', 'state', 'areas', 'latitude', 'longitude', 'title', 'cobrand',
{ duration => { extract => "epoch from current_timestamp-lastupdate" } },
{ age => { extract => "epoch from current_timestamp-confirmed" } },
+ { confirmed => { extract => 'epoch from confirmed' } },
+ { photo => 'photo is not null' },
],
order_by => { -desc => 'lastupdate' },
rows => 100,
@@ -352,9 +353,9 @@ sub load_and_group_problems : Private {
$c->stash->{pager} = $problems->pager;
$problems = $problems->cursor; # Raw DB cursor for speed
- my ( %fixed, %open, @pins );
+ my ( %problems, @pins );
my $re_councils = join('|', keys %{$c->stash->{areas_info}});
- my @cols = ( 'id', 'council', 'state', 'areas', 'latitude', 'longitude', 'title', 'cobrand', 'duration', 'age' );
+ my @cols = ( 'id', 'council', 'state', 'areas', 'latitude', 'longitude', 'title', 'cobrand', 'duration', 'age', 'confirmed', 'photo' );
while ( my @problem = $problems->next ) {
my %problem = zip @cols, @problem;
$c->log->debug( $problem{'cobrand'} . ', cobrand is ' . $c->cobrand->moniker );
@@ -362,7 +363,7 @@ sub load_and_group_problems : Private {
# Problem was not sent to any council, add to possible councils
$problem{councils} = 0;
while ($problem{areas} =~ /,($re_councils)(?=,)/g) {
- add_row( \%problem, $1, \%fixed, \%open, \@pins );
+ add_row( \%problem, $1, \%problems, \@pins );
}
} else {
# Add to councils it was sent to
@@ -371,37 +372,19 @@ sub load_and_group_problems : Private {
$problem{councils} = scalar @council;
foreach ( @council ) {
next if $c->stash->{council} && $_ != $c->stash->{council}->{id};
- add_row( \%problem, $_, \%fixed, \%open, \@pins );
+ add_row( \%problem, $_, \%problems, \@pins );
}
}
}
$c->stash(
- fixed => \%fixed,
- open => \%open,
+ problems => \%problems,
pins => \@pins,
);
return 1;
}
-sub sort_problems : Private {
- my ( $self, $c ) = @_;
-
- my $id = $c->stash->{council}->{id};
- my $fixed = $c->stash->{fixed};
- my $open = $c->stash->{open};
-
- foreach (qw/new old/) {
- $c->stash->{fixed}{$id}{$_} = [ sort { $a->{duration} <=> $b->{duration} } @{$fixed->{$id}{$_}} ]
- if $fixed->{$id}{$_};
- }
- foreach (qw/new older unknown/) {
- $c->stash->{open}{$id}{$_} = [ sort { $a->{age} <=> $b->{age} } @{$open->{$id}{$_}} ]
- if $open->{$id}{$_};
- }
-}
-
sub redirect_index : Private {
my ( $self, $c ) = @_;
my $url = '/reports';
@@ -419,24 +402,13 @@ sub redirect_area : Private {
$c->res->redirect( $c->uri_for($url) );
}
-my $fourweeks = 4*7*24*60*60;
sub add_row {
- my ( $problem, $council, $fixed, $open, $pins ) = @_;
- my $duration_str = ( $problem->{duration} > 2 * $fourweeks ) ? 'old' : 'new';
- my $type = ( $problem->{duration} > 2 * $fourweeks )
- ? 'unknown'
- : ($problem->{age} > $fourweeks ? 'older' : 'new');
- # Fixed problems are either old or new
- push @{$fixed->{$council}{$duration_str}}, $problem if
- exists FixMyStreet::DB::Result::Problem->fixed_states()->{$problem->{state}};
- # Open problems are either unknown, older, or new
- push @{$open->{$council}{$type}}, $problem if
- exists FixMyStreet::DB::Result::Problem->open_states->{$problem->{state}};
-
+ my ( $problem, $council, $problems, $pins ) = @_;
+ push @{$problems->{$council}}, $problem;
push @$pins, {
latitude => $problem->{latitude},
longitude => $problem->{longitude},
- colour => FixMyStreet::DB::Result::Problem->fixed_states()->{$problem->{state}} ? 'green' : 'red',
+ colour => 'yellow', # FixMyStreet::DB::Result::Problem->fixed_states()->{$problem->{state}} ? 'green' : 'red',
id => $problem->{id},
title => $problem->{title},
};
diff --git a/perllib/FixMyStreet/App/Controller/Rss.pm b/perllib/FixMyStreet/App/Controller/Rss.pm
index 822780b81..4d0b6cb93 100755
--- a/perllib/FixMyStreet/App/Controller/Rss.pm
+++ b/perllib/FixMyStreet/App/Controller/Rss.pm
@@ -267,8 +267,8 @@ sub add_row : Private {
$item{category} = $row->{category} if $row->{category};
if ($c->cobrand->allow_photo_display && $row->{photo}) {
- my $key = $alert_type->item_table eq 'comment' ? 'c' : 'id';
- $item{description} .= ent("\n<br><img src=\"". $c->cobrand->base_url . "/photo?$key=$row->{id}\">");
+ my $key = $alert_type->item_table eq 'comment' ? 'c/' : '';
+ $item{description} .= ent("\n<br><img src=\"". $c->cobrand->base_url . "/photo/$key$row->{id}.jpeg\">");
}
if ( $row->{used_map} ) {
diff --git a/perllib/FixMyStreet/App/Controller/Static.pm b/perllib/FixMyStreet/App/Controller/Static.pm
index 2e6bda28c..52b230c27 100755
--- a/perllib/FixMyStreet/App/Controller/Static.pm
+++ b/perllib/FixMyStreet/App/Controller/Static.pm
@@ -22,6 +22,13 @@ sub about : Global : Args(0) {
# don't need to do anything here - should just pass through.
}
+sub for_councils : Path('/for-councils') : Args(0) {
+ my ( $self, $c ) = @_;
+}
+sub for_councils_faq : Path('/for-councils/faq') : Args(0) {
+ my ( $self, $c ) = @_;
+}
+
sub faq : Global : Args(0) {
my ( $self, $c ) = @_;
diff --git a/perllib/FixMyStreet/Cobrand/Base.pm b/perllib/FixMyStreet/Cobrand/Base.pm
index 42a891cb4..fada33b78 100644
--- a/perllib/FixMyStreet/Cobrand/Base.pm
+++ b/perllib/FixMyStreet/Cobrand/Base.pm
@@ -62,7 +62,7 @@ Returns the path to the templates for this cobrand - by default
sub path_to_web_templates {
my $self = shift;
- return FixMyStreet->path_to( 'templates/web', $self->moniker );
+ return [ FixMyStreet->path_to( 'templates/web', $self->moniker )->stringify ];
}
1;
diff --git a/perllib/FixMyStreet/Cobrand/FixMyStreet.pm b/perllib/FixMyStreet/Cobrand/FixMyStreet.pm
index 37fa7a16d..97b4c3c8b 100644
--- a/perllib/FixMyStreet/Cobrand/FixMyStreet.pm
+++ b/perllib/FixMyStreet/Cobrand/FixMyStreet.pm
@@ -6,5 +6,31 @@ sub restriction {
return {};
}
+sub generate_problem_banner {
+ my ( $self, $problem ) = @_;
+
+ my $banner = {};
+ if ( $problem->is_open && time() - $problem->lastupdate_local->epoch > 8 * 7 * 24 * 60 * 60 )
+ {
+ $banner->{id} = 'unknown';
+ $banner->{text} = _('Unknown');
+ }
+ if ($problem->is_fixed) {
+ $banner->{id} = 'fixed';
+ $banner->{text} = _('Fixed');
+ }
+ if ($problem->is_closed) {
+ $banner->{id} = 'closed';
+ $banner->{text} = _('Closed');
+ }
+
+ if ( grep { $problem->state eq $_ } ( 'investigating', 'in progress', 'planned' ) ) {
+ $banner->{id} = 'progress';
+ $banner->{text} = _('In progress');
+ }
+
+ return $banner;
+}
+
1;
diff --git a/perllib/FixMyStreet/Cobrand/UKCouncils.pm b/perllib/FixMyStreet/Cobrand/UKCouncils.pm
index 589abd178..b40f13d9d 100644
--- a/perllib/FixMyStreet/Cobrand/UKCouncils.pm
+++ b/perllib/FixMyStreet/Cobrand/UKCouncils.pm
@@ -1,5 +1,5 @@
package FixMyStreet::Cobrand::UKCouncils;
-use base 'FixMyStreet::Cobrand::FixMyStreet';
+use base 'FixMyStreet::Cobrand::Default';
use strict;
use warnings;
diff --git a/perllib/FixMyStreet/DB/Result/Comment.pm b/perllib/FixMyStreet/DB/Result/Comment.pm
index 958194eb8..195fe4019 100644
--- a/perllib/FixMyStreet/DB/Result/Comment.pm
+++ b/perllib/FixMyStreet/DB/Result/Comment.pm
@@ -132,21 +132,12 @@ sub confirm {
=head2 get_photo_params
Returns a hashref of details of any attached photo for use in templates.
-Hashref contains height, width and url keys.
=cut
sub get_photo_params {
my $self = shift;
-
- return {} unless $self->photo;
-
- my $photo = {};
- ( $photo->{width}, $photo->{height} ) =
- Image::Size::imgsize( \$self->photo );
- $photo->{url} = '/photo?c=' . $self->id;
-
- return $photo;
+ return FixMyStreet::App::get_photo_params($self, 'c');
}
=head2 meta_problem_state
diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm
index 7ceabf1da..ce7488703 100644
--- a/perllib/FixMyStreet/DB/Result/Problem.pm
+++ b/perllib/FixMyStreet/DB/Result/Problem.pm
@@ -329,7 +329,7 @@ sub check_for_errors {
|| $self->name =~ m/\ba\s*n+on+((y|o)mo?u?s)?(ly)?\b/i )
{
$errors{name} = _(
-'Please enter your full name, councils need this information - if you do not wish your name to be shown on the site, untick the box'
+'Please enter your full name, councils need this information – if you do not wish your name to be shown on the site, untick the box below'
);
}
@@ -400,21 +400,12 @@ sub url {
=head2 get_photo_params
Returns a hashref of details of any attached photo for use in templates.
-Hashref contains height, width and url keys.
=cut
sub get_photo_params {
my $self = shift;
-
- return {} unless $self->photo;
-
- my $photo = {};
- ( $photo->{width}, $photo->{height} ) =
- Image::Size::imgsize( \$self->photo );
- $photo->{url} = '/photo?id=' . $self->id;
-
- return $photo;
+ return FixMyStreet::App::get_photo_params($self, 'id');
}
=head2 is_open
diff --git a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
index 04089096e..83fc85a88 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Nearby.pm
@@ -24,7 +24,7 @@ sub nearby {
columns => [
'problem.id', 'problem.title', 'problem.latitude',
'problem.longitude', 'distance', 'problem.state',
- 'problem.confirmed'
+ 'problem.confirmed', { 'problem.photo' => 'problem.photo is not null' },
],
bind => [ $mid_lat, $mid_lon, $dist ],
order_by => [ 'distance', { -desc => 'created' } ],
diff --git a/perllib/FixMyStreet/DB/ResultSet/Problem.pm b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
index 59227fce8..3557e77c7 100644
--- a/perllib/FixMyStreet/DB/ResultSet/Problem.pm
+++ b/perllib/FixMyStreet/DB/ResultSet/Problem.pm
@@ -62,39 +62,36 @@ sub recent_new {
sub recent {
my ( $rs ) = @_;
- my $key = "recent:$site_key";
- my $result = Memcached::get($key);
- if ( $result ) {
- # Need to reattach schema so that confirmed column gets reinflated.
- $result->[0]->result_source->schema( $rs->result_source->schema ) if $result->[0];
- } else {
- $result = [ $rs->search( {
- state => [ FixMyStreet::DB::Result::Problem->visible_states() ]
- }, {
- columns => [ 'id', 'title', 'confirmed' ],
- order_by => { -desc => 'confirmed' },
- rows => 5,
- } )->all ];
- Memcached::set($key, $result, 3600);
- }
- return $result;
+ return _recent( $rs, 5 );
}
sub recent_photos {
my ( $rs, $num, $lat, $lon, $dist ) = @_;
- my $probs;
+ return _recent( $rs, $num, $lat, $lon, $dist, 1);
+}
+
+sub _recent {
+ my ( $rs, $num, $lat, $lon, $dist, $photos ) = @_;
+
+ my $key = $photos ? 'recent_photos' : 'recent';
+ $key .= ":$site_key:$num";
+
my $query = {
state => [ FixMyStreet::DB::Result::Problem->visible_states() ],
- photo => { '!=', undef },
};
+ $query->{photo} = { '!=', undef } if $photos;
+
my $attrs = {
- columns => [ 'id', 'title' ],
+ columns => [ 'id', 'title', 'confirmed' ],
order_by => { -desc => 'confirmed' },
rows => $num,
};
+
+ my $probs;
+ my $new = 0;
if (defined $lat) {
my $dist2 = $dist; # Create a copy of the variable to stop it being stringified into a locale in the next line!
- my $key = "recent_photos:$site_key:$num:$lat:$lon:$dist2";
+ $key .= ":$lat:$lon:$dist2";
$probs = Memcached::get($key);
unless ($probs) {
$attrs->{bind} = [ $lat, $lon, $dist ];
@@ -102,16 +99,23 @@ sub recent_photos {
$probs = [ mySociety::Locale::in_gb_locale {
$rs->search( $query, $attrs )->all;
} ];
- Memcached::set($key, $probs, 3600);
+ $new = 1;
}
} else {
- my $key = "recent_photos:$site_key:$num";
$probs = Memcached::get($key);
unless ($probs) {
$probs = [ $rs->search( $query, $attrs )->all ];
- Memcached::set($key, $probs, 3600);
+ $new = 1;
}
}
+
+ if ( $new ) {
+ Memcached::set($key, $probs, 3600);
+ } else {
+ # Need to reattach schema so that confirmed column gets reinflated.
+ $probs->[0]->result_source->schema( $rs->result_source->schema ) if $probs->[0];
+ }
+
return $probs;
}
@@ -122,7 +126,8 @@ sub around_map {
my $attr = {
order_by => { -desc => 'created' },
columns => [
- 'id', 'title' ,'latitude', 'longitude', 'state', 'confirmed'
+ 'id', 'title', 'latitude', 'longitude', 'state', 'confirmed',
+ { photo => 'photo is not null' },
],
};
$attr->{rows} = $limit if $limit;
diff --git a/perllib/FixMyStreet/Map.pm b/perllib/FixMyStreet/Map.pm
index 2bccf1584..08bba3285 100644
--- a/perllib/FixMyStreet/Map.pm
+++ b/perllib/FixMyStreet/Map.pm
@@ -95,8 +95,10 @@ sub _map_features {
my $around_limit = $c->cobrand->on_map_list_limit || undef;
my @around_args = ( $min_lat, $max_lat, $min_lon, $max_lon, $interval );
- my $around_map_list = $c->cobrand->problems->around_map( @around_args, $around_limit );
my $around_map = $c->cobrand->problems->around_map( @around_args, undef );
+ my $around_map_list = $around_limit
+ ? $c->cobrand->problems->around_map( @around_args, $around_limit )
+ : $around_map;
my $dist;
mySociety::Locale::in_gb_locale {
diff --git a/perllib/FixMyStreet/Map/OSM.pm b/perllib/FixMyStreet/Map/OSM.pm
index be185c35c..8ca5949d8 100644
--- a/perllib/FixMyStreet/Map/OSM.pm
+++ b/perllib/FixMyStreet/Map/OSM.pm
@@ -116,7 +116,10 @@ sub map_pins {
# id => $p->id,
# title => $p->title,
#}
- [ $p->latitude, $p->longitude, $p->is_fixed ? 'green' : 'red', $p->id, $p->title ]
+ [ $p->latitude, $p->longitude,
+ 'yellow', # $p->is_fixed ? 'green' : 'red',
+ $p->id, $p->title
+ ]
} @$around_map, @$nearby;
return (\@pins, $around_map_list, $nearby, $dist);
diff --git a/perllib/FixMyStreet/TestMech.pm b/perllib/FixMyStreet/TestMech.pm
index 185b59daa..a8cbc98f2 100644
--- a/perllib/FixMyStreet/TestMech.pm
+++ b/perllib/FixMyStreet/TestMech.pm
@@ -224,6 +224,7 @@ sub form_errors {
my $mech = shift;
my $result = scraper {
process 'div.form-error', 'errors[]', 'TEXT';
+ process 'p.form-error', 'errors[]', 'TEXT';
}
->scrape( $mech->response );
return $result->{errors} || [];
@@ -365,6 +366,7 @@ sub extract_problem_banner {
my $result = scraper {
process 'div#side > p.banner', id => '@id', text => 'TEXT';
+ process 'div.banner > p', id => '@id', text => 'TEXT';
}
->scrape( $mech->response );