decidim-blogs 0.29.2 → 0.30.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/app/cells/decidim/blogs/content_blocks/highlighted_posts_cell.rb +0 -3
  3. data/app/commands/decidim/blogs/create_post.rb +35 -0
  4. data/app/commands/decidim/blogs/update_post.rb +21 -0
  5. data/app/controllers/decidim/blogs/admin/posts_controller.rb +12 -9
  6. data/app/controllers/decidim/blogs/posts_controller.rb +61 -1
  7. data/app/forms/decidim/blogs/post_form.rb +52 -0
  8. data/app/helpers/decidim/blogs/posts_helper.rb +5 -0
  9. data/app/helpers/decidim/blogs/posts_select_helper.rb +32 -0
  10. data/app/models/decidim/blogs/post.rb +2 -1
  11. data/app/packs/stylesheets/blogs.scss +0 -20
  12. data/app/permissions/decidim/blog/permissions.rb +85 -2
  13. data/app/presenters/decidim/blogs/admin_log/post_presenter.rb +1 -1
  14. data/app/presenters/decidim/blogs/post_presenter.rb +25 -1
  15. data/app/views/decidim/blogs/admin/posts/_actions.html.erb +21 -0
  16. data/app/views/decidim/blogs/admin/posts/_post-tr.html.erb +25 -0
  17. data/app/views/decidim/blogs/admin/posts/_posts-thead.html.erb +9 -0
  18. data/app/views/decidim/blogs/admin/posts/index.html.erb +16 -55
  19. data/app/views/decidim/blogs/admin/posts/manage_trash.html.erb +20 -0
  20. data/app/views/decidim/blogs/posts/_actions.html.erb +7 -14
  21. data/app/views/decidim/blogs/posts/_form.html.erb +11 -0
  22. data/app/views/decidim/blogs/posts/_menu_actions.html.erb +21 -0
  23. data/app/views/decidim/blogs/posts/_schema_org_blog_posting_post.html.erb +3 -0
  24. data/app/views/decidim/blogs/posts/edit.html.erb +21 -0
  25. data/app/views/decidim/blogs/posts/index.html.erb +16 -1
  26. data/app/views/decidim/blogs/posts/new.html.erb +21 -0
  27. data/app/views/decidim/blogs/posts/show.html.erb +15 -6
  28. data/config/locales/ar.yml +0 -1
  29. data/config/locales/bg.yml +0 -3
  30. data/config/locales/ca.yml +58 -3
  31. data/config/locales/cs.yml +39 -4
  32. data/config/locales/de.yml +58 -3
  33. data/config/locales/el.yml +0 -3
  34. data/config/locales/en.yml +58 -3
  35. data/config/locales/es-MX.yml +58 -3
  36. data/config/locales/es-PY.yml +58 -3
  37. data/config/locales/es.yml +58 -3
  38. data/config/locales/eu.yml +58 -3
  39. data/config/locales/fi-plain.yml +39 -4
  40. data/config/locales/fi.yml +39 -4
  41. data/config/locales/fr-CA.yml +32 -2
  42. data/config/locales/fr.yml +32 -2
  43. data/config/locales/gl.yml +0 -1
  44. data/config/locales/hu.yml +0 -3
  45. data/config/locales/ja.yml +57 -2
  46. data/config/locales/kaa.yml +0 -1
  47. data/config/locales/ko.yml +0 -2
  48. data/config/locales/lt.yml +0 -3
  49. data/config/locales/nl.yml +0 -1
  50. data/config/locales/no.yml +0 -1
  51. data/config/locales/pl.yml +0 -3
  52. data/config/locales/pt-BR.yml +0 -3
  53. data/config/locales/ro-RO.yml +20 -1
  54. data/config/locales/ru.yml +0 -3
  55. data/config/locales/sq-AL.yml +0 -3
  56. data/config/locales/sv.yml +58 -3
  57. data/config/locales/zh-TW.yml +0 -3
  58. data/db/migrate/20200827153709_add_commentable_counter_cache_to_posts.rb +1 -1
  59. data/db/migrate/20210310120514_add_followable_counter_cache_to_blogs.rb +1 -1
  60. data/db/migrate/20240828103324_add_deleted_at_to_decidim_blogs_posts.rb +8 -0
  61. data/decidim-blogs.gemspec +1 -1
  62. data/lib/decidim/api/blogs_type.rb +4 -5
  63. data/lib/decidim/api/post_type.rb +2 -2
  64. data/lib/decidim/blogs/admin_engine.rb +7 -1
  65. data/lib/decidim/blogs/component.rb +27 -0
  66. data/lib/decidim/blogs/engine.rb +1 -1
  67. data/lib/decidim/blogs/post_serializer.rb +70 -0
  68. data/lib/decidim/blogs/schema_org_blog_posting_post_serializer.rb +81 -0
  69. data/lib/decidim/blogs/test/factories.rb +9 -0
  70. data/lib/decidim/blogs/version.rb +1 -1
  71. data/lib/decidim/blogs.rb +2 -0
  72. metadata +34 -18
