Head & rel_2_2 merged
authortoins <toins>
Tue, 4 Jul 2006 15:02:42 +0000 (15:02 +0000)
committertoins <toins>
Tue, 4 Jul 2006 15:02:42 +0000 (15:02 +0000)
koha-tmpl/intranet-tmpl/prog/en/intranet-main.tmpl
misc/migration_tools/bulkmarcimport.pl

index b9bf144..b1f3da4 100644 (file)
@@ -27,7 +27,7 @@
                        <li><a href="/cgi-bin/koha/loadmodules.pl?module=search&amp;marc=1&amp;type=intranet">Advanced Search</a></li>
                        <li><a href="/cgi-bin/koha/bookshelves/shelves.pl">Virtual Shelves</a></li>
                </ul>
-       </li>   
+       </li>
        <li>Cataloging
 <ul>
                        <li><a href="/cgi-bin/koha/cataloguing/addbooks.pl">Cataloging</a></li>
@@ -36,7 +36,7 @@
 <li>Acquisitions<ul>
 <li><a href="/cgi-bin/koha/loadmodules.pl?module=acquisitions">Acquisitions</a></li><li><a href="/cgi-bin/koha/admin/aqbookfund.pl">Book funds</a></li>
 <li><a href="/cgi-bin/koha/acqui/histsearch.pl">Search Order History</a></li>
-<li><a href="/cgi-bin/koha/import/breeding.pl">Import to reservoir</a></li><li><a href="/cgi-bin/koha/bull-home.pl">Serials</a></li></ul>
+<li><a href="/cgi-bin/koha/import/breeding.pl">Import to reservoir</a></li><li><a href="/cgi-bin/koha/serials/serials-home.pl">Serials</a></li></ul>
        </li>
        <li><a href="/cgi-bin/koha/authorities/authorities-home.pl">Authorities</a></li>
        <li>Accounts and Reports
@@ -72,7 +72,7 @@
        </li>
        <li>Koha Administration
                <ul>
-               <li><a href="/cgi-bin/koha/tools/tools-home.pl">Tools</a></li>
+               <li><a href="/cgi-bin/koha/admin/admin-home.pl">Tools</a></li>
                <li><a href="/cgi-bin/koha/admin/admin-home.pl">System Administration Home</a></li>
                <li><a href="/cgi-bin/koha/admin/systempreferences.pl">System Preferences</a></li>
                <li><a href="/cgi-bin/koha/barcodes/barcodes.pl">Barcodes generator</a></li>
@@ -87,7 +87,7 @@
                                <th>
                                        <!-- TMPL_VAR NAME="title" --></th>
                                        <td>
-                                       <!-- TMPL_VAR NAME="new" --> 
+                                       <!-- TMPL_VAR NAME="new" -->
                                        </td>
                                <td>
                                                <!-- TMPL_VAR NAME="newdate" --> 
index 5527306..1a49733 100644 (file)
@@ -2,14 +2,21 @@
 # small script that import an iso2709 file into koha 2.0
 
 use strict;
+# use warnings;
 
 # Koha modules used
 use MARC::File::USMARC;
+# Uncomment the line below and use MARC::File::XML again when it works better.
+# -- thd
+# use MARC::File::XML;
 use MARC::Record;
 use MARC::Batch;
+use MARC::Charset;
 use C4::Context;
 use C4::Biblio;
 use Time::HiRes qw(gettimeofday);
+use Getopt::Long;
+binmode(STDOUT, ":utf8");
 
 use Getopt::Long;
 
@@ -27,6 +34,110 @@ GetOptions(
     'v:s' => \$verbose,
 );
 
