has_moderated 1.1.4 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/has_moderated/associations/base.rb +7 -2
- data/lib/has_moderated/carrier_wave.rb +44 -19
- data/lib/has_moderated/moderated_attributes.rb +2 -1
- data/lib/has_moderated/moderated_create.rb +3 -2
- data/lib/has_moderated/moderation_model.rb +19 -12
- data/lib/has_moderated/version.rb +1 -1
- data/test/dummy/log/test.log +17281 -0
- data/test/dummy/public/uploads/tmp/20121024-1607-1557-8676/test.jpg +0 -0
- data/test/dummy/public/uploads/tmp/20121024-1607-1557-8676/thumb_test.jpg +0 -0
- data/test/dummy/spec/models/photo_spec.rb +70 -14
- data/test/dummy/spec/models/task_spec.rb +7 -1
- metadata +8 -4
| @@ -70,6 +70,7 @@ module HasModerated | |
| 70 70 | 
             
                    end
         | 
| 71 71 |  | 
| 72 72 | 
             
                    def self.apply_add_association(to, reflection, attrs)
         | 
| 73 | 
            +
                      preview_mode = to.instance_variable_get(:@has_moderated_preview)
         | 
| 73 74 | 
             
                      klass = reflection.class_name.constantize
         | 
| 74 75 | 
             
                      fk = HasModerated::ActiveRecordHelpers::foreign_key(reflection)
         | 
| 75 76 |  | 
| @@ -86,10 +87,12 @@ module HasModerated | |
| 86 87 | 
             
                        # PARAM = ID
         | 
| 87 88 | 
             
                        if attrs.class == Fixnum
         | 
| 88 89 | 
             
                          arec = klass.find_by_id(attrs)
         | 
| 90 | 
            +
                          arec.instance_variable_set(:@has_moderated_preview, preview_mode)
         | 
| 89 91 | 
             
                          add_assoc_to_record(rec, arec, reflection)
         | 
| 90 92 | 
             
                        # PARAM = Hash (create)
         | 
| 91 93 | 
             
                        elsif attrs.kind_of? Hash
         | 
| 92 94 | 
             
                          arec = klass.new
         | 
| 95 | 
            +
                          arec.instance_variable_set(:@has_moderated_preview, preview_mode)
         | 
| 93 96 | 
             
                          # set foreign key first, may be required sometimes
         | 
| 94 97 | 
             
                          add_assoc_to_record(rec, arec, reflection)
         | 
| 95 98 | 
             
                          attrs.each_pair do |key, val|
         | 
| @@ -97,7 +100,7 @@ module HasModerated | |
| 97 100 | 
             
                            arec.send(key.to_s+"=", val)
         | 
| 98 101 | 
             
                          end
         | 
| 99 102 | 
             
                          # recursive, used for has_many :through
         | 
| 100 | 
            -
                          apply(arec, attrs) if attrs[:associations].present?
         | 
| 103 | 
            +
                          apply(arec, attrs, preview_mode) if attrs[:associations].present?
         | 
| 101 104 | 
             
                        else
         | 
| 102 105 | 
             
                          raise "don't know how to parse #{attrs.class}"
         | 
| 103 106 | 
             
                        end
         | 
| @@ -108,6 +111,7 @@ module HasModerated | |
| 108 111 | 
             
                          end
         | 
| 109 112 | 
             
                          if reflection.collection?
         | 
| 110 113 | 
             
                            rec = rec.reload
         | 
| 114 | 
            +
                            rec.instance_variable_set(:@has_moderated_preview, true) if preview_mode
         | 
| 111 115 | 
             
                            #rec.send(reflection.name.to_s) << arec unless rec.send(reflection.name.to_s).include?(arec)
         | 
| 112 116 | 
             
                          else
         | 
| 113 117 | 
             
                            rec.send(reflection.name.to_s + "=", arec)
         | 
| @@ -130,7 +134,8 @@ module HasModerated | |
| 130 134 | 
             
                    end
         | 
| 131 135 |  | 
| 132 136 | 
             
                    # add/delete associations to a record
         | 
| 133 | 
            -
                    def self.apply(record, data)
         | 
| 137 | 
            +
                    def self.apply(record, data, preview_mode = false)
         | 
| 138 | 
            +
                      record.instance_variable_set(:@has_moderated_preview, true) if preview_mode
         | 
| 134 139 | 
             
                      associations = data[:associations]
         | 
| 135 140 | 
             
                      delete_associations = data[:delete_associations]
         | 
| 136 141 |  | 
| @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            require 'fileutils'
         | 
| 2 2 | 
             
            module HasModerated
         | 
| 3 3 | 
             
              module CarrierWave
         | 
| 4 | 
            -
             | 
| 4 | 
            +
             | 
| 5 5 | 
             
                def self.included(base)
         | 
