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