approval 0.3.7 → 0.4.0
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.
- checksums.yaml +4 -4
- data/app/models/approval/execute_form.rb +57 -0
- data/app/models/approval/request.rb +10 -2
- data/app/models/approval/request_form/base.rb +3 -5
- data/app/models/approval/respond_form/approve.rb +0 -1
- data/app/models/approval/respond_form/approve_with_execute.rb +19 -0
- data/app/models/approval/respond_form/base.rb +3 -5
- data/app/models/concerns/approval/acts_as_user.rb +10 -2
- data/config/locales/en.yml +2 -0
- data/config/locales/ja.yml +2 -0
- data/db/migrate/20180409000000_create_approval_tables.rb +1 -0
- data/lib/approval/version.rb +1 -1
- metadata +4 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 887c9791882f3ddcad06255f3c51bdce3f3a3bc2c0303f4b08c6675049cab402
         | 
| 4 | 
            +
              data.tar.gz: cf49a8a8805feb9197b07d7248032da32b8fa22d8baee4e403c75f5b266627f7
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: acc899127438f3fc8ed8c157fb91cf677a7dab0a41ba54e78300cfe4d9cee722fc530fea6d87d0be1537362ae317432e88d8819de604137afe761044302b4f8c
         | 
| 7 | 
            +
              data.tar.gz: 8e2d0d89ce1b639a025f400e0cb0b3e64cd00218fb1b646df538957c63665c9f2e283b4cec710ce588f742512ae32045b471216549bd57fd384b039fa9bf03b2
         | 
| @@ -0,0 +1,57 @@ | |
| 1 | 
            +
            module Approval
         | 
| 2 | 
            +
              class ExecuteForm
         | 
| 3 | 
            +
                include ::ActiveModel::Model
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                attr_accessor :user, :reason, :request
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def initialize(user:, reason:, request:)
         | 
| 8 | 
            +
                  @user    = user
         | 
| 9 | 
            +
                  @reason  = reason
         | 
| 10 | 
            +
                  @request = request
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                validates :user,    presence: true
         | 
| 14 | 
            +
                validates :request, presence: true
         | 
| 15 | 
            +
                validates :reason,  allow_blank: true, length: { maximum: Approval.config.comment_maximum }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                validate :ensure_request_is_approved
         | 
| 18 | 
            +
                validate :ensure_user_same_as_request_user
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def save
         | 
| 21 | 
            +
                  return false unless valid?
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  execute(&:save)
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def save!
         | 
| 27 | 
            +
                  raise ::ActiveRecord::RecordInvalid unless valid?
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  execute(&:save!)
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                private
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def execute
         | 
| 35 | 
            +
                    ::Approval::Request.transaction do
         | 
| 36 | 
            +
                      request.lock!
         | 
| 37 | 
            +
                      request.comments.new(user_id: user.id, content: reason) if reason
         | 
| 38 | 
            +
                      request.execute
         | 
| 39 | 
            +
                      yield(request)
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  def ensure_request_is_approved
         | 
| 44 | 
            +
                    return unless request
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    errors.add(:request, :is_not_approved) unless request.approved?
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  def ensure_user_same_as_request_user
         | 
| 50 | 
            +
                    return unless user && request
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    unless user.id == request.request_user_id
         | 
| 53 | 
            +
                      errors.add(:user, :cannot_execute_others_request)
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
            end
         | 
| @@ -10,7 +10,7 @@ module Approval | |
| 10 10 | 
             
                has_many :comments, class_name: :"Approval::Comment", inverse_of: :request, dependent: :destroy
         | 
| 11 11 | 
             
                has_many :items,    class_name: :"Approval::Item",    inverse_of: :request, dependent: :destroy
         | 
| 12 12 |  | 
| 13 | 
            -
                enum state: { pending: 0, cancelled: 1, approved: 2, rejected: 3 }
         | 
| 13 | 
            +
                enum state: { pending: 0, cancelled: 1, approved: 2, rejected: 3, executed: 4 }
         | 
| 14 14 |  | 
| 15 15 | 
             
                scope :recently, -> { order(id: :desc) }
         | 
| 16 16 |  | 
| @@ -28,12 +28,20 @@ module Approval | |
| 28 28 | 
             
                  self.requested_at = Time.current
         | 
| 29 29 | 
             
                end
         | 
| 30 30 |  | 
| 31 | 
            +
                def execute
         | 
| 32 | 
            +
                  self.state = :executed
         | 
| 33 | 
            +
                  self.executed_at = Time.current
         | 
| 34 | 
            +
                  items.each(&:apply)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 31 37 | 
             
                private
         | 
| 32 38 |  | 
| 33 39 | 
             
                  def ensure_state_was_pending
         | 
| 34 40 | 
             
                    return unless persisted?
         | 
| 35 41 |  | 
| 36 | 
            -
                     | 
| 42 | 
            +
                    if %w[pending approved].exclude?(state_was)
         | 
| 43 | 
            +
                      errors.add(:base, :already_performed)
         | 
| 44 | 
            +
                    end
         | 
| 37 45 | 
             
                  end
         | 
| 38 46 | 
             
              end
         | 
| 39 47 | 
             
            end
         | 
| @@ -11,11 +11,9 @@ module Approval | |
| 11 11 | 
             
                    @records = records
         | 
| 12 12 | 
             
                  end
         | 
| 13 13 |  | 
| 14 | 
            -
                   | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
                    validates :records
         | 
