Class: Decidim::Initiative
- Inherits:
-
ApplicationRecord
- Object
- ApplicationRecord
- Decidim::Initiative
- Includes:
- ActiveModel::Dirty, Authorable, Comments::Commentable, Followable, HasAttachmentCollections, HasAttachments, HasReference, HasResourcePermission, Decidim::Initiatives::HasArea, Decidim::Initiatives::InitiativeSlug, Loggable, Participable, Publicable, Randomable, Resourceable, ScopableParticipatorySpace, Searchable, Traceable, TranslatableResource
- Defined in:
- app/models/decidim/initiative.rb
Overview
The data store for a Initiative in the Decidim::Initiatives component.
Class Method Summary collapse
Instance Method Summary collapse
- #accepts_offline_votes? ⇒ Boolean
- #accepts_online_unvotes? ⇒ Boolean
- #accepts_online_votes? ⇒ Boolean
-
#allow_resource_permissions? ⇒ Boolean
Public: Overrides the `allow_resource_permissions?` Resourceable concern method.
-
#answered? ⇒ Boolean
Public: Checks if the organization has given an answer for the initiative.
-
#author_name ⇒ Object
PUBLIC.
- #author_users ⇒ Object
-
#banner_image ⇒ Object
PUBLIC banner image.
-
#closed? ⇒ Boolean
PUBLIC.
-
#comments_have_alignment? ⇒ Boolean
Public: Overrides the `comments_have_alignment?` Commentable concern method.
-
#comments_have_votes? ⇒ Boolean
Public: Overrides the `comments_have_votes?` Commentable concern method.
- #component ⇒ Object
-
#created_by_individual? ⇒ Boolean
PUBLIC.
- #enough_committee_members? ⇒ Boolean
-
#has_authorship?(user) ⇒ Boolean
Public: Checks if user is the author or is part of the promotal committee of the initiative.
-
#has_signature_interval_defined? ⇒ Boolean
Public: Returns wether the signature interval is already defined or not.
-
#hashtag ⇒ Object
Public: Returns the hashtag for the initiative.
- #minimum_committee_members ⇒ Object
- #offline_votes_count ⇒ Object
- #offline_votes_count_for(scope) ⇒ Object
-
#online_votes_count ⇒ Object
Public: Calculates all the votes across all the scopes.
- #online_votes_count_for(scope) ⇒ Object
-
#open? ⇒ Boolean
PUBLIC.
-
#percentage ⇒ Object
Public: Returns the percentage of required supports reached.
-
#publish! ⇒ Object
Public: Publishes this initiative.
-
#scopes_enabled ⇒ Object
Public: Overrides scopes enabled attribute value.
-
#scopes_enabled? ⇒ Boolean
Public: Overrides scopes enabled flag available in other models like participatory space or assemblies.
- #set_offline_votes_total ⇒ Object
-
#slug ⇒ Object
Public: Overrides slug attribute from participatory processes.
-
#supports_count ⇒ Object
Public: Calculates the number of total current supports.
-
#supports_count_for(scope) ⇒ Object
Public: Calculates the number of current supports for a scope.
-
#supports_goal_reached? ⇒ Boolean
Public: Whether the supports required objective has been reached.
-
#supports_goal_reached_for?(scope) ⇒ Boolean
Public: Whether the supports required objective has been reached for a scope.
-
#supports_required_for(scope) ⇒ Object
Public: Calculates the number of supports required to accept the initiative for a scope.
- #to_param ⇒ Object
-
#unpublish! ⇒ Object
Public: Unpublishes this initiative.
- #update_online_votes_counters ⇒ Object
- #user_allowed_to_comment?(user) ⇒ Boolean
-
#user_role_config_for(_user, _role_name) ⇒ Object
Public: Returns an empty object.
-
#validate_sms_code_on_votes? ⇒ Boolean
PUBLIC.
-
#votable_initiative_type_scopes ⇒ Object
Public: Finds all the InitiativeTypeScopes that are eligible to be voted by a user.
-
#voted_by?(user) ⇒ Boolean
Public: Check if the user has voted the question.
- #votes_enabled? ⇒ Boolean
Methods included from Decidim::Initiatives::InitiativeSlug
Class Method Details
.log_presenter_class_for(_log) ⇒ Object
124 125 126 |
# File 'app/models/decidim/initiative.rb', line 124 def self.log_presenter_class_for(_log) Decidim::Initiatives::AdminLog::InitiativePresenter end |
Instance Method Details
#accepts_offline_votes? ⇒ Boolean
386 387 388 |
# File 'app/models/decidim/initiative.rb', line 386 def accepts_offline_votes? published? && (offline_signature_type? || any_signature_type?) end |
#accepts_online_unvotes? ⇒ Boolean
394 395 396 |
# File 'app/models/decidim/initiative.rb', line 394 def accepts_online_unvotes? accepts_online_votes? && type.undo_online_signatures_enabled? end |
#accepts_online_votes? ⇒ Boolean
390 391 392 |
# File 'app/models/decidim/initiative.rb', line 390 def accepts_online_votes? votes_enabled? && (online_signature_type? || any_signature_type?) end |
#allow_resource_permissions? ⇒ Boolean
Public: Overrides the `allow_resource_permissions?` Resourceable concern method.
429 430 431 |
# File 'app/models/decidim/initiative.rb', line 429 def true end |
#answered? ⇒ Boolean
Public: Checks if the organization has given an answer for the initiative.
Returns Boolean.
200 201 202 |
# File 'app/models/decidim/initiative.rb', line 200 def answered? answered_at.present? end |
#author_name ⇒ Object
PUBLIC
Returns the author name. If it has been created by an organization it will return the organization's name. Otherwise it will return author's name.
RETURN string
180 181 182 |
# File 'app/models/decidim/initiative.rb', line 180 def user_group&.name || .name end |
#author_users ⇒ Object
382 383 384 |
# File 'app/models/decidim/initiative.rb', line 382 def [].concat(committee_members..map(&:user)) end |
#banner_image ⇒ Object
PUBLIC banner image
Overrides participatory space's banner image with the banner image defined for the initiative type.
RETURNS Decidim::BannerImageUploader
137 138 139 |
# File 'app/models/decidim/initiative.rb', line 137 def type.attached_uploader(:banner_image) end |
#closed? ⇒ Boolean
PUBLIC
Returns when an initiative is closed. An initiative is closed when at least one of the following conditions is true:
-
It has been discarded.
-
It has been rejected.
-
It has been accepted.
-
Signature collection period has finished.
RETURNS BOOLEAN
170 171 172 |
# File 'app/models/decidim/initiative.rb', line 170 def closed? discarded? || rejected? || accepted? || !votes_enabled? end |
#comments_have_alignment? ⇒ Boolean
Public: Overrides the `comments_have_alignment?` Commentable concern method.
363 364 365 |
# File 'app/models/decidim/initiative.rb', line 363 def comments_have_alignment? true end |
#comments_have_votes? ⇒ Boolean
Public: Overrides the `comments_have_votes?` Commentable concern method.
368 369 370 |
# File 'app/models/decidim/initiative.rb', line 368 def comments_have_votes? true end |
#component ⇒ Object
406 407 408 |
# File 'app/models/decidim/initiative.rb', line 406 def component nil end |
#created_by_individual? ⇒ Boolean
PUBLIC
Returns true when an initiative has been created by an individual person. False in case it has been created by an authorized organization.
RETURN boolean
147 148 149 |
# File 'app/models/decidim/initiative.rb', line 147 def created_by_individual? decidim_user_group_id.nil? end |
#enough_committee_members? ⇒ Boolean
402 403 404 |
# File 'app/models/decidim/initiative.rb', line 402 def enough_committee_members? committee_members.approved.count >= minimum_committee_members end |
#has_authorship?(user) ⇒ Boolean
Public: Checks if user is the author or is part of the promotal committee of the initiative.
Returns a Boolean.
376 377 378 379 380 |
# File 'app/models/decidim/initiative.rb', line 376 def (user) return true if .id == user.id committee_members.approved.where(decidim_users_id: user.id).any? end |
#has_signature_interval_defined? ⇒ Boolean
Public: Returns wether the signature interval is already defined or not.
242 243 244 |
# File 'app/models/decidim/initiative.rb', line 242 def has_signature_interval_defined? signature_end_date.present? && signature_start_date.present? end |
#hashtag ⇒ Object
Public: Returns the hashtag for the initiative.
247 248 249 |
# File 'app/models/decidim/initiative.rb', line 247 def hashtag attributes["hashtag"].to_s.delete("#") end |
#minimum_committee_members ⇒ Object
398 399 400 |
# File 'app/models/decidim/initiative.rb', line 398 def minimum_committee_members type.minimum_committee_members || Decidim::Initiatives.minimum_committee_members end |
#offline_votes_count ⇒ Object
298 299 300 301 302 |
# File 'app/models/decidim/initiative.rb', line 298 def offline_votes_count return 0 if online_signature_type? offline_votes["total"].to_i end |
#offline_votes_count_for(scope) ⇒ Object
312 313 314 315 316 317 318 |
# File 'app/models/decidim/initiative.rb', line 312 def offline_votes_count_for(scope) return 0 if online_signature_type? scope_key = (scope&.id || "global").to_s (offline_votes || {}).fetch(scope_key, 0).to_i end |
#online_votes_count ⇒ Object
Public: Calculates all the votes across all the scopes.
Returns an Integer.
292 293 294 295 296 |
# File 'app/models/decidim/initiative.rb', line 292 def online_votes_count return 0 if offline_signature_type? online_votes["total"].to_i end |
#online_votes_count_for(scope) ⇒ Object
304 305 306 307 308 309 310 |
# File 'app/models/decidim/initiative.rb', line 304 def online_votes_count_for(scope) return 0 if offline_signature_type? scope_key = (scope&.id || "global").to_s (online_votes || {}).fetch(scope_key, 0).to_i end |
#open? ⇒ Boolean
PUBLIC
RETURN boolean TRUE when the initiative is open, false in case its not closed.
155 156 157 |
# File 'app/models/decidim/initiative.rb', line 155 def open? !closed? end |
#percentage ⇒ Object
Public: Returns the percentage of required supports reached
273 274 275 276 277 |
# File 'app/models/decidim/initiative.rb', line 273 def percentage return 100 if supports_goal_reached? supports_count * 100 / supports_required end |
#publish! ⇒ Object
Public: Publishes this initiative
Returns true if the record was properly saved, false otherwise.
221 222 223 224 225 226 227 228 229 230 |
# File 'app/models/decidim/initiative.rb', line 221 def publish! return false if published? update( published_at: Time.current, state: "published", signature_start_date: Date.current, signature_end_date: signature_end_date || Date.current + Decidim::Initiatives.default_signature_time_period_length ) end |
#scopes_enabled ⇒ Object
Public: Overrides scopes enabled attribute value. For initiatives it won't be directly managed by the user and it will be enabled by default.
214 215 216 |
# File 'app/models/decidim/initiative.rb', line 214 def scopes_enabled true end |
#scopes_enabled? ⇒ Boolean
Public: Overrides scopes enabled flag available in other models like participatory space or assemblies. For initiatives it won't be directly managed by the user and it will be enabled by default.
207 208 209 |
# File 'app/models/decidim/initiative.rb', line 207 def scopes_enabled? true end |
#set_offline_votes_total ⇒ Object
332 333 334 335 336 |
# File 'app/models/decidim/initiative.rb', line 332 def set_offline_votes_total return if offline_votes.blank? || scope.nil? offline_votes["total"] = offline_votes[scope.id.to_s] end |
#slug ⇒ Object
Public: Overrides slug attribute from participatory processes.
353 354 355 |
# File 'app/models/decidim/initiative.rb', line 353 def slug slug_from_id(id) end |
#supports_count ⇒ Object
Public: Calculates the number of total current supports.
Returns an Integer.
254 255 256 |
# File 'app/models/decidim/initiative.rb', line 254 def supports_count online_votes_count + offline_votes_count end |
#supports_count_for(scope) ⇒ Object
Public: Calculates the number of current supports for a scope.
Returns an Integer.
261 262 263 |
# File 'app/models/decidim/initiative.rb', line 261 def supports_count_for(scope) online_votes_count_for(scope) + offline_votes_count_for(scope) end |
#supports_goal_reached? ⇒ Boolean
Public: Whether the supports required objective has been reached
280 281 282 |
# File 'app/models/decidim/initiative.rb', line 280 def supports_goal_reached? initiative_type_scopes.map(&:scope).all? { |scope| supports_goal_reached_for?(scope) } end |
#supports_goal_reached_for?(scope) ⇒ Boolean
Public: Whether the supports required objective has been reached for a scope
285 286 287 |
# File 'app/models/decidim/initiative.rb', line 285 def supports_goal_reached_for?(scope) supports_count_for(scope) >= supports_required_for(scope) end |
#supports_required_for(scope) ⇒ Object
Public: Calculates the number of supports required to accept the initiative for a scope.
Returns an Integer.
268 269 270 |
# File 'app/models/decidim/initiative.rb', line 268 def supports_required_for(scope) initiative_type_scopes.find_by(decidim_scopes_id: scope&.id).supports_required end |
#to_param ⇒ Object
357 358 359 |
# File 'app/models/decidim/initiative.rb', line 357 def to_param slug end |
#unpublish! ⇒ Object
Public: Unpublishes this initiative
Returns true if the record was properly saved, false otherwise.
235 236 237 238 239 |
# File 'app/models/decidim/initiative.rb', line 235 def unpublish! return false unless published? update(published_at: nil, state: "discarded") end |
#update_online_votes_counters ⇒ Object
320 321 322 323 324 325 326 327 328 329 330 |
# File 'app/models/decidim/initiative.rb', line 320 def update_online_votes_counters online_votes = votes.group(:scope).count.each_with_object({}) do |(scope, count), counters| counters[scope&.id || "global"] = count counters["total"] ||= 0 counters["total"] += count end # rubocop:disable Rails/SkipsModelValidations update_column("online_votes", online_votes) # rubocop:enable Rails/SkipsModelValidations end |
#user_allowed_to_comment?(user) ⇒ Boolean
433 434 435 |
# File 'app/models/decidim/initiative.rb', line 433 def user_allowed_to_comment?(user) ActionAuthorizer.new(user, "comment", self, nil)..ok? end |
#user_role_config_for(_user, _role_name) ⇒ Object
Public: Returns an empty object. This method should be implemented by `ParticipatorySpaceResourceable`, but for some reason this model does not implement this interface.
424 425 426 |
# File 'app/models/decidim/initiative.rb', line 424 def user_role_config_for(_user, _role_name) Decidim::ParticipatorySpaceRoleConfig::Base.new(:empty_role_name) end |
#validate_sms_code_on_votes? ⇒ Boolean
PUBLIC
Checks if the type the initiative belongs to enables SMS code verification step. Tis configuration is ignored if the organization doesn't have the sms authorization available
RETURNS boolean
417 418 419 |
# File 'app/models/decidim/initiative.rb', line 417 def validate_sms_code_on_votes? organization..include?("sms") && type.validate_sms_code_on_votes? end |
#votable_initiative_type_scopes ⇒ Object
Public: Finds all the InitiativeTypeScopes that are eligible to be voted by a user. Usually this is only the `scoped_type` but voting on children of the scoped type is enabled we have to filter all the available scopes in the initiative type to select the ones that are a descendant of the initiative type.
Returns an Array of Decidim::InitiativesScopeType.
344 345 346 347 348 349 350 |
# File 'app/models/decidim/initiative.rb', line 344 def votable_initiative_type_scopes return Array(scoped_type) unless type.child_scope_threshold_enabled? initiative_type_scopes.select do |initiative_type_scope| initiative_type_scope.scope.present? && (scoped_type.global_scope? || scoped_type.scope.ancestor_of?(initiative_type_scope.scope)) end.prepend(scoped_type).uniq end |
#voted_by?(user) ⇒ Boolean
Public: Check if the user has voted the question.
Returns Boolean.
193 194 195 |
# File 'app/models/decidim/initiative.rb', line 193 def voted_by?(user) votes.where(author: user).any? end |
#votes_enabled? ⇒ Boolean
184 185 186 187 188 |
# File 'app/models/decidim/initiative.rb', line 184 def votes_enabled? published? && signature_start_date <= Date.current && signature_end_date >= Date.current end |