app/models/decidim/initiative.rb in decidim-initiatives-0.21.0 vs app/models/decidim/initiative.rb in decidim-initiatives-0.22.0

- old
+ new

@@ -17,10 +17,11 @@ include Decidim::Initiatives::InitiativeSlug include Decidim::Resourceable include Decidim::HasReference include Decidim::Randomable include Decidim::Searchable + include Decidim::Initiatives::HasArea belongs_to :organization, foreign_key: "decidim_organization_id", class_name: "Decidim::Organization" @@ -28,11 +29,12 @@ foreign_key: "scoped_type_id", class_name: "Decidim::InitiativesTypeScope", inverse_of: :initiatives delegate :type, :scope, :scope_name, to: :scoped_type, allow_nil: true - delegate :promoting_committee_enabled?, to: :type + delegate :attachments_enabled?, :promoting_committee_enabled?, :custom_signature_end_date_enabled?, :area_enabled?, to: :type + delegate :name, to: :area, prefix: true, allow_nil: true has_many :votes, foreign_key: "decidim_initiative_id", class_name: "Decidim::InitiativesVote", dependent: :destroy, @@ -65,28 +67,36 @@ uniqueness: true, allow_blank: true, case_sensitive: false scope :open, lambda { - published - .where.not(state: [:discarded, :rejected, :accepted, :created]) - .where("signature_start_date <= ?", Date.current) - .where("signature_end_date >= ?", Date.current) + where.not(state: [:discarded, :rejected, :accepted, :created]) + .currently_signable } scope :closed, lambda { - published - .where(state: [:discarded, :rejected, :accepted]) - .or(where("signature_start_date > ?", Date.current)) - .or(where("signature_end_date < ?", Date.current)) + where(state: [:discarded, :rejected, :accepted]) + .or(currently_unsignable) } scope :published, -> { where.not(published_at: nil) } scope :with_state, ->(state) { where(state: state) if state.present? } + scope :currently_signable, lambda { + where("signature_start_date <= ?", Date.current) + .where("signature_end_date >= ?", Date.current) + } + scope :currently_unsignable, lambda { + where("signature_start_date > ?", Date.current) + .or(where("signature_end_date < ?", Date.current)) + } + + scope :answered, -> { where.not(answered_at: nil) } + scope :public_spaces, -> { published } scope :signature_type_updatable, -> { created } scope :order_by_most_recent, -> { order(created_at: :desc) } + scope :order_by_most_recently_published, -> { order(published_at: :desc) } scope :order_by_supports, -> { order(Arel.sql("initiative_votes_count + coalesce(offline_votes, 0) desc")) } scope :order_by_most_commented, lambda { select("decidim_initiatives.*") .left_joins(:comments) .group("decidim_initiatives.id") @@ -225,11 +235,11 @@ update( published_at: Time.current, state: "published", signature_start_date: Date.current, - signature_end_date: Date.current + Decidim::Initiatives.default_signature_time_period_length + signature_end_date: signature_end_date || Date.current + Decidim::Initiatives.default_signature_time_period_length ) end # # Public: Unpublishes this initiative @@ -299,10 +309,14 @@ return true if author.id == user.id committee_members.approved.where(decidim_users_id: user.id).any? end + def author_users + [author].concat(committee_members.excluding_author.map(&:user)) + end + def accepts_offline_votes? published? && (offline_signature_type? || any_signature_type?) end def accepts_online_votes? @@ -366,7 +380,45 @@ end end # Allow ransacker to search on an Enum Field ransacker :state, formatter: proc { |int| states[int] } + + ransacker :type_id do + Arel.sql("decidim_initiatives_type_scopes.decidim_initiatives_types_id") + end + + # method for sort_link by number of supports + ransacker :supports_count do + query = <<~SQL + ( + SELECT + CASE + WHEN signature_type = 0 THEN 0 + ELSE COALESCE(offline_votes, 0) + END + + + CASE + WHEN signature_type = 1 THEN 0 + ELSE initiative_votes_count + initiative_supports_count + END + FROM decidim_initiatives as initiatives + WHERE initiatives.id = decidim_initiatives.id + GROUP BY initiatives.id + ) + SQL + Arel.sql(query) + end + + ransacker :id_string do + Arel.sql(%{cast("decidim_initiatives"."id" as text)}) + end + + ransacker :author_name do + Arel.sql("decidim_users.name") + end + + ransacker :author_nickname do + Arel.sql("decidim_users.nickname") + end end end