@@ -11,9 +11,15 @@ module Decidim
11
11
  paths["lib/tasks"] = nil
12
12
 
13
13
  routes do
14
- resources :posts do
14
+ resources :posts, except: [:destroy] do
15
15
  resources :attachment_collections, except: [:show]
16
16
  resources :attachments, except: [:show]
17
+ get :manage_trash, on: :collection
18
+
19
+ member do
20
+ patch :soft_delete
21
+ patch :restore
22
+ end
17
23
  end
18
24
  root to: "posts#index"
19
25
  end
@@ -23,6 +23,7 @@ Decidim.register_component(:blogs) do |component|
23
23
  settings.attribute :announcement, type: :text, translated: true, editor: true
24
24
  settings.attribute :comments_enabled, type: :boolean, default: true
25
25
  settings.attribute :comments_max_length, type: :integer, required: true
26
+ settings.attribute :creation_enabled_for_participants, type: :boolean, default: false
26
27
  end
27
28
 
28
29
  component.settings(:step) do |settings|
@@ -39,6 +40,32 @@ Decidim.register_component(:blogs) do |component|
39
40
  resource.searchable = true
40
41
  end
41
42
 
43
+ component.exports :posts do |exports|
44
+ exports.collection do |component_instance|
45
+ Decidim::Blogs::Post
46
+ .not_hidden
47
+ .published
48
+ .where(component: component_instance)
49
+ .includes(component: { participatory_space: :organization })
50
+ end
51
+
52
+ exports.include_in_open_data = true
53
+
54
+ exports.serializer Decidim::Blogs::PostSerializer
55
+ end
56
+
57
+ component.exports :post_comments do |exports|
58
+ exports.collection do |component_instance|
59
+ Decidim::Comments::Export.comments_for_resource(
60
+ Decidim::Blogs::Post, component_instance
61
+ ).includes(:author, :user_group, root_commentable: { component: { participatory_space: :organization } })
62
+ end
63
+
64
+ exports.include_in_open_data = true
65
+
66
+ exports.serializer Decidim::Comments::CommentSerializer
67
+ end
68
+
42
69
  component.seeds do |participatory_space|
43
70
  require "decidim/blogs/seeds"
44
71
 
@@ -14,7 +14,7 @@ module Decidim
14
14
  isolate_namespace Decidim::Blogs
15
15
 
16
16
  routes do
17
- resources :posts, only: [:index, :show]
17
+ resources :posts
18
18
  scope "/posts" do
19
19
  root to: "posts#index"
20
20
  end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Blogs
