Class: Decidim::Debates::Debate

Overview

The data store for a Debate in the Decidim::Debates component. It stores a title, description and any other useful information to render a custom debate.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from TranslatableAttributes

#default_locale?

Methods included from Searchable

searchable_resources, searchable_resources_of_type_comment, searchable_resources_of_type_component, searchable_resources_of_type_participant, searchable_resources_of_type_participatory_space

Methods included from Followable

#followers

Class Method Details

.export_serializerObject


145
146
147
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 145

def self.export_serializer
  Decidim::Debates::DownloadYourDataDebateSerializer
end

.log_presenter_class_for(_log) ⇒ Object


59
60
61
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 59

def self.log_presenter_class_for(_log)
  Decidim::Debates::AdminLog::DebatePresenter
end

.newsletter_participant_ids(component) ⇒ Object


149
150
151
152
153
154
155
156
157
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 149

def self.newsletter_participant_ids(component)
  authors_ids = Decidim::Debates::Debate.where(component: component)
                                        .where(decidim_author_type: Decidim::UserBaseEntity.name)
                                        .where.not(author: nil)
                                        .group(:decidim_author_id)
                                        .pluck(:decidim_author_id).flatten.compact
  commentators_ids = Decidim::Comments::Comment.user_commentators_ids_in(Decidim::Debates::Debate.where(component: component))
  (authors_ids + commentators_ids).flatten.compact.uniq
end

.ransack(params = {}, options = {}) ⇒ Object


206
207
208
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 206

def self.ransack(params = {}, options = {})
  DebateSearch.new(self, params, options)
end

.ransackable_scopes(_auth_object = nil) ⇒ Object


202
203
204
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 202

def self.ransackable_scopes(_auth_object = nil)
  [:with_any_state, :with_any_origin, :with_any_category, :with_any_scope]
end

Instance Method Details

#accepts_new_comments?Boolean

Public: Overrides the `accepts_new_comments?` CommentableWithComponent concern method.

Returns:

  • (Boolean)

111
112
113
114
115
116
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 111

def accepts_new_comments?
  return false unless open?
  return false if closed?

  commentable? && !comments_blocked? && comments_allowed?
end

#allow_resource_permissions?Boolean

Public: Overrides the `allow_resource_permissions?` Resourceable concern method.

Returns:

  • (Boolean)

141
142
143
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 141

def allow_resource_permissions?
  true
end

#ama?Boolean

Public: Calculates whether the current debate is an AMA-styled one or not. AMA-styled debates are those that have a start and end time set, and comments are only open during that timelapse. AMA stands for Ask Me Anything, a type of debate inspired by Reddit.

Returns a Boolean.

Returns:

  • (Boolean)

92
93
94
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 92

def ama?
  start_time.present? && end_time.present?
end

#closeable_by?(user) ⇒ Boolean

Checks whether the user can edit the debate.

user - the user to check for authorship

Returns:

  • (Boolean)

175
176
177
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 175

def closeable_by?(user)
  authored_by?(user)
end

#closed?Boolean

Checks whether the debate is closed or not.

Returns:

  • (Boolean)

168
169
170
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 168

def closed?
  closed_at.present? && conclusions.present?
end

#commentable_typeObject

Public: Identifies the commentable type in the API.


129
130
131
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 129

def commentable_type
  self.class.name
end

#comments_end_timeObject


67
68
69
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 67

def comments_end_time
  end_time
end

#comments_have_alignment?Boolean

Public: Overrides the `comments_have_alignment?` Commentable concern method.

Returns:

  • (Boolean)

119
120
121
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 119

def comments_have_alignment?
  true
end

#comments_have_votes?Boolean

Public: Overrides the `comments_have_votes?` Commentable concern method.

Returns:

  • (Boolean)

124
125
126
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 124

def comments_have_votes?
  true
end

#comments_start_timeObject


63
64
65
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 63

def comments_start_time
  start_time
end

#editable_by?(user) ⇒ Boolean

Checks whether the user can edit the debate.

user - the user to check for authorship

Returns:

  • (Boolean)

162
163
164
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 162

def editable_by?(user)
  !closed? && authored_by?(user)
end

#open?Boolean

Public: Checks if the debate is open or not.

Returns a boolean.

Returns:

  • (Boolean)

106
107
108
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 106

def open?
  (ama? && open_ama?) || !ama?
end

#open_ama?Boolean

Public: Checks whether the debate is an AMA-styled one and is open.

Returns a boolean.

Returns:

  • (Boolean)

99
100
101
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 99

def open_ama?
  ama? && Time.current.between?(start_time, end_time)
end

#reported_attributesObject

Public: Overrides the `reported_attributes` Reportable concern method.


77
78
79
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 77

def reported_attributes
  [:title, :description]
end

#reported_content_urlObject

Public: Overrides the `reported_content_url` Reportable concern method.


72
73
74
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 72

def reported_content_url
  ResourceLocatorPresenter.new(self).url
end

#reported_searchable_content_extrasObject

Public: Overrides the `reported_searchable_content_extras` Reportable concern method.


82
83
84
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 82

def reported_searchable_content_extras
  [normalized_author.name]
end

#update_comments_countObject

Public: Updates the comments counter cache. We have to do it these way in order to properly calculate the counter with hidden comments.

rubocop:disable Rails/SkipsModelValidations


184
185
186
187
188
189
190
191
192
193
194
195
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 184

def update_comments_count
  comments_count = comments.not_hidden.not_deleted.count
  last_comment = comments.not_hidden.not_deleted.order("created_at DESC").first

  update_columns(
    last_comment_at: last_comment&.created_at,
    last_comment_by_id: last_comment&.decidim_user_group_id || last_comment&.decidim_author_id,
    last_comment_by_type: last_comment&.decidim_author_type,
    comments_count: comments_count,
    updated_at: Time.current
  )
end

#users_to_notify_on_comment_createdObject

Public: Override Commentable concern method `users_to_notify_on_comment_created`


134
135
136
137
138
# File 'decidim-debates/app/models/decidim/debates/debate.rb', line 134

def users_to_notify_on_comment_created
  return Decidim::User.where(id: followers).or(Decidim::User.where(id: component.participatory_space.admins)).distinct if official?

  followers
end