added collision detection to the user editor code to prevent overwiting changes
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 9 Apr 2007 19:41:45 +0000 (19:41 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Mon, 9 Apr 2007 19:41:45 +0000 (19:41 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@7133 dcc99617-32d9-48b4-a31d-7c20da2025e4

Evergreen/xul/staff_client/server/patron/ue.js
Evergreen/xul/staff_client/server/patron/ue.xhtml
Open-ILS/src/extras/ils_events.xml
Open-ILS/src/perlmods/OpenILS/Application/Actor.pm

index fc95175..ddc7f6a 100644 (file)
@@ -524,7 +524,13 @@ function uEditSaveUser(cloneme) {
        var evt;
        if( (evt = checkILSEvent(newuser)) || ! newuser ) {
                if(evt) {
-                       var j = js2JSON(newuser); 
+            evt = newuser;
+            if( evt.textcode == 'XACT_COLLISION' ) {
+                if( confirmId('ue_xact_collision') )
+                    location.href = location.href;
+                return;
+            }
+            var j = js2JSON(evt);
                        alert(j);
                        _debug("USER UPDATE FAILED:\n" + j);
                }
index a0ead4c..bdbefc0 100644 (file)
          You have unsaved changes. 
       </span>
 
+        <span class='hide_me' id='ue_xact_collision'>
+            It appears that someone else was also editing this user.  Saving the user
+            now will destroy their changes.  Click "OK" to refresh the user and continue
+            editing.  Click "Cancel" to do nothing.
+    
+            Note that you will not be able to save the user until this page has been refreshed.
+        </span>
+
+
        </div>
 
        </body>
index 46fc303..a19fa22 100644 (file)
        <event code='1229' textcode='VOLUME_DELETED'>
                <desc xml:lang="en-US">The requested volume is marked as deleted</desc>
        </event>
+       <event code='1230' textcode='XACT_COLLISION'>
+               <desc xml:lang="en-US">The saved item has been edited by another user</desc>
+       </event>
+
 
 
 
index 3339695..baf6fd1 100644 (file)
@@ -168,22 +168,7 @@ __PACKAGE__->register_method(
 # ------------------------------------------------------------------
 sub ou_ancestor_setting {
     my( $self, $client, $orgid, $name ) = @_;
-    my $e = new_editor();
-
-    do {
-        my $setting = $e->search_actor_org_unit_setting({org_unit=>$orgid, name=>$name})->[0];
-
-        if( $setting ) {
-            $logger->info("found org_setting $name at org $orgid : " . $setting->value);
-            return { org => $orgid, value => JSON->JSON2perl($setting->value) };
-        }
-
-        my $org = $e->retrieve_actor_org_unit($orgid) or return $e->event;
-        $orgid = $org->parent_ou or return undef;
-
-    } while(1);
-
-    return undef;
+    return $U->ou_ancestor_setting($orgid, $name);
 }
 
 
@@ -244,7 +229,6 @@ sub update_patron {
        return $evt if $evt;
 
 
-       # XXX does this user have permission to add/create users.  Granularity?
        # $new_patron is the patron in progress.  $patron is the original patron
        # passed in with the method.  new_patron will change as the components
        # of patron are added/updated.
@@ -459,6 +443,9 @@ sub _update_patron {
                $patron->clear_ident_value;
        }
 
+    $evt = verify_last_xact($session, $patron);
+    return (undef, $evt) if $evt;
+
        my $stat = $session->request(
                "open-ils.storage.direct.actor.user.update",$patron )->gather(1);
        return (undef, $U->DB_UPDATE_FAILED($patron)) unless defined($stat);
@@ -466,6 +453,20 @@ sub _update_patron {
        return ($patron);
 }
 
+sub verify_last_xact {
+    my( $session, $patron ) = @_;
+    return undef unless $patron->id and $patron->id > 0;
+    my $p = $session->request(
+        'open-ils.storage.direct.actor.user.retrieve', $patron->id)->gather(1);
+    my $xact = $p->last_xact_id;
+    return undef unless $xact;
+    $logger->info("user xact = $xact, saving with xact " . $patron->last_xact_id);
+    return OpenILS::Event->new('XACT_COLLISION')
+        if $xact != $patron->last_xact_id;
+    return undef;
+}
+
+
 sub _check_dup_ident {
        my( $session, $patron ) = @_;