[Koha-patches] [PATCH] Adding Merge of two biblios from a virtualshelf

Henri-Damien LAURENT henridamien.laurent at biblibre.com
Tue Aug 25 23:56:13 CEST 2009


---
 .../includes/virtualshelves/merge/selection.tmpl   |   18 +++
 .../prog/en/modules/virtualshelves/merge.tmpl      |   15 ++
 .../prog/en/modules/virtualshelves/shelves.tmpl    |   10 ++-
 virtualshelves/addbybiblionumber.pl                |   47 ++++++-
 virtualshelves/merge.pl                            |  137 ++++++++++++++++++++
 5 files changed, 220 insertions(+), 7 deletions(-)
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves/merge/selection.tmpl
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/merge.tmpl
 create mode 100755 virtualshelves/merge.pl

diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves/merge/selection.tmpl b/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves/merge/selection.tmpl
new file mode 100644
index 0000000..10d8b29
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/virtualshelves/merge/selection.tmpl
@@ -0,0 +1,18 @@
+<form><table><caption>Merge</caption>
+<!-- TMPL_LOOP NAME="fields" -->
+<tr>
+<td><!-- TMPL_VAR NAME="from" --></td>
+<td><!-- TMPL_VAR NAME="tag" --> <input type="checkbox" name="selected_field" value="<!-- TMPL_VAR NAME="id" -->">
+</td>
+<td><dl>
+<!-- TMPL_LOOP NAME="subfields" -->
+    <dt><!-- TMPL_VAR NAME="key" --></dt>
+    <dd><!-- TMPL_VAR NAME="value" --></dd>
+<!--/TMPL_LOOP -->
+</dl>
+</td>
+</tr>
+<!--/TMPL_LOOP -->
+</table>
+<input type="submit" value="selection" />
+</form>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/merge.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/merge.tmpl
new file mode 100644
index 0000000..a189a57
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/merge.tmpl
@@ -0,0 +1,15 @@
+<!-- TMPL_INCLUDE NAME="doc-head-open.inc" -->
+<title>Koha &rsaquo; <!-- TMPL_VAR NAME="shelf" --> merge</title>
+<!-- TMPL_INCLUDE NAME="doc-head-close.inc" -->
+<!-- TMPL_INCLUDE NAME="header.inc" -->
+
+<h1> <!-- TMPL_VAR NAME="session" --> </h1>
+
+<!-- TMPL_IF fields ><!-- TMPL_INCLUDE NAME="virtualshelves/merge/selection.tmpl" -->
+<!-- TMPL_ELSE -->
+<h1>DOIT</h1><pre><!-- TMPL_VAR NAME="new" --></pre>
+<h1>ITEMS</h1><pre><!-- TMPL_VAR NAME="items" --></pre>
+<!-- /TMPL_IF -->
+
+<!-- TMPL_INCLUDE NAME="intranet-bottom.inc" -->
+
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tmpl
index 8b0a7d3..5c9687c 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/virtualshelves/shelves.tmpl
@@ -120,7 +120,11 @@ function placeHold () {
    <div class="yui-g">
     <!-- TMPL_IF NAME="itemsloop" -->
 
-<form action="/cgi-bin/koha/virtualshelves/shelves.pl" method="post" class="checkboxed">
+	<form action="merge.pl" method="get">
+		<input type="hidden" name="shelf" value="<!-- TMPL_VAR NAME="shelf" -->" />
+		<input type="submit" class="editshelf" value="Merge" />
+	</form>
+	<form action="/cgi-bin/koha/virtualshelves/shelves.pl" method="post" class="checkboxed">
         <input type="hidden" name="viewshelf" value="<!-- TMPL_VAR NAME="shelfnumber" -->" />
         <input type="hidden" name="modifyshelfcontents" value="1" />
  <fieldset>
@@ -324,6 +328,10 @@ function placeHold () {
 		</td>
         <td>
             <!-- TMPL_IF NAME="mine" -->
+				<form action="merge.pl" method="get">
+					<input type="hidden" name="shelf" value="<!-- TMPL_VAR NAME="shelf" -->" />
+					<input type="submit" class="editshelf" value="Merge" />
+				</form>
 				<form action="shelves.pl" method="get">
 					<input type="hidden" name="shelfnumber" value="<!-- TMPL_VAR NAME="shelf" -->" />
 					<input type="hidden" name="op" value="modif" />
diff --git a/virtualshelves/addbybiblionumber.pl b/virtualshelves/addbybiblionumber.pl
index d565493..ee199ec 100755
--- a/virtualshelves/addbybiblionumber.pl
+++ b/virtualshelves/addbybiblionumber.pl
@@ -66,6 +66,18 @@ use C4::Auth;
 use CGI::Carp qw/fatalsToBrowser/;
 use warnings;
 
+sub AddBibliosToShelf {
+    my ($shelfnumber, at biblionumber)=@_;
+
+    # multiple bibs might come in as '/' delimited string (from where, i don't see), or as array.
+    if (scalar(@biblionumber) == 1) {
+        @biblionumber = (split /\//,$biblionumber[0]);
+    }
+    for my $bib (@biblionumber){
+        AddToShelfFromBiblio($bib, $shelfnumber);
+    }
+}
+
 my $query           = new CGI;
 
 # If set, then single item case.
@@ -99,12 +111,35 @@ if ($biblionumbers) {
 $shelfnumber = AddShelf( $newvirtualshelf, $loggedinuser, $category, $sortfield )
   if $newvirtualshelf;
 if ( $shelfnumber || ( $shelfnumber == -1 ) ) {    # the shelf already exist.
-    foreach my $biblionumber (@biblionumbers) {
-        AddToShelfFromBiblio( $biblionumber, $shelfnumber );
+    if ($confirmed == 1) {
+	AddBibliosToShelf($shelfnumber, at biblionumber);
+	print
+    "Content-Type: text/html\n\n<html><body onload=\"window.opener.location.reload(true);window.close()\"></body></html>";
+	exit;
+    } else {
+	my ( $singleshelf, $singleshelfname, $singlecategory ) = GetShelf( $query->param('shelfnumber') );
+	my @biblios;
+        for my $bib (@biblionumber) {
+	    my $data = GetBiblioData( $bib );
+            push(@biblios,
+                        { biblionumber => $bib,
+                          title        => $data->{'title'},
+                          author       => $data->{'author'},
+                        } );
+        }
+
+       	$template->param
+        (
+         biblionumber => \@biblionumber,
+         biblios      => \@biblios,
+         multiple     => (scalar(@biblionumber) > 1),
+         singleshelf  => 1,
+         shelfname    => $singleshelfname,
+         shelfnumber  => $singleshelf,
+         total        => scalar(@biblionumber),
+         confirm      => 1,
+        );
     }
-    print
-"Content-Type: text/html\n\n<html><body onload=\"window.close()\"></body></html>";
-    exit;
 }
 else {    # this shelf doesn't already exist.
     my $limit = 10;
@@ -163,5 +198,5 @@ else {    # this shelf doesn't already exist.
           );
     }
     
-    output_html_with_http_headers $query, $cookie, $template->output;
 }
+output_html_with_http_headers $query, $cookie, $template->output;
diff --git a/virtualshelves/merge.pl b/virtualshelves/merge.pl
new file mode 100755
index 0000000..bff5aa7
--- /dev/null
+++ b/virtualshelves/merge.pl
@@ -0,0 +1,137 @@
+#! /usr/bin/perl
+# vim: enc=utf-8 fdm=marker fdn=1 sw=4
+use utf8;
+use strict;
+use warnings;
+use Devel::SimpleTrace;
+use Storable qw< freeze thaw >;
+use C4::Auth;
+use C4::Context;
+use C4::Biblio;
+use C4::VirtualShelves;
+use YAML;
+use CGI;
+
+sub debug { print STDERR @_,"\n" }
+
+# Global values {{{
+my $query   = CGI->new;
+my $sessionID = (checkauth($query))[2];
+my $session = C4::Auth::get_session( $sessionID );
+
+my ( $template, $user, $cookie ) = get_template_and_user {
+    qw(
+    template_name virtualshelves/merge.tmpl
+    type intranet
+    authnotrequired 0
+    )
+    , query => $query
+    , flagsrequired => {}
+};
+# }}}
+# Functions {{{
+
+sub render {
+    use C4::Output;
+    $template->param( session => $sessionID ); 
+    output_html_with_http_headers $query, $cookie, $template->output;
+}
+
+sub maybe_lost {
+    $template->param( maybe_lost => 1 );
+    render; exit;
+}
+
+sub fields_to_merge { $session->param('fields_to_merge') }
+
+# global values ... but only for nextid
+
+my $selection_id = 0;
+sub nextid { $selection_id++ }
+
+sub prepare_subfield { { key => $$_[0], value => $$_[1]  } }
+
+sub prepare_field {
+    my $ready = {
+	field => freeze($_)
+	, from => shift
+	, tag => $_->tag 
+	, id => nextid
+    };
+
+    if ( $_->is_control_field ) {
+	$$ready{control} = 1;
+    } else {
+	$$ready{subfields} = [ map prepare_subfield, $_->subfields ]
+    };
+
+    $ready;
+}
+
+sub fields_by_tag { $$a{tag} cmp $$b{tag} }
+
+sub build_records {
+    my $newbiblio = MARC::Record->new;
+    my $items = MARC::Record->new;
+    my ( $selected_fields ) = @_;
+    my $stored_fields = $session->param('fields');
+    my $kept_biblio   = $stored_fields->[0]->{id};
+    my %biblio_to_delete;
+
+    for ( @$stored_fields  ) {
+	my $from = $$_{from};
+	$biblio_to_delete{ $from } = 1;
+
+	if ( $$_{tag} eq '995' ) {
+	    if ( $from != $kept_biblio ) {
+		$items->append_fields( thaw $$_{field} )
+	    }
+	} else {
+	    if ( exists $$selected_fields{ $$_{id} } ) {
+		$newbiblio->append_fields( thaw $$_{field} )
+	    }
+	}
+    }
+    delete $biblio_to_delete{ $kept_biblio };
+    ( $newbiblio, $kept_biblio, $items, [ values %biblio_to_delete ] );
+}
+
+sub clear_session { (shift)->clear([qw< fields shelf >]) }
+
+# }}}
+# the controller {{{
+
+if ( my %field_selection = map { $_ => 1 } $query->param('selected_field') ) {
+    my ($record, $number, $items, $delete ) = build_records( \%field_selection );
+    ModBiblio( $record, $number, GetFrameworkCode( $number ));
+    AddItems( $items, $number );
+    for ( @$delete ) {
+	if ( my $error = DelBiblio($_) ) {
+	    die $error
+	}
+    }
+} else {
+    my $shelf = $query->param('shelf') or maybe_lost;
+    if ( my @records = C4::VirtualShelves::each_biblionumbers {
+	    { id => $_, record => GetMarcBiblio($_) }
+	} $shelf
+    ) {
+	my @fields = sort {fields_by_tag} map {
+	    my ( $id , $record ) = @$_{qw< id record >};
+	    map { prepare_field($id) } $record->fields;
+	} @records;
+	my @store = ( fields => \@fields ); 
+
+	for ($session) {
+	    clear_session($_);
+	    $_->param(@store, shelf => $shelf );
+	}
+	$template->param(@store);
+    } else {
+	die "GET LOST ?";
+    }
+}
+
+render;
+
+# }}}
-- 
1.6.0.4




More information about the Koha-patches mailing list