@@ -, +, @@ to never AnonymousPatron - to a valid borrowernumber OPACPrivacy - Allow --- Koha/Exceptions/Patron.pm | 4 ++++ Koha/Patron.pm | 16 ++++++++++++++++ t/db_dependent/Koha/Patron.t | 34 +++++++++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-) --- a/Koha/Exceptions/Patron.pm +++ a/Koha/Exceptions/Patron.pm @@ -15,6 +15,10 @@ use Exception::Class ( isa => 'Koha::Exceptions::Patron', description => "Deleting patron failed" }, + 'Koha::Exceptions::Patron::FailedAnonymizing' => { + isa => 'Koha::Exceptions::Patron', + description => "Anonymizing patron reading history failed" + }, 'Koha::Exceptions::Patron::FailedDeleteAnonymousPatron' => { isa => 'Koha::Exceptions::Patron', description => "Deleting patron failed, AnonymousPatron is not deleteable" --- a/Koha/Patron.pm +++ a/Koha/Patron.pm @@ -298,6 +298,22 @@ sub store { $self->userid($stored_userid); } + # If a borrower has set their privacy to never we should immediately anonymize + # their checkouts + if( $self->privacy() == 2 && $self_from_storage->privacy() != 2 ){ + try{ + my $schema = Koha::Database->new()->schema(); + $schema->txn_do( + sub { $self->old_checkouts->anonymize; } + ); + } + catch { + Koha::Exceptions::Patron::FailedAnonymizing->throw( + error => @_ + ); + }; + } + # Password must be updated using $self->set_password $self->password($self_from_storage->password); --- a/t/db_dependent/Koha/Patron.t +++ a/t/db_dependent/Koha/Patron.t @@ -19,7 +19,7 @@ use Modern::Perl; -use Test::More tests => 20; +use Test::More tests => 21; use Test::Exception; use Test::Warn; @@ -1398,3 +1398,35 @@ subtest 'get_savings tests' => sub { $schema->storage->txn_rollback; }; + +subtest 'update privacy tests' => sub { + + plan tests => 5; + + my $patron = $builder->build_object({ class => 'Koha::Patrons', value => { privacy => 1 } }); + + my $old_checkout = $builder->build_object({ class => 'Koha::Old::Checkouts', value => { borrowernumber => $patron->id } }); + + t::lib::Mocks::mock_preference( 'AnonymousPatron', '0' ); + + $patron->privacy(2); #set to never + + throws_ok{ $patron->store } 'Koha::Exceptions::Patron::FailedAnonymizing', 'We throw an exception when anonymizing fails'; + + $old_checkout->discard_changes; #refresh from db + $patron->discard_changes; + + is( $old_checkout->borrowernumber, $patron->id, "When anonymizing fails, we don't clear the checkouts"); + is( $patron->privacy(), 1, "When anonymizing fails, we don't chaneg the privacy"); + + my $anon_patron = $builder->build_object({ class => 'Koha::Patrons'}); + t::lib::Mocks::mock_preference( 'AnonymousPatron', $anon_patron->id ); + + $patron->privacy(2)->store(); #set to never + + $old_checkout->discard_changes; #refresh from db + $patron->discard_changes; + + is( $old_checkout->borrowernumber, $anon_patron->id, "Checkout is successfully anonymized"); + is( $patron->privacy(), 2, "Patron privacy is successfully updated"); +}; --