@@ -, +, @@ --- C4/Auth.pm | 27 ++++++++++++++++----------- t/db_dependent/Auth.t | 23 +++++++++-------------- 2 files changed, 25 insertions(+), 25 deletions(-) --- a/C4/Auth.pm +++ a/C4/Auth.pm @@ -33,6 +33,7 @@ use C4::Search::History; use Koha; use Koha::Caches; use Koha::AuthUtils qw(get_script_name hash_password); +use Koha::DateUtils qw(dt_from_string); use Koha::Library::Groups; use Koha::Libraries; use Koha::Patrons; @@ -1201,7 +1202,7 @@ sub checkauth { ); } - track_login_for_session( $userid, $session ); + track_login_for_session( $userid ); return ( $userid, $cookie, $sessionID, $flags ); } @@ -2078,26 +2079,30 @@ sub getborrowernumber { =head2 track_login_for_session - track_login_for_session( $userid, $session ); + track_login_for_session( $userid ); C<$userid> the userid of the member -C<$session> the CGI::Session object used to store the session's state. Wraps the call to $patron->track_login, the method used to update borrowers.lastseen. =cut sub track_login_for_session { - my ( $userid, $session ) = @_; + my $userid = shift; + return unless $userid; - if ( $userid && $session && !$session->param('tracked_for_session') ) { - $session->param( 'tracked_for_session', 1 ); - $session->flush(); + my $patron = Koha::Patrons->find( { userid => $userid } ); + return unless $patron; - # track_login also depends on pref TrackLastPatronActivity - my $patron = Koha::Patrons->find( { userid => $userid } ); - $patron->track_login if $patron; - } + my $cache = Koha::Caches->get_instance(); + my $cache_key = "seen-for-session-" . $patron->id; + my $cached = $cache->get_from_cache( $cache_key, { unsafe => 1 } ); + + my $today = dt_from_string()->ymd; + return if $cached && $cached eq $today; + + $patron->track_login; + $cache->set_in_cache( $cache_key, $today ); } END { } # module clean-up code here (global destructor) --- a/t/db_dependent/Auth.t +++ a/t/db_dependent/Auth.t @@ -77,38 +77,33 @@ subtest 'track_login_for_session() tests' => sub { $patron->lastseen( undef ); $patron->store(); - # Mock a CGI object with real userid param - my $cgi = Test::MockObject->new(); - $cgi->mock( 'param', sub { return $patron; } ); - $cgi->mock( 'cookie', sub { return; } ); - - my $session = new CGI::Session( undef, undef, { Directory => File::Spec->tmpdir } ); + my $cache = Koha::Caches->get_instance(); + my $cache_key = "seen-for-session-" . $patron->id; + $cache->clear_from_cache($cache_key); t::lib::Mocks::mock_preference( 'TrackLastPatronActivity', '1' ); - C4::Auth::track_login_for_session( $userid ); - $patron->_result()->discard_changes(); - is( $patron->lastseen, undef, 'Patron last seen should be unchanged if no session is passed' ); + is( $patron->lastseen, undef, 'Patron should have not last seen when newly created' ); - C4::Auth::track_login_for_session( $userid, $session ); + C4::Auth::track_login_for_session( $userid ); $patron->_result()->discard_changes(); isnt( $patron->lastseen, undef, 'Patron should have last seen set when TrackLastPatronActivity = 1' ); sleep(1); # We need to wait a tiny bit to make sure the timestamp will be different my $last_seen = $patron->lastseen; - C4::Auth::track_login_for_session( $userid, $session ); + C4::Auth::track_login_for_session( $userid ); $patron->_result()->discard_changes(); is( $patron->lastseen, $last_seen, 'Patron last seen should be unchanged if passed the same session' ); - $session = new CGI::Session( undef, undef, { Directory => File::Spec->tmpdir } ); - C4::Auth::track_login_for_session( $userid, $session ); + $cache->clear_from_cache($cache_key); + C4::Auth::track_login_for_session( $userid ); $patron->_result()->discard_changes(); isnt( $patron->lastseen, $last_seen, 'Patron last seen should be changed if given a new session' ); t::lib::Mocks::mock_preference( 'TrackLastPatronActivity', '0' ); sleep(1); $last_seen = $patron->lastseen; - C4::Auth::track_login_for_session( $userid, $session ); + C4::Auth::track_login_for_session( $userid ); $patron->_result()->discard_changes(); is( $patron->lastseen, $last_seen, 'Patron should have last seen unchanged when TrackLastPatronActivity = 0' ); --