| 6 6 | 
             
                  base.send :extend, ClassMethods
         | 
| 7 | 
            -
                end | 
| 8 | 
            -
             | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 9 | 
             
                def self.photo_tmp_delete(value)
         | 
| 10 10 | 
             
                  begin
         | 
| 11 11 | 
             
                    dirname = File.expand_path("..", value)
         | 
| @@ -28,21 +28,44 @@ module HasModerated | |
| 28 28 | 
             
                  def has_moderated_carrierwave_field field_names
         | 
| 29 29 | 
             
                    base = self
         | 
| 30 30 | 
             
                    base.send :include, InstanceMethods
         | 
| 31 | 
            -
             | 
| 31 | 
            +
             | 
| 32 32 | 
             
                    cattr_accessor :moderated_carrierwave_fields
         | 
| 33 | 
            -
             | 
| 33 | 
            +
             | 
| 34 34 | 
             
                    field_names = [field_names] unless field_names.kind_of? Array
         | 
| 35 | 
            -
             | 
| 35 | 
            +
             | 
| 36 36 | 
             
                    field_names.each do |field_name|
         | 
| 37 37 | 
             
                      field_name = field_name.to_s
         | 
| 38 38 | 
             
                      self.moderated_carrierwave_fields ||= []
         | 
| 39 39 | 
             
                      self.moderated_carrierwave_fields.push(field_name)
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                      base.send :define_method, "#{field_name}_tmp_file=" do | | 
| 42 | 
            -
                         | 
| 43 | 
            -
             | 
| 40 | 
            +
             | 
| 41 | 
            +
                      base.send :define_method, "#{field_name}_tmp_file=" do |tmp_filename|
         | 
| 42 | 
            +
                        if @has_moderated_preview != true
         | 
| 43 | 
            +
                          self.send("#{field_name}=", File.open(tmp_filename))
         | 
| 44 | 
            +
                          HasModerated::CarrierWave::photo_tmp_delete(tmp_filename)
         | 
| 45 | 
            +
                        elsif tmp_filename.present?
         | 
| 46 | 
            +
                          # preview
         | 
| 47 | 
            +
                          self.singleton_class.class_eval do
         | 
| 48 | 
            +
                            define_method :"#{field_name}_with_preview" do |*args, &block|
         | 
| 49 | 
            +
                              uploader = send(:"#{field_name}_without_preview", *args, &block)
         | 
| 50 | 
            +
                              unless uploader.frozen?
         | 
| 51 | 
            +
                                uploader.instance_variable_set(:@file,
         | 
| 52 | 
            +
                                  ::CarrierWave::SanitizedFile.new(
         | 
| 53 | 
            +
                                    File.open(tmp_filename, "rb")))
         | 
| 54 | 
            +
                                uploader.freeze
         | 
| 55 | 
            +
                              end
         | 
| 56 | 
            +
                              uploader
         | 
| 57 | 
            +
                            end
         | 
| 58 | 
            +
                            define_method :"#{field_name}?" do
         | 
| 59 | 
            +
                              true
         | 
| 60 | 
            +
                            end
         | 
| 61 | 
            +
                            define_method :"#{field_name}_url" do
         | 
| 62 | 
            +
                              send("#{field_name}").url
         | 
| 63 | 
            +
                            end
         | 
| 64 | 
            +
                            alias_method_chain :"#{field_name}", :preview
         | 
| 65 | 
            +
                          end
         | 
| 66 | 
            +
                        end
         | 
| 44 67 | 
             
                      end
         | 
| 45 | 
            -
             | 
| 68 | 
            +
             | 
| 46 69 | 
             
                      base.send :define_method, "store_#{field_name}_with_moderation!" do
         | 
| 47 70 | 
             
                        is_moderated = self.class.respond_to?(:moderated_attributes) &&
         | 
| 48 71 | 
             
                          self.class.moderated_attributes.include?(field_name)
         | 
| @@ -56,26 +79,28 @@ module HasModerated | |
| 56 79 | 
             
                          })
         | 
| 57 80 | 
             
                        end
         | 
| 58 81 | 
             
                      end
         | 
| 59 | 
            -
             | 
| 82 | 
            +
             | 
| 60 83 | 
             
                      base.send :define_method, "write_#{field_name}_identifier_with_moderation" do
         | 
| 61 84 | 
             
                        is_moderated = self.class.respond_to?(:moderated_attributes) &&
         | 
| 62 85 | 
             
                          self.class.moderated_attributes.include?(field_name)
         | 
| 63 | 
            -
                        if  | 
| 86 | 
            +
                        if !@has_moderated_preview &&
         | 
| 87 | 
            +
                          (!is_moderated || self.moderation_disabled || !self.send("#{field_name}_changed?"))
         | 
| 64 88 | 
             
                          self.send("write_#{field_name}_identifier_without_moderation")
         | 
