Changeset 2803

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

Added callbacks to MT::Revisable to save revisions

Files:

Legend:

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

    r2789 r2803  
    1111use strict; 
    1212 
    13 # sub install_properties { 
    14 #     my $pkg = shift; 
    15 #     my ($class) = @_; 
    16 #      
    17 #     my $props = $class->properties; 
    18 #     # unless($props->{revision_installed}) { 
    19 #         $class->install_revisioning(); 
    20 #         die if $class->class_type eq 'page'; 
    21 #         # $props->{revision_installed} = 1; 
    22 #     # } 
    23 # } 
     13sub install_properties { 
     14    my $pkg = shift; 
     15    my ($class) = @_; 
     16    my $datasource = $class->datasource; 
     17     
     18    MT->add_callback('api_post_save.' . $datasource, 1, undef, \&save_revision); 
     19    MT->add_callback('cms_post_save.' . $datasource, 1, undef, \&save_revision); 
     20
    2421 
    2522sub revision_pkg { 
     
    5754sub install_revisioning { 
    5855    my $class = shift; 
     56    my $datasource = $class->datasource; 
    5957     
    6058    my $subclass = $class->revision_pkg; 
     
    9593} 
    9694 
     95sub revisioned_columns { 
     96    my $obj = shift; 
     97    my $defs = $obj->column_defs; 
     98     
     99    my @cols; 
     100    foreach my $col (keys %$defs) { 
     101        push @cols, $col 
     102            if $defs->{$col} && exists $defs->{$col}{revisioned}; 
     103    } 
     104     
     105    return \@cols; 
     106} 
     107 
     108sub is_revisioned_column { 
     109    my $obj = shift; 
     110    my ($col) = @_; 
     111    my $defs = $obj->column_defs; 
     112     
     113    return $defs->{$col} && exists $defs->{$col}{revisioned}; 
     114} 
     115 
     116sub changed_columns { 
     117    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; 
     127} 
     128 
     129sub pack_revision { 
     130    my $obj = shift; 
     131    my $values; 
     132    my $cols = $obj->revisioned_columns; 
     133     
     134    foreach my $col (@$cols) { 
     135        $values->{$col} = $obj->$col 
     136    } 
     137 
     138    my $meta_values = $obj->meta; 
     139    foreach my $key (%$meta_values) { 
     140        $values->{$key} = $meta_values->{$key}; 
     141    } 
     142     
     143    return $values; 
     144} 
     145 
     146sub save_revision { 
     147    my $cb = shift; 
     148    my ($mt, $obj, $orig) = @_; 
     149    return 1 unless $orig->id; 
     150     
     151    my $datasource = $obj->datasource;     
     152    my $obj_id = $datasource . '_id'; 
     153    my $packed_obj = $orig->pack_revision(); 
     154    my $changed_cols = $obj->changed_columns($orig);     
     155     
     156    require MT::Serialize; 
     157    my $rev_class = MT->model($datasource . ':revision'); 
     158    my $revision = $rev_class->new; 
     159    $revision->set_values({ 
     160        $obj_id     => $orig->id, 
     161        $datasource => MT::Serialize->serialize(\$packed_obj), 
     162        changed     => join ',', @$changed_cols 
     163    }); 
     164    $revision->save or return; 
     165     
     166    return 1; 
     167} 
     168 
    971691;