Class: Decidim::User

Inherits:
UserBaseEntity show all
Includes:
ActsAsAuthor, DataPortability, Searchable, Traceable, UserReportable
Defined in:
decidim-core/app/models/decidim/user.rb

Overview

A User is a citizen that wants to join the platform to participate.

Defined Under Namespace

Classes: Roles

Constant Summary collapse

REGEXP_NICKNAME =
/\A[\w\-]+\z/.freeze

Constants inherited from UserBaseEntity

Decidim::UserBaseEntity::REGEXP_NAME

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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 inherited from UserBaseEntity

#following

Methods included from HasUploadValidations

#maximum_avatar_size, #maximum_upload_size

Methods included from Followable

#followers

Instance Attribute Details

#invitation_instructionsObject

Public: Allows customizing the invitation instruction email content when inviting a user.

Returns a String.


104
105
106
# File 'decidim-core/app/models/decidim/user.rb', line 104

def invitation_instructions
  @invitation_instructions
end

#newsletter_notificationsObject

Returns the value of attribute newsletter_notifications


83
84
85
# File 'decidim-core/app/models/decidim/user.rb', line 83

def newsletter_notifications
  @newsletter_notifications
end

Class Method Details

.data_portability_images(user) ⇒ Object


193
194
195
# File 'decidim-core/app/models/decidim/user.rb', line 193

def self.data_portability_images(user)
  user_collection(user).map(&:avatar)
end

.export_serializerObject


189
190
191
# File 'decidim-core/app/models/decidim/user.rb', line 189

def self.export_serializer
  Decidim::DataPortabilitySerializers::DataPortabilityUserSerializer
end

.find_for_authentication(warden_conditions) ⇒ Object

Check if the user exists with the given email and the current organization

warden_conditions - A hash with the authentication conditions

* email - a String that represents user's email.
* env - A Hash containing environment variables.

Returns a User.


177
178
179
180
181
182
183
# File 'decidim-core/app/models/decidim/user.rb', line 177

def self.find_for_authentication(warden_conditions)
  organization = warden_conditions.dig(:env, "decidim.current_organization")
  find_by(
    email: warden_conditions[:email].to_s.downcase,
    decidim_organization_id: organization.id
  )
end

.has_pending_invitations?(organization_id, email) ⇒ Boolean

Returns the user corresponding to the given email if it exists and has pending invitations,

otherwise returns nil.

Returns:

  • (Boolean)

108
109
110
# File 'decidim-core/app/models/decidim/user.rb', line 108

def self.has_pending_invitations?(organization_id, email)
  invitation_not_accepted.find_by(decidim_organization_id: organization_id, email: email)
end

.log_presenter_class_for(_log) ⇒ Object


118
119
120
# File 'decidim-core/app/models/decidim/user.rb', line 118

def self.log_presenter_class_for(_log)
  Decidim::AdminLog::UserPresenter
end

.user_collection(user) ⇒ Object


185
186
187
# File 'decidim-core/app/models/decidim/user.rb', line 185

def self.user_collection(user)
  where(id: user.id)
end

Instance Method Details

#accepted_user_groupsObject

return the groups where this user has been accepted


241
242
243
# File 'decidim-core/app/models/decidim/user.rb', line 241

def accepted_user_groups
  UserGroups::AcceptedUserGroups.for(self)
end

#accepts_conversation?(user) ⇒ Boolean

Public: whether the user accepts direct messages from another

Returns:

  • (Boolean)

157
158
159
160
161
# File 'decidim-core/app/models/decidim/user.rb', line 157

def accepts_conversation?(user)
  return follows?(user) if direct_message_types == "followed-only"

  true
end

#active_roleObject

Public: Returns the active role of the user


133
134
135
# File 'decidim-core/app/models/decidim/user.rb', line 133

def active_role
  admin ? "admin" : roles.first
end

#admin_terms_accepted?Boolean

Returns:

  • (Boolean)

207
208
209
# File 'decidim-core/app/models/decidim/user.rb', line 207

def admin_terms_accepted?
  return true if admin_terms_accepted_at
end

#authenticatable_saltObject


250
251
252
# File 'decidim-core/app/models/decidim/user.rb', line 250

def authenticatable_salt
  "#{super}#{session_token}"
end

#being_impersonated?Boolean

Returns:

  • (Boolean)

216
217
218
# File 'decidim-core/app/models/decidim/user.rb', line 216

