Class: Decidim::Initiatives::VoteForm

Inherits:
Form
  • Object
show all
Includes:
TranslatableAttributes
Defined in:
app/forms/decidim/initiatives/vote_form.rb

Overview

A form object used to collect the data for a new initiative.

Instance Method Summary collapse

Instance Method Details

#authorized_scope_candidatesObject

Public: Builds a list of Decidim::Scopes where the user could have a valid authorization.

If the initiative is set with a global scope (meaning the scope is nil), all the scopes in the organization are valid.

Returns an array of Decidim::Scopes.



100
101
102
103
104
105
106
107
108
# File 'app/forms/decidim/initiatives/vote_form.rb', line 100

def authorized_scope_candidates
  authorized_scope_candidates = [initiative.scope]
  authorized_scope_candidates += if initiative.scope.present?
                                   initiative.scope.descendants
                                 else
                                   initiative.organization.scopes
                                 end
  authorized_scope_candidates.uniq
end

#authorized_scopesObject

Public: Builds the list of scopes where the user is authorized to vote in. This is used when the initiative allows also voting on child scopes, not only the main scope.

Instead of just listing the children of the main scope, we just want to select the ones that have been added to the InitiativeType with its voting settings.



62
63
64
65
66
67
68
# File 'app/forms/decidim/initiatives/vote_form.rb', line 62

def authorized_scopes
  initiative.votable_initiative_type_scopes.select do |initiative_type_scope|
    initiative_type_scope.global_scope? ||
      initiative_type_scope.scope == user_authorized_scope ||
      initiative_type_scope.scope.ancestor_of?(user_authorized_scope)
  end.flat_map(&:scope)
end

#encrypted_metadataObject



34
35
36
37
38
# File 'app/forms/decidim/initiatives/vote_form.rb', line 34

def 
  return unless required_personal_data?

  @encrypted_metadata ||= encryptor.encrypt()
end

#hash_idObject

Public: The hash to uniquely identify an initiative vote. It uses the initiative scope as a default.

Returns a String.



44
45
46
47
48
49
50
51
52
53
54
# File 'app/forms/decidim/initiatives/vote_form.rb', line 44

def hash_id
  return unless initiative && (document_number || signer)

  @hash_id ||= Digest::MD5.hexdigest(
    [
      initiative.id,
      document_number || signer.id,
      Rails.application.secrets.secret_key_base
    ].compact.join("-")
  )
end

#metadataObject



110
111
112
113
114
115
116
117
# File 'app/forms/decidim/initiatives/vote_form.rb', line 110

def 
  {
    name_and_surname:,
    document_number:,
    date_of_birth:,
    postal_code:
  }
end

#user_authorized_scopeObject

Public: Finds the scope the user has an authorization for, this way the user can vote on that scope and its parents.

This is can be used to allow users that are authorized with a children scope to sign an initiative with a parent scope.

As an example: A city (global scope) has many districts (scopes with parent nil), and each district has different neighbourhoods (with its parent as a district). If we setup the authorization handler to match a neighbourhood, the same authorization can be used to participate in district, neighbourhoods or city initiatives.

Returns a Decidim::Scope.



83
84
85
86
87
88
89
90
91
# File 'app/forms/decidim/initiatives/vote_form.rb', line 83

def user_authorized_scope
  return scope if handler_name.blank?
  return unless authorized?
  return if authorization..blank?

  @user_authorized_scope ||= authorized_scope_candidates.find do |scope|
    scope&.id == authorization..symbolize_keys[:scope_id]
  end
end