| 65 89 | 
             
                        end
         | 
| 66 90 | 
             
                      end
         | 
| 67 | 
            -
             | 
| 91 | 
            +
             | 
| 68 92 | 
             
                      base.alias_method_chain :get_moderation_attributes, :carrierwave unless base.instance_methods.include?("get_moderation_attributes_without_carrierwave")
         | 
| 69 93 | 
             
                      base.alias_method_chain "store_#{field_name}!", :moderation
         | 
| 70 94 | 
             
                      base.alias_method_chain "write_#{field_name}_identifier", :moderation
         | 
| 71 95 | 
             
                    end
         | 
| 72 96 | 
             
                  end
         | 
| 73 | 
            -
             | 
| 97 | 
            +
             | 
| 74 98 | 
             
                  # use class method because we only operate on hash parameters, not with a real record
         | 
| 75 99 | 
             
                  # here we can delete the photo from tmp
         | 
| 76 | 
            -
                  def moderatable_discard(moderation)
         | 
| 100 | 
            +
                  def moderatable_discard(moderation, options)
         | 
| 101 | 
            +
                    return if options[:preview_mode]
         | 
| 77 102 | 
             
                    value = moderation.parsed_data
         | 
| 78 | 
            -
             | 
| 103 | 
            +
             | 
| 79 104 | 
             
                    moderated_carrierwave_fields.each do |field_name|
         | 
| 80 105 | 
             
                      if value.kind_of? Hash
         | 
| 81 106 | 
             
                        if value.has_key?(:create) && value[:create].has_key?(:attributes)
         | 
| @@ -93,7 +118,7 @@ module HasModerated | |
| 93 118 | 
             
                    end
         | 
| 94 119 | 
             
                  end
         | 
| 95 120 | 
             
                end
         | 
| 96 | 
            -
             | 
| 121 | 
            +
             | 
| 97 122 | 
             
                module InstanceMethods
         | 
| 98 123 | 
             
                  def get_moderation_attributes_with_carrierwave
         | 
| 99 124 | 
             
                    attrs = get_moderation_attributes_without_carrierwave
         | 
| @@ -106,4 +131,4 @@ module HasModerated | |
| 106 131 | 
             
                  end
         | 
| 107 132 | 
             
                end
         | 
| 108 133 | 
             
              end
         | 
| 109 | 
            -
            end
         | 
| 134 | 
            +
            end
         | 
| @@ -49,8 +49,9 @@ module HasModerated | |
| 49 49 | 
             
                end
         | 
| 50 50 |  | 
| 51 51 | 
             
                module ApplyModeration
         | 
| 52 | 
            -
                  def self.apply(rec, value)
         | 
| 52 | 
            +
                  def self.apply(rec, value, preview_mode = false)
         | 
| 53 53 | 
             
                    if value[:attributes].present?
         | 
| 54 | 
            +
                      rec.instance_variable_set(:@has_moderated_preview, true) if preview_mode
         | 
| 54 55 | 
             
                      Moderation.without_moderation do
         | 
| 55 56 | 
             
                        value[:attributes].each_pair do |attr_name, attr_value|
         | 
| 56 57 | 
             
                          rec.send(attr_name.to_s+"=", attr_value)
         | 
| @@ -16,17 +16,18 @@ module HasModerated | |
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| 18 18 | 
             
                module ApplyModeration
         | 
| 19 | 
            -
                  def self.apply(klass, value)
         | 
| 19 | 
            +
                  def self.apply(klass, value, preview_mode = false)
         | 
| 20 20 | 
             
                    rec = nil
         | 
| 21 21 | 
             
                    if value[:create].present?
         | 
| 22 22 | 
             
                      # create the main record
         | 
| 23 23 | 
             
                      rec = klass.new
         | 
| 24 | 
            +
                      rec.instance_variable_set(:@has_moderated_preview, true) if preview_mode
         | 
| 24 25 | 
             
                      attrs = value[:create][:attributes]
         | 
| 25 26 | 
             
                      attrs && attrs.each_pair do |key, val|
         | 
| 26 27 | 
             
                        rec.send(key.to_s+"=", val) unless key.to_s == 'id'
         | 
| 27 28 | 
             
                      end
         | 
| 28 29 | 
             
                      Moderation.without_moderation { rec.save(:validate => false) }
         | 
| 29 | 
            -
                      HasModerated::Associations::Base::ApplyModeration::apply(rec, value[:create])
         | 
| 30 | 
            +
                      HasModerated::Associations::Base::ApplyModeration::apply(rec, value[:create], preview_mode)
         | 
| 30 31 | 
             
                    end
         | 
| 31 32 | 
             
                    rec
         | 
| 32 33 | 
             
                  end
         | 
