effective_posts 2.0.0 → 2.0.4
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 +1 -49
- data/app/controllers/admin/posts_controller.rb +1 -0
- data/app/helpers/effective_posts_helper.rb +5 -5
- data/app/models/effective/post.rb +4 -5
- data/app/views/admin/posts/_form.html.haml +4 -6
- data/app/views/effective/posts/_form.html.haml +2 -3
- data/config/effective_posts.rb +0 -3
- data/config/routes.rb +19 -22
- data/lib/effective_posts/version.rb +1 -1
- data/lib/effective_posts.rb +2 -3
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5b14ecbfb59bf639f5a0950fac43873d6cf2ca7c30aa1a1c69d71250bebf769d
|
|
4
|
+
data.tar.gz: 901c1ceca8dfa718866150dab53c7e5d76b59aa29fa9bd3003b81b1b1cd153af
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4543b3fcfc8068dd7eeb13002d6d793b200c74065efa960e13ce86f787eb3d2635b4d0e33a359227c5da41d4f9eea9438a147603a0329105b2efff08407d390d
|
|
7
|
+
data.tar.gz: d51323feaf466cdda3dff70816929228f8875df491af0c7054db1fb682e72816f4910773f79e0f9ceb6a4bef4cfba19259ad33f9d2dc309d459b2d963cb6f67f
|
data/README.md
CHANGED
|
@@ -85,54 +85,7 @@ The per_page for posts may be configured via the `/app/config/initializers/effec
|
|
|
85
85
|
|
|
86
86
|
## Authorization
|
|
87
87
|
|
|
88
|
-
All authorization checks are handled via the
|
|
89
|
-
|
|
90
|
-
It is intended for flow through to CanCan or Pundit, but neither of those gems are required.
|
|
91
|
-
|
|
92
|
-
This method is called by all controller actions with the appropriate action and resource
|
|
93
|
-
|
|
94
|
-
Action will be one of [:index, :show, :new, :create, :edit, :update, :destroy]
|
|
95
|
-
|
|
96
|
-
Resource will the appropriate Effective::Post object or class
|
|
97
|
-
|
|
98
|
-
The authorization method is defined in the initializer file:
|
|
99
|
-
|
|
100
|
-
```ruby
|
|
101
|
-
# As a Proc (with CanCan)
|
|
102
|
-
config.authorization_method = Proc.new { |controller, action, resource| authorize!(action, resource) }
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
```ruby
|
|
106
|
-
# As a Custom Method
|
|
107
|
-
config.authorization_method = :my_authorization_method
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
and then in your application_controller.rb:
|
|
111
|
-
|
|
112
|
-
```ruby
|
|
113
|
-
def my_authorization_method(action, resource)
|
|
114
|
-
current_user.is?(:admin) || EffectivePunditPolicy.new(current_user, resource).send('#{action}?')
|
|
115
|
-
end
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
or disabled entirely:
|
|
119
|
-
|
|
120
|
-
```ruby
|
|
121
|
-
config.authorization_method = false
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
If the method or proc returns false (user is not authorized) an Effective::AccessDenied exception will be raised
|
|
125
|
-
|
|
126
|
-
You can rescue from this exception by adding the following to your application_controller.rb:
|
|
127
|
-
|
|
128
|
-
```ruby
|
|
129
|
-
rescue_from Effective::AccessDenied do |exception|
|
|
130
|
-
respond_to do |format|
|
|
131
|
-
format.html { render 'static_pages/access_denied', :status => 403 }
|
|
132
|
-
format.any { render :text => 'Access Denied', :status => 403 }
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
```
|
|
88
|
+
All authorization checks are handled via the effective_resources gem found in the `config/initializers/effective_resources.rb` file.
|
|
136
89
|
|
|
137
90
|
### Permissions
|
|
138
91
|
|
|
@@ -155,7 +108,6 @@ There are some obvious additional features that have yet to be implemented:
|
|
|
155
108
|
- Some kind of helper for displaying a sidebar for the categories
|
|
156
109
|
- Post archives and date filtering
|
|
157
110
|
|
|
158
|
-
|
|
159
111
|
## License
|
|
160
112
|
|
|
161
113
|
MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
|
|
@@ -10,6 +10,7 @@ module Admin
|
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
submit :save, 'Save'
|
|
13
|
+
submit :save, 'Save and Add New', redirect: :new
|
|
13
14
|
submit :save, 'Save and View', redirect: -> { effective_posts.post_path(resource) }
|
|
14
15
|
submit :save, 'Duplicate', redirect: -> { effective_posts.new_admin_post_path(duplicate_id: resource.id) }
|
|
15
16
|
|
|
@@ -3,14 +3,14 @@ require 'cgi'
|
|
|
3
3
|
module EffectivePostsHelper
|
|
4
4
|
|
|
5
5
|
def effective_posts_header_tags
|
|
6
|
-
return unless @post && @post.kind_of?(Effective::Post) && @post.persisted?
|
|
6
|
+
return unless @post && @post.kind_of?(Effective::Post) && @post.persisted? && @post.published?
|
|
7
7
|
|
|
8
8
|
@effective_pages_og_type = 'article'
|
|
9
9
|
|
|
10
10
|
tags = [
|
|
11
11
|
tag(:meta, itemprop: 'author', content: @post.user.to_s),
|
|
12
12
|
tag(:meta, itemprop: 'publisher', content: @post.user.to_s),
|
|
13
|
-
tag(:meta, itemprop: '
|
|
13
|
+
tag(:meta, itemprop: 'datePublished', content: (@post.published_at || Time.zone.now).strftime('%FT%T%:z')),
|
|
14
14
|
tag(:meta, itemprop: 'headline', content: @post.title)
|
|
15
15
|
].join("\n").html_safe
|
|
16
16
|
end
|
|
@@ -61,8 +61,8 @@ module EffectivePostsHelper
|
|
|
61
61
|
def post_meta(post, date: true, datetime: false, category: true, author: true)
|
|
62
62
|
[
|
|
63
63
|
'Published',
|
|
64
|
-
("on #{post.published_at.strftime('%B %d, %Y')}" if date),
|
|
65
|
-
("on #{post.published_at.strftime('%B %d, %Y at %l:%M %p')}" if datetime),
|
|
64
|
+
("on #{post.published_at.strftime('%B %d, %Y')}" if date && post.published_at),
|
|
65
|
+
("on #{post.published_at.strftime('%B %d, %Y at %l:%M %p')}" if datetime && post.published_at),
|
|
66
66
|
("to #{link_to_post_category(post.category)}" if category && Array(EffectivePosts.categories).length > 1),
|
|
67
67
|
("by #{post.user.to_s.presence || 'Unknown'}" if author && EffectivePosts.post_meta_author && post.user.present?)
|
|
68
68
|
].compact.join(' ').html_safe
|
|
@@ -74,7 +74,7 @@ module EffectivePostsHelper
|
|
|
74
74
|
if post.draft?
|
|
75
75
|
content_tag(:span, 'DRAFT', class: 'badge badge-info')
|
|
76
76
|
elsif post.published? == false
|
|
77
|
-
content_tag(:span, "TO BE PUBLISHED AT #{post.published_at
|
|
77
|
+
content_tag(:span, "TO BE PUBLISHED AT #{post.published_at&.strftime('%F %H:%M') || 'LATER'}", class: 'badge badge-info')
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
80
|
|
|
@@ -47,7 +47,7 @@ module Effective
|
|
|
47
47
|
validates :title, presence: true, length: { maximum: 255 }
|
|
48
48
|
validates :description, presence: true, length: { maximum: 150 }
|
|
49
49
|
validates :category, presence: true
|
|
50
|
-
validates :published_at, presence: true
|
|
50
|
+
validates :published_at, presence: true, unless: -> { draft? }
|
|
51
51
|
|
|
52
52
|
validates :start_at, presence: true, if: -> { category == 'events' }
|
|
53
53
|
|
|
@@ -107,7 +107,7 @@ module Effective
|
|
|
107
107
|
end
|
|
108
108
|
|
|
109
109
|
def send_post_submitted_to_admin!
|
|
110
|
-
deliver_method = EffectivePosts.mailer[:deliver_method] ||
|
|
110
|
+
deliver_method = EffectivePosts.mailer[:deliver_method] || EffectiveResources.deliver_method
|
|
111
111
|
Effective::PostsMailer.post_submitted_to_admin(to_param).send(deliver_method)
|
|
112
112
|
end
|
|
113
113
|
|
|
@@ -118,9 +118,8 @@ module Effective
|
|
|
118
118
|
post.slug = post.slug + '-copy'
|
|
119
119
|
post.draft = true
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
end
|
|
121
|
+
post.body = body
|
|
122
|
+
post.excerpt = excerpt
|
|
124
123
|
end
|
|
125
124
|
end
|
|
126
125
|
|
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
- if f.object.persisted? || f.object.errors.include?(:slug)
|
|
5
5
|
- current_url = effective_posts.post_path(f.object)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
= f.text_field :slug, required: f.object.persisted?,
|
|
8
|
+
hint: "The slug controls this post's internet address. Be careful, changing the slug will break links that other websites may have to the old address.<br>#{('This post is currently reachable via ' + link_to(current_url.gsub(f.object.slug, '<strong>' + f.object.slug + '</strong>').html_safe, current_url)) if current_url && f.object.slug.present? }".html_safe
|
|
8
9
|
|
|
9
|
-
= f.
|
|
10
|
-
hint: "The slug controls this post's internet address. Be careful, changing the slug will break links that other websites may have to the old address.<br>#{('This post is currently reachable via ' + link_to(current_url.gsub(f.object.slug, '<strong>' + f.object.slug + '</strong>').html_safe, current_url)) if current_url && f.object.slug.present? }".html_safe
|
|
10
|
+
= f.rich_text_area :excerpt, hint: 'Will be used for the post excerpt on index pages.'
|
|
11
11
|
|
|
12
12
|
= f.text_field :description, hint: 'The content of the post meta tags.', maxlength: 150
|
|
13
13
|
|
|
14
14
|
- if Array(EffectivePosts.categories).length > 1
|
|
15
15
|
= f.select :category, EffectivePosts.categories
|
|
16
16
|
- else
|
|
17
|
-
= f.hidden_field :category, (EffectivePosts.categories.first || 'posts')
|
|
17
|
+
= f.hidden_field :category, value: (EffectivePosts.categories.first || 'posts')
|
|
18
18
|
|
|
19
19
|
- if EffectivePosts.use_active_storage
|
|
20
20
|
= f.file_field :image, hint: 'An image for your post'
|
|
@@ -32,8 +32,6 @@
|
|
|
32
32
|
|
|
33
33
|
= f.submit do
|
|
34
34
|
= f.save 'Save'
|
|
35
|
-
|
|
36
35
|
= f.save 'Save and View', class: 'btn btn-secondary'
|
|
37
|
-
|
|
38
36
|
- if f.object.persisted?
|
|
39
37
|
= f.save 'Duplicate', class: 'btn btn-info'
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
- if EffectivePosts.use_active_storage
|
|
14
14
|
= f.file_field :image, hint: 'An image for your post'
|
|
15
15
|
|
|
16
|
-
= f.
|
|
16
|
+
= f.rich_text_area :excerpt, hint: 'Will be used for the post excerpt on index pages.'
|
|
17
17
|
= f.text_field :description, hint: 'The content of the post meta tags.', maxlength: 150
|
|
18
18
|
|
|
19
19
|
= render partial: '/effective/posts/additional_fields', locals: { post: post, form: f, f: f }
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
|
|
23
23
|
= f.check_box :draft, hint: 'Save this post as a draft. It will not be accessible on the website.'
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
= f.ck_editor :body, hint: 'The content of your post.'
|
|
25
|
+
= f.rich_text_area :body, hint: 'The main body of your post'
|
|
27
26
|
|
|
28
27
|
= f.submit 'Save'
|
data/config/effective_posts.rb
CHANGED
|
@@ -35,9 +35,6 @@ EffectivePosts.setup do |config|
|
|
|
35
35
|
# Display the effective roles 'choose roles' input when an admin creates a new post
|
|
36
36
|
config.use_effective_roles = false
|
|
37
37
|
|
|
38
|
-
# Hides the Save and Edit Content links from admin. They can just use the textarea input.
|
|
39
|
-
config.use_fullscreen_editor = true
|
|
40
|
-
|
|
41
38
|
# Display a file upload field when the admin creates a new post to collect a post.image
|
|
42
39
|
config.use_active_storage = true
|
|
43
40
|
|
data/config/routes.rb
CHANGED
|
@@ -1,38 +1,35 @@
|
|
|
1
1
|
EffectivePosts::Engine.routes.draw do
|
|
2
2
|
namespace :admin do
|
|
3
3
|
resources :posts, except: [:show] do
|
|
4
|
-
|
|
5
|
-
post :approve, on: :member
|
|
6
|
-
end
|
|
4
|
+
post :approve, on: :member
|
|
7
5
|
end
|
|
8
|
-
|
|
9
|
-
match 'posts/excerpts', to: 'posts#excerpts', via: :get
|
|
10
6
|
end
|
|
11
7
|
|
|
12
8
|
scope module: 'effective' do
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
# Post Routes
|
|
10
|
+
resources :posts
|
|
15
11
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
# Blog Routes
|
|
13
|
+
match 'blog/category/:category', to: 'posts#index', via: :get, constraints: lambda { |req|
|
|
14
|
+
EffectivePosts.use_blog_routes && EffectivePosts.categories.include?(req.params['category'].to_sym)
|
|
15
|
+
}
|
|
20
16
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
match category, to: 'posts#index', via: :get, defaults: { category: category }
|
|
25
|
-
match "#{category}/:id", to: 'posts#show', via: :get, defaults: { category: category }
|
|
26
|
-
end
|
|
17
|
+
resources :posts, only: [:index, :show], path: 'blog', constraints: lambda { |req|
|
|
18
|
+
EffectivePosts.use_blog_routes
|
|
19
|
+
}
|
|
27
20
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
# Category routes
|
|
22
|
+
match ':category', to: 'posts#index', via: :get, constraints: lambda { |req|
|
|
23
|
+
EffectivePosts.use_category_routes && EffectivePosts.categories.include?(req.params['category'].to_sym)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
match ":category/:id", to: 'posts#show', via: :get, constraints: lambda { |req|
|
|
27
|
+
EffectivePosts.use_category_routes && EffectivePosts.categories.include?(req.params['category'].to_sym)
|
|
28
|
+
}
|
|
32
29
|
end
|
|
33
30
|
|
|
34
31
|
end
|
|
35
32
|
|
|
36
33
|
Rails.application.routes.draw do
|
|
37
|
-
mount EffectivePosts::Engine => '/', :
|
|
34
|
+
mount EffectivePosts::Engine => '/', as: 'effective_posts'
|
|
38
35
|
end
|
data/lib/effective_posts.rb
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
require 'effective_datatables'
|
|
2
1
|
require 'effective_resources'
|
|
3
2
|
require 'effective_posts/engine'
|
|
4
3
|
require 'effective_posts/version'
|
|
@@ -9,7 +8,7 @@ module EffectivePosts
|
|
|
9
8
|
[
|
|
10
9
|
:posts_table_name, :layout, :categories,
|
|
11
10
|
:use_category_routes, :use_blog_routes,
|
|
12
|
-
:use_effective_roles, :
|
|
11
|
+
:use_effective_roles, :use_active_storage,
|
|
13
12
|
:per_page, :post_meta_author,
|
|
14
13
|
:submissions_enabled, :submissions_require_current_user,
|
|
15
14
|
:submissions_require_approval, :submissions_note,
|
|
@@ -20,7 +19,7 @@ module EffectivePosts
|
|
|
20
19
|
include EffectiveGem
|
|
21
20
|
|
|
22
21
|
def self.permitted_params
|
|
23
|
-
[
|
|
22
|
+
@permitted_params ||= [
|
|
24
23
|
:title, :excerpt, :description, :draft, :category, :slug, :published_at, :body, :tags, :extra,
|
|
25
24
|
:image, :start_at, :end_at, :location, :website_name, :website_href, roles: []
|
|
26
25
|
]
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: effective_posts
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Code and Effect
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-01-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|