#!/usr/bin/env perl # update-all-reports: # Generate the data for the /reports page # # Copyright (c) 2011 UK Citizens Online Democracy. All rights reserved. # Email: matthew@mysociety.org. WWW: http://www.mysociety.org use strict; use warnings; require 5.8.0; BEGIN { use File::Basename qw(dirname); use File::Spec; my $d = dirname(File::Spec->rel2abs($0)); require "$d/../setenv.pl"; } use FixMyStreet::App; use File::Path (); use File::Slurp; use JSON; use List::MoreUtils qw(zip); my $fourweeks = 4*7*24*60*60; # Age problems from when they're confirmed, except on Zurich # where they appear as soon as they're created. my $age_column = 'confirmed'; if ( FixMyStreet->config('BASE_URL') =~ /zurich|zueri/ ) { $age_column = 'created'; } my $problems = FixMyStreet::App->model("DB::Problem")->search( { state => [ FixMyStreet::DB::Result::Problem->visible_states() ], }, { columns => [ 'id', 'bodies_str', 'state', 'areas', { duration => { extract => "epoch from current_timestamp-lastupdate" } }, { age => { extract => "epoch from current_timestamp-$age_column" } }, ] } ); $problems = $problems->cursor; # Raw DB cursor for speed my ( %fixed, %open ); my @cols = ( 'id', 'bodies_str', 'state', 'areas', 'duration', 'age' ); while ( my @problem = $problems->next ) { my %problem = zip @cols, @problem; my @bodies; if ( !$problem{bodies_str} ) { # Problem was not sent to any bodies, add to all areas @bodies = grep { $_ } split( /,/, $problem{areas} ); $problem{bodies} = 0; } else { # Add to bodies it was sent to (my $bodies = $problem{bodies_str}) =~ s/\|.*$//; @bodies = split( /,/, $bodies ); $problem{bodies} = scalar @bodies; } foreach my $body ( @bodies ) { my $duration_str = ( $problem{duration} > 2 * $fourweeks ) ? 'old' : 'new'; my $type = ( $problem{duration} > 2 * $fourweeks ) ? 'unknown' : ($problem{age} > $fourweeks ? 'older' : 'new'); if (FixMyStreet::DB::Result::Problem->fixed_states()->{$problem{state}} || FixMyStreet::DB::Result::Problem->closed_states()->{$problem{state}}) { # Fixed problems are either old or new $fixed{$body}{$duration_str}++; } else { # Open problems are either unknown, older, or new $open{$body}{$type}++; } } } if ( FixMyStreet->config('BASE_URL') =~ /emptyhomes/ ) { my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker('emptyhomes')->new(); my $stats = $cobrand->old_site_stats; foreach (keys %$stats) { $open{$_}{unknown} += $stats->{$_}; } } my $body = JSON->new->utf8(1)->encode( { fixed => \%fixed, open => \%open, } ); File::Path::mkpath( FixMyStreet->path_to( '../data/' )->stringify ); File::Slurp::write_file( FixMyStreet->path_to( '../data/all-reports.json' )->stringify, \$body );