def being_impersonated?
  ImpersonationLog.active.exists?(user: self)
end

#data_portability_file(filename) ⇒ Object

Caches a Decidim::DataPortabilityUploader with the retrieved file.


233
234
235
236
237
238
# File 'decidim-core/app/models/decidim/user.rb', line 233

def data_portability_file(filename)
  @data_portability_file ||= DataPortabilityUploader.new(self).tap do |uploader|
    uploader.retrieve_from_store!(filename)
    uploader.cache!(filename)
  end
end

#deleted?Boolean

Check if the user account has been deleted or not

Returns:

  • (Boolean)

143
144
145
# File 'decidim-core/app/models/decidim/user.rb', line 143

def deleted?
  deleted_at.present?
end

#follows?(followable) ⇒ Boolean

Returns:

  • (Boolean)

152
153
154
# File 'decidim-core/app/models/decidim/user.rb', line 152

def follows?(followable)
  Decidim::Follow.where(user: self, followable: followable).any?
end

#interested_scopesObject


224
225
226
# File 'decidim-core/app/models/decidim/user.rb', line 224

def interested_scopes
  @interested_scopes ||= organization.scopes.where(id: interested_scopes_ids)
end

#interested_scopes_idsObject


220
221
222
# File 'decidim-core/app/models/decidim/user.rb', line 220

def interested_scopes_ids
  extended_data["interested_scopes"] || []
end

#invalidate_all_sessions!Object


254
255
256
257
# File 'decidim-core/app/models/decidim/user.rb', line 254

def invalidate_all_sessions!
  self.session_token = SecureRandom.hex
  save!
end

#manageable_user_groupsObject

return the groups where this user has admin permissions


246
247
248
# File 'decidim-core/app/models/decidim/user.rb', line 246

def manageable_user_groups
  UserGroups::ManageableUserGroups.for(self)
end

#nameObject

Public: returns the user's name or the default one


138
139
140
# File 'decidim-core/app/models/decidim/user.rb', line 138

def name
  super || I18n.t("decidim.anonymous_user")
end

#officialized?Boolean

Public: whether the user has been officialized or not

Returns:

  • (Boolean)

148
149
150
# File 'decidim-core/app/models/decidim/user.rb', line 148

def officialized?
  !officialized_at.nil?
end

#presenterObject

Returns the presenter for this author, to be used in the views. Required by ActsAsAuthor.


114
115
116
# File 'decidim-core/app/models/decidim/user.rb', line 114

def presenter
  Decidim::UserPresenter.new(self)
end

#role?(role) ⇒ Boolean

Checks if the user has the given `role` or not.

role - a String or a Symbol that represents the role that is being

checked

Returns a boolean.

Returns:

  • (Boolean)

128
129
130
# File 'decidim-core/app/models/decidim/user.rb', line 128

def role?(role)
  roles.include?(role.to_s)
end

#tos_accepted?Boolean

Returns:

  • (Boolean)

197
198
199
200
201
202
203
204
205
# File 'decidim-core/app/models/decidim/user.rb', line 197

def tos_accepted?
  return true if managed
  return false if accepted_tos_version.nil?

  # For some reason, if we don't use `#to_i` here we get some
  # cases where the comparison returns false, but calling `#to_i` returns
  # the same number :/
  accepted_tos_version.to_i >= organization.tos_version.to_i
end

#unread_conversationsObject


163
164
165
# File 'decidim-core/app/models/decidim/user.rb', line 163

def unread_conversations
  Decidim::Messaging::Conversation.unread_by(self)
end

#unread_messages_countObject


167
168
169
# File 'decidim-core/app/models/decidim/user.rb', line 167

def unread_messages_count
  @unread_messages_count ||= Decidim::Messaging::Receipt.unread_count(self)
end

#user_invited?Boolean

Returns:

  • (Boolean)

96
97
98
# File 'decidim-core/app/models/decidim/user.rb', line 96

def user_invited?
  invitation_token_changed? && invitation_accepted_at_changed?
end

#user_nameObject


228
229
230
# File 'decidim-core/app/models/decidim/user.rb', line 228

def user_name
  extended_data["user_name"] || name
end

#verifiable?Boolean

Whether this user can be verified against some authorization or not.

Returns:

  • (Boolean)

212
213
214
# File 'decidim-core/app/models/decidim/user.rb', line 212

def verifiable?
  confirmed? || managed? || being_impersonated?
end