From d0996c80d67621f1df017534d7d6fdfdf2d14b55 Mon Sep 17 00:00:00 2001 From: Marcel de Rooy Date: Mon, 13 Feb 2012 12:14:18 +0100 Subject: [PATCH] 7310b: Improving list permissions: Deleting patron Content-Type: text/plain; charset="utf-8" Implements following points from the wiki page List permissions: 5) Delete or move list information when deleting a patron. --- C4/VirtualShelves.pm | 40 ++++++++++++++++++++++++++++++++++++++-- members/deletemem.pl | 2 ++ tools/cleanborrowers.pl | 5 ++++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/C4/VirtualShelves.pm b/C4/VirtualShelves.pm index 266e5fb..b176d9d 100644 --- a/C4/VirtualShelves.pm +++ b/C4/VirtualShelves.pm @@ -565,8 +565,10 @@ sub DelFromShelf { } } if($del_oth) { - $query = qq(DELETE FROM virtualshelfcontents - WHERE shelfnumber=? AND biblionumber=? AND borrowernumber<>?); + #includes a check if borrowernumber is null (deleted patron) + $query = qq/DELETE FROM virtualshelfcontents + WHERE shelfnumber=? AND biblionumber=? AND + (borrowernumber IS NULL OR borrowernumber<>?)/; $sth= $dbh->prepare($query); foreach my $biblionumber (@$bibref) { $sth->execute($shelfnumber, $biblionumber, $user); @@ -634,6 +636,40 @@ sub ShelvesMax { return SHELVES_MASTHEAD_MAX; } +sub HandleDelBorrower { +#when a member is deleted (DelMember in Members.pm), you should call me first +#this routine deletes/moves lists and entries for the deleted member/borrower +#you could just delete everything (and lose more than you want) +#instead we now try to save all public/shared stuff and keep others happy + my ($borrower)= @_; + my $query; + my $dbh = C4::Context->dbh; + + #Delete shares of this borrower (not lists !) + $query="DELETE FROM virtualshelfshares WHERE borrowernumber=?"; + $dbh->do($query,undef,($borrower)); + + #Delete private lists without owner that now have no shares anymore + $query="DELETE vs.* FROM virtualshelves vs LEFT JOIN virtualshelfshares sh USING (shelfnumber) WHERE category=1 AND vs.owner IS NULL AND sh.shelfnumber IS NULL"; + $dbh->do($query); + + #Change owner for private lists which have shares + $query="UPDATE virtualshelves LEFT JOIN virtualshelfshares sh USING (shelfnumber) SET owner=NULL where owner=? AND category=1 AND sh.borrowernumber IS NOT NULL"; + $dbh->do($query,undef,($borrower)); + + #Delete unshared private lists + $query="DELETE FROM virtualshelves WHERE owner=? AND category=1"; + $dbh->do($query,undef,($borrower)); + + #Handle public lists owned by borrower + $query="UPDATE virtualshelves SET owner=NULL WHERE owner=? AND category=2"; + $dbh->do($query,undef,($borrower)); + + #Handle entries added by borrower to lists of others + $query="UPDATE virtualshelfcontents SET borrowernumber=NULL WHERE borrowernumber=?"; + $dbh->do($query,undef,($borrower)); +} + # internal subs sub _shelf_count { diff --git a/members/deletemem.pl b/members/deletemem.pl index 924245a..a813cd6 100755 --- a/members/deletemem.pl +++ b/members/deletemem.pl @@ -30,6 +30,7 @@ use C4::Output; use C4::Auth; use C4::Members; use C4::Branch; # GetBranches +use C4::VirtualShelves (); #no import my $input = new CGI; @@ -117,6 +118,7 @@ output_html_with_http_headers $input, $cookie, $template->output; } else { MoveMemberToDeleted($member); + C4::VirtualShelves::HandleDelBorrower($member); DelMember($member); print $input->redirect("/cgi-bin/koha/members/members-home.pl"); } diff --git a/tools/cleanborrowers.pl b/tools/cleanborrowers.pl index 4fde0f2..0b37c20 100755 --- a/tools/cleanborrowers.pl +++ b/tools/cleanborrowers.pl @@ -40,6 +40,7 @@ use C4::Output; use C4::Dates qw/format_date format_date_in_iso/; use C4::Members; # GetBorrowersWhoHavexxxBorrowed. use C4::Circulation; # AnonymiseIssueHistory. +use C4::VirtualShelves (); #no import use Date::Calc qw/Today Add_Delta_YM/; my $cgi = new CGI; @@ -117,13 +118,15 @@ if ( $params->{'step3'} ) { my $i; for ( $i = 0 ; $i < $totalDel ; $i++ ) { MoveMemberToDeleted( $membersToDelete->[$i]->{'borrowernumber'} ); + C4::VirtualShelves::HandleDelBorrower($membersToDelete->[$i]->{'borrowernumber'}); DelMember( $membersToDelete->[$i]->{'borrowernumber'} ); } } else { # delete completly. my $i; for ( $i = 0 ; $i < $totalDel ; $i++ ) { - DelMember($membersToDelete->[$i]->{'borrowernumber'}); + C4::VirtualShelves::HandleDelBorrower($membersToDelete->[$i]->{'borrowernumber'}); + DelMember($membersToDelete->[$i]->{'borrowernumber'}); } } $template->param( -- 1.6.0.6