Class: Decidim::Initiatives::VoteForm

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

Overview

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

Instance Method Summary collapse

Methods included from TranslatableAttributes

#default_locale?

Instance Method Details

#authorized_scope_candidatesObject

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

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

Returns an array of Decidim::Scopes.


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

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.


65
66
67
68
69
70
71
# File 'decidim-initiatives/app/forms/decidim/initiatives/vote_form.rb', line 65

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


37
38
39
40
41
# File 'decidim-initiatives/app/forms/decidim/initiatives/vote_form.rb', line 37

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.


47
48
49
50
51
52
53
54
55
56
57
# File 'decidim-initiatives/app/forms/decidim/initiatives/vote_form.rb', line 47

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


112
113
114
115
116
117
118
119
# File 'decidim-initiatives/app/forms/decidim/initiatives/vote_form.rb', line 112

def 
  {
    name_and_surname: name_and_surname,
    document_number: document_number,
    date_of_birth: date_of_birth,
    postal_code: 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.


86
87
88
89
90
91
92
93
# File 'decidim-initiatives/app/forms/decidim/initiatives/vote_form.rb', line 86

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

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