fixed some permission checking errors in copy/volume update. did some refactoring...
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 13 Oct 2006 21:17:07 +0000 (21:17 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Fri, 13 Oct 2006 21:17:07 +0000 (21:17 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@6470 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/src/perlmods/OpenILS/Application/Cat.pm
Open-ILS/src/perlmods/OpenILS/Application/Cat/Merge.pm

index 4404f37..a85a541 100644 (file)
@@ -845,8 +845,12 @@ sub fleshed_copy_update {
        my $editor = new_editor(requestor => $reqr, xact => 1);
        my $override = $self->api_name =~ /override/;
        $evt = update_fleshed_copies($editor, $override, undef, $copies, $delete_stats);
-       return $evt if $evt;
-       $editor->finish;
+       if( $evt ) { 
+               $logger->info("fleshed copy update failed with event: ".JSON->perl2JSON($evt));
+               $editor->rollback; 
+               return $evt; 
+       }
+       $editor->commit;
        $logger->info("fleshed copy update successfully updated ".scalar(@$copies)." copies");
        return 1;
 }
@@ -993,6 +997,9 @@ sub update_fleshed_copies {
                        return $editor->event unless $vol;
                }
 
+               return $editor->event unless 
+                       $editor->allowed('UPDATE_COPY', $vol->owning_lib);
+
                $copy->editor($editor->requestor->id);
                $copy->edit_date('now');
 
@@ -1053,10 +1060,8 @@ sub update_copy {
                if ref $copy->age_protect;
 
        fix_copy_price($copy);
-       return $editor->event unless
-               $editor->update_asset_copy( 
-                       $copy, {checkperm=>1, permorg=>$vol->owning_lib});
 
+       return $editor->event unless $editor->update_asset_copy($copy);
        return remove_empty_objects($editor, $override, $orig_vol);
 }
 
@@ -1065,15 +1070,16 @@ sub remove_empty_objects {
        my( $editor, $override, $vol ) = @_; 
        if( title_is_empty($editor, $vol->record) ) {
 
-               if( $override ) {
+               # disable the TITLE_LAST_COPY event for now
+               # if( $override ) {
+               if( 1 ) {
 
                        # delete this volume if it's not already marked as deleted
                        unless( $U->is_true($vol->deleted) || $vol->isdeleted ) {
                                $vol->deleted('t');
                                $vol->editor($editor->requestor->id);
                                $vol->edit_date('now');
-                               $editor->update_asset_call_number($vol, {checkperm=>0})
-                                       or return $editor->event;
+                               $editor->update_asset_call_number($vol) or return $editor->event;
                        }
 
                        # then delete the record this volume points to
@@ -1083,8 +1089,7 @@ sub remove_empty_objects {
                        unless( $U->is_true($rec->deleted) ) {
                                $rec->deleted('t');
                                $rec->active('f');
-                               $editor->update_biblio_record_entry($rec, {checkperm=>0})
-                                       or return $editor->event;
+                               $editor->update_biblio_record_entry($rec) or return $editor->event;
                        }
 
                } else {
@@ -1104,9 +1109,7 @@ sub delete_copy {
 
        $copy->editor($editor->requestor->id);
        $copy->edit_date('now');
-       $editor->update_asset_copy(
-               $copy, {checkperm=>1, permorg=>$vol->owning_lib})
-               or return $editor->event;
+       $editor->update_asset_copy($copy) or return $editor->event;
 
        # Delete any open transits for this copy
        my $transits = $editor->search_action_transit_copy(
@@ -1134,10 +1137,7 @@ sub create_copy {
        $copy->create_date('now');
        fix_copy_price($copy);
 
-       $editor->create_asset_copy(
-               $copy, {checkperm=>1, permorg=>$vol->owning_lib})
-               or return $editor->event;
-
+       $editor->create_asset_copy($copy) or return $editor->event;
        return undef;
 }
 
@@ -1272,7 +1272,7 @@ sub batch_volume_transfer {
 
        my $e = new_editor(authtoken => $auth, xact =>1);
        return $e->event unless $e->checkauth;
-       return $e->event unless $e->allowed('VOLUME_UPDATE');
+       return $e->event unless $e->allowed('VOLUME_UPDATE', $o_lib);
 
        my $dorg = $e->retrieve_actor_org_unit($o_lib)
                or return $e->event;
index fec432c..9804fb2 100644 (file)
@@ -45,7 +45,7 @@ sub merge_records {
        my @recs = keys %r;
 
        my $reqr = $editor->requestor;
-       $logger->activity("merge: user ".$reqr->id." merging bib records: @recs");
+       $logger->activity("merge: user ".$reqr->id." merging bib records: @recs with master = $master");
 
        # -----------------------------------------------------------
        # collect all of the volumes, merge any with duplicate 
@@ -53,7 +53,7 @@ sub merge_records {
        # -----------------------------------------------------------
        my @volumes;
        for (@recs) {
-               my $vs = $editor->search_asset_call_number({record => $_});
+               my $vs = $editor->search_asset_call_number({record => $_, deleted=>'f'});
                push( @volumes, @$vs );
        }
 
@@ -61,22 +61,46 @@ sub merge_records {
 
        my @trimmed;
        # de-duplicate any volumes with the same label and owning_lib
+
+       my %seen_vols;
+
        for my $v (@volumes) {
                my $l = $v->label;
                my $o = $v->owning_lib;
-               my @dups = rgrep( 
-                       sub { $_->label eq $l and $_->owning_lib == $o }, \@volumes );
+
+               if($seen_vols{$v->id}) {
+                       $logger->debug("merge: skipping ".$v->id." since it's already been merged");
+                       next;
+               }
+
+               $seen_vols{$v->id} = 1;
+
+               $logger->debug("merge: [".$v->id."] looking for dupes with label $l and owning_lib $o");
+
+               my @dups;
+               for my $vv (@volumes) {
+                       if( $vv->label eq $v->label and $vv->owning_lib == $v->owning_lib ) {
+                               $logger->debug("merge: pushing dupe volume ".$vv->id) if @dups;
+                               push( @dups, $vv );
+                               $seen_vols{$vv->id} = 1;
+                       } 
+               }
 
                if( @dups == 1 ) {
+                       $logger->debug("merge: pushing unique volume into trimmed volume set: ".$v->id);
                        push( @trimmed, @dups );
 
                } else {
                        my($vol, $e) = merge_volumes($editor, \@dups);
                        return $e if $e;
+                       $logger->debug("merge: pushing vol-merged volume into trimmed volume set: ".$vol->id);
                        push(@trimmed, $vol);
                }
        }
 
+       my $s = 'merge: trimmed volume set contains the following vols: ';
+       $s .= 'id = '.$_->id .' : record = '.$_->record.' | ' for @trimmed;
+       $logger->debug($s);
 
        # make all the volumes point to the master record
        my $stat;
@@ -183,8 +207,7 @@ sub merge_volumes {
                        $copy->call_number($bigcn);
                        $copy->editor($editor->requestor->id);
                        $copy->edit_date('now');
-                       $editor->update_asset_copy($copy, {checkperm=>1})
-                               or return (undef, $editor->event);
+                       $editor->update_asset_copy($copy) or return (undef, $editor->event);
                }
        }
 
@@ -194,8 +217,8 @@ sub merge_volumes {
                $_->deleted('t');
                $_->editor($editor->requestor->id);
                $_->edit_date('now');
-               $editor->update_asset_call_number($_,{checkperm=>1}) 
-                       or return (undef, $editor->event);
+               return (undef,$editor->event) unless $editor->allowed('VOLUME_UPDATE', $_->owning_lib);
+               $editor->update_asset_call_number($_) or return (undef, $editor->event);
        }
 
        my ($mvol) = grep { $_->id == $bigcn } @$volumes;