From 75dbb51498469176ba81b06c20e30d89466b3037 Mon Sep 17 00:00:00 2001 From: Rikard Date: Mon, 25 Feb 2013 16:47:53 +0000 Subject: Replaced hardcoded Mapit-URL in error message to use variable from config instead --- perllib/Open311/PopulateServiceList.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'perllib') diff --git a/perllib/Open311/PopulateServiceList.pm b/perllib/Open311/PopulateServiceList.pm index 7990abfbf..c5fc4a506 100644 --- a/perllib/Open311/PopulateServiceList.pm +++ b/perllib/Open311/PopulateServiceList.pm @@ -42,8 +42,9 @@ sub process_body { my $list = $open311->get_service_list; unless ( $list ) { my $id = $self->_current_body->id; + my $mapit_url = mySociety::Config::get('MAPIT_URL'); my $areas = join( ",", keys %{$self->_current_body->areas} ); - warn "Body $id for areas $areas - http://mapit.mysociety.org/areas/$areas.html - did not return a service list\n" + warn "Body $id for areas $areas - $mapit_url/areas/$areas.html - did not return a service list\n" if $self->verbose >= 1; return; } -- cgit v1.2.3 From 485ac883cd1e119aeca2cbe77e5f02828496c28d Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Fri, 30 Aug 2013 19:31:24 +0100 Subject: Changed hardcoded URL in Problem.pm to be using variable from general.yml instead. --- perllib/FixMyStreet/DB/ResultSet/Problem.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'perllib') diff --git a/perllib/FixMyStreet/DB/ResultSet/Problem.pm b/perllib/FixMyStreet/DB/ResultSet/Problem.pm index 07848d782..97d457297 100644 --- a/perllib/FixMyStreet/DB/ResultSet/Problem.pm +++ b/perllib/FixMyStreet/DB/ResultSet/Problem.pm @@ -464,7 +464,8 @@ sub send_reports { send_fail_count => { '>', 0 } } ); while (my $row = $unsent->next) { - $sending_errors .= "* http://www.fixmystreet.com/report/" . $row->id . ", failed " + my $base_url = mySociety::Config::get('BASE_URL'); + $sending_errors .= "* " . $base_url . "/report/" . $row->id . ", failed " . $row->send_fail_count . " times, last at " . $row->send_fail_timestamp . ", reason " . $row->send_fail_reason . "\n"; } -- cgit v1.2.3 From 6053521d9c977f1414d1254e56415514795eb7a7 Mon Sep 17 00:00:00 2001 From: Jonas Oberg Date: Tue, 9 Apr 2013 07:04:38 +0000 Subject: Updated MapQuest links per instructions --- perllib/FixMyStreet/Map/OSM/MapQuest.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'perllib') diff --git a/perllib/FixMyStreet/Map/OSM/MapQuest.pm b/perllib/FixMyStreet/Map/OSM/MapQuest.pm index 4751679f5..ff314a4da 100644 --- a/perllib/FixMyStreet/Map/OSM/MapQuest.pm +++ b/perllib/FixMyStreet/Map/OSM/MapQuest.pm @@ -28,7 +28,7 @@ sub map_tiles { } sub base_tile_url { - return 'mqcdn.com/tiles/1.0.0/osm/'; + return 'mqcdn.com/tiles/1.0.0/map/'; } 1; -- cgit v1.2.3 From 924ec5ee474b731caaceb384034f478277c6a21c Mon Sep 17 00:00:00 2001 From: Chris Mytton Date: Tue, 3 Sep 2013 15:44:00 +0100 Subject: [Zurich] Only super user can edit bodies --- perllib/FixMyStreet/App/Controller/Admin.pm | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'perllib') diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index e2547019b..e0ba80af6 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -296,6 +296,7 @@ sub body : Path('body') : Args(1) { $c->stash->{body_id} = $body_id; + $c->forward( 'check_for_super_user' ); $c->forward( 'get_token' ); $c->forward( 'lookup_body' ); $c->forward( 'fetch_all_bodies' ); @@ -311,6 +312,13 @@ sub body : Path('body') : Args(1) { return 1; } +sub check_for_super_user : Private { + my ( $self, $c ) = @_; + if ( $c->cobrand->moniker eq 'zurich' && $c->stash->{admin_type} ne 'super' ) { + $c->detach('/page_error_404_not_found', []); + } +} + sub update_contacts : Private { my ( $self, $c ) = @_; -- cgit v1.2.3 From 18d916c30374bff64c0ce56c613210b93d301acc Mon Sep 17 00:00:00 2001 From: Chris Mytton Date: Wed, 4 Sep 2013 16:32:52 +0100 Subject: [Zurich] Ensure only superusers can add/edit bodies --- perllib/FixMyStreet/App/Controller/Admin.pm | 2 ++ 1 file changed, 2 insertions(+) (limited to 'perllib') diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index e0ba80af6..133c83024 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -234,6 +234,7 @@ sub bodies : Path('bodies') : Args(0) { my $posted = $c->req->param('posted') || ''; if ( $posted eq 'body' ) { + $c->forward('check_for_super_user'); $c->forward('check_token'); my $params = $c->forward('body_params'); @@ -385,6 +386,7 @@ sub update_contacts : Private { $c->stash->{updated} = _('Values updated'); } elsif ( $posted eq 'body' ) { + $c->forward('check_for_super_user'); $c->forward('check_token'); my $params = $c->forward( 'body_params' ); -- cgit v1.2.3 From 12bf37ede6631a132f7b10e8e13017043786f422 Mon Sep 17 00:00:00 2001 From: Chris Mytton Date: Wed, 4 Sep 2013 17:29:37 +0100 Subject: [Zurich] Make the phone number field required --- perllib/FixMyStreet/App/Controller/Report/New.pm | 3 +++ 1 file changed, 3 insertions(+) (limited to 'perllib') diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm index 3d3ddce1e..2c1c7e15a 100644 --- a/perllib/FixMyStreet/App/Controller/Report/New.pm +++ b/perllib/FixMyStreet/App/Controller/Report/New.pm @@ -956,6 +956,9 @@ sub check_for_errors : Private { delete $field_errors{name}; my $report = $c->stash->{report}; $report->title( Utils::cleanup_text( substr($report->detail, 0, 25) ) ); + if ( ! $c->req->param('phone') ) { + $field_errors{phone} = "This field is required."; + } } # FIXME: need to check for required bromley fields here -- cgit v1.2.3 From 98a27733d7b96efb9de28fcf21f637650ecbbb6b Mon Sep 17 00:00:00 2001 From: Matthew Somerville Date: Wed, 4 Sep 2013 17:09:50 +0100 Subject: Stop Template Toolkit indenting multiline strings. Embed a local copy of Template::Document, which includes the change of https://github.com/abw/Template2/pull/29 so that multiline quoted strings within a template are not indented and thus stop translating. --- perllib/Template/Document.pm | 539 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 539 insertions(+) create mode 100644 perllib/Template/Document.pm (limited to 'perllib') diff --git a/perllib/Template/Document.pm b/perllib/Template/Document.pm new file mode 100644 index 000000000..8fc66deea --- /dev/null +++ b/perllib/Template/Document.pm @@ -0,0 +1,539 @@ +##============================================================= -*-Perl-*- +# +# Template::Document +# +# DESCRIPTION +# Module defining a class of objects which encapsulate compiled +# templates, storing additional block definitions and metadata +# as well as the compiled Perl sub-routine representing the main +# template content. +# +# AUTHOR +# Andy Wardley +# +# COPYRIGHT +# Copyright (C) 1996-2007 Andy Wardley. All Rights Reserved. +# +# This module is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# +#============================================================================ + +package Template::Document; + +use strict; +use warnings; +use base 'Template::Base'; +use Template::Constants; + +our $VERSION = 2.79; +our $DEBUG = 0 unless defined $DEBUG; +our $ERROR = ''; +our ($COMPERR, $AUTOLOAD, $UNICODE); + +BEGIN { + # UNICODE is supported in versions of Perl from 5.008 onwards + if ($UNICODE = $] > 5.007 ? 1 : 0) { + if ($] > 5.008) { + # utf8::is_utf8() available from Perl 5.8.1 onwards + *is_utf8 = \&utf8::is_utf8; + } + elsif ($] == 5.008) { + # use Encode::is_utf8() for Perl 5.8.0 + require Encode; + *is_utf8 = \&Encode::is_utf8; + } + } +} + + +#======================================================================== +# ----- PUBLIC METHODS ----- +#======================================================================== + +#------------------------------------------------------------------------ +# new(\%document) +# +# Creates a new self-contained Template::Document object which +# encapsulates a compiled Perl sub-routine, $block, any additional +# BLOCKs defined within the document ($defblocks, also Perl sub-routines) +# and additional $metadata about the document. +#------------------------------------------------------------------------ + +sub new { + my ($class, $doc) = @_; + my ($block, $defblocks, $variables, $metadata) = @$doc{ qw( BLOCK DEFBLOCKS VARIABLES METADATA ) }; + $defblocks ||= { }; + $metadata ||= { }; + + # evaluate Perl code in $block to create sub-routine reference if necessary + unless (ref $block) { + local $SIG{__WARN__} = \&catch_warnings; + $COMPERR = ''; + + # DON'T LOOK NOW! - blindly untainting can make you go blind! + $block =~ /(.*)/s; + $block = $1; + + $block = eval $block; + return $class->error($@) + unless defined $block; + } + + # same for any additional BLOCK definitions + @$defblocks{ keys %$defblocks } = + # MORE BLIND UNTAINTING - turn away if you're squeamish + map { + ref($_) + ? $_ + : ( /(.*)/s && eval($1) or return $class->error($@) ) + } values %$defblocks; + + bless { + %$metadata, + _BLOCK => $block, + _DEFBLOCKS => $defblocks, + _VARIABLES => $variables, + _HOT => 0, + }, $class; +} + + +#------------------------------------------------------------------------ +# block() +# +# Returns a reference to the internal sub-routine reference, _BLOCK, +# that constitutes the main document template. +#------------------------------------------------------------------------ + +sub block { + return $_[0]->{ _BLOCK }; +} + + +#------------------------------------------------------------------------ +# blocks() +# +# Returns a reference to a hash array containing any BLOCK definitions +# from the template. The hash keys are the BLOCK nameand the values +# are references to Template::Document objects. Returns 0 (# an empty hash) +# if no blocks are defined. +#------------------------------------------------------------------------ + +sub blocks { + return $_[0]->{ _DEFBLOCKS }; +} + + +#----------------------------------------------------------------------- +# variables() +# +# Returns a reference to a hash of variables used in the template. +# This requires the TRACE_VARS option to be enabled. +#----------------------------------------------------------------------- + +sub variables { + return $_[0]->{ _VARIABLES }; +} + +#------------------------------------------------------------------------ +# process($context) +# +# Process the document in a particular context. Checks for recursion, +# registers the document with the context via visit(), processes itself, +# and then unwinds with a large gin and tonic. +#------------------------------------------------------------------------ + +sub process { + my ($self, $context) = @_; + my $defblocks = $self->{ _DEFBLOCKS }; + my $output; + + + # check we're not already visiting this template + return $context->throw(Template::Constants::ERROR_FILE, + "recursion into '$self->{ name }'") + if $self->{ _HOT } && ! $context->{ RECURSION }; ## RETURN ## + + $context->visit($self, $defblocks); + + $self->{ _HOT } = 1; + eval { + my $block = $self->{ _BLOCK }; + $output = &$block($context); + }; + $self->{ _HOT } = 0; + + $context->leave(); + + die $context->catch($@) + if $@; + + return $output; +} + + +#------------------------------------------------------------------------ +# AUTOLOAD +# +# Provides pseudo-methods for read-only access to various internal +# members. +#------------------------------------------------------------------------ + +sub AUTOLOAD { + my $self = shift; + my $method = $AUTOLOAD; + + $method =~ s/.*:://; + return if $method eq 'DESTROY'; +# my ($pkg, $file, $line) = caller(); +# print STDERR "called $self->AUTOLOAD($method) from $file line $line\n"; + return $self->{ $method }; +} + + +#======================================================================== +# ----- PRIVATE METHODS ----- +#======================================================================== + + +#------------------------------------------------------------------------ +# _dump() +# +# Debug method which returns a string representing the internal state +# of the object. +#------------------------------------------------------------------------ + +sub _dump { + my $self = shift; + my $dblks; + my $output = "$self : $self->{ name }\n"; + + $output .= "BLOCK: $self->{ _BLOCK }\nDEFBLOCKS:\n"; + + if ($dblks = $self->{ _DEFBLOCKS }) { + foreach my $b (keys %$dblks) { + $output .= " $b: $dblks->{ $b }\n"; + } + } + + return $output; +} + + +#======================================================================== +# ----- CLASS METHODS ----- +#======================================================================== + +#------------------------------------------------------------------------ +# as_perl($content) +# +# This method expects a reference to a hash passed as the first argument +# containing 3 items: +# METADATA # a hash of template metadata +# BLOCK # string containing Perl sub definition for main block +# DEFBLOCKS # hash containing further subs for addional BLOCK defs +# It returns a string containing Perl code which, when evaluated and +# executed, will instantiate a new Template::Document object with the +# above data. On error, it returns undef with an appropriate error +# message set in $ERROR. +#------------------------------------------------------------------------ + +sub as_perl { + my ($class, $content) = @_; + my ($block, $defblocks, $metadata) = @$content{ qw( BLOCK DEFBLOCKS METADATA ) }; + + #$block =~ s/\n(?!#line)/\n /g; + $block =~ s/\s+$//; + + $defblocks = join('', map { + my $code = $defblocks->{ $_ }; + # $code =~ s/\n(?!#line)/\n /g; + $code =~ s/\s*$//; + " '$_' => $code,\n"; + } keys %$defblocks); + $defblocks =~ s/\s+$//; + + $metadata = join('', map { + my $x = $metadata->{ $_ }; + $x =~ s/(['\\])/\\$1/g; + " '$_' => '$x',\n"; + } keys %$metadata); + $metadata =~ s/\s+$//; + + return <new({ + METADATA => { +$metadata + }, + BLOCK => $block, + DEFBLOCKS => { +$defblocks + }, +}); +EOF +} + + +#------------------------------------------------------------------------ +# write_perl_file($filename, \%content) +# +# This method calls as_perl() to generate the Perl code to represent a +# compiled template with the content passed as the second argument. +# It then writes this to the file denoted by the first argument. +# +# Returns 1 on success. On error, sets the $ERROR package variable +# to contain an error message and returns undef. +#------------------------------------------------------------------------ + +sub write_perl_file { + my ($class, $file, $content) = @_; + my ($fh, $tmpfile); + + return $class->error("invalid filename: $file") + unless $file =~ /^(.+)$/s; + + eval { + require File::Temp; + require File::Basename; + ($fh, $tmpfile) = File::Temp::tempfile( + DIR => File::Basename::dirname($file) + ); + my $perlcode = $class->as_perl($content) || die $!; + + if ($UNICODE && is_utf8($perlcode)) { + $perlcode = "use utf8;\n\n$perlcode"; + binmode $fh, ":utf8"; + } + print $fh $perlcode; + close($fh); + }; + return $class->error($@) if $@; + return rename($tmpfile, $file) + || $class->error($!); +} + + +#------------------------------------------------------------------------ +# catch_warnings($msg) +# +# Installed as +#------------------------------------------------------------------------ + +sub catch_warnings { + $COMPERR .= join('', @_); +} + + +1; + +__END__ + +=head1 NAME + +Template::Document - Compiled template document object + +=head1 SYNOPSIS + + use Template::Document; + + $doc = Template::Document->new({ + BLOCK => sub { # some perl code; return $some_text }, + DEFBLOCKS => { + header => sub { # more perl code; return $some_text }, + footer => sub { # blah blah blah; return $some_text }, + }, + METADATA => { + author => 'Andy Wardley', + version => 3.14, + } + }) || die $Template::Document::ERROR; + + print $doc->process($context); + +=head1 DESCRIPTION + +This module defines an object class whose instances represent compiled +template documents. The L module creates a +C instance to encapsulate a template as it is compiled +into Perl code. + +The constructor method, L, expects a reference to a hash array +containing the C, C and C items. + +The C item should contain a reference to a Perl subroutine or a textual +representation of Perl code, as generated by the L module. +This is then evaluated into a subroutine reference using C. + +The C item should reference a hash array containing further named +Cs which may be defined in the template. The keys represent C +names and the values should be subroutine references or text strings of Perl +code as per the main C item. + +The C item should reference a hash array of metadata items relevant +to the document. + +The L method can then be called on the instantiated +C object, passing a reference to a L +object as the first parameter. This will install any locally defined blocks +(C) in the C cache in the context (via a call to +L) so that they may be subsequently +resolved by the context. The main C subroutine is then executed, +passing the context reference on as a parameter. The text returned from the +template subroutine is then returned by the L method, after calling +the context L method to permit cleanup and +de-registration of named C previously installed. + +An C method provides access to the C items for the +document. The L module installs a reference to the main +C object in the stash as the C