X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=authorities%2Fmerge.pl;h=9f725415a52cdeeb7a3e80a1abeb673e7055e4be;hb=d9ce37ff3e7f351bdf3506e925b1333217743cea;hp=362838150fd69ca59717c8043bdc146d00fa5786;hpb=0070a7f6afb30b6f7ae8bc0eb073a4c39e0f783a;p=koha.git diff --git a/authorities/merge.pl b/authorities/merge.pl index 362838150f..9f725415a5 100755 --- a/authorities/merge.pl +++ b/authorities/merge.pl @@ -19,16 +19,18 @@ use strict; use warnings; -use CGI; +use CGI qw ( -utf8 ); use C4::Output; use C4::Auth; use C4::AuthoritiesMarc; -use Koha::Authority; use C4::Koha; use C4::Biblio; +use Koha::Authority::Types; +use Koha::MetadataRecord::Authority; + my $input = new CGI; -my @authid = $input->param('authid'); +my @authid = $input->multi_param('authid'); my $merge = $input->param('merge'); my @errors; @@ -49,30 +51,41 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( if ($merge) { # Creating a new record from the html code - my $record = TransformHtmlToMarc($input); - my $recordid1 = $input->param('recordid1'); - my $recordid2 = $input->param('recordid2'); + my $record = TransformHtmlToMarc($input, 0); + my $recordid1 = $input->param('recordid1') // q{}; + my $recordid2 = $input->param('recordid2') // q{}; my $typecode = $input->param('frameworkcode'); + # Some error checking + if( $recordid1 eq $recordid2 ) { + push @errors, { code => 'DESTRUCTIVE_MERGE' }; + } elsif( !$typecode || !Koha::Authority::Types->find($typecode) ) { + push @errors, { code => 'WRONG_FRAMEWORK' }; + } elsif( scalar $record->fields == 0 ) { + push @errors, { code => 'EMPTY_MARC' }; + } + if( @errors ) { + $template->param( errors => \@errors ); + output_html_with_http_headers $input, $cookie, $template->output; + exit; + } + # Rewriting the leader - $record->leader( GetAuthority($recordid1)->leader() ); + if( my $authrec = GetAuthority($recordid1) ) { + $record->leader( $authrec->leader() ); + } # Modifying the reference record + # This triggers a merge for the biblios attached to $recordid1 ModAuthority( $recordid1, $record, $typecode ); - # Deleting the other record - if ( scalar(@errors) == 0 ) { + # Now merge for biblios attached to $recordid2 + my $MARCfrom = GetAuthority( $recordid2 ); + merge({ mergefrom => $recordid2, MARCfrom => $MARCfrom, mergeto => $recordid1, MARCto => $record }); - my $error; - if ($input->param('mergereference') eq 'breeding') { - require C4::ImportBatch; - C4::ImportBatch::SetImportRecordStatus( $recordid2, 'imported' ); - } else { - C4::AuthoritiesMarc::merge( $recordid2, GetAuthority($recordid2), $recordid1, $record ); - $error = (DelAuthority($recordid2) == 0); - } - push @errors, $error if ($error); - } + # Delete the other record. Do not merge. It is unneeded and could under + # special circumstances have unwanted side-effects. + DelAuthority({ authid => $recordid2, skip_merge => 1 }); # Parameters $template->param( @@ -90,26 +103,41 @@ else { if ( scalar(@authid) != 2 ) { push @errors, { code => "WRONG_COUNT", value => scalar(@authid) }; - } - else { - my $recordObj1 = Koha::Authority->get_from_authid($authid[0]) || Koha::Authority->new(); - my $recordObj2; + } elsif( $authid[0] eq $authid[1] ) { + push @errors, { code => 'DESTRUCTIVE_MERGE' }; + } else { + my $recordObj1 = Koha::MetadataRecord::Authority->get_from_authid($authid[0]); + if (!$recordObj1) { + push @errors, { code => "MISSING_RECORD", value => $authid[0] }; + } + + my $recordObj2; if (defined $mergereference && $mergereference eq 'breeding') { - $recordObj2 = Koha::Authority->get_from_breeding($authid[1]) || Koha::Authority->new(); + $recordObj2 = Koha::MetadataRecord::Authority->get_from_breeding($authid[1]); } else { - $recordObj2 = Koha::Authority->get_from_authid($authid[1]) || Koha::Authority->new(); + $recordObj2 = Koha::MetadataRecord::Authority->get_from_authid($authid[1]); + } + if (!$recordObj2) { + push @errors, { code => "MISSING_RECORD", value => $authid[1] }; } - if ($mergereference) { + unless ( $recordObj1 && $recordObj2 ) { + if (@errors) { + $template->param( errors => \@errors ); + } + output_html_with_http_headers $input, $cookie, $template->output; + exit; + } + + if ($mergereference ) { my $framework; - if ( $recordObj1->authtype ne $recordObj2->authtype && $mergereference ne 'breeding' ) { - $framework = $input->param('frameworkcode') - or push @errors, { code => 'FRAMEWORK_NOT_SELECTED' }; + if ( $recordObj1->authtypecode ne $recordObj2->authtypecode && $mergereference ne 'breeding' ) { + $framework = $input->param('frameworkcode'); } else { - $framework = $recordObj1->authtype; + $framework = $recordObj1->authtypecode; } if ($mergereference eq 'breeding') { $mergereference = $authid[0]; @@ -123,22 +151,37 @@ else { } } - my $notreference = - ( $authid[0] == $mergereference ) - ? $authid[1] - : $authid[0]; + #Setting $notreference + my $notreference = $authid[1]; + if($mergereference == $notreference){ + $notreference = $authid[0]; + #Swap so $recordObj1 is always the correct merge reference + ($recordObj1, $recordObj2) = ($recordObj2, $recordObj1); + } # Creating a loop for display - my @record1 = $recordObj1->createMergeHash($tagslib); - my @record2 = $recordObj2->createMergeHash($tagslib); + my @records = ( + { + recordid => $mergereference, + record => $recordObj1->record, + frameworkcode => $recordObj1->authtypecode, + display => $recordObj1->createMergeHash($tagslib), + reference => 1, + }, + { + recordid => $notreference, + record => $recordObj2->record, + frameworkcode => $recordObj2->authtypecode, + display => $recordObj2->createMergeHash($tagslib), + }, + ); # Parameters $template->param( recordid1 => $mergereference, recordid2 => $notreference, - record1 => @record1, - record2 => @record2, + records => \@records, framework => $framework, ); } @@ -152,62 +195,19 @@ else { title1 => $recordObj1->authorized_heading, title2 => $recordObj2->authorized_heading, ); - if ( $recordObj1->authtype ne $recordObj2->authtype ) { - my $frameworks = getauthtypes; - my @frameworkselect; - foreach my $thisframeworkcode ( keys %$frameworks ) { - my %row = ( - value => $thisframeworkcode, - frameworktext => - $frameworks->{$thisframeworkcode}->{'authtypetext'}, - ); - if ( $recordObj1->authtype eq $thisframeworkcode ) { - $row{'selected'} = 1; - } - push @frameworkselect, \%row; - } + if ( $recordObj1->authtypecode ne $recordObj2->authtypecode ) { + my $authority_types = Koha::Authority::Types->search( { authtypecode => { '!=' => '' } }, { order_by => ['authtypecode'] } ); $template->param( - frameworkselect => \@frameworkselect, - frameworkcode1 => $recordObj1->authtype, - frameworkcode2 => $recordObj2->authtype, - frameworklabel1 => $frameworks->{$recordObj1->authtype}->{'authtypetext'}, - frameworklabel2 => $frameworks->{$recordObj2->authtype}->{'authtypetext'}, + frameworkselect => $authority_types->unblessed, + frameworkcode1 => $recordObj1->authtypecode, + frameworkcode2 => $recordObj2->authtypecode, ); } } } } -my $authtypes = getauthtypes; -my @authtypesloop; -foreach my $thisauthtype ( - sort { - $authtypes->{$a}{'authtypetext'} cmp $authtypes->{$b}{'authtypetext'} - } - keys %$authtypes - ) -{ - my %row = ( - value => $thisauthtype, - authtypetext => $authtypes->{$thisauthtype}{'authtypetext'}, - ); - push @authtypesloop, \%row; -} -$template->{VARS}->{authtypesloop} = \@authtypesloop; - if (@errors) { - - # Errors $template->param( errors => \@errors ); } - output_html_with_http_headers $input, $cookie, $template->output; -exit; - -=head1 FUNCTIONS - -=cut - -# ------------------------ -# Functions -# ------------------------