aboutsummaryrefslogtreecommitdiffstats
path: root/perllib
diff options
context:
space:
mode:
Diffstat (limited to 'perllib')
-rw-r--r--perllib/FixMyStreet/Cobrand/TfL.pm30
-rw-r--r--perllib/FixMyStreet/DB/Result/Problem.pm11
-rw-r--r--perllib/FixMyStreet/Script/Inactive.pm57
3 files changed, 87 insertions, 11 deletions
diff --git a/perllib/FixMyStreet/Cobrand/TfL.pm b/perllib/FixMyStreet/Cobrand/TfL.pm
index 751831b10..797b872a4 100644
--- a/perllib/FixMyStreet/Cobrand/TfL.pm
+++ b/perllib/FixMyStreet/Cobrand/TfL.pm
@@ -119,6 +119,36 @@ sub report_age { '6 weeks' }
# We don't want any reports made before the go-live date visible
sub cut_off_date { '2019-12-09 12:00' }
+sub problems_restriction {
+ my ($self, $rs) = @_;
+ return $rs if FixMyStreet->staging_flag('skip_checks');
+ $rs = $self->next::method($rs);
+ my $table = ref $rs eq 'FixMyStreet::DB::ResultSet::Nearby' ? 'problem' : 'me';
+ $rs = $rs->search({
+ "$table.lastupdate" => { '>=', \"now() - '3 years'::interval" }
+ });
+ return $rs;
+}
+
+sub problems_sql_restriction {
+ my ($self, $item_table) = @_;
+ my $q = $self->next::method($item_table);
+ if ($item_table ne 'comment') {
+ $q .= " AND lastupdate >= now() - '3 years'::interval";
+ }
+ return $q;
+}
+
+sub inactive_reports_filter {
+ my ($self, $time, $rs) = @_;
+ if ($time < 7*12) {
+ $rs = $rs->search({ extra => { like => '%safety_critical,T5:value,T2:no%' } });
+ } else {
+ $rs = $rs->search({ extra => { like => '%safety_critical,T5:value,T3:yes%' } });
+ }
+ return $rs;
+}
+
sub password_expiry {
return if FixMyStreet->test_mode;
# uncoverable statement
diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm
index a188d9c2b..d9bb8e125 100644
--- a/perllib/FixMyStreet/DB/Result/Problem.pm
+++ b/perllib/FixMyStreet/DB/Result/Problem.pm
@@ -1187,4 +1187,15 @@ has inspection_log_entry => (
},
);
+has alerts => (
+ is => 'ro',
+ lazy => 1,
+ default => sub {
+ my $self = shift;
+ return $self->result_source->schema->resultset('Alert')->search({
+ alert_type => 'new_updates', parameter => $self->id
+ });
+ },
+);
+
1;
diff --git a/perllib/FixMyStreet/Script/Inactive.pm b/perllib/FixMyStreet/Script/Inactive.pm
index 0468d2a52..e09417648 100644
--- a/perllib/FixMyStreet/Script/Inactive.pm
+++ b/perllib/FixMyStreet/Script/Inactive.pm
@@ -12,17 +12,23 @@ use FixMyStreet::Email;
has anonymize => ( is => 'ro' );
has close => ( is => 'ro' );
+has delete => ( is => 'ro' );
has email => ( is => 'ro' );
has verbose => ( is => 'ro' );
has dry_run => ( is => 'ro' );
+has cobrand => (
+ is => 'ro',
+ coerce => sub { FixMyStreet::Cobrand->get_class_for_moniker($_[0])->new },
+);
+
sub BUILDARGS {
my ($cls, %args) = @_;
$args{dry_run} = delete $args{'dry-run'};
return \%args;
}
-has cobrand => (
+has base_cobrand => (
is => 'lazy',
default => sub {
my $base_url = FixMyStreet->config('BASE_URL');
@@ -55,6 +61,7 @@ sub reports {
say "DRY RUN" if $self->dry_run;
$self->anonymize_reports if $self->anonymize;
+ $self->delete_reports if $self->delete;
$self->close_updates if $self->close;
}
@@ -66,6 +73,7 @@ sub close_updates {
state => [ FixMyStreet::DB::Result::Problem->closed_states(), FixMyStreet::DB::Result::Problem->fixed_states() ],
extra => [ undef, { -not_like => '%closed_updates%' } ],
});
+ $problems = $problems->search({ cobrand => $self->cobrand->moniker }) if $self->cobrand;
while (my $problem = $problems->next) {
say "Closing updates on problem #" . $problem->id if $self->verbose;
@@ -75,18 +83,28 @@ sub close_updates {
}
}
-sub anonymize_reports {
- my $self = shift;
-
- # Need to look though them all each time, in case any new updates/alerts
+sub _relevant_reports {
+ my ($self, $time) = @_;
my $problems = FixMyStreet::DB->resultset("Problem")->search({
- lastupdate => { '<', interval($self->anonymize) },
+ lastupdate => { '<', interval($time) },
state => [
FixMyStreet::DB::Result::Problem->closed_states(),
FixMyStreet::DB::Result::Problem->fixed_states(),
FixMyStreet::DB::Result::Problem->hidden_states(),
],
});
+ if ($self->cobrand) {
+ $problems = $problems->search({ cobrand => $self->cobrand->moniker });
+ $problems = $self->cobrand->call_hook(inactive_reports_filter => $time, $problems) || $problems;
+ }
+ return $problems;
+}
+
+sub anonymize_reports {
+ my $self = shift;
+
+ # Need to look though them all each time, in case any new updates/alerts
+ my $problems = $self->_relevant_reports($self->anonymize);
while (my $problem = $problems->next) {
say "Anonymizing problem #" . $problem->id if $self->verbose;
@@ -110,10 +128,8 @@ sub anonymize_reports {
});
# Remove alerts - could just delete, but of interest how many there were, perhaps?
- FixMyStreet::DB->resultset('Alert')->search({
+ $problem->alerts->search({
user_id => { '!=' => $self->anonymous_user->id },
- alert_type => 'new_updates',
- parameter => $problem->id,
})->update({
user_id => $self->anonymous_user->id,
whendisabled => \'current_timestamp',
@@ -121,11 +137,30 @@ sub anonymize_reports {
}
}
+sub delete_reports {
+ my $self = shift;
+
+ my $problems = $self->_relevant_reports($self->delete);
+
+ while (my $problem = $problems->next) {
+ say "Deleting associated data of problem #" . $problem->id if $self->verbose;
+ next if $self->dry_run;
+
+ $problem->comments->delete;
+ $problem->questionnaires->delete;
+ $problem->alerts->delete;
+ }
+ say "Deleting all matching problems" if $self->verbose;
+ return if $self->dry_run;
+ $problems->delete;
+}
+
sub anonymize_users {
my $self = shift;
my $users = FixMyStreet::DB->resultset("User")->search({
last_active => { '<', interval($self->anonymize) },
+ email => { -not_like => 'removed-%@' . FixMyStreet->config('EMAIL_DOMAIN') },
});
while (my $user = $users->next) {
@@ -154,10 +189,10 @@ sub email_inactive_users {
email_from => $self->email,
anonymize_from => $self->anonymize,
user => $user,
- url => $self->cobrand->base_url_with_lang . '/my',
+ url => $self->base_cobrand->base_url_with_lang . '/my',
},
{ To => [ $user->email, $user->name ] },
- undef, 0, $self->cobrand,
+ undef, 0, $self->base_cobrand,
);
$user->set_extra_metadata('inactive_email_sent', 1);