use utf8;
package FixMyStreet::DB::Result::Comment;
# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THE FIRST PART OF THIS FILE
use strict;
use warnings;
use base 'DBIx::Class::Core';
__PACKAGE__->load_components(
"FilterColumn",
"FixMyStreet::InflateColumn::DateTime",
"FixMyStreet::EncodedColumn",
);
__PACKAGE__->table("comment");
__PACKAGE__->add_columns(
"id",
{
data_type => "integer",
is_auto_increment => 1,
is_nullable => 0,
sequence => "comment_id_seq",
},
"problem_id",
{ data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
"user_id",
{ data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
"anonymous",
{ data_type => "boolean", is_nullable => 0 },
"name",
{ data_type => "text", is_nullable => 1 },
"website",
{ data_type => "text", is_nullable => 1 },
"created",
{
data_type => "timestamp",
default_value => \"current_timestamp",
is_nullable => 0,
original => { default_value => \"now()" },
},
"confirmed",
{ data_type => "timestamp", is_nullable => 1 },
"text",
{ data_type => "text", is_nullable => 0 },
"photo",
{ data_type => "bytea", is_nullable => 1 },
"state",
{ data_type => "text", is_nullable => 0 },
"cobrand",
{ data_type => "text", default_value => "", is_nullable => 0 },
"lang",
{ data_type => "text", default_value => "en-gb", is_nullable => 0 },
"cobrand_data",
{ data_type => "text", default_value => "", is_nullable => 0 },
"mark_fixed",
{ data_type => "boolean", is_nullable => 0 },
"mark_open",
{ data_type => "boolean", default_value => \"false", is_nullable => 0 },
"problem_state",
{ data_type => "text", is_nullable => 1 },
"external_id",
{ data_type => "text", is_nullable => 1 },
"extra",
{ data_type => "text", is_nullable => 1 },
"send_fail_count",
{ data_type => "integer", default_value => 0, is_nullable => 0 },
"send_fail_reason",
{ data_type => "text", is_nullable => 1 },
"send_fail_timestamp",
{ data_type => "timestamp", is_nullable => 1 },
"whensent",
{ data_type => "timestamp", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->has_many(
"moderation_original_datas",
"FixMyStreet::DB::Result::ModerationOriginalData",
{ "foreign.comment_id" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
__PACKAGE__->belongs_to(
"problem",
"FixMyStreet::DB::Result::Problem",
{ id => "problem_id" },
{ is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" },
);
__PACKAGE__->belongs_to(
"user",
"FixMyStreet::DB::Result::User",
{ id => "user_id" },
{ is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" },
);
# Created by DBIx::Class::Schema::Loader v0.07035 @ 2019-04-25 12:06:39
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CozqNY621I8G7kUPXi5RoQ
#
__PACKAGE__->load_components("+FixMyStreet::DB::RABXColumn");
__PACKAGE__->rabx_column('extra');
use Moo;
use namespace::clean -except => [ 'meta' ];
use FixMyStreet::Template;
with 'FixMyStreet::Roles::Abuser',
'FixMyStreet::Roles::Extra',
'FixMyStreet::Roles::Moderation',
'FixMyStreet::Roles::PhotoSet';
=head2 get_cobrand_logged
Get a cobrand object for the cobrand the update was made on.
e.g. if an update was logged at www.fixmystreet.com, this will be a
FixMyStreet::Cobrand::FixMyStreet object.
=cut
has get_cobrand_logged => (
is => 'ro',
lazy => 1,
default => sub {
my $self = shift;
my $cobrand_class = FixMyStreet::Cobrand->get_class_for_moniker( $self->cobrand );
return $cobrand_class->new;
},
);
# You can replace this text with custom code or comments, and it will be preserved on regeneration
sub check_for_errors {
my $self = shift;
my %errors = ();
$errors{name} = _('Please enter your name')
if !$self->name || $self->name !~ m/\S/;
$errors{update} = _('Please enter a message')
unless $self->text =~ m/\S/;
# Bromley Council custom character limit
if ( $self->text && $self->problem && $self->problem->bodies_str) {
if ($self->problem->to_body_named('Bromley') && length($self->text) > 1750) {
$errors{update} = sprintf( _('Updates are limited to %s characters in length. Please shorten your update'), 1750 );
}
}
return \%errors;
}
=head2 confirm
Set state of comment to confirmed
=cut
sub confirm {
my $self = shift;
$self->state( 'confirmed' );
$self->confirmed( \'current_timestamp' );
}
sub url {
my $self = shift;
return "/report/" . $self->problem_id . '#update_' . $self->id;
}
__PACKAGE__->has_many(
"admin_log_entries",
"FixMyStreet::DB::Result::AdminLog",
{ "foreign.object_id" => "self.id" },
{
cascade_copy => 0, cascade_delete => 0,
where => { 'object_type' => 'update' },
}
);
# This will return the oldest moderation_original_data, if any.
# The plural can be used to return all entries.
__PACKAGE__->might_have(
"moderation_original_data",
"FixMyStreet::DB::Result::ModerationOriginalData",
{ "foreign.comment_id" => "self.id",
"foreign.problem_id" => "self.problem_id",
},
{ order_by => 'id',
rows => 1,
cascade_copy => 0, cascade_delete => 1 },
);
sub moderation_filter {
my $self = shift;
{ problem_id => $self->problem_id };
}
=head2 meta_line
Returns a string to be used on a report update, describing some of the metadata
about an update
=cut
sub meta_line {
my ( $self, $c ) = @_;
my $meta = '';
if ($self->anonymous or !$self->name) {
$meta = sprintf( _( 'Posted anonymously at %s' ), Utils::prettify_dt( $self->confirmed ) )
} elsif ($self->user->from_body || $self->get_extra_metadata('is_body_user') || $self->get_extra_metadata('is_superuser') ) {
my $user_name = FixMyStreet::Template::html_filter($self->user->name);
my $body;
if ($self->get_extra_metadata('is_superuser')) {
$body = _('an administrator');
} else {
# use this meta data in preference to the user's from_body setting
# in case they are no longer with the body, or have changed body.
if (my $body_id = $self->get_extra_metadata('is_body_user')) {
$body = FixMyStreet::App->model('DB::Body')->find({id => $body_id})->name;
} else {
$body = $self->user->body;
}
if ($body eq 'Bromley Council') {
$body = "$body
";
} elsif ($body eq 'Royal Borough of Greenwich') {
$body = "$body
";
}
}
my $cobrand_always_view_body_user = $c->cobrand->call_hook("always_view_body_contribute_details");
my $can_view_contribute = $cobrand_always_view_body_user ||
($c->user_exists && $c->user->has_permission_to('view_body_contribute_details', $self->problem->bodies_str_ids));
if ($self->text) {
if ($can_view_contribute) {
$meta = sprintf( _( 'Posted by %s (%s) at %s' ), $body, $user_name, Utils::prettify_dt( $self->confirmed ) );
} else {
$meta = sprintf( _( 'Posted by %s at %s' ), $body, Utils::prettify_dt( $self->confirmed ) );
}
} else {
if ($can_view_contribute) {
$meta = sprintf( _( 'Updated by %s (%s) at %s' ), $body, $user_name, Utils::prettify_dt( $self->confirmed ) );
} else {
$meta = sprintf( _( 'Updated by %s at %s' ), $body, Utils::prettify_dt( $self->confirmed ) );
}
}
} else {
$meta = sprintf( _( 'Posted by %s at %s' ), FixMyStreet::Template::html_filter($self->name), Utils::prettify_dt( $self->confirmed ) )
}
if ($self->get_extra_metadata('defect_raised')) {
$meta .= ', ' . _( 'and a defect raised' );
}
return $meta;
};
sub problem_state_processed {
my $self = shift;
return 'fixed - user' if $self->mark_fixed;
return 'confirmed' if $self->mark_open;
return $self->problem_state;
}
sub problem_state_display {
my ( $self, $c ) = @_;
my $state = $self->problem_state_processed;
return '' unless $state;
my $cobrand_name = $c->cobrand->moniker;
$cobrand_name = 'bromley' if $self->problem->to_body_named('Bromley');
return FixMyStreet::DB->resultset("State")->display($state, 1, $cobrand_name);
}
sub is_latest {
my $self = shift;
my $latest_update = $self->result_source->resultset->search(
{ problem_id => $self->problem_id, state => 'confirmed' },
{ order_by => [ { -desc => 'confirmed' }, { -desc => 'id' } ] }
)->first;
return $latest_update->id == $self->id;
}
sub hide {
my $self = shift;
my $ret = {};
# If we're hiding an update, see if it marked as fixed and unfix if so
if ($self->mark_fixed && $self->is_latest && $self->problem->state =~ /^fixed/) {
$self->problem->state('confirmed');
$self->problem->update;
$ret->{reopened} = 1;
}
$self->get_photoset->delete_cached;
$self->update({ state => 'hidden' });
return $ret;
}
sub as_hashref {
my ($self, $c, $cols) = @_;
my $out = {
id => $self->id,
problem_id => $self->problem_id,
text => $self->text,
state => $self->state,
created => $self->created,
};
$out->{problem_state} = $self->problem_state_processed;
$out->{photos} = [ map { $_->{url} } @{$self->photos} ] if !$cols || $cols->{photos};
if ($self->confirmed) {
$out->{confirmed} = $self->confirmed if !$cols || $cols->{confirmed};
$out->{confirmed_pp} = $c->cobrand->prettify_dt( $self->confirmed ) if !$cols || $cols->{confirmed_pp};
}
return $out;
}
1;