5
+ # This class serializes a Post so can be exported to CSV, JSON or other
6
+ # formats.
7
+ class PostSerializer < Decidim::Exporters::Serializer
8
+ include Decidim::ApplicationHelper
9
+ include Decidim::ResourceHelper
10
+
11
+ # Public: Initializes the serializer with a post.
12
+ def initialize(post)
13
+ @post = post
14
+ end
15
+
16
+ # Public: Exports a hash with the serialized data for this post.
17
+ def serialize
18
+ {
19
+ id: post.id,
20
+ author: {
21
+ **author_fields
22
+ },
23
+ title: post.title,
24
+ body: post.body,
25
+ created_at: post.created_at,
26
+ updated_at: post.updated_at,
27
+ published_at: post.published_at,
28
+ endorsements_count: post.endorsements_count,
29
+ comments_count: post.comments_count,
30
+ follows_count: post.follows_count,
31
+ participatory_space: {
32
+ id: post.participatory_space.id,
33
+ url: Decidim::ResourceLocatorPresenter.new(post.participatory_space).url
34
+ },
35
+ component: { id: component.id },
36
+ url:
37
+ }
38
+ end
39
+
40
+ private
41
+
42
+ attr_reader :post
43
+ alias resource post
44
+
45
+ def url
46
+ Decidim::ResourceLocatorPresenter.new(post).url
47
+ end
48
+
49
+ def author_fields
50
+ {
51
+ id: resource.author.id,
52
+ name: author_name(resource.author),
53
+ url: author_url(resource.author)
54
+ }
55
+ end
56
+
57
+ def author_name(author)
58
+ translated_attribute(author.name)
59
+ end
60
+
61
+ def author_url(author)
62
+ if author.respond_to?(:nickname)
63
+ profile_url(author) # is a Decidim::User or Decidim::UserGroup
64
+ else
65
+ root_url # is a Decidim::Organization
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module Blogs
5
+ class SchemaOrgBlogPostingPostSerializer < Decidim::Exporters::Serializer
6
+ include Decidim::TranslationsHelper
7
+ include Decidim::SanitizeHelper
8
+ include ActionView::Helpers::UrlHelper
9
+
10
+ # Public: Initializes the serializer with a post.
11
+ def initialize(post)
12
+ @post = post
13
+ end
14
+
15
+ # Serializes a post for the Schema.org Event type
16
+ #
17
+ # @see https://schema.org/BlogPosting
18
+ # @see https://developers.google.com/search/docs/appearance/structured-data/article?hl=en
19
+ def serialize
20
+ attributes = {
21
+ "@context": "https://schema.org",
22
+ "@type": "BlogPosting",
23
+ headline: decidim_escape_translated(post.title),
24
+ author:
25
+ }
26
+
27
+ attributes = attributes.merge(image:) if post.photos.any?
28
+ attributes = attributes.merge(datePublished: published) if post.published?
29
+ attributes
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :post
35
+ alias resource post
36
+
37
+ def author
38
+ case post.author.class.name
39
+ when "Decidim::Organization"
40
+ author_organization
41
+ when "Decidim::UserGroup"
42
+ author_user_group
43
+ when "Decidim::User"
44
+ author_user
45
+ end
46
+ end
47
+
48
+ def author_user_group
49
+ {
50
+ "@type": "Organization",
51
+ name: post.author.name,
52
+ url: profile_url(post.author)
53
+ }
54
+ end
55
+
56
+ def author_organization
57
+ {
58
+ "@type": "Organization",
59
+ name: decidim_escape_translated(post.author.name),
60
+ url: EngineRouter.new("decidim", router_options).root_url
61
+ }
62
+ end
63
+
64
+ def author_user
65
+ {
66
+ "@type": "Person",
67
+ name: decidim_escape_translated(post.author.name),
68
+ url: profile_url(post.author)
69
+ }
70
+ end
71
+
72
+ def router_options = { host: post.organization.host }
73
+
74
+ def image = post.photos.map(&:thumbnail_url)
75
+
76
+ def published
77
+ post.published_at.iso8601
78
+ end
79
+ end
80
+ end
81
+ end
@@ -30,6 +30,14 @@ FactoryBot.define do
30
30
  }
31
31
  end
