Changeset 2804

Show
Ignore:
Timestamp:
07/16/08 23:16:41 (1 month ago)
Author:
arvind
Message:

Loading and reverting revisions

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/feature-revision-histories/lib/MT/Revisable.pm

    r2803 r2804  
    1616    my $datasource = $class->datasource; 
    1717     
    18     MT->add_callback('api_post_save.' . $datasource, 1, undef, \&save_revision); 
    19     MT->add_callback('cms_post_save.' . $datasource, 1, undef, \&save_revision); 
     18    MT->add_callback('api_post_save.' . $datasource, 1, undef, \&mt_save_revision); 
     19    MT->add_callback('cms_post_save.' . $datasource, 1, undef, \&mt_save_revision); 
    2020} 
    2121 
     
    144144} 
    145145 
     146sub unpack_revision { 
     147    my $obj = shift; 
     148    my ($packed_obj) = @_; 
     149     
     150    $obj->set_values($packed_obj); 
     151} 
     152 
     153sub mt_save_revision { 
     154    my ($cb, $mt, $obj, $orig) = @_; 
     155     
     156    $obj->save_revision($orig); 
     157} 
     158 
    146159sub save_revision { 
    147     my $cb = shift; 
    148     my ($mt, $obj, $orig) = @_; 
     160    my $obj = shift; 
     161    my ($orig) = @_; 
    149162    return 1 unless $orig->id; 
    150163     
     
    167180} 
    168181 
     182sub object_from_revision { 
     183    my $obj = shift; 
     184    my ($rev) = @_; 
     185    my $datasource = $obj->datasource; 
     186     
     187    my $serialized_obj = $rev->$datasource; 
     188    require MT::Serialize; 
     189    my $packed_obj = MT::Serialize->unserialize($serialized_obj); 
     190    $obj->unpack_revision($$packed_obj); 
     191     
     192    my @changed = split ',', $rev->changed; 
     193     
     194    return [ $obj, \@changed]; 
     195} 
     196 
     197sub load_revision { 
     198    my $obj = shift; 
     199    my ($rev_id) = @_; 
     200    my $datasource = $obj->datasource; 
     201     
     202    my $rev_class = MT->model($datasource . ':revision'); 
     203     
     204    my $terms = { 
     205        $datasource . '_id' => $obj->id, 
     206        $rev_id ? ( id => $rev_id ) : () 
     207    }; 
     208    my $args; 
     209    if(!$rev_id && !wantarray) { 
     210        $args = { 
     211            sort => 'id', 
     212            direction => 'descend', 
     213            limit => 1 
     214        };  
     215    } 
     216     
     217    if ( wantarray ) { 
     218        my @rev = map { $obj->object_from_revision($_); } 
     219            $rev_class->load( $terms, $args ); 
     220        unless (@rev) { 
     221            return $obj->error( $rev_class->errstr ); 
     222        } 
     223        return @rev; 
     224    } 
     225    else { 
     226        my $rev = $rev_class->load( $terms, $args ) 
     227            or return $obj->error( $rev_class->errstr ); 
     228        my $o = $obj->object_from_revision($rev); 
     229        return $o; 
     230    }     
     231} 
     232 
     233sub apply_revision { 
     234    my $obj = shift; 
     235    my ( $rev_id ) = @_; 
     236 
     237    my $orig = $obj->clone; # Reverting is a revision 
     238    my $rev = $obj->load_revision( $rev_id ) 
     239        or return $obj->error( 
     240            MT->translate('Revision (ID: [_1]) not found.', $rev_id)); 
     241    my $rev_object = $rev->[0]; 
     242    $rev_object->save 
     243        or return $obj->error($rev_object->errstr); 
     244 
     245    $rev_object->save_revision($orig); 
     246    return $rev_object; 
     247} 
     248 
    1692491;