| @@ -23,14 +23,14 @@ module HasModerated | |
| 23 23 | 
             
                  @parsed_data ||= YAML::load(data)
         | 
| 24 24 | 
             
                end
         | 
| 25 25 |  | 
| 26 | 
            -
                def apply
         | 
| 26 | 
            +
                def apply(preview_mode = false)
         | 
| 27 27 | 
             
                  if create?
         | 
| 28 | 
            -
                    record = HasModerated::ModeratedCreate::ApplyModeration::apply(moderatable_type.constantize, parsed_data)
         | 
| 28 | 
            +
                    record = HasModerated::ModeratedCreate::ApplyModeration::apply(moderatable_type.constantize, parsed_data, preview_mode)
         | 
| 29 29 | 
             
                  else
         | 
| 30 30 | 
             
                    record = moderatable
         | 
| 31 31 | 
             
                    if record
         | 
| 32 | 
            -
                      record = HasModerated::ModeratedAttributes::ApplyModeration::apply(record, parsed_data)
         | 
| 33 | 
            -
                      record = HasModerated::Associations::Base::ApplyModeration::apply(record, parsed_data)
         | 
| 32 | 
            +
                      record = HasModerated::ModeratedAttributes::ApplyModeration::apply(record, parsed_data, preview_mode)
         | 
| 33 | 
            +
                      record = HasModerated::Associations::Base::ApplyModeration::apply(record, parsed_data, preview_mode)
         | 
| 34 34 | 
             
                      record = HasModerated::ModeratedDestroy::ApplyModeration::apply(record, parsed_data)
         | 
| 35 35 | 
             
                    end
         | 
| 36 36 | 
             
                  end
         | 
| @@ -47,26 +47,27 @@ module HasModerated | |
| 47 47 | 
             
                  record
         | 
| 48 48 | 
             
                end
         | 
| 49 49 |  | 
| 50 | 
            -
                def accept!(save_opts = Hash.new)
         | 
| 51 | 
            -
                  record = apply
         | 
| 50 | 
            +
                def accept!(save_opts = Hash.new, preview_mode = false)
         | 
| 51 | 
            +
                  record = apply(preview_mode)
         | 
| 52 52 | 
             
                  accept_changes(record, save_opts)
         | 
| 53 | 
            -
                  self.destroy
         | 
| 53 | 
            +
                  self.destroy(:preview_mode => preview_mode)
         | 
| 54 54 | 
             
                  record
         | 
| 55 55 | 
             
                end
         | 
| 56 56 |  | 
| 57 | 
            -
                def accept(save_opts = Hash.new)
         | 
| 57 | 
            +
                def accept(save_opts = Hash.new, preview_mode = false)
         | 
| 58 58 | 
             
                  begin
         | 
| 59 | 
            -
                    accept!(save_opts)
         | 
| 59 | 
            +
                    accept!(save_opts, preview_mode)
         | 
| 60 60 | 
             
                    true
         | 
| 61 61 | 
             
                  rescue
         | 
| 62 62 | 
             
                    false
         | 
| 63 63 | 
             
                  end
         | 
| 64 64 | 
             
                end
         | 
| 65 65 |  | 
| 66 | 
            -
                def destroy_with_moderation_callbacks
         | 
| 66 | 
            +
                def destroy_with_moderation_callbacks(*args)
         | 
| 67 | 
            +
                  options = args.first || Hash.new
         | 
| 67 68 | 
             
                  if moderatable_type
         | 
| 68 69 | 
             
                    klass = moderatable_type.constantize
         | 
| 69 | 
            -
                    klass.moderatable_discard(self) if klass.respond_to?(:moderatable_discard)
         | 
| 70 | 
            +
                    klass.moderatable_discard(self, options) if klass.respond_to?(:moderatable_discard)
         | 
| 70 71 | 
             
                  end
         | 
| 71 72 | 
             
                  destroy_without_moderation_callbacks
         | 
| 72 73 | 
             
                end
         | 
| @@ -76,8 +77,14 @@ module HasModerated | |
| 76 77 | 
             
                end
         | 
| 77 78 |  | 
| 78 79 | 
             
                def live_preview
         | 
| 80 | 
            +
                  # absolutely no point to preview a destroy moderation
         | 
| 81 | 
            +
                  if destroy? && parsed_data.keys.count == 1
         | 
| 82 | 
            +
                    yield(nil)
         | 
| 83 | 
            +
                    return nil
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
             | 
| 79 86 | 
             
                  self.transaction do
         | 
| 80 | 
            -
                    record = accept!(:perform_validation => false)
         | 
| 87 | 
            +
                    record = accept!({ :perform_validation => false }, true)
         | 
| 81 88 | 
             
                    yield(record)
         | 
| 82 89 | 
             
                    raise ActiveRecord::Rollback
         | 
| 83 90 | 
             
                  end
         |