32
32
  end
33
+
34
+ trait :with_creation_enabled do
35
+ settings do
36
+ {
37
+ creation_enabled_for_participants: true
38
+ }
39
+ end
40
+ end
33
41
  end
34
42
 
35
43
  factory :post, class: "Decidim::Blogs::Post" do
@@ -41,6 +49,7 @@ FactoryBot.define do
41
49
  body { generate_localized_description(:blog_body, skip_injection:) }
42
50
  component { build(:post_component, skip_injection:) }
43
51
  author { build(:user, :confirmed, skip_injection:, organization: component.organization) }
52
+ deleted_at { nil }
44
53
 
45
54
  trait :with_endorsements do
46
55
  after :create do |post, evaluator|
@@ -4,7 +4,7 @@ module Decidim
4
4
  # This holds the decidim-pages version.
5
5
  module Blogs
6
6
  def self.version
7
- "0.29.2"
7
+ "0.30.0.rc1"
8
8
  end
9
9
  end
10
10
  end
data/lib/decidim/blogs.rb CHANGED
@@ -10,5 +10,7 @@ module Decidim
10
10
  # This namespace holds the logic of the `Blogs` component. This component
11
11
  # allows the admins to create a custom blog for a participatory process.
12
12
  module Blogs
13
+ autoload :PostSerializer, "decidim/blogs/post_serializer"
14
+ autoload :SchemaOrgBlogPostingPostSerializer, "decidim/blogs/schema_org_blog_posting_post_serializer"
13
15
  end
14
16
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-blogs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.29.2
4
+ version: 0.30.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Isaac Massot Gil
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-12 00:00:00.000000000 Z
11
+ date: 2025-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: decidim-admin
@@ -16,98 +16,98 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.29.2
19
+ version: 0.30.0.rc1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.29.2
26
+ version: 0.30.0.rc1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: decidim-comments
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.29.2
33
+ version: 0.30.0.rc1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.29.2
40
+ version: 0.30.0.rc1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: decidim-core
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 0.29.2
47
+ version: 0.30.0.rc1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 0.29.2
54
+ version: 0.30.0.rc1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: decidim-admin
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 0.29.2
61
+ version: 0.30.0.rc1
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 0.29.2
68
+ version: 0.30.0.rc1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: decidim-assemblies
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: 0.29.2
75
+ version: 0.30.0.rc1
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: 0.29.2
82
+ version: 0.30.0.rc1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: decidim-dev
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 0.29.2
89
+ version: 0.30.0.rc1
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 0.29.2
96
+ version: 0.30.0.rc1
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: decidim-participatory_processes
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - '='
102
102
  - !ruby/object:Gem::Version
103
- version: 0.29.2
103
+ version: 0.30.0.rc1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - '='
109
109
  - !ruby/object:Gem::Version
110
- version: 0.29.2
110
+ version: 0.30.0.rc1
111
111
  description: A Blog component for decidim's participatory spaces.
112
112
  email:
113
113
  - isaac.mg@coditramuntana.com
@@ -128,6 +128,8 @@ files:
128
128
  - app/cells/decidim/blogs/post_s_cell.rb
129
129
  - app/commands/decidim/blogs/admin/create_post.rb
130
130
  - app/commands/decidim/blogs/admin/update_post.rb
131
+ - app/commands/decidim/blogs/create_post.rb
132
+ - app/commands/decidim/blogs/update_post.rb
131
133
  - app/controllers/decidim/blogs/admin/application_controller.rb
132
134
  - app/controllers/decidim/blogs/admin/attachment_collections_controller.rb
133
135
  - app/controllers/decidim/blogs/admin/attachments_controller.rb
@@ -136,9 +138,11 @@ files:
136
138
  - app/controllers/decidim/blogs/posts_controller.rb
137
139
  - app/events/decidim/blogs/create_post_event.rb
138
140
  - app/forms/decidim/blogs/admin/post_form.rb
