decidim-blogs 0.11.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +30 -0
- data/Rakefile +3 -0
- data/app/assets/images/decidim/blogs/icon.svg +3 -0
- data/app/commands/decidim/blogs/admin/create_post.rb +50 -0
- data/app/commands/decidim/blogs/admin/update_post.rb +44 -0
- data/app/controllers/decidim/blogs/admin/application_controller.rb +22 -0
- data/app/controllers/decidim/blogs/admin/posts_controller.rb +64 -0
- data/app/controllers/decidim/blogs/application_controller.rb +14 -0
- data/app/controllers/decidim/blogs/posts_controller.rb +35 -0
- data/app/events/decidim/blogs/create_post_event.rb +8 -0
- data/app/forms/decidim/blogs/admin/post_form.rb +18 -0
- data/app/helpers/decidim/blogs/admin/posts_helper.rb +25 -0
- data/app/helpers/decidim/blogs/application_helper.rb +13 -0
- data/app/helpers/decidim/blogs/posts_helper.rb +25 -0
- data/app/models/decidim/blogs/application_record.rb +10 -0
- data/app/models/decidim/blogs/post.rb +44 -0
- data/app/presenters/decidim/module/blogs/post_presenter.rb +14 -0
- data/app/views/decidim/blogs/admin/posts/_form.html.erb +13 -0
- data/app/views/decidim/blogs/admin/posts/edit.html.erb +7 -0
- data/app/views/decidim/blogs/admin/posts/index.html.erb +53 -0
- data/app/views/decidim/blogs/admin/posts/new.html.erb +7 -0
- data/app/views/decidim/blogs/posts/_author_data.html.erb +7 -0
- data/app/views/decidim/blogs/posts/_datetime.html.erb +1 -0
- data/app/views/decidim/blogs/posts/_posts.html.erb +20 -0
- data/app/views/decidim/blogs/posts/_sidebar_blog.html.erb +21 -0
- data/app/views/decidim/blogs/posts/index.html.erb +10 -0
- data/app/views/decidim/blogs/posts/show.html.erb +23 -0
- data/config/locales/ca.yml +69 -0
- data/config/locales/en.yml +70 -0
- data/config/locales/es.yml +69 -0
- data/config/locales/eu.yml +69 -0
- data/config/locales/fi.yml +69 -0
- data/config/locales/fr.yml +69 -0
- data/config/locales/gl.yml +69 -0
- data/config/locales/it.yml +69 -0
- data/config/locales/nl.yml +69 -0
- data/config/locales/pl.yml +69 -0
- data/config/locales/pt-BR.yml +69 -0
- data/config/locales/pt.yml +69 -0
- data/config/locales/ru.yml +5 -0
- data/config/locales/sv.yml +69 -0
- data/config/locales/uk.yml +6 -0
- data/db/migrate/20171129131353_create_decidim_blogs_posts.rb +12 -0
- data/db/migrate/20171211084630_add_author_to_decidim_blogs_posts.rb +7 -0
- data/lib/decidim/blogs.rb +13 -0
- data/lib/decidim/blogs/admin.rb +10 -0
- data/lib/decidim/blogs/admin_engine.rb +22 -0
- data/lib/decidim/blogs/component.rb +65 -0
- data/lib/decidim/blogs/engine.rb +24 -0
- data/lib/decidim/blogs/test/factories.rb +20 -0
- data/lib/decidim/blogs/version.rb +10 -0
- metadata +235 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 77d681860119dee520f12322bc3f82962b485e3710348cf0f95d3c2a3ac8fa2e
|
4
|
+
data.tar.gz: b48ac462f570f74867ff27af60100619bac5a9324654ac916696e8266fd90f43
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 46b48ee482df01acd8c07a2e24dd98efd75a5550eee2a33d96bf4d3ffae82718f269c5fdcb3f1bf01b5d7e7bc0b46fbdf3e4f502904bf2d7fd0407962b21fce8
|
7
|
+
data.tar.gz: 401e1475f4107a3b265ea7f3bbf1e72ec2dc6188ce213da3f229f8bea989eec290708ce3008fa5d6aaf1c1022381634b09edef1c16e1e81c78d44958f7ccd6cb
|
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# decidim-blogs
|
2
|
+
|
3
|
+
The BLOG module adds posts to any participatory process. It adds a CRUD engine
|
4
|
+
to the admin and public view scoped inside the participatory process.
|
5
|
+
|
6
|
+
## Usage
|
7
|
+
|
8
|
+
BLOG will be available as a Component for a Participatory Process.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'decidim-blogs'
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
```bash
|
21
|
+
bundle
|
22
|
+
```
|
23
|
+
|
24
|
+
## Contributing
|
25
|
+
|
26
|
+
See [Decidim](https://github.com/decidim/decidim).
|
27
|
+
|
28
|
+
## License
|
29
|
+
|
30
|
+
See [Decidim](https://github.com/decidim/decidim).
|
data/Rakefile
ADDED
@@ -0,0 +1,3 @@
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36">
|
2
|
+
<path d="M18 0C8.07 0 0 8.07 0 18s8.07 18 18 18 18-8.071 18-18S27.93 0 18 0zm0 2c8.85 0 16 7.152 16 16 0 8.848-7.15 16-16 16-8.848 0-16-7.152-16-16C2 9.152 9.152 2 18 2zm-7 9a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h14a1 1 0 1 0 0-2H11zm0 4a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2H11z"/>
|
3
|
+
</svg>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
module Admin
|
6
|
+
# This command is executed when the user creates a Post from the admin
|
7
|
+
# panel.
|
8
|
+
class CreatePost < Rectify::Command
|
9
|
+
def initialize(form, current_user)
|
10
|
+
@form = form
|
11
|
+
@current_user = current_user
|
12
|
+
end
|
13
|
+
|
14
|
+
# Creates the post if valid.
|
15
|
+
#
|
16
|
+
# Broadcasts :ok if successful, :invalid otherwise.
|
17
|
+
def call
|
18
|
+
return broadcast(:invalid) if @form.invalid?
|
19
|
+
|
20
|
+
transaction do
|
21
|
+
create_post!
|
22
|
+
send_notification
|
23
|
+
end
|
24
|
+
|
25
|
+
broadcast(:ok, @post)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def create_post!
|
31
|
+
@post = Post.create!(
|
32
|
+
title: @form.title,
|
33
|
+
body: @form.body,
|
34
|
+
component: @form.current_component,
|
35
|
+
decidim_author_id: @current_user.id
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def send_notification
|
40
|
+
Decidim::EventsManager.publish(
|
41
|
+
event: "decidim.events.blogs.post_created",
|
42
|
+
event_class: Decidim::Blogs::CreatePostEvent,
|
43
|
+
resource: @post,
|
44
|
+
recipient_ids: @post.participatory_space.followers.pluck(:id)
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
module Admin
|
6
|
+
# This command is executed when the user changes a Blog from the admin
|
7
|
+
# panel.
|
8
|
+
class UpdatePost < Rectify::Command
|
9
|
+
# Initializes a UpdateBlog Command.
|
10
|
+
#
|
11
|
+
# form - The form from which to get the data.
|
12
|
+
# blog - The current instance of the page to be updated.
|
13
|
+
def initialize(form, post)
|
14
|
+
@form = form
|
15
|
+
@post = post
|
16
|
+
end
|
17
|
+
|
18
|
+
# Updates the blog if valid.
|
19
|
+
#
|
20
|
+
# Broadcasts :ok if successful, :invalid otherwise.
|
21
|
+
def call
|
22
|
+
return broadcast(:invalid) if form.invalid?
|
23
|
+
|
24
|
+
transaction do
|
25
|
+
update_post!
|
26
|
+
end
|
27
|
+
|
28
|
+
broadcast(:ok, post)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
attr_reader :form, :post
|
34
|
+
|
35
|
+
def update_post!
|
36
|
+
post.update!(
|
37
|
+
title: form.title,
|
38
|
+
body: form.body
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
module Admin
|
6
|
+
# Base controller for the administration of this module. It inherits from
|
7
|
+
# Decidim's admin base controller in order to inherit the layout and other
|
8
|
+
# convenience methods relevant to a this component.
|
9
|
+
class ApplicationController < Decidim::Admin::Components::BaseController
|
10
|
+
helper_method :posts, :post
|
11
|
+
|
12
|
+
def posts
|
13
|
+
@posts ||= Post.where(component: current_component).page(params[:page]).per(15)
|
14
|
+
end
|
15
|
+
|
16
|
+
def post
|
17
|
+
@post ||= posts.find(params[:id])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
module Admin
|
6
|
+
# This controller allows the create or update a blog.
|
7
|
+
class PostsController < Admin::ApplicationController
|
8
|
+
def new
|
9
|
+
@form = form(PostForm).instance
|
10
|
+
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
@form = form(PostForm).from_params(params, current_component: current_component)
|
14
|
+
|
15
|
+
CreatePost.call(@form, current_user) do
|
16
|
+
on(:ok) do
|
17
|
+
flash[:notice] = I18n.t("posts.create.success", scope: "decidim.blogs.admin")
|
18
|
+
redirect_to posts_path
|
19
|
+
end
|
20
|
+
|
21
|
+
on(:invalid) do
|
22
|
+
flash.now[:alert] = I18n.t("posts.create.invalid", scope: "decidim.blogs.admin")
|
23
|
+
render action: "new"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def edit
|
29
|
+
@form = form(PostForm).from_model(post)
|
30
|
+
end
|
31
|
+
|
32
|
+
def update
|
33
|
+
@form = form(PostForm).from_params(params, current_component: current_component)
|
34
|
+
|
35
|
+
UpdatePost.call(@form, post) do
|
36
|
+
on(:ok) do
|
37
|
+
flash[:notice] = I18n.t("posts.update.success", scope: "decidim.blogs.admin")
|
38
|
+
redirect_to posts_path
|
39
|
+
end
|
40
|
+
|
41
|
+
on(:invalid) do
|
42
|
+
flash.now[:alert] = I18n.t("posts.update.invalid", scope: "decidim.blogs.admin")
|
43
|
+
render action: "edit"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def destroy
|
49
|
+
post.destroy!
|
50
|
+
|
51
|
+
flash[:notice] = I18n.t("posts.destroy.success", scope: "decidim.blogs.admin")
|
52
|
+
|
53
|
+
redirect_to posts_path
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def post
|
59
|
+
@post ||= Blogs::Post.find_by(component: current_component)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
# This controller is the abstract class from which all other controllers of
|
6
|
+
# this engine inherit.
|
7
|
+
#
|
8
|
+
# Note that it inherits from `Decidim::Components::Basecontroller`, which
|
9
|
+
# override its layout and provide all kinds of useful methods.
|
10
|
+
class ApplicationController < Decidim::Components::BaseController
|
11
|
+
helper Decidim::Blogs::ApplicationHelper
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
# Exposes the blog resource so users can view them
|
6
|
+
class PostsController < Decidim::Blogs::ApplicationController
|
7
|
+
helper_method :posts, :post, :paginate_posts, :posts_most_commented
|
8
|
+
|
9
|
+
def index; end
|
10
|
+
|
11
|
+
def show; end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def paginate_posts
|
16
|
+
@paginate_posts ||= posts.created_at_desc.page(params[:page]).per(4)
|
17
|
+
end
|
18
|
+
|
19
|
+
def post
|
20
|
+
@post ||= posts.find(params[:id])
|
21
|
+
end
|
22
|
+
|
23
|
+
def posts
|
24
|
+
@posts ||= Post.where(component: current_component)
|
25
|
+
end
|
26
|
+
|
27
|
+
# PROVISIONAL if we implement counter cache
|
28
|
+
def posts_most_commented
|
29
|
+
@posts_most_commented ||= posts.joins(:comments).group(:id)
|
30
|
+
.select("count(decidim_comments_comments.id) as counter")
|
31
|
+
.select("decidim_blogs_posts.*").order("counter DESC").created_at_desc.limit(7)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
module Admin
|
6
|
+
# This class holds a Form to update pages from Decidim's admin panel.
|
7
|
+
class PostForm < Decidim::Form
|
8
|
+
include TranslatableAttributes
|
9
|
+
|
10
|
+
translatable_attribute :title, String
|
11
|
+
translatable_attribute :body, String
|
12
|
+
|
13
|
+
validates :title, translatable_presence: true
|
14
|
+
validates :body, translatable_presence: true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
module Admin
|
6
|
+
# Custom helpers used in posts views
|
7
|
+
module PostsHelper
|
8
|
+
include Decidim::ApplicationHelper
|
9
|
+
# include Decidim::TranslationsHelper
|
10
|
+
# include Decidim::ResourceHelper
|
11
|
+
|
12
|
+
# Public: truncates the post body
|
13
|
+
#
|
14
|
+
# post - a Decidim::Blog instance
|
15
|
+
# max_length - a number to limit the length of the body
|
16
|
+
#
|
17
|
+
# Returns the post's body truncated.
|
18
|
+
def post_description_admin(post, max_length = 100)
|
19
|
+
body = translated_attribute(post.body)
|
20
|
+
CGI.unescapeHTML html_truncate(body, max_length: max_length)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
# Custom helpers, scoped to the blogs engine.
|
6
|
+
#
|
7
|
+
module ApplicationHelper
|
8
|
+
include PaginateHelper
|
9
|
+
include Decidim::Blogs::PostsHelper
|
10
|
+
include Decidim::Comments::CommentsHelper
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
# Custom helpers used in posts views
|
6
|
+
module PostsHelper
|
7
|
+
include Decidim::ApplicationHelper
|
8
|
+
include Decidim::TranslationsHelper
|
9
|
+
include Decidim::ResourceHelper
|
10
|
+
|
11
|
+
# Public: truncates the post body
|
12
|
+
#
|
13
|
+
# post - a Decidim::Blog instance
|
14
|
+
# max_length - a number to limit the length of the body
|
15
|
+
#
|
16
|
+
# Returns the post's body truncated.
|
17
|
+
def post_description(post, max_length = 600)
|
18
|
+
link = post_path(post)
|
19
|
+
body = translated_attribute(post.body)
|
20
|
+
tail = "... <br/> #{link_to(t("read_more", scope: "decidim.blogs"), link)}".html_safe
|
21
|
+
CGI.unescapeHTML html_truncate(body, max_length: max_length, tail: tail)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Decidim
|
4
|
+
module Blogs
|
5
|
+
# The data store for a Blog in the Decidim::Blogs component. It stores a
|
6
|
+
# title, description and any other useful information to render a blog.
|
7
|
+
class Post < Blogs::ApplicationRecord
|
8
|
+
include Decidim::Resourceable
|
9
|
+
include Decidim::HasComponent
|
10
|
+
include Decidim::Authorable
|
11
|
+
include Decidim::Comments::Commentable
|
12
|
+
|
13
|
+
component_manifest_name "blogs"
|
14
|
+
|
15
|
+
validates :title, presence: true
|
16
|
+
|
17
|
+
scope :created_at_desc, -> { order(arel_table[:created_at].desc) }
|
18
|
+
|
19
|
+
# Public: Overrides the `commentable?` Commentable concern method.
|
20
|
+
def commentable?
|
21
|
+
component.settings.comments_enabled?
|
22
|
+
end
|
23
|
+
|
24
|
+
# Public: Overrides the `accepts_new_comments?` Commentable concern method.
|
25
|
+
def accepts_new_comments?
|
26
|
+
commentable? && !component.current_settings.comments_blocked
|
27
|
+
end
|
28
|
+
|
29
|
+
# Public: Overrides the `comments_have_alignment?` Commentable concern method.
|
30
|
+
def comments_have_alignment?
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
# Public: Overrides the `comments_have_votes?` Commentable concern method.
|
35
|
+
def comments_have_votes?
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def official?
|
40
|
+
author.nil?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|