From 41b9fc32fde54e0d59b326b842fee4e92342557e Mon Sep 17 00:00:00 2001 From: Kyle M Hall Date: Mon, 6 May 2013 13:51:27 -0400 Subject: [PATCH] Bug 10263 - Add ability to limit which branch can edit a bibliographic record ( IndependentBranchesMarcEditing ) Right now, it's possible to limit who can edit items by using IndependantBranches. However, Koha has no method of limiting who can edit bibliographic records, as they have no defined owner. This patch adds a new system preference IndependentBranchesMarcEditing. If this new syspref is enabled, a librarian can only edit or delete a bib record if his or her logged in branch code matches the branchcode in biblio.branchcode. This feature does not affect the ability to edit or delete items, as that functionality is determined by IndependantBranches. This patch adds the 'branches_optional' field to the authorised values pulldown for MARC fields and subfields in the MARC frameworks editor. 'branches_optional' behaves exactly like 'branches' except it includes an "empty" choice so the branch does not have to be set. Test Plan: 1) Apply patch 2) Run updatedatabase.pl 3) Map a nonrepeatable field/subfield to biblio.branchcode ( e.g. 951$o ) Pro-tip: Use the authorised value 'branches_optional' to get a pulldown of libraries instead of entering the branchcode manually. 4) Edit a record, and add a branchcode. 5) Log in as a non-superlibrarian with cataloging priveleges 6) Change the logged in branch to a branch other than the one you entered in the record. 7) You should note the 'edit' pulldown for the record is missing the "Edit record" and "Delete record" options. 8) Switch the logged in branch to match the branchcode of the record. 9) You should now see the edit and delete options for that record. 10) Attempt to edit a record with no branchcode defined, you should be able to. --- C4/Auth.pm | 1 + C4/Biblio.pm | 21 +++++++++--- Koha/Template/Plugin/Koha.pm | 8 ++++- admin/marc_subfields_structure.pl | 1 + catalogue/detail.pl | 2 + cataloguing/addbiblio.pl | 23 ++++++++++++- installer/data/mysql/kohastructure.sql | 2 + installer/data/mysql/updatedatabase.pl | 34 ++++++++++++++++++- .../intranet-tmpl/prog/en/includes/cat-toolbar.inc | 21 +++++++++--- .../prog/en/modules/admin/preferences/admin.pref | 9 +++++- .../prog/en/modules/catalogue/results.tt | 3 +- 11 files changed, 107 insertions(+), 18 deletions(-) diff --git a/C4/Auth.pm b/C4/Auth.pm index d6da435..d0589a3 100644 --- a/C4/Auth.pm +++ b/C4/Auth.pm @@ -197,6 +197,7 @@ sub get_template_and_user { # to create the template's parameters that will indicate # which menus the user can access. if ( $flags && $flags->{superlibrarian}==1 ) { + $template->param( CAN_user_superlibrarian => 1 ); $template->param( CAN_user_circulate => 1 ); $template->param( CAN_user_catalogue => 1 ); $template->param( CAN_user_parameters => 1 ); diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 71e9366..d49ddbc 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -3045,12 +3045,16 @@ sub _koha_add_biblio { seriestitle = ?, copyrightdate = ?, datecreated=NOW(), - abstract = ? + abstract = ?, + branchcode = ? "; my $sth = $dbh->prepare($query); $sth->execute( - $frameworkcode, $biblio->{'author'}, $biblio->{'title'}, $biblio->{'unititle'}, $biblio->{'notes'}, - $biblio->{'serial'}, $biblio->{'seriestitle'}, $biblio->{'copyrightdate'}, $biblio->{'abstract'} + $frameworkcode, $biblio->{'author'}, + $biblio->{'title'}, $biblio->{'unititle'}, + $biblio->{'notes'}, $biblio->{'serial'}, + $biblio->{'seriestitle'}, $biblio->{'copyrightdate'}, + $biblio->{'abstract'}, $biblio->{'branchcode'}, ); my $biblionumber = $dbh->{'mysql_insertid'}; @@ -3087,15 +3091,20 @@ sub _koha_modify_biblio { serial = ?, seriestitle = ?, copyrightdate = ?, - abstract = ? + abstract = ?, + branchcode = ? WHERE biblionumber = ? " ; my $sth = $dbh->prepare($query); $sth->execute( - $frameworkcode, $biblio->{'author'}, $biblio->{'title'}, $biblio->{'unititle'}, $biblio->{'notes'}, - $biblio->{'serial'}, $biblio->{'seriestitle'}, $biblio->{'copyrightdate'}, $biblio->{'abstract'}, $biblio->{'biblionumber'} + $frameworkcode, $biblio->{'author'}, + $biblio->{'title'}, $biblio->{'unititle'}, + $biblio->{'notes'}, $biblio->{'serial'}, + $biblio->{'seriestitle'}, $biblio->{'copyrightdate'}, + $biblio->{'abstract'}, $biblio->{'branchcode'}, + $biblio->{'biblionumber'} ) if $biblio->{'biblionumber'}; if ( $dbh->errstr || !$biblio->{'biblionumber'} ) { diff --git a/Koha/Template/Plugin/Koha.pm b/Koha/Template/Plugin/Koha.pm index 2eff9f1..96ee539 100644 --- a/Koha/Template/Plugin/Koha.pm +++ b/Koha/Template/Plugin/Koha.pm @@ -22,7 +22,7 @@ use Modern::Perl; use base qw( Template::Plugin ); use C4::Context; - +use C4::Branch qw( GetIndependentGroupModificationRights ); =pod This plugin contains various Koha replated Template Toolkit functions @@ -44,4 +44,10 @@ sub Preference { return C4::Context->preference( $pref ); } +sub HasIndependentGroupModificationRightsFor { + my ( $self, $branchcode ) = @_; + my $value = GetIndependentGroupModificationRights( { for => $branchcode } ); + return $value; +} + 1; diff --git a/admin/marc_subfields_structure.pl b/admin/marc_subfields_structure.pl index 615fbcf..52c3859 100755 --- a/admin/marc_subfields_structure.pl +++ b/admin/marc_subfields_structure.pl @@ -133,6 +133,7 @@ if ( $op eq 'add_form' ) { push @authorised_values, $category; } push( @authorised_values, "branches" ); + push( @authorised_values, "branches_optional" ); push( @authorised_values, "itemtypes" ); push( @authorised_values, "cn_source" ); diff --git a/catalogue/detail.pl b/catalogue/detail.pl index 955dbf5..e0e22c5 100755 --- a/catalogue/detail.pl +++ b/catalogue/detail.pl @@ -63,6 +63,8 @@ my ( $template, $borrowernumber, $cookie, $flags ) = get_template_and_user( my $biblionumber = $query->param('biblionumber'); my $record = GetMarcBiblio($biblionumber); +$template->param( biblio => GetBiblio( $biblionumber ) ); + if ( not defined $record ) { # biblionumber invalid -> report and exit $template->param( unknownbiblionumber => 1, diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl index 4b1cd95..52288a5 100755 --- a/cataloguing/addbiblio.pl +++ b/cataloguing/addbiblio.pl @@ -170,7 +170,7 @@ sub build_authorized_values_list { # builds list, depending on authorised value... #---- branch - if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) { + if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} =~ /branches|branches_optional/ ) { #Use GetBranches($onlymine) my $onlymine = C4::Context->preference('IndependentBranches') @@ -183,7 +183,7 @@ sub build_authorized_values_list { push @authorised_values, $thisbranch; $authorised_lib{$thisbranch} = $branches->{$thisbranch}->{'branchname'}; } - + push( @authorised_values, q{} ) if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq 'branches_optional' ); #----- itemtypes } elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) { @@ -808,6 +808,25 @@ if ($breedingid) { ( $record, $encoding ) = MARCfindbreeding( $breedingid ) ; } +if ( $record != -1 + && C4::Context->preference('IndependentBranchesMarcEditing') ) +{ + my ( $field, $subfield ) = + GetMarcFromKohaField( 'biblio.branchcode', $frameworkcode ); + if ( + defined( $record->field($field) ) + && defined( $record->subfield( $field, $subfield ) ) + && !GetIndependentGroupModificationRights( + { for => $record->subfield( $field, $subfield ) } + ) + ) + { + print $input->redirect( + "/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber"); + exit; + } +} + #populate hostfield if hostbiblionumber is available if ($hostbiblionumber) { my $marcflavour = C4::Context->preference("marcflavour"); diff --git a/installer/data/mysql/kohastructure.sql b/installer/data/mysql/kohastructure.sql index 7f1d472..90f57f3 100644 --- a/installer/data/mysql/kohastructure.sql +++ b/installer/data/mysql/kohastructure.sql @@ -127,6 +127,7 @@ CREATE TABLE `biblio` ( -- table that stores bibliographic information `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, -- date and time this record was last touched `datecreated` DATE NOT NULL, -- the date this record was added to Koha `abstract` mediumtext, -- summary from the MARC record (520$a in MARC21) + `branchcode` VARCHAR( 10 ) NULL DEFAULT NULL, -- branchcode for the opationl 'owner' of this record. PRIMARY KEY (`biblionumber`), KEY `blbnoidx` (`biblionumber`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -737,6 +738,7 @@ CREATE TABLE `deletedbiblio` ( -- stores information about bibliographic records `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, -- date and time this record was last touched `datecreated` DATE NOT NULL, -- the date this record was added to Koha `abstract` mediumtext, -- summary from the MARC record (520$a in MARC21) + `branchcode` VARCHAR( 10 ) NULL DEFAULT NULL, -- branchcode for the opationl 'owner' of this record. PRIMARY KEY (`biblionumber`), KEY `blbnoidx` (`biblionumber`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 830ee60..e0b9b01 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -6800,6 +6800,7 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { ADD KEY `branchcode_idx` (`branchcode`), ADD KEY `issuingbranch_idx` (`issuingbranch`) }); + #items $dbh->do(q{ ALTER TABLE `items` ADD KEY `itype_idx` (`itype`) @@ -7153,7 +7154,7 @@ if ( CheckVersion($DBversion) ) { $DBversion = "3.13.00.XXX"; if ( CheckVersion($DBversion) ) { - $dbh->do(" + $dbh->do(q{ INSERT INTO systempreferences ( variable, value, @@ -7167,7 +7168,7 @@ if ( CheckVersion($DBversion) ) { 'If on, the staff interface search will hide all records that do not contain an item owned by the logged in branch, and hide the items themselves.', 'YesNo' ) - "); + }); print "Upgrade to $DBversion done (Bug 10278 - Add ability to hide items and records from search results for Independent Branches)\n"; SetVersion ($DBversion); } @@ -7857,6 +7858,35 @@ if ( CheckVersion($DBversion) ) { SetVersion($DBversion); } +$DBversion = "3.13.00.XXX"; +if ( CheckVersion($DBversion) ) { + $dbh->do(q{ + INSERT INTO systempreferences ( + variable, + value, + options, + explanation, + type + ) VALUES ( + 'IndependentBranchesMarcEditing', + '0', + '', + "If on, this preference disallows the editing of a bibliographic record unless the logged in library's branchcode matchs the branchcode stored in biblio.branchcode.", + 'YesNo' + ) + }); + + $dbh->do(q{ + ALTER TABLE biblio ADD branchcode VARCHAR( 10 ) NULL DEFAULT NULL + }); + + $dbh->do(q{ + ALTER TABLE deletedbiblio ADD branchcode VARCHAR( 10 ) NULL DEFAULT NULL + }); + + print "Upgrade to $DBversion done (Bug 10263 - Add ability to limit which branch can edit a bibliographic record)\n"; + SetVersion ($DBversion); +} =head1 FUNCTIONS diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc index 63b22a4..51e8a32 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc +++ b/koha-tmpl/intranet-tmpl/prog/en/includes/cat-toolbar.inc @@ -1,3 +1,5 @@ +[% USE Koha %] +