Sha256: cd1dce3fda2fb5990150220115efccd4789ec0f6e97b5bb28ce45d885dc7abdd

Contents?: true

Size: 1.87 KB

Versions: 1

Compression:

Stored size: 1.87 KB

Contents

module FinePrint
  class Contract < ActiveRecord::Base
    has_many :signatures, dependent: :destroy, inverse_of: :contract

    has_many :same_name, class_name: 'Contract',
             primary_key: :name, foreign_key: :name

    before_validation :downcase_name
    before_update :no_signatures
    before_destroy :no_signatures

    validates :name, presence: true, format: /\A[\w-]+\z/
    validates :title, presence: true
    validates :content, presence: true
    validates :version, uniqueness: { scope: :name,
                                      case_sensitive: false},
                        allow_nil: true

    default_scope lambda { order{[name.asc, version.desc]} }

    scope :published, lambda { where{version != nil} }
    scope :latest, lambda { joins(:same_name).group{id}
                              .having{version == max(same_name.version)} }

    def is_published?
      !version.nil?
    end

    def is_latest?
      is_published? && self == same_name.published.first
    end

    def publish
      errors.add(:base, I18n.t('fine_print.contract.errors.already_published')) \
        if is_published?
      return false unless errors.empty?

      self.version = (same_name.published.first.try(:version) || 0) + 1
      save
    end

    def unpublish
      errors.add(:base, I18n.t('fine_print.contract.errors.not_latest')) \
        unless is_latest?
      return false unless errors.empty?

      self.version = nil
      save
    end

    def new_version
      Contract.where(name: name, version: nil).first || \
        dup.tap{|contract| contract.version = nil}
    end

    ##############
    # Validation #
    ##############

    def no_signatures
      return if signatures.empty?
      errors.add(:base, I18n.t('fine_print.contract.errors.already_signed'))
      false
    end

    protected

    def downcase_name
      self.name = name.try(:downcase)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
fine_print-3.0.0 app/models/fine_print/contract.rb