Changeset 2808

Show
Ignore:
Timestamp:
07/17/08 21:54:50 (2 months ago)
Author:
arvind
Message:

Storing the 'original' object became too complicated, just save a copy of the object on every post_save

Files:

Legend:

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

    r2804 r2808  
    1616    my $datasource = $class->datasource; 
    1717     
    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); 
     18    MT->add_callback( 'api_pre_save.entry', 1, undef, 
     19               \&mt_remove_unchanged_cols ); 
     20    MT->add_callback( 'cms_pre_save.entry', 1, undef, 
     21               \&mt_remove_unchanged_cols ); 
     22    $class->add_trigger( post_save => \&save_revision ); 
    2023} 
    2124 
     
    111114    my $defs = $obj->column_defs; 
    112115     
    113     return $defs->{$col} && exists $defs->{$col}{revisioned}; 
    114 
    115  
    116 sub changed_columns { 
     116    return 1 if $defs->{$col} && exists $defs->{$col}{revisioned}; 
     117
     118 
     119sub mt_remove_unchanged_cols { 
     120    my ($cb, $app, $obj, $orig) = @_; 
     121    remove_unchanged_cols($obj, $orig); 
     122
     123 
     124sub remove_unchanged_cols { 
    117125    my ($obj, $orig) = @_; 
    118     my @changed_cols; 
    119     my $revisioned_cols = $obj->revisioned_columns; 
    120      
    121     foreach my $col (@$revisioned_cols) { 
    122         push @changed_cols, $col 
    123             if $obj->$col ne $orig->$col; 
    124     }     
    125      
    126     return \@changed_cols; 
     126 
     127    return 1 unless defined $orig; 
     128    return 1 unless $obj->id; 
     129 
     130    my %date_cols = map { $_ => 1 } 
     131        @{$obj->columns_of_type('datetime', 'timestamp')}; 
     132 
     133    if ( my @changed_cols = $obj->changed_cols ) { 
     134        for my $col ( @changed_cols ) { 
     135            unless($obj->is_revisioned_column($col)) {         
     136                delete $obj->{changed_cols}->{$col}; 
     137            } 
     138            if ( $obj->$col eq $orig->$col ) { 
     139                delete $obj->{changed_cols}->{$col}; 
     140            } 
     141            elsif ( exists $date_cols{$col} ) { 
     142                delete $obj->{changed_cols}->{$col} 
     143                    if $orig->$col eq MT::Object::_db2ts($obj->$col); 
     144            } 
     145        } 
     146    } 
     147    1; 
    127148} 
    128149 
     
    164185    my $datasource = $obj->datasource;     
    165186    my $obj_id = $datasource . '_id'; 
    166     my $packed_obj = $orig->pack_revision(); 
    167     my $changed_cols = $obj->changed_columns($orig);     
     187    my $packed_obj = $orig->pack_revision();  
    168188     
    169189    require MT::Serialize; 
     
    173193        $obj_id     => $orig->id, 
    174194        $datasource => MT::Serialize->serialize(\$packed_obj), 
    175         changed     => join ',', @$changed_cols 
     195        changed     => join ',', $obj->changed_cols 
    176196    }); 
    177197    $revision->save or return; 
     
    184204    my ($rev) = @_; 
    185205    my $datasource = $obj->datasource; 
    186      
     206 
     207    my $rev_obj = $obj->clone; 
    187208    my $serialized_obj = $rev->$datasource; 
    188209    require MT::Serialize; 
    189210    my $packed_obj = MT::Serialize->unserialize($serialized_obj); 
    190     $obj->unpack_revision($$packed_obj); 
     211    $rev_obj->unpack_revision($$packed_obj); 
    191212     
    192213    my @changed = split ',', $rev->changed; 
    193214     
    194     return [ $obj, \@changed]; 
     215    return [ $rev_obj, \@changed]; 
    195216} 
    196217 
     
    235256    my ( $rev_id ) = @_; 
    236257 
    237     my $orig = $obj->clone; # Reverting is a revision 
    238258    my $rev = $obj->load_revision( $rev_id ) 
    239259        or return $obj->error( 
    240260            MT->translate('Revision (ID: [_1]) not found.', $rev_id)); 
    241261    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; 
     262    $obj->set_values($rev_object->column_values); 
     263    $obj->save 
     264        or return $obj->error($obj->errstr); 
     265    return $obj; 
    247266} 
    248267