decidim-initiatives 0.30.1 → 0.31.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +46 -9
- data/app/cells/decidim/initiatives/content_blocks/highlighted_initiatives_settings_form/show.erb +7 -2
- data/app/cells/decidim/initiatives/initiative_g_cell.rb +5 -1
- data/app/commands/decidim/initiatives/admin/publish_initiative.rb +1 -5
- data/app/commands/decidim/initiatives/admin/update_initiative.rb +1 -2
- data/app/commands/decidim/initiatives/create_initiative.rb +0 -1
- data/app/commands/decidim/initiatives/update_initiative.rb +1 -3
- data/app/commands/decidim/initiatives/vote_initiative.rb +1 -11
- data/app/controllers/concerns/decidim/initiatives/has_signature_workflow.rb +36 -0
- data/app/controllers/concerns/decidim/initiatives/needs_initiative.rb +1 -12
- data/app/controllers/decidim/initiatives/admin/initiatives_controller.rb +2 -2
- data/app/controllers/decidim/initiatives/admin/initiatives_settings_controller.rb +1 -1
- data/app/controllers/decidim/initiatives/admin/initiatives_type_scopes_controller.rb +2 -2
- data/app/controllers/decidim/initiatives/admin/initiatives_types_controller.rb +2 -2
- data/app/controllers/decidim/initiatives/committee_requests_controller.rb +10 -2
- data/app/controllers/decidim/initiatives/create_initiative_controller.rb +84 -18
- data/app/controllers/decidim/initiatives/initiative_signatures_controller.rb +133 -42
- data/app/controllers/decidim/initiatives/initiative_votes_controller.rb +3 -2
- data/app/controllers/decidim/initiatives/initiatives_controller.rb +21 -2
- data/app/forms/decidim/initiatives/admin/initiative_form.rb +0 -1
- data/app/forms/decidim/initiatives/initiative_form.rb +0 -3
- data/app/helpers/decidim/initiatives/application_helper.rb +2 -0
- data/app/helpers/decidim/initiatives/initiatives_helper.rb +0 -1
- data/app/models/decidim/initiative.rb +7 -31
- data/app/models/decidim/initiatives_committee_member.rb +1 -1
- data/app/models/decidim/initiatives_type.rb +5 -2
- data/app/models/decidim/initiatives_vote.rb +2 -2
- data/app/packs/entrypoints/decidim_initiatives.js +1 -1
- data/app/packs/entrypoints/decidim_initiatives_admin.scss +1 -1
- data/app/packs/src/decidim/initiatives/admin/initiatives_types.js +2 -11
- data/app/packs/src/decidim/initiatives/admin/invite_users.js +1 -1
- data/app/packs/src/decidim/initiatives/application.js +1 -1
- data/app/packs/src/decidim/initiatives/check_code.js +114 -0
- data/app/packs/src/decidim/initiatives/initiative_creation_wizard.js +16 -0
- data/app/packs/src/decidim/initiatives/scoped_type.js +1 -1
- data/app/packs/stylesheets/initiatives.scss +16 -2
- data/app/permissions/decidim/initiatives/admin/permissions.rb +4 -7
- data/app/permissions/decidim/initiatives/permissions.rb +26 -16
- data/app/presenters/decidim/initiative_presenter.rb +12 -6
- data/app/presenters/decidim/initiatives/admin_log/initiative_presenter.rb +1 -2
- data/app/queries/decidim/initiatives/initiatives_stats_followers_count.rb +14 -0
- data/app/queries/decidim/initiatives/initiatives_stats_participants_count.rb +14 -0
- data/app/serializers/decidim/initiatives/open_data_initiative_serializer.rb +0 -1
- data/app/services/decidim/initiatives/data_encryptor.rb +1 -1
- data/app/services/decidim/initiatives/legacy_signature_handler.rb +25 -0
- data/app/services/decidim/initiatives/progress_notifier.rb +1 -7
- data/app/services/decidim/initiatives/signature_handler.rb +248 -0
- data/app/services/decidim/initiatives/status_change_notifier.rb +1 -7
- data/app/views/decidim/initiatives/admin/committee_requests/index.html.erb +29 -11
- data/app/views/decidim/initiatives/admin/exports/_dropdown.html.erb +17 -20
- data/app/views/decidim/initiatives/admin/initiatives/_form.html.erb +7 -13
- data/app/views/decidim/initiatives/admin/initiatives/_initiative_attachments.erb +2 -2
- data/app/views/decidim/initiatives/admin/initiatives/index.html.erb +76 -47
- data/app/views/decidim/initiatives/admin/initiatives_types/_form.html.erb +13 -21
- data/app/views/decidim/initiatives/admin/initiatives_types/_initiative_type_scopes.html.erb +28 -12
- data/app/views/decidim/initiatives/admin/initiatives_types/index.html.erb +33 -15
- data/app/views/decidim/initiatives/create_initiative/_committee_member.html.erb +27 -0
- data/app/views/decidim/initiatives/create_initiative/_return_to_initiatives_button.html.erb +3 -0
- data/app/views/decidim/initiatives/create_initiative/_send_to_technical_validation_button.html.erb +10 -0
- data/app/views/decidim/initiatives/create_initiative/_share_committee_link.html.erb +5 -1
- data/app/views/decidim/initiatives/create_initiative/fill_data.html.erb +7 -11
- data/app/views/decidim/initiatives/create_initiative/finish.html.erb +16 -13
- data/app/views/decidim/initiatives/create_initiative/promotal_committee.html.erb +33 -6
- data/app/views/decidim/initiatives/create_initiative/select_initiative_type.html.erb +40 -26
- data/app/views/decidim/initiatives/initiative_signatures/_sms_code_form.html.erb +22 -0
- data/app/views/decidim/initiatives/initiative_signatures/_sms_phone_number_form.html.erb +13 -0
- data/app/views/decidim/initiatives/initiative_signatures/fill_personal_data.html.erb +23 -22
- data/app/views/decidim/initiatives/initiative_signatures/finish.html.erb +17 -5
- data/app/views/decidim/initiatives/initiative_signatures/sms_code.html.erb +6 -8
- data/app/views/decidim/initiatives/initiative_signatures/sms_phone_number.html.erb +3 -8
- data/app/views/decidim/initiatives/initiative_signatures/update_buttons_and_counters.js.erb +3 -14
- data/app/views/decidim/initiatives/initiative_votes/update_buttons_and_counters.js.erb +3 -14
- data/app/views/decidim/initiatives/initiatives/_committee_members.html.erb +1 -1
- data/app/views/decidim/initiatives/initiatives/_form.html.erb +1 -3
- data/app/views/decidim/initiatives/initiatives/_new_initiative_button.html.erb +10 -3
- data/app/views/decidim/initiatives/initiatives/_pending_initiatives.html.erb +5 -0
- data/app/views/decidim/initiatives/initiatives/index.html.erb +8 -0
- data/app/views/decidim/initiatives/initiatives/show.html.erb +2 -2
- data/app/views/layouts/decidim/_initiative_signature_creation_header.html.erb +20 -2
- data/app/views/layouts/decidim/admin/_manage_initiatives.html.erb +1 -1
- data/app/views/layouts/decidim/initiative_signature_creation.html.erb +3 -1
- data/config/assets.rb +2 -2
- data/config/locales/ar.yml +0 -45
- data/config/locales/bg.yml +0 -54
- data/config/locales/ca-IT.yml +99 -51
- data/config/locales/ca.yml +99 -51
- data/config/locales/cs.yml +93 -54
- data/config/locales/de.yml +100 -52
- data/config/locales/el.yml +0 -45
- data/config/locales/en.yml +99 -51
- data/config/locales/es-MX.yml +99 -51
- data/config/locales/es-PY.yml +99 -51
- data/config/locales/es.yml +99 -51
- data/config/locales/eu.yml +120 -72
- data/config/locales/fi-plain.yml +99 -51
- data/config/locales/fi.yml +99 -51
- data/config/locales/fr-CA.yml +44 -51
- data/config/locales/fr.yml +44 -51
- data/config/locales/ga-IE.yml +0 -17
- data/config/locales/gl.yml +0 -41
- data/config/locales/hu.yml +0 -54
- data/config/locales/id-ID.yml +0 -40
- data/config/locales/is-IS.yml +0 -22
- data/config/locales/it.yml +0 -53
- data/config/locales/ja.yml +98 -49
- data/config/locales/lb.yml +0 -50
- data/config/locales/lt.yml +0 -56
- data/config/locales/lv.yml +0 -46
- data/config/locales/nl.yml +0 -47
- data/config/locales/no.yml +0 -53
- data/config/locales/pl.yml +0 -56
- data/config/locales/pt-BR.yml +0 -53
- data/config/locales/pt.yml +0 -53
- data/config/locales/ro-RO.yml +92 -50
- data/config/locales/ru.yml +0 -25
- data/config/locales/sk.yml +0 -43
- data/config/locales/sl.yml +0 -1
- data/config/locales/sv.yml +10 -53
- data/config/locales/tr-TR.yml +0 -53
- data/config/locales/uk.yml +0 -25
- data/config/locales/zh-CN.yml +0 -45
- data/config/locales/zh-TW.yml +0 -53
- data/db/migrate/20250605104500_remove_hashtag_column_initiatives.rb +7 -0
- data/lib/decidim/api/initiative_api_type.rb +3 -0
- data/lib/decidim/api/initiative_type.rb +23 -4
- data/lib/decidim/exporters/initiative_votes_pdf.rb +1 -1
- data/lib/decidim/initiatives/default_signature_authorizer.rb +17 -0
- data/lib/decidim/initiatives/engine.rb +17 -14
- data/lib/decidim/initiatives/menu.rb +1 -1
- data/lib/decidim/initiatives/participatory_space.rb +15 -1
- data/lib/decidim/initiatives/seeds.rb +1 -2
- data/lib/decidim/initiatives/signature_workflow_manifest.rb +176 -0
- data/lib/decidim/initiatives/signatures.rb +12 -0
- data/lib/decidim/initiatives/test/factories.rb +7 -7
- data/lib/decidim/initiatives/test/initiatives_signatures_test_helpers.rb +19 -0
- data/lib/decidim/initiatives/validatable_authorizations.rb +83 -0
- data/lib/decidim/initiatives/version.rb +1 -1
- data/lib/decidim/initiatives.rb +23 -12
- metadata +33 -21
- data/app/events/decidim/initiatives/endorse_initiative_event.rb +0 -13
- data/app/forms/decidim/initiatives/vote_form.rb +0 -208
- data/app/packs/src/decidim/initiatives/identity_selector_dialog.js +0 -14
- data/app/services/decidim/initiatives/pdf_signature_example.rb +0 -110
- data/app/views/decidim/initiatives/initiative_signatures/_wizard_steps.html.erb +0 -15
- data/app/views/decidim/initiatives/initiatives/_interactions.html.erb +0 -10
- data/app/views/layouts/decidim/_initiative_header.html.erb +0 -27
@@ -1,110 +0,0 @@
|
|
1
|
-
# frozen_string_literal: false
|
2
|
-
|
3
|
-
require "hexapdf"
|
4
|
-
require "tempfile"
|
5
|
-
|
6
|
-
module Decidim
|
7
|
-
module Initiatives
|
8
|
-
# Example of service to add a signature to a pdf
|
9
|
-
class PdfSignatureExample
|
10
|
-
attr_accessor :pdf
|
11
|
-
|
12
|
-
# Public: Initializes the service.
|
13
|
-
# pdf - The pdf document to be signed
|
14
|
-
def initialize(args = {})
|
15
|
-
@pdf = args.fetch(:pdf)
|
16
|
-
end
|
17
|
-
|
18
|
-
# Public: PDF signed using a new certificate generated by the service
|
19
|
-
def signed_pdf
|
20
|
-
signed_file = Tempfile.new("signed_pdf")
|
21
|
-
|
22
|
-
doc = HexaPDF::Document.new(io: StringIO.new(pdf))
|
23
|
-
|
24
|
-
# Prepare the document for embedding of the digital signature
|
25
|
-
data = nil # Used for storing the to-be-signed data
|
26
|
-
signing_mechanism = lambda do |io, byte_range|
|
27
|
-
# Store the to-be-signed data in the local variable data
|
28
|
-
io.pos = byte_range[0]
|
29
|
-
data = io.read(byte_range[1])
|
30
|
-
io.pos = byte_range[2]
|
31
|
-
data << io.read(byte_range[3])
|
32
|
-
""
|
33
|
-
end
|
34
|
-
doc.sign(signed_file.path, signature: signature_widget(doc), reason: caption, signature_size: 10_000, external_signing: signing_mechanism)
|
35
|
-
|
36
|
-
signature = OpenSSL::PKCS7.sign(certificate, key, data,
|
37
|
-
# [HexaPDF.demo_cert.sub_ca, HexaPDF.demo_cert.root_ca],
|
38
|
-
[],
|
39
|
-
OpenSSL::PKCS7::DETACHED | OpenSSL::PKCS7::BINARY).to_der
|
40
|
-
|
41
|
-
# Embed the signature
|
42
|
-
HexaPDF::DigitalSignature::Signing.embed_signature(File.open(signed_file.path, "rb+"), signature)
|
43
|
-
|
44
|
-
File.binread(signed_file.path)
|
45
|
-
ensure
|
46
|
-
signed_file.close
|
47
|
-
signed_file.unlink
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def signature_widget(doc)
|
53
|
-
form = doc.acro_form(create: true)
|
54
|
-
form.signature_flag(:append_only)
|
55
|
-
|
56
|
-
sig_field = form.create_signature_field("signature")
|
57
|
-
|
58
|
-
widget = sig_field.create_widget(doc.pages[doc.pages.length - 1], Rect: [60, 50, 250, 620])
|
59
|
-
widget.flag(:print)
|
60
|
-
xobject = (widget[:AP] ||= {})[:N] ||= doc.add({ Type: :XObject, Subtype: :Form }) # Create the appearance for the widget
|
61
|
-
xobject[:BBox] = [0, 0, widget[:Rect].width, widget[:Rect].height]
|
62
|
-
xobject.canvas
|
63
|
-
.font("Helvetica", size: 10)
|
64
|
-
.text(caption, at: [10, 30])
|
65
|
-
|
66
|
-
sig = doc.add({ Type: :Sig }) # set an empty signature and apply it to the field
|
67
|
-
sig_field.field_value = sig
|
68
|
-
sig
|
69
|
-
end
|
70
|
-
|
71
|
-
def certificate
|
72
|
-
@certificate ||= OpenSSL::X509::Certificate.new.tap do |cert|
|
73
|
-
cert.not_before = Time.current
|
74
|
-
cert.not_after = 10.years.from_now
|
75
|
-
|
76
|
-
cert.public_key = key.public_key
|
77
|
-
cert.sign(key, OpenSSL::Digest.new("SHA256"))
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def key
|
82
|
-
@key ||= OpenSSL::PKey::RSA.new(2048)
|
83
|
-
end
|
84
|
-
|
85
|
-
def caption
|
86
|
-
@caption ||= "Digitally Signed By: #{signedby}\nContact: #{contact}\nLocation: #{location}\nDate: #{date.iso8601}"
|
87
|
-
end
|
88
|
-
|
89
|
-
def signedby
|
90
|
-
"Test"
|
91
|
-
end
|
92
|
-
|
93
|
-
def location
|
94
|
-
"Barcelona"
|
95
|
-
end
|
96
|
-
|
97
|
-
def contact
|
98
|
-
"test@example.org"
|
99
|
-
end
|
100
|
-
|
101
|
-
def issuer
|
102
|
-
"Decidim"
|
103
|
-
end
|
104
|
-
|
105
|
-
def date
|
106
|
-
Time.current
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
<% scope = "layouts.decidim.initiative_signature_creation_header" %>
|
2
|
-
<ol id="wizard-steps" class="wizard-steps">
|
3
|
-
<% options = { data: { active: false }, aria: { current: "step" } } %>
|
4
|
-
|
5
|
-
<% if fill_personal_data_step? %>
|
6
|
-
<%= content_tag :li, t("fill_personal_data", scope: ),
|
7
|
-
%w(fill_personal_data update_fill_personal_data).include?(action_name) ? options : {} %>
|
8
|
-
<% end %>
|
9
|
-
<% if sms_step? %>
|
10
|
-
<%= content_tag :li, t("sms_phone_number", scope: ),
|
11
|
-
%w(sms_phone_number update_sms_phone_number).include?(action_name) ? options : {} %>
|
12
|
-
<%= content_tag :li, t("sms_code", scope: ), %w(sms_code update_sms_code).include?(action_name) ? options : {} %>
|
13
|
-
<% end %>
|
14
|
-
<%= content_tag :li, t("finish", scope: ), action_name == "finish" ? options : {} %>
|
15
|
-
</ol>
|
@@ -1,10 +0,0 @@
|
|
1
|
-
<div class="row collapse">
|
2
|
-
<div class="column collapse">
|
3
|
-
<%= link_to "#comments", class: "button small compact hollow button--nomargin expanded" do %>
|
4
|
-
<%= icon "chat-1-line", class: "icon--small", role: "img", "aria-hidden": true %>
|
5
|
-
<%= stats.comments_count %>
|
6
|
-
<%= t(".comments_count.count", count: stats.comments_count) %>
|
7
|
-
<% end %>
|
8
|
-
</button>
|
9
|
-
</div>
|
10
|
-
</div>
|
@@ -1,27 +0,0 @@
|
|
1
|
-
<div class="process-header">
|
2
|
-
<div>
|
3
|
-
<div class="row column"
|
4
|
-
style="background-image:url('<%= current_participatory_space.type.attached_uploader(:banner_image).url %>');">
|
5
|
-
</div>
|
6
|
-
<div class="row collapse column">
|
7
|
-
<div class="columns">
|
8
|
-
<div>
|
9
|
-
<h1>
|
10
|
-
<%= participatory_space_helpers.translated_attribute(current_participatory_space.title) %>
|
11
|
-
</h1>
|
12
|
-
</div>
|
13
|
-
<div>
|
14
|
-
<p>
|
15
|
-
<% if current_participatory_space.hashtag.present? %>
|
16
|
-
<span>
|
17
|
-
<%= link_to "##{current_participatory_space.hashtag}", twitter_hashtag_url(current_participatory_space.hashtag), target: "_blank" %>
|
18
|
-
</span>
|
19
|
-
<% end %>
|
20
|
-
<%= strip_tags participatory_space_helpers.translated_attribute(current_participatory_space.type.title) %>
|
21
|
-
</p>
|
22
|
-
</div>
|
23
|
-
</div>
|
24
|
-
</div>
|
25
|
-
</div>
|
26
|
-
<%= extended_navigation_bar(initiative_nav_items(current_participatory_space)) %>
|
27
|
-
</div>
|