| 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 | | # } |
|---|
| | 13 | sub 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 | } |
|---|
| | 95 | sub 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 | |
|---|
| | 108 | sub 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 | |
|---|
| | 116 | sub 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 | |
|---|
| | 129 | sub 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 | |
|---|
| | 146 | sub 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 | |
|---|