141
+ - app/forms/decidim/blogs/post_form.rb
139
142
  - app/helpers/decidim/blogs/admin/posts_helper.rb
140
143
  - app/helpers/decidim/blogs/application_helper.rb
141
144
  - app/helpers/decidim/blogs/posts_helper.rb
145
+ - app/helpers/decidim/blogs/posts_select_helper.rb
142
146
  - app/models/decidim/blogs/application_record.rb
143
147
  - app/models/decidim/blogs/post.rb
144
148
  - app/packs/entrypoints/decidim_blogs.js
@@ -148,12 +152,21 @@ files:
148
152
  - app/presenters/decidim/blogs/admin_log/post_presenter.rb
149
153
  - app/presenters/decidim/blogs/official_author_presenter.rb
150
154
  - app/presenters/decidim/blogs/post_presenter.rb
155
+ - app/views/decidim/blogs/admin/posts/_actions.html.erb
151
156
  - app/views/decidim/blogs/admin/posts/_form.html.erb
157
+ - app/views/decidim/blogs/admin/posts/_post-tr.html.erb
158
+ - app/views/decidim/blogs/admin/posts/_posts-thead.html.erb
152
159
  - app/views/decidim/blogs/admin/posts/edit.html.erb
153
160
  - app/views/decidim/blogs/admin/posts/index.html.erb
161
+ - app/views/decidim/blogs/admin/posts/manage_trash.html.erb
154
162
  - app/views/decidim/blogs/admin/posts/new.html.erb
155
163
  - app/views/decidim/blogs/posts/_actions.html.erb
164
+ - app/views/decidim/blogs/posts/_form.html.erb
165
+ - app/views/decidim/blogs/posts/_menu_actions.html.erb
166
+ - app/views/decidim/blogs/posts/_schema_org_blog_posting_post.html.erb
167
+ - app/views/decidim/blogs/posts/edit.html.erb
156
168
  - app/views/decidim/blogs/posts/index.html.erb
169
+ - app/views/decidim/blogs/posts/new.html.erb
157
170
  - app/views/decidim/blogs/posts/show.html.erb
158
171
  - config/assets.rb
159
172
  - config/locales/am-ET.yml
@@ -247,6 +260,7 @@ files:
247
260
  - db/migrate/20200827153709_add_commentable_counter_cache_to_posts.rb
248
261
  - db/migrate/20210310120514_add_followable_counter_cache_to_blogs.rb
249
262
  - db/migrate/20220812122940_add_published_at_to_decidim_blogs_posts.rb
263
+ - db/migrate/20240828103324_add_deleted_at_to_decidim_blogs_posts.rb
250
264
  - decidim-blogs.gemspec
251
265
  - lib/decidim/api/blogs_type.rb
252
266
  - lib/decidim/api/post_input_filter.rb
@@ -258,6 +272,8 @@ files:
258
272
  - lib/decidim/blogs/api.rb
259
273
  - lib/decidim/blogs/component.rb
260
274
  - lib/decidim/blogs/engine.rb
275
+ - lib/decidim/blogs/post_serializer.rb
276
+ - lib/decidim/blogs/schema_org_blog_posting_post_serializer.rb
261
277
  - lib/decidim/blogs/seeds.rb
262
278
  - lib/decidim/blogs/test/factories.rb
263
279
  - lib/decidim/blogs/version.rb
@@ -278,14 +294,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
278
294
  requirements:
279
295
  - - "~>"
280
296
  - !ruby/object:Gem::Version
281
- version: 3.2.0
297
+ version: 3.3.0
282
298
  required_rubygems_version: !ruby/object:Gem::Requirement
283
299
  requirements:
284
300
  - - ">="
285
301
  - !ruby/object:Gem::Version
286
302
  version: '0'
287
303
  requirements: []
288
- rubygems_version: 3.4.10
304
+ rubygems_version: 3.5.11
289
305
  signing_key:
290
306
  specification_version: 4
291
307
  summary: Decidim blogs module