Sha256: d1e6e9e9f264f47a4db6b4909d3439386b05ad569fa59aa77e461a25283983fe

Contents?: true

Size: 1.99 KB

Versions: 25

Compression:

Stored size: 1.99 KB

Contents

# frozen_string_literal: true

require "active_support/concern"

module Decidim
  # A concern with the components needed when you want a model to have a scope.
  #
  # The including model needs to implement the following interface:
  #
  #  @abstract An instance method that returns the id of the scope
  #  @method decidim_scope_id
  #    @return [Integer]
  #
  #  @abstract An instance method that states whether scopes are enabled or not
  #  @method scopes_enabled
  #    @return [Boolean]
  #
  #  @abstract An method that gives an associated organization
  #  @method organization
  #    @return [Decidim::Organization]
  #
  module Scopable
    extend ActiveSupport::Concern

    included do
      delegate :scopes, to: :organization

      validate :scope_belongs_to_organization
    end

    # Whether the resource has scopes enabled or not.
    #
    # Returns a boolean.
    def scopes_enabled?
      scopes_enabled
    end

    # Gets the children scopes of the object's scope.
    #
    # If it's global, returns the organization's top scopes.
    #
    # Returns an ActiveRecord::Relation.
    def subscopes
      scope ? scope.children : organization.top_scopes
    end

    # Whether the resource has subscopes or not.
    #
    # Returns a boolean.
    def has_subscopes?
      scopes_enabled? && subscopes.any?
    end

    # Whether the passed subscope is out of the resource's scope.
    #
    # Returns a boolean
    def out_of_scope?(subscope)
      scope && !scope.ancestor_of?(subscope)
    end

    # If any, gets the previous scope of the object.
    #
    #
    # Returns a Decidim::Scope
    def previous_scope
      return if versions.count <= 1

      Decidim::Scope.find_by(id: versions.last.reify.decidim_scope_id)
    end

    private

    # Validation to ensure that the resource is scoped within the organization's scope.
    def scope_belongs_to_organization
      return if !scope || !organization

      errors.add(:scope, :invalid) unless organization.scopes.exists?(id: scope.id)
    end
  end
end

Version data entries

25 entries across 25 versions & 1 rubygems

Version Path
decidim-core-0.26.10 lib/decidim/scopable.rb
decidim-core-0.26.9 lib/decidim/scopable.rb
decidim-core-0.26.8 lib/decidim/scopable.rb
decidim-core-0.26.7 lib/decidim/scopable.rb
decidim-core-0.26.5 lib/decidim/scopable.rb
decidim-core-0.26.4 lib/decidim/scopable.rb
decidim-core-0.26.3 lib/decidim/scopable.rb
decidim-core-0.26.2 lib/decidim/scopable.rb
decidim-core-0.26.1 lib/decidim/scopable.rb
decidim-core-0.26.0 lib/decidim/scopable.rb
decidim-core-0.26.0.rc2 lib/decidim/scopable.rb
decidim-core-0.26.0.rc1 lib/decidim/scopable.rb
decidim-core-0.25.2 lib/decidim/scopable.rb
decidim-core-0.25.1 lib/decidim/scopable.rb
decidim-core-0.25.0 lib/decidim/scopable.rb
decidim-core-0.25.0.rc4 lib/decidim/scopable.rb
decidim-core-0.25.0.rc3 lib/decidim/scopable.rb
decidim-core-0.25.0.rc2 lib/decidim/scopable.rb
decidim-core-0.25.0.rc1 lib/decidim/scopable.rb
decidim-core-0.24.3 lib/decidim/scopable.rb