decidim-core 0.29.0.rc2 → 0.29.0.rc3
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/app/services/decidim/download_your_data_exporter.rb +36 -25
- data/decidim-core.gemspec +0 -1
- data/lib/decidim/core/engine.rb +8 -0
- data/lib/decidim/core/version.rb +1 -1
- data/lib/decidim/seven_zip_wrapper.rb +29 -0
- metadata +7 -21
- data/app/services/decidim/zip_stream/writer.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d58ac45e047a62b04a7625b6da1c4ee92c2a62d9bf4e1969cdfb324257e5ef9
|
4
|
+
data.tar.gz: 94a06bf8519d6234945a39dc86cc9794149fa3dc09c89273dcd475a64a3ad78b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e90186e86e894822888b13cbaabe6c8c2a752d73a477cb13b39be5fd785d9b92082e5e403de91790f43c19a78f83bb85253e4fa0475f086f64e90258b2593b3
|
7
|
+
data.tar.gz: f297c4b6a5fad64c57984fc063778cddda2404f3861e75b8a16c4fff83986caedc44354bba11a58551c5815dae0c9785b5f8d159a9a7e0930d2f080341b69579
|
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
4
|
-
require "zip"
|
5
|
-
require_relative "zip_stream/writer"
|
3
|
+
require "decidim/seven_zip_wrapper"
|
6
4
|
|
7
5
|
module Decidim
|
8
6
|
# Public: Generates a 7z(seven zip) file with data files ready to be persisted
|
@@ -10,8 +8,6 @@ module Decidim
|
|
10
8
|
#
|
11
9
|
# In fact, the 7z file wraps a ZIP file which finally contains the data files.
|
12
10
|
class DownloadYourDataExporter
|
13
|
-
include ::Decidim::ZipStream::Writer
|
14
|
-
|
15
11
|
DEFAULT_EXPORT_FORMAT = "CSV"
|
16
12
|
ZIP_FILE_NAME = "download-your-data.zip"
|
17
13
|
|
@@ -29,36 +25,25 @@ module Decidim
|
|
29
25
|
end
|
30
26
|
|
31
27
|
def export
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
39
|
-
end
|
28
|
+
tmpdir = Dir.mktmpdir("temporary-download-your-data-dir")
|
29
|
+
user_data, user_attachments = data_and_attachments_for_user
|
30
|
+
save_user_data(tmpdir, user_data)
|
31
|
+
save_user_attachments(tmpdir, user_attachments)
|
32
|
+
|
33
|
+
SevenZipWrapper.compress_and_encrypt(filename: @path, password: @password, input_directory: tmpdir)
|
40
34
|
end
|
41
35
|
|
42
36
|
private
|
43
37
|
|
44
|
-
|
45
|
-
buffer = Zip::OutputStream.write_buffer do |out|
|
46
|
-
user_data, attachments = data_for(@user, @export_format)
|
38
|
+
attr_reader :user, :export_format
|
47
39
|
|
48
|
-
|
49
|
-
add_attachments_to_zip_stream(out, attachments)
|
50
|
-
end
|
51
|
-
|
52
|
-
buffer.string
|
53
|
-
end
|
54
|
-
|
55
|
-
def data_for(user, format)
|
40
|
+
def data_and_attachments_for_user
|
56
41
|
export_data = []
|
57
42
|
export_attachments = []
|
58
43
|
|
59
44
|
download_your_data_entities.each do |object|
|
60
45
|
klass = Object.const_get(object)
|
61
|
-
export_data << [klass.model_name.name.parameterize.pluralize, Exporters.find_exporter(
|
46
|
+
export_data << [klass.model_name.name.parameterize.pluralize, Exporters.find_exporter(export_format).new(klass.user_collection(user), klass.export_serializer).export]
|
62
47
|
attachments = klass.download_your_data_images(user)
|
63
48
|
export_attachments << [klass.model_name.name.parameterize.pluralize, attachments.flatten] unless attachments.nil?
|
64
49
|
end
|
@@ -69,5 +54,31 @@ module Decidim
|
|
69
54
|
def download_your_data_entities
|
70
55
|
@download_your_data_entities ||= DownloadYourDataSerializers.data_entities
|
71
56
|
end
|
57
|
+
|
58
|
+
def save_user_data(tmpdir, user_data)
|
59
|
+
user_data.each do |entity, exporter_data|
|
60
|
+
next if exporter_data.read == "\n"
|
61
|
+
|
62
|
+
file_name = File.join(tmpdir, "#{entity}-#{exporter_data.filename}")
|
63
|
+
File.write(file_name, exporter_data.read)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def save_user_attachments(tmpdir, user_attachments)
|
68
|
+
user_attachments.each do |entity, attachment_block|
|
69
|
+
attachment_block.each do |attachment|
|
70
|
+
next unless attachment.attached?
|
71
|
+
|
72
|
+
blobs = attachment.is_a?(ActiveStorage::Attached::One) ? [attachment.blob] : attachment.blobs
|
73
|
+
blobs.each do |blob|
|
74
|
+
Dir.mkdir(File.join(tmpdir, entity.parameterize))
|
75
|
+
file_name = File.join(tmpdir, entity.parameterize, blob.filename.to_s)
|
76
|
+
blob.open do |blob_file|
|
77
|
+
File.write(file_name, blob_file.read.force_encoding("UTF-8"))
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
72
83
|
end
|
73
84
|
end
|
data/decidim-core.gemspec
CHANGED
@@ -80,7 +80,6 @@ Gem::Specification.new do |s|
|
|
80
80
|
s.add_dependency "request_store", "~> 1.5.0"
|
81
81
|
s.add_dependency "rubyXL", "~> 3.4"
|
82
82
|
s.add_dependency "rubyzip", "~> 2.0"
|
83
|
-
s.add_dependency "seven_zip_ruby", "~> 1.3"
|
84
83
|
s.add_dependency "shakapacker", "~> 7.1.0"
|
85
84
|
s.add_dependency "valid_email2", "~> 4.0"
|
86
85
|
s.add_dependency "web-push", "~> 3.0"
|
data/lib/decidim/core/engine.rb
CHANGED
@@ -239,6 +239,14 @@ module Decidim
|
|
239
239
|
app.config.action_mailer.deliver_later_queue_name = :mailers
|
240
240
|
end
|
241
241
|
|
242
|
+
initializer "decidim_core.signed_global_id", after: "global_id" do |app|
|
243
|
+
next if app.config.global_id.fetch(:expires_in, nil).present?
|
244
|
+
|
245
|
+
config.after_initialize do
|
246
|
+
SignedGlobalID.expires_in = nil
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
242
250
|
initializer "decidim_core.middleware" do |app|
|
243
251
|
if app.config.public_file_server.enabled
|
244
252
|
headers = app.config.public_file_server.headers || {}
|
data/lib/decidim/core/version.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "shellwords"
|
4
|
+
|
5
|
+
module Decidim
|
6
|
+
class SevenZipWrapper
|
7
|
+
class << self
|
8
|
+
def compress_and_encrypt(filename:, password:, input_directory:)
|
9
|
+
run("cd #{escape(input_directory)} && 7z a -tzip -p#{escape(password)} -mem=AES256 #{escape(filename)} .")
|
10
|
+
end
|
11
|
+
|
12
|
+
def extract_and_decrypt(filename:, password:, output_directory:)
|
13
|
+
run("7z x -tzip #{escape(filename)} -o#{escape(output_directory)} -p#{escape(password)}")
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def run(command)
|
19
|
+
success = system(command)
|
20
|
+
|
21
|
+
raise "Command failed: #{command}" unless success
|
22
|
+
end
|
23
|
+
|
24
|
+
def escape(string)
|
25
|
+
Shellwords.escape(string)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: decidim-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.29.0.
|
4
|
+
version: 0.29.0.rc3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josep Jaume Rey Peroy
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-07-
|
13
|
+
date: 2024-07-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: active_link_to
|
@@ -696,20 +696,6 @@ dependencies:
|
|
696
696
|
- - "~>"
|
697
697
|
- !ruby/object:Gem::Version
|
698
698
|
version: '2.0'
|
699
|
-
- !ruby/object:Gem::Dependency
|
700
|
-
name: seven_zip_ruby
|
701
|
-
requirement: !ruby/object:Gem::Requirement
|
702
|
-
requirements:
|
703
|
-
- - "~>"
|
704
|
-
- !ruby/object:Gem::Version
|
705
|
-
version: '1.3'
|
706
|
-
type: :runtime
|
707
|
-
prerelease: false
|
708
|
-
version_requirements: !ruby/object:Gem::Requirement
|
709
|
-
requirements:
|
710
|
-
- - "~>"
|
711
|
-
- !ruby/object:Gem::Version
|
712
|
-
version: '1.3'
|
713
699
|
- !ruby/object:Gem::Dependency
|
714
700
|
name: shakapacker
|
715
701
|
requirement: !ruby/object:Gem::Requirement
|
@@ -772,28 +758,28 @@ dependencies:
|
|
772
758
|
requirements:
|
773
759
|
- - '='
|
774
760
|
- !ruby/object:Gem::Version
|
775
|
-
version: 0.29.0.
|
761
|
+
version: 0.29.0.rc3
|
776
762
|
type: :development
|
777
763
|
prerelease: false
|
778
764
|
version_requirements: !ruby/object:Gem::Requirement
|
779
765
|
requirements:
|
780
766
|
- - '='
|
781
767
|
- !ruby/object:Gem::Version
|
782
|
-
version: 0.29.0.
|
768
|
+
version: 0.29.0.rc3
|
783
769
|
- !ruby/object:Gem::Dependency
|
784
770
|
name: decidim-dev
|
785
771
|
requirement: !ruby/object:Gem::Requirement
|
786
772
|
requirements:
|
787
773
|
- - '='
|
788
774
|
- !ruby/object:Gem::Version
|
789
|
-
version: 0.29.0.
|
775
|
+
version: 0.29.0.rc3
|
790
776
|
type: :development
|
791
777
|
prerelease: false
|
792
778
|
version_requirements: !ruby/object:Gem::Requirement
|
793
779
|
requirements:
|
794
780
|
- - '='
|
795
781
|
- !ruby/object:Gem::Version
|
796
|
-
version: 0.29.0.
|
782
|
+
version: 0.29.0.rc3
|
797
783
|
description: Adds core features so other engines can hook into the framework.
|
798
784
|
email:
|
799
785
|
- josepjaume@gmail.com
|
@@ -1907,7 +1893,6 @@ files:
|
|
1907
1893
|
- app/services/decidim/static_map_generator.rb
|
1908
1894
|
- app/services/decidim/tokenizer.rb
|
1909
1895
|
- app/services/decidim/traceability.rb
|
1910
|
-
- app/services/decidim/zip_stream/writer.rb
|
1911
1896
|
- app/uploaders/decidim/application_uploader.rb
|
1912
1897
|
- app/uploaders/decidim/attachment_uploader.rb
|
1913
1898
|
- app/uploaders/decidim/avatar_uploader.rb
|
@@ -2939,6 +2924,7 @@ files:
|
|
2939
2924
|
- lib/decidim/searchable.rb
|
2940
2925
|
- lib/decidim/seeds.rb
|
2941
2926
|
- lib/decidim/settings_manifest.rb
|
2927
|
+
- lib/decidim/seven_zip_wrapper.rb
|
2942
2928
|
- lib/decidim/shareable_with_token.rb
|
2943
2929
|
- lib/decidim/snippets.rb
|
2944
2930
|
- lib/decidim/social_share_service_manifest.rb
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Decidim
|
4
|
-
module ZipStream
|
5
|
-
module Writer
|
6
|
-
def add_user_data_to_zip_stream(out, user_data)
|
7
|
-
user_data.each do |element|
|
8
|
-
filename_file = element.last.filename(element.first.parameterize)
|
9
|
-
|
10
|
-
out.put_next_entry(filename_file)
|
11
|
-
if element.last.read.presence
|
12
|
-
out.write element.last.read
|
13
|
-
else
|
14
|
-
out.write "No data"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_attachments_to_zip_stream(out, export_attachments)
|
20
|
-
export_attachments.each do |attachment_block|
|
21
|
-
next if attachment_block.last.nil?
|
22
|
-
|
23
|
-
folder_name = attachment_block.first.parameterize
|
24
|
-
attachment_block.last.each do |attachment|
|
25
|
-
next unless attachment.attached?
|
26
|
-
|
27
|
-
blobs = attachment.is_a?(ActiveStorage::Attached::One) ? [attachment.blob] : attachment.blobs
|
28
|
-
blobs.each do |blob|
|
29
|
-
out.put_next_entry("#{folder_name}/#{blob.filename}")
|
30
|
-
blob.open do |f|
|
31
|
-
out << f.read
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|