Changeset 2808
- Timestamp:
- 07/17/08 21:54:50 (2 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/feature-revision-histories/lib/MT/Revisable.pm
r2804 r2808 16 16 my $datasource = $class->datasource; 17 17 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 ); 20 23 } 21 24 … … 111 114 my $defs = $obj->column_defs; 112 115 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 119 sub mt_remove_unchanged_cols { 120 my ($cb, $app, $obj, $orig) = @_; 121 remove_unchanged_cols($obj, $orig); 122 } 123 124 sub remove_unchanged_cols { 117 125 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; 127 148 } 128 149 … … 164 185 my $datasource = $obj->datasource; 165 186 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(); 168 188 169 189 require MT::Serialize; … … 173 193 $obj_id => $orig->id, 174 194 $datasource => MT::Serialize->serialize(\$packed_obj), 175 changed => join ',', @$changed_cols195 changed => join ',', $obj->changed_cols 176 196 }); 177 197 $revision->save or return; … … 184 204 my ($rev) = @_; 185 205 my $datasource = $obj->datasource; 186 206 207 my $rev_obj = $obj->clone; 187 208 my $serialized_obj = $rev->$datasource; 188 209 require MT::Serialize; 189 210 my $packed_obj = MT::Serialize->unserialize($serialized_obj); 190 $ obj->unpack_revision($$packed_obj);211 $rev_obj->unpack_revision($$packed_obj); 191 212 192 213 my @changed = split ',', $rev->changed; 193 214 194 return [ $ obj, \@changed];215 return [ $rev_obj, \@changed]; 195 216 } 196 217 … … 235 256 my ( $rev_id ) = @_; 236 257 237 my $orig = $obj->clone; # Reverting is a revision238 258 my $rev = $obj->load_revision( $rev_id ) 239 259 or return $obj->error( 240 260 MT->translate('Revision (ID: [_1]) not found.', $rev_id)); 241 261 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; 247 266 } 248 267