+# FIXME:  Management of error conditions needed for record parsing problems
+# and MARC8 character sets with mappings to Unicode not yet included in 
+# MARC::Charset.  The real world rarity of these problems is not fully tested.
+# Unmapped character sets will throw a warning currently and processing will 
+# continue with the error condition.  A fairly trivial correction should 
+# address some record parsing and unmapped character set problems but I need 
+# time to implement a test and correction for undef subfields and revert to 
+# MARC8 if mappings are missing. -- thd
+sub fMARC8ToUTF8($$) {
+       my ($record) = shift;
+       my ($verbose) = shift;
+       if ($verbose) {
+               if ($verbose >= 2) {
+                       my $leader = $record->leader();
+                       $leader =~ s/ /#/g;
+                       print "\n000 " . $leader;
+               }
+       }
+       foreach my $field ($record->fields()) {
+               if ($field->is_control_field()) {
+                       if ($verbose) {
+                               if ($verbose >= 2) {
+                                       my $fieldName = $field->tag();
+                                       my $fieldValue = $field->data();
+                                       $fieldValue =~ s/ /#/g;
+                                       print "\n" . $fieldName;
+                                       print ' ' . $fieldValue;
+                               }
+                       }
+               } else {
+                       my @subfieldsArray;
+                       my $fieldName = $field->tag();
+                       my $indicator1Value = $field->indicator(1);
+                       my $indicator2Value = $field->indicator(2);
+                       if ($verbose) {
+                               if ($verbose >= 2) {
+                                       $indicator1Value =~ s/ /#/;
+                                       $indicator2Value =~ s/ /#/;
+                                       print "\n" . $fieldName . ' ' . 
+                                                       $indicator1Value . 
+                                       $indicator2Value;
+                               }
+                       }
+                       foreach my $subfield ($field->subfields()) {
+                               my $subfieldName = $subfield->[0];
+                               my $subfieldValue = $subfield->[1];
+                               $subfieldValue = MARC::Charset::marc8_to_utf8($subfieldValue);
+                               
+                               # Alas, MARC::Field::update() does not work correctly.
+                               ## push (@subfieldsArray, $subfieldName, $subfieldValue);
+                               
+                               push @subfieldsArray, [$subfieldName, $subfieldValue];
+                               if ($verbose) {
+                                       if ($verbose >= 2) {
+                                               print " \$" . $subfieldName . ' ' . $subfieldValue;
+                                       }
+                               }
+                       }
+                       
+                       # Alas, MARC::Field::update() does not work correctly.
+                       # 
+                       # The first instance in the field of a of a repeated subfield 
+                       # overwrites the content from later instances with the content 
+                       # from the first instance.
+                       ## $field->update(@subfieldsArray);
+                       
+                       foreach my $subfieldRow(@subfieldsArray) {
+                               my $subfieldName = $subfieldRow->[0];
+                               $field->delete_subfields($subfieldName);
+                       }
+                       foreach my $subfieldRow(@subfieldsArray) {
+                               $field->add_subfields(@$subfieldRow);
+                       }
+                       
+                       if ($verbose) {
+                               if ($verbose >= 2) {
+                                       # Reading the indicator values again is not necessary.  
+                                       # They were not converted.
+                                       # $indicator1Value = $field->indicator(1);
+                                       # $indicator2Value = $field->indicator(2);
+                                       # $indicator1Value =~ s/ /#/;
+                                       # $indicator2Value =~ s/ /#/;
+                                       print "\nCONVERTED TO UTF-8:\n" . $fieldName . ' ' . 
+                                                       $indicator1Value . 
+                                       $indicator2Value;
+                                       foreach my $subfield ($field->subfields()) {
+                                               my $subfieldName = $subfield->[0];
+                                               my $subfieldValue = $subfield->[1];
+                                               print " \$" . $subfieldName . ' ' . $subfieldValue;
+                                       }
+                               }
+                       }
+                       if ($verbose) {
+                               if ($verbose >= 2) {
+                                       print "\n" if $verbose;
+                               }
+                       }
+               }
+       }
+       $record->encoding('UTF-8');
+       return $record;
+}
+
+
 if ($version || ($input_marc_file eq '')) {
        print <<EOF
 small script to import an iso2709 file into Koha.
@@ -37,7 +148,8 @@ parameters :
 \tn : the number of records to import. If missing, all the file is imported
 \tcommit : the number of records to wait before performing a 'commit' operation
 \tt : test mode : parses the file, saying what he would do, but doing nothing.
-\tc : the char encoding. At the moment, only MARC21 and UNIMARC supported. MARC21 by default.
+\tc : the characteristic MARC flavour. At the moment, only MARC21 and UNIMARC 
+\tsupported. MARC21 by default.
 \td : delete EVERYTHING related to biblio in koha-DB before import  :tables :
 \t\tbiblio, \t\tbiblioitems, \t\tsubjects,\titems
 \t\tadditionalauthors, \tbibliosubtitles, \tmarc_biblio,
@@ -72,8 +184,8 @@ if ($test_parameter) {
        print "TESTING MODE ONLY\n    DOING NOTHING\n===============\n";
 }
 
-$char_encoding = 'MARC21' unless ($char_encoding);
-print "CHAR : $char_encoding\n" if $verbose;
+$marcFlavour = 'MARC21' unless ($marcFlavour);
+print "Characteristic MARC flavour: $marcFlavour\n" if $verbose;
 my $starttime = gettimeofday;
 my $batch = MARC::Batch->new( 'USMARC', $input_marc_file );
 $batch->warnings_off();
@@ -110,17 +222,22 @@ warn "NUM:".$number;
        }
        #now, parse the record, extract the item fields, and store them in somewhere else.
 
-    ## create an empty record object to populate
-    my $newRecord = MARC::Record->new();
+       ## create an empty record object to populate
+       my $newRecord = MARC::Record->new();
        $newRecord->leader($record->leader());
 
-    # go through each field in the existing record
-    foreach my $oldField ( $record->fields() ) {
+       # go through each field in the existing record
+       foreach my $oldField ( $record->fields() ) {
 
        # just reproduce tags < 010 in our new record
-       if ( $oldField->tag() < 10 ) {
-           $newRecord->append_fields( $oldField );
-           next();
+       # 
+       # Fields are not necessarily only numeric in the actual world of records 
+       # nor in what I would recommend for additonal safe non-interfering local
+       # use fields.  The following regular expression match is much safer than 
+       # a numeric evaluation. -- thd
+       if ( $oldField->tag() =~ m/^00/ ) {
+               $newRecord->append_fields( $oldField );
+               next();
        }
 
        # store our new subfield data in this list
@@ -135,15 +252,15 @@ warn "NUM:".$number;
 
        # add the new field to our new record
        my $newField = MARC::Field->new(
-           $oldField->tag(),
-           $oldField->indicator(1),
-           $oldField->indicator(2),
-           @newSubfields
+               $oldField->tag(),
+               $oldField->indicator(1),
+               $oldField->indicator(2),
+               @newSubfields
        );
 
        $newRecord->append_fields( $newField );
 
-    }
+       }
 
        warn "$i ==>".$newRecord->as_formatted() if $verbose eq 2;
        my @fields = $newRecord->field($tagfield);