| 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); |
|---|
| | 182 | sub 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 | |
|---|
| | 197 | sub 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 | |
|---|
| | 233 | sub 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 | |
|---|