| 18 | 
            -
                  end
         | 
| 14 | 
            +
                  validates :user,    presence: true
         | 
| 15 | 
            +
                  validates :reason,  presence: true, length: { maximum: Approval.config.comment_maximum }
         | 
| 16 | 
            +
                  validates :records, presence: true
         | 
| 19 17 |  | 
| 20 18 | 
             
                  def save
         | 
| 21 19 | 
             
                    return false unless valid?
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            module Approval
         | 
| 2 | 
            +
              module RespondForm
         | 
| 3 | 
            +
                class ApproveWithExecute < Base
         | 
| 4 | 
            +
                  validate :ensure_user_cannot_respond_to_my_request
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  private
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                    def prepare
         | 
| 9 | 
            +
                      ::Approval::Request.transaction do
         | 
| 10 | 
            +
                        request.lock!
         | 
| 11 | 
            +
                        request.assign_attributes(state: :approved, approved_at: Time.current, respond_user_id: user.id)
         | 
| 12 | 
            +
                        request.comments.new(user_id: user.id, content: reason)
         | 
| 13 | 
            +
                        request.execute
         | 
| 14 | 
            +
                        yield(request)
         | 
| 15 | 
            +
                      end
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
| @@ -11,11 +11,9 @@ module Approval | |
| 11 11 | 
             
                    @request = request
         | 
| 12 12 | 
             
                  end
         | 
| 13 13 |  | 
| 14 | 
            -
                   | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
                    validates :request
         | 
| 18 | 
            -
                  end
         | 
| 14 | 
            +
                  validates :user,    presence: true
         | 
| 15 | 
            +
                  validates :reason,  presence: true, length: { maximum: Approval.config.comment_maximum }
         | 
| 16 | 
            +
                  validates :request, presence: true
         | 
| 19 17 |  | 
| 20 18 | 
             
                  def save
         | 
| 21 19 | 
             
                    return false unless valid?
         | 
| @@ -23,12 +23,20 @@ module Approval | |
| 23 23 | 
             
                  Approval::RespondForm::Cancel.new(user: self, reason: reason, request: request)
         | 
| 24 24 | 
             
                end
         | 
| 25 25 |  | 
| 26 | 
            -
                def approve_request(request, reason:)
         | 
| 27 | 
            -
                   | 
| 26 | 
            +
                def approve_request(request, reason:, execute: true)
         | 
| 27 | 
            +
                  if execute
         | 
| 28 | 
            +
                    Approval::RespondForm::ApproveWithExecute.new(user: self, reason: reason, request: request)
         | 
| 29 | 
            +
                  else
         | 
| 30 | 
            +
                    Approval::RespondForm::Approve.new(user: self, reason: reason, request: request)
         | 
| 31 | 
            +
                  end
         | 
| 28 32 | 
             
                end
         | 
| 29 33 |  | 
| 30 34 | 
             
                def reject_request(request, reason:)
         | 
| 31 35 | 
             
                  Approval::RespondForm::Reject.new(user: self, reason: reason, request: request)
         | 
| 32 36 | 
             
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def execute_request(request, reason: nil)
         | 
| 39 | 
            +
                  Approval::ExecuteForm.new(user: self, reason: reason, request: request)
         | 
| 40 | 
            +
                end
         | 
| 33 41 | 
             
              end
         | 
| 34 42 | 
             
            end
         | 
    
        data/config/locales/en.yml
    CHANGED
    
    | @@ -3,6 +3,8 @@ en: | |
| 3 3 | 
             
                messages:
         | 
| 4 4 | 
             
                  already_performed: "This request has already performed."
         | 
| 5 5 | 
             
                  cannot_respond_to_own_request: "cannot respond to own request."
         | 
| 6 | 
            +
                  cannot_execute_others_request: "cannot execute others request."
         | 
| 7 | 
            +
                  is_not_approved: "is not approved."
         | 
| 6 8 |  | 
| 7 9 | 
             
              attributes:
         | 
| 8 10 | 
             
                id: "ID"
         | 
    
        data/config/locales/ja.yml
    CHANGED
    
    
    
        data/lib/approval/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: approval
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Yoshiyuki Hirano
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018-04- | 
| 11 | 
            +
            date: 2018-04-17 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -35,6 +35,7 @@ files: | |
| 35 35 | 
             
            - README.md
         | 
| 36 36 | 
             
            - app/models/approval/application_record.rb
         | 
| 37 37 | 
             
            - app/models/approval/comment.rb
         | 
| 38 | 
            +
            - app/models/approval/execute_form.rb
         | 
| 38 39 | 
             
            - app/models/approval/item.rb
         | 
| 39 40 | 
             
            - app/models/approval/request.rb
         | 
| 40 41 | 
             
            - app/models/approval/request_form/base.rb
         | 
| @@ -42,6 +43,7 @@ files: | |
| 42 43 | 
             
            - app/models/approval/request_form/destroy.rb
         | 
| 43 44 | 
             
            - app/models/approval/request_form/update.rb
         | 
| 44 45 | 
             
            - app/models/approval/respond_form/approve.rb
         | 
| 46 | 
            +
            - app/models/approval/respond_form/approve_with_execute.rb
         | 
| 45 47 | 
             
            - app/models/approval/respond_form/base.rb
         | 
| 46 48 | 
             
            - app/models/approval/respond_form/cancel.rb
         | 
| 47 49 | 
             
            - app/models/approval/respond_form/reject.rb
         |