Skip to content

Commit

Permalink
[SouthKesteven] Added cobrand front-end
Browse files Browse the repository at this point in the history
  • Loading branch information
lucascumsille committed Jan 20, 2025
1 parent fbbb05a commit 3a5f614
Show file tree
Hide file tree
Showing 18 changed files with 1,036 additions and 0 deletions.
280 changes: 280 additions & 0 deletions perllib/FixMyStreet/Cobrand/SouthKesteven.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,280 @@
=head1 NAME
FixMyStreet::Cobrand::SouthKesteven - code specific to the SouthKesteven cobrand
=head1 SYNOPSIS
We integrate with SouthKesteven's Confirm back end.
=head1 DESCRIPTION
=cut

package FixMyStreet::Cobrand::SouthKesteven;
use parent 'FixMyStreet::Cobrand::Whitelabel';

use strict;
use warnings;

use Moo;

use LWP::Simple;
use URI;
use Try::Tiny;
use JSON::MaybeXS;


=pod
Confirm backends expect some extra values and have some maximum lengths for
certain fields. These roles implement that behaviour.
=cut

with 'FixMyStreet::Roles::ConfirmOpen311';
with 'FixMyStreet::Roles::ConfirmValidation';

=head2 Defaults
=over 4
=cut

sub council_area_id { '2226' }
sub council_area { 'South Kesteven' }
sub council_name { 'South Kesteven District Council' }
sub council_url { 'southkesteven' }

=item * Users with a Aberdeenshire.gov.uk email can always be found in the admin.
=cut

sub admin_user_domain { 'southkesteven.gov.uk' }

=item * Allows anonymous reporting
=cut

sub allow_anonymous_reports { 'button' }

=item * Aberdeenshire use their own privacy policy
=cut

sub privacy_policy_url {
'https://www.southkesteven.gov.uk/your-council-and-democracy/data-protection-and-freedom-information/privacy-notice'
}

=item * Users can not reopen reports
=cut

sub reopening_disallowed {
my ($self, $problem) = @_;

# Only staff can reopen reports.
my $c = $self->{c};
my $user = $c->user;
return 0 if ($c->user_exists && $user->from_body && $user->from_body->cobrand_name eq $self->council_name);
return 1;
}

=item * Jobs from Confirm that are completed (marked as fixed or closed) are not displayed after 48 hours
=cut

sub report_age {
return {
closed => {
job => '48 hours',
},
fixed => {
job => '48 hours',
},
};
}

=item * We do not send questionnaires.
=cut

sub send_questionnaires { 0 }

=item * Don't show reports before the go-live date, 4th October 2023
=cut

sub cut_off_date { '2023-10-04' }

=item * Add display_name as an extra contact field
=cut

sub contact_extra_fields { [ 'display_name' ] }

=item * Custom label and hint for new report detail field
=cut

sub new_report_detail_field_label {
'Where is the location of the problem? Please be specific and identify the nearest property address or landmark to the problem.'
}

sub new_report_detail_field_hint {
"e.g. 'The drain outside number 42 is blocked'"
}

=pod
=back
=cut

=head2 open311_skip_report_fetch
Do not fetch reports from Confirm for categories that are marked private.
=cut

sub open311_skip_report_fetch {
my ( $self, $problem ) = @_;

return 1 if $problem->non_public;
}

=head2 open311_update_missing_data
Unlike the ConfirmOpen311 role, we want to fetch a central asset ID here, not a
site code.
=cut

sub open311_update_missing_data {
my ($self, $row, $h, $contact) = @_;

# In case the client hasn't given us a central asset ID, look up the
# closest asset from the WFS service at the point we're sending the report
if (!$row->get_extra_field_value('central_asset_id')) {
if (my $id = $self->lookup_site_code($row)) {
$row->update_extra_field({ name => 'central_asset_id', value => $id });
}
}
}

sub lookup_site_code_config {
my $host = FixMyStreet->config('STAGING_SITE') ? "tilma.staging.mysociety.org" : "tilma.mysociety.org";
return {
buffer => 200, # metres
url => "https://$host/mapserver/southkesteven",
srsname => "urn:ogc:def:crs:EPSG::27700",
typename => "WSF",
property => "CentralAssetId",
accept_feature => sub { 1 }
};
}

=head2 open311_extra_data_include
SouthKesteven want report title to be in description field, along with
subcategory text, which is not otherwise captured by Confirm. Report detail
goes into the location field.
Subcategory text may need to be fetched from '_wrapped_service_code'
extra data.
=cut

around open311_extra_data_include => sub {
my ( $orig, $self, $row, $h ) = @_;
my $open311_only = $self->$orig( $row, $h );

my $category = $row->category;
my $wrapped_for_report
= $row->get_extra_field_value('_wrapped_service_code');
my $wrapped_categories
= $row->contact->get_extra_field( code => '_wrapped_service_code' );

if ( $wrapped_for_report && $wrapped_categories ) {
($category)
= grep { $_->{key} eq $wrapped_for_report }
@{ $wrapped_categories->{values} };

$category = $category->{name};
}

push @$open311_only, {
name => 'description',
value => $category . ' | ' . $row->title,
};
push @$open311_only, {
name => 'location',
value => $row->detail,
};

return $open311_only;
};


sub disambiguate_location {
my $self = shift;
my $string = shift;

my $town = 'South Kesteven';

# As it's the requested example location, try to avoid a disambiguation page
$town .= ', GL20 5XA'
if $string =~ /^\s*gloucester\s+r(oa)?d,\s*tewkesbury\s*$/i;

return {
%{ $self->SUPER::disambiguate_location() },
town => $town,
centre => '51.825508771929094,-2.1263689427866654',
span => '0.53502964014244,1.07233523662321',
bounds => [
51.57753580138198, -2.687537158717889,
52.11256544152442, -1.6152019220946803,
],
};
}

=head2 is_defect
Returns true if it's a fetched job from Confirm.
=cut

sub is_defect {
my ($self, $p) = @_;
return $p->external_id && $p->external_id =~ /^JOB_/;
}

=head2 pin_colour
Green for anything completed or closed, yellow for the rest,
apart from defects which are blue.
=cut

sub pin_colour {
my ( $self, $p ) = @_;

return 'blue-work' if $self->is_defect($p);
return 'green-tick' if $p->is_fixed || $p->is_closed;
return 'yellow-cone';
}

sub path_to_pin_icons { '/i/pins/whole-shadow-cone-spot/' }

=head2 open311_config
Send multiple photos as files to Open311
=cut

sub open311_config {
my ($self, $row, $h, $params) = @_;

$params->{multi_photos} = 1;
$params->{upload_files} = 1;
}

1;
23 changes: 23 additions & 0 deletions templates/email/southkesteven/_email_color_overrides.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[%

color_primary = '#004289'
color_pale_grey = '#f0f0f0'

body_font_family = "Verdana, sans-serif"

header_background_color = color_primary
header_text_color = color_white

secondary_column_background_color = color_pale_grey

link_text_color = color_primary
link_hover_text_color = '#0081c9'

button_background_color = '#8c4e8d'
button_text_color = color_white

logo_file = 'south-kesteven-logo.png'
logo_width = "293" # pixel measurement, but without 'px' suffix
logo_height = "60" # pixel measurement, but without 'px' suffix

%]
73 changes: 73 additions & 0 deletions templates/web/southkesteven/footer_extra.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<footer class="southkesteven-footer">
<div class="container footer-grid">
<div class="newsletter-container">
<h3>SKtoday - digital newsletter</h3>
<p>SKtoday is the magazine for all residents and business across the 365 square miles of South Kesteven, with news and features on Council business and the local area. Sign up with us to receive notifications of when the next digital edition is published online.</p>
<a class="btn-white" href="https://www.southkesteven.gov.uk/sktoday-digital-newsletter">Subscribe</a>

<div class="social-container">
<h2>Follow us</h2>
<p>Find out more about local services and follow our social media accounts</p>
<ul>
<li>
<a class="social-media-link-icon--facebook" href="https://www.facebook.com/southkdc" aria-label="Facebook">
<span class="fab fa-facebook fa-2x"></span>
</a>
</li>
<li>
<a class="social-media-link-icon--twitter" href="https://www.x.com/southkesteven" aria-label="X">
<span class="fab fa-x-twitter fa-2x"></span>
</a>
</li>
<li>
<a class="social-media-link-icon--instagram" href="https://www.instagram.com/discoversouthk" aria-label="Instagram">
<span class="fab fa-instagram fa-2x"></span>
</a>
</li>
<li>
<a class="social-media-link-icon--linkedin" href="https://www.linkedin.com/company/south-kesteven-council" aria-label="LinkedIn">
<span class="fab fa-linkedin fa-2x"></span>
</a>
</li>
<li>
<a class="social-media-link-icon--youtube" href="https://www.youtube.com/@SouthKestevenGovUK" aria-label="Youtube">
<span class="fab fa-youtube fa-2x"></span>
</a>
</li>
</ul>
</div>
</div>


<div class="contact-container">
<h3>Contact the council</h3>
<p>Complete the enquiry form on our 'contact us' page below, or find details of your local office.</p>
<p><a class="btn-white" href="https://www.southkesteven.gov.uk/contact-us">Contact us</a></p>
<p><a class="btn-white" href="https://www.southkesteven.gov.uk/who-call-emergency">Who to call in an emergency</a></p>
<p><a class="btn-white" href="https://www.southkesteven.gov.uk/contact-us-office-details">Office addresses and phone numbers</a></p>
<div>
<a href="https://www.southkesteven.gov.uk/armed-forces-community-covenant">
<img style="margin-left: -7px" loading="lazy" src="/cobrands/southkesteven/images/armed-forces.png" width="165" height="300" alt="Armed forces logo">
</a>
</div>
</div>

<nav class="footer-nav" aria-labelledby="block-footersecondary-menu">
<h2 id="block-footersecondary-menu" class="screen-reader-only">Footer secondary</h2>
<ul>
<li><a href="https://www.southkesteven.gov.uk/accessibility">Accessibility</a></li>
<li><a href="https://www.southkesteven.gov.uk/your-council-and-democracy/data-protection-and-freedom-information/cookie-policy">Cookies</a></li>
<li><a href="https://www.southkesteven.gov.uk/your-council-and-democracy/data-protection-and-freedom-information/privacy-notice">Privacy</a></li>
</ul>
</nav>
</div>

<div class="sk-logo-container">
<a href="https://www.southkesteven.gov.uk/" aria-label="Go to South Keveston council home page">
<img src="/cobrands/southkesteven/images/southkesteven-logo.svg" alt="">
</a>
</div>
</footer>

[% PROCESS '_footer_main_nav.html' %]
[% PROCESS '_footer_extra_powered_by.html' %]
1 change: 1 addition & 0 deletions templates/web/southkesteven/footer_extra_js.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[% PROCESS 'footer_extra_js_base.html' highways=1 roadworks=1 validation=1 cobrand_js=1 %]
Empty file.
6 changes: 6 additions & 0 deletions templates/web/southkesteven/header_extra.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:[email protected]&display=swap" rel="stylesheet">
<link rel="icon" type="image/png" sizes="32x32" href="/cobrands/southkesteven/images/favicon.ico">
<link rel="stylesheet" media="all" href="https://use.fontawesome.com/releases/v6.4.2/css/all.css">
[% INCLUDE 'tracking_code.html' %]
2 changes: 2 additions & 0 deletions templates/web/southkesteven/header_logo.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<a href="https://www.southkesteven.gov.uk/" id="site-logo">South Kesteven District Council</a>
<a href="/" id="report-cta" title="[%- loc('Report a problem') -%]">[%- loc('Report') -%]</a>
1 change: 1 addition & 0 deletions templates/web/southkesteven/site-name.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
South Kesteven District Council
Loading

0 comments on commit 3a5f614

Please sign in to comment.