effective_posts 1.1.9 → 2.0.1

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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +4 -9
  4. data/app/controllers/admin/posts_controller.rb +10 -125
  5. data/app/controllers/effective/posts_controller.rb +20 -15
  6. data/app/datatables/effective_posts_datatable.rb +3 -1
  7. data/app/helpers/effective_posts_helper.rb +8 -27
  8. data/app/mailers/effective/posts_mailer.rb +2 -1
  9. data/app/models/effective/post.rb +45 -60
  10. data/app/views/admin/posts/_form.html.haml +8 -11
  11. data/app/views/admin/posts/excerpts.html.haml +2 -2
  12. data/app/views/effective/posts/_form.html.haml +2 -3
  13. data/app/views/effective/posts/_post.html.haml +1 -1
  14. data/app/views/effective/posts/_recent_posts.html.haml +1 -4
  15. data/app/views/effective/posts/_sidebar.html.haml +1 -2
  16. data/app/views/effective/posts/show.html.haml +1 -2
  17. data/app/views/effective/posts/submitted.html.haml +1 -1
  18. data/config/effective_posts.rb +2 -37
  19. data/config/routes.rb +7 -10
  20. data/db/migrate/01_create_effective_posts.rb.erb +1 -2
  21. data/lib/effective_posts.rb +14 -49
  22. data/lib/effective_posts/engine.rb +1 -1
  23. data/lib/effective_posts/version.rb +1 -1
  24. metadata +9 -60
  25. data/app/assets/javascripts/effective/snippets/read_more_divider.js.coffee +0 -22
  26. data/app/helpers/effective_truncate_html_helper.rb +0 -73
  27. data/app/models/effective/access_denied.rb +0 -17
  28. data/app/models/effective/datatables/posts.rb +0 -40
  29. data/app/models/effective/snippets/read_more_divider.rb +0 -11
  30. data/app/views/admin/posts/_actions.html.haml +0 -13
  31. data/app/views/admin/posts/edit.html.haml +0 -3
  32. data/app/views/admin/posts/new.html.haml +0 -3
  33. data/app/views/effective/snippets/_read_more_divider.html.haml +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c3e1d79781f750dc9d0fc4c4e22a4842507f3e5e33779c6c0e22316fd3f5e750
4
- data.tar.gz: 9365a6e511ef93c18abfc6b21ce09b158b74af42987954c035d9dfa812451aff
3
+ metadata.gz: d7fa99747e0baf6c175224b5d3ce645964ac5592137857a6cb28ae6d17687146
4
+ data.tar.gz: 277fa3f03c1411d810f0dc09663f4deb6bb2be2c1a890cbf7cc88bc9d6b0bd9e
5
5
  SHA512:
6
- metadata.gz: 49086d49debe0b5d918389e7b88e273bfc7c68abd73a05aaffa59ea4bd1e05c4c25ecddfba97643426efc3ad6597a3f88fb7dbb19629cfa3db0205c4cd42a4d3
7
- data.tar.gz: 94ad39c97d653ca020b9d39f98b27d199cfb1c8c95f131b6d2440b913dc14c6783bb38bc416c19cfa18ea59cedc798c34bb14dde2bb48c21e0306f79f97c5c7d
6
+ metadata.gz: efce23b1c3b45e66acbe5d5b055e114a7baa09add399a29a4a76074c2be854b46565deb2dfc3e9bd3f9559b6e6ec8c51a0fcb66f184c278f8edd8fed10578d18
7
+ data.tar.gz: 2422db33dc37d6d3f39b3b206c7ea77cf0238a3c9194b44c7b4335058e870e1082449027bab23b71e46177c36e62d697a704359e3fecf7891c7921eef2a000fa
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2018 Code and Effect Inc.
1
+ Copyright 2021 Code and Effect Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -2,17 +2,17 @@
2
2
 
3
3
  A blog implementation with WYSIWYG content editing, post scheduling, pagination and optional top level routes for each post category.
4
4
 
5
- ## effective_posts 1.0
5
+ ## effective_posts 2.0
6
6
 
7
- This is the 1.0 series of effective_posts.
7
+ This is the 2.0 series of effective_posts.
8
8
 
9
- This requires Twitter Bootstrap 4 and Rails 5.1+
9
+ This requires Twitter Bootstrap 4 and Rails 6+
10
10
 
11
11
  Please check out [Effective Posts 0.x](https://github.com/code-and-effect/effective_posts/tree/bootstrap3) for more information using this gem with Bootstrap 3.
12
12
 
13
13
  ## Getting Started
14
14
 
15
- Please first install the [effective_regions](https://github.com/code-and-effect/effective_regions) and [effective_datatables](https://github.com/code-and-effect/effective_datatables) gems.
15
+ Please first install the [effective_datatables](https://github.com/code-and-effect/effective_datatables) gem.
16
16
 
17
17
  Please download and install [Twitter Bootstrap4](http://getbootstrap.com)
18
18
 
@@ -64,8 +64,6 @@ You can schedule a post to appear at a later date by setting the published_at va
64
64
 
65
65
  As well, if you're using the [effective_roles](https://github.com/code-and-effect/effective_roles) gem, you will be able to configure permissions so that only permitted users may view this post.
66
66
 
67
- Once you click `Save and Edit Content` you will be brought into the effective_regions editor where you may enter the content for your post. Click `Insert Snippet` -> `Read more divider` from the toolbar to place a divider into your post. Only the content above the Read more divider, the excerpt content, will be displayed on any posts#index screens. The full content will be displayed on the posts#show screen.
68
-
69
67
 
70
68
  ## Category Routes
71
69
 
@@ -78,9 +76,6 @@ If disabled, all posts will be available at `/posts`, with posts for a specific
78
76
 
79
77
  Use `link_to_post_category(:blog)` to display a link to the Blog page. The helper considers `config.use_category_routes` and puts in the correct url.
80
78
 
81
- Use `post_excerpt(post)` to display the excerpt for a post. Or `post_excerpt(post, :length => 200)` to truncate it and add a Read more link where appropriate.
82
-
83
-
84
79
  ## Pagination
85
80
 
86
81
  The [effective_bootstrap](https://github.com/code-and-effect/effective_bootstrap) gem is used for pagination on all posts#index type screens.
@@ -1,136 +1,21 @@
1
1
  module Admin
2
2
  class PostsController < ApplicationController
3
- before_action(:authenticate_user!) # Devise
3
+ before_action(:authenticate_user!) if defined?(Devise)
4
+ before_action { EffectiveResources.authorize!(self, :admin, :effective_posts) }
4
5
 
5
- layout (EffectivePosts.layout.kind_of?(Hash) ? EffectivePosts.layout[:admin] : EffectivePosts.layout)
6
+ include Effective::CrudController
6
7
 
7
- def index
8
- @page_title = 'Posts'
9
- @datatable = EffectivePostsDatatable.new(self)
10
-
11
- authorize_effective_posts!
12
- end
13
-
14
- def new
15
- @post = Effective::Post.new(published_at: Time.zone.now)
16
- @page_title = 'New Post'
17
-
18
- authorize_effective_posts!
19
- end
20
-
21
- def create
22
- @post = Effective::Post.new(post_params)
23
- @post.user = current_user if defined?(current_user)
24
-
25
- @page_title = 'New Post'
26
-
27
- authorize_effective_posts!
28
-
29
- if @post.save
30
- if params[:commit] == 'Save and Edit Content'
31
- redirect_to effective_regions.edit_path(effective_posts.post_path(@post), :exit => effective_posts.edit_admin_post_path(@post))
32
- elsif params[:commit] == 'Save and Add New'
33
- flash[:success] = 'Successfully created post'
34
- redirect_to effective_posts.new_admin_post_path
35
- elsif params[:commit] == 'Save and View'
36
- redirect_to effective_posts.post_path(@post)
37
- else
38
- flash[:success] = 'Successfully created post'
39
- redirect_to effective_posts.edit_admin_post_path(@post)
40
- end
41
- else
42
- flash.now[:danger] = 'Unable to create post'
43
- render :action => :new
44
- end
45
- end
46
-
47
- def edit
48
- @post = Effective::Post.find(params[:id])
49
- @page_title = 'Edit Post'
50
-
51
- authorize_effective_posts!
52
- end
53
-
54
- def update
55
- @post = Effective::Post.find(params[:id])
56
- @page_title = 'Edit Post'
57
-
58
- authorize_effective_posts!
59
-
60
- if @post.update_attributes(post_params)
61
- if params[:commit] == 'Save and Edit Content'
62
- redirect_to effective_regions.edit_path(effective_posts.post_path(@post), :exit => effective_posts.edit_admin_post_path(@post))
63
- elsif params[:commit] == 'Save and Add New'
64
- flash[:success] = 'Successfully updated post'
65
- redirect_to effective_posts.new_admin_post_path
66
- elsif params[:commit] == 'Save and View'
67
- redirect_to effective_posts.post_path(@post)
68
- elsif params[:commit] == 'Duplicate'
69
- begin
70
- post = @post.duplicate!
71
- flash[:success] = 'Successfully saved and duplicated post.'
72
- flash[:info] = "You are now editing the duplicated post. This new post has been created as a Draft."
73
- rescue => e
74
- flash.delete(:success)
75
- flash[:danger] = "Unable to duplicate post: #{e.message}"
76
- end
77
-
78
- redirect_to effective_posts.edit_admin_post_path(post || @post)
79
- else
80
- flash[:success] = 'Successfully updated post'
81
- redirect_to effective_posts.edit_admin_post_path(@post)
82
- end
83
- else
84
- flash.now[:danger] = 'Unable to update post'
85
- render :action => :edit
86
- end
87
- end
88
-
89
- def destroy
90
- @post = Effective::Post.find(params[:id])
91
-
92
- authorize_effective_posts!
93
-
94
- if @post.destroy
95
- flash[:success] = 'Successfully deleted post'
96
- else
97
- flash[:danger] = 'Unable to delete post'
98
- end
99
-
100
- redirect_to effective_posts.admin_posts_path
101
- end
102
-
103
- def approve
104
- @post = Effective::Post.find(params[:id])
105
- @page_title = 'Approve Post'
106
-
107
- authorize_effective_posts!
108
-
109
- if @post.update_attributes(draft: false)
110
- flash[:success] = 'Successfully approved post. It is now displayed on the website.'
111
- else
112
- flash[:danger] = "Unable to approve post: #{@post.errors.full_messages.join(', ')}"
113
- end
114
-
115
- redirect_to(:back) rescue redirect_to(effective_posts.admin_posts_path)
116
- end
117
-
118
- def excerpts
119
- @posts = Effective::Post.includes(:regions)
120
- @page_title = 'Post Excerpts'
121
-
122
- authorize_effective_posts!
8
+ if (config = EffectivePosts.layout)
9
+ layout(config.kind_of?(Hash) ? config[:admin] : config)
123
10
  end
124
11
 
125
- private
126
-
127
- def authorize_effective_posts!
128
- EffectivePosts.authorize!(self, :admin, :effective_posts)
129
- EffectivePosts.authorize!(self, action_name.to_sym, @post || Effective::Post)
130
- end
12
+ submit :save, 'Save'
13
+ submit :save, 'Save and Add New', redirect: :new
14
+ submit :save, 'Save and View', redirect: -> { effective_posts.post_path(resource) }
15
+ submit :save, 'Duplicate', redirect: -> { effective_posts.new_admin_post_path(duplicate_id: resource.id) }
131
16
 
132
17
  def post_params
133
- params.require(:effective_post).permit(EffectivePosts.permitted_params)
18
+ params.require(:effective_post).permit!
134
19
  end
135
20
 
136
21
  end
@@ -1,15 +1,21 @@
1
1
  module Effective
2
2
  class PostsController < ApplicationController
3
- layout (EffectivePosts.layout.kind_of?(Hash) ? EffectivePosts.layout[:posts] : EffectivePosts.layout)
3
+ if defined?(Devise)
4
+ before_action :authenticate_user!, only: [:new, :create, :edit, :update],
5
+ if: -> { EffectivePosts.submissions_require_current_user }
6
+ end
7
+
8
+ include Effective::CrudController
4
9
 
5
- before_action :authenticate_user!, only: [:new, :create, :edit, :update],
6
- if: -> { EffectivePosts.submissions_require_current_user }
10
+ if (config = EffectivePosts.layout)
11
+ layout(config.kind_of?(Hash) ? (config[:application] || config[:posts]) : config)
12
+ end
7
13
 
8
14
  def index
9
15
  @posts ||= Effective::Post.posts(
10
16
  user: current_user,
11
17
  category: params[:category],
12
- unpublished: EffectivePosts.authorized?(self, :admin, :effective_posts)
18
+ unpublished: EffectiveResources.authorized?(self, :admin, :effective_posts)
13
19
  )
14
20
 
15
21
  @posts = @posts.paginate(page: params[:page])
@@ -23,28 +29,27 @@ module Effective
23
29
  @posts = @posts.where(search) if search.present?
24
30
  end
25
31
 
26
- EffectivePosts.authorize!(self, :index, Effective::Post)
32
+ EffectiveResources.authorize!(self, :index, Effective::Post)
27
33
 
28
34
  @page_title ||= [(params[:category] || 'Blog').to_s.titleize, (" - Page #{params[:page]}" if params[:page])].compact.join
29
35
  @canonical_url ||= helpers.effective_post_category_url(params[:category], page: params[:page])
30
36
  end
31
37
 
32
38
  def show
33
- @posts ||= Effective::Post.posts(user: current_user, category: params[:category], unpublished: EffectivePosts.authorized?(self, :admin, :effective_posts))
39
+ @posts ||= Effective::Post.posts(user: current_user, category: params[:category], unpublished: EffectiveResources.authorized?(self, :admin, :effective_posts))
34
40
  @post = @posts.find(params[:id])
35
41
 
36
42
  if @post.respond_to?(:roles_permit?)
37
43
  raise Effective::AccessDenied.new('Access Denied', :show, @post) unless @post.roles_permit?(current_user)
38
44
  end
39
45
 
40
- EffectivePosts.authorize!(self, :show, @post)
46
+ EffectiveResources.authorize!(self, :show, @post)
41
47
 
42
- if EffectivePosts.authorized?(self, :admin, :effective_posts)
48
+ if EffectiveResources.authorized?(self, :admin, :effective_posts)
43
49
  flash.now[:warning] = [
44
50
  'Hi Admin!',
45
51
  ('You are viewing a hidden post.' unless @post.published?),
46
52
  'Click here to',
47
- ("<a href='#{effective_regions.edit_path(effective_posts.post_path(@post, exit: effective_posts.post_path(@post)))}' class='alert-link' data-no-turbolink='true' data-turbolinks='false'>edit post content</a> or" unless admin_edit?),
48
53
  ("<a href='#{effective_posts.edit_admin_post_path(@post)}' class='alert-link'>edit post settings</a>.")
49
54
  ].compact.join(' ')
50
55
  end
@@ -59,7 +64,7 @@ module Effective
59
64
  @post ||= Effective::Post.new(published_at: Time.zone.now)
60
65
  @page_title = 'New Post'
61
66
 
62
- EffectivePosts.authorize!(self, :new, @post)
67
+ EffectiveResources.authorize!(self, :new, @post)
63
68
  end
64
69
 
65
70
  def create
@@ -67,7 +72,7 @@ module Effective
67
72
  @post.user = current_user if defined?(current_user)
68
73
  @post.draft = (EffectivePosts.submissions_require_approval == true)
69
74
 
70
- EffectivePosts.authorize!(self, :create, @post)
75
+ EffectiveResources.authorize!(self, :create, @post)
71
76
 
72
77
  if @post.save
73
78
  @page_title ||= 'Post Submitted'
@@ -89,7 +94,7 @@ module Effective
89
94
  @post ||= Effective::Post.find(params[:id])
90
95
  @page_title ||= 'Edit Post'
91
96
 
92
- EffectivePosts.authorize!(self, :edit, @post)
97
+ EffectiveResources.authorize!(self, :edit, @post)
93
98
  end
94
99
 
95
100
  def update
@@ -97,7 +102,7 @@ module Effective
97
102
  draft_was = @post.draft
98
103
  @post.draft = (EffectivePosts.submissions_require_approval == true)
99
104
 
100
- EffectivePosts.authorize!(self, :update, @post)
105
+ EffectiveResources.authorize!(self, :update, @post)
101
106
 
102
107
  if @post.update_attributes(post_params)
103
108
  @page_title ||= 'Post Submitted'
@@ -118,7 +123,7 @@ module Effective
118
123
  def destroy
119
124
  @post ||= Effective::Post.find(params[:id])
120
125
 
121
- EffectivePosts.authorize!(self, :destroy, @post)
126
+ EffectiveResources.authorize!(self, :destroy, @post)
122
127
 
123
128
  if @post.destroy
124
129
  flash[:success] = 'Successfully deleted post'
@@ -136,7 +141,7 @@ module Effective
136
141
  end
137
142
 
138
143
  def admin_edit?
139
- EffectivePosts.authorized?(self, :admin, :effective_posts) && (params[:edit].to_s == 'true')
144
+ EffectiveResources.authorized?(self, :admin, :effective_posts) && (params[:edit].to_s == 'true')
140
145
  end
141
146
 
142
147
  end
@@ -25,7 +25,9 @@ class EffectivePostsDatatable < Effective::Datatable
25
25
 
26
26
  col :created_at, label: 'Submitted at', visible: false
27
27
 
28
- actions_col partial: '/admin/posts/actions', partial_as: :post
28
+ actions_col do |post|
29
+ dropdown_link_to('View', effective_post_path(post), target: '_blank')
30
+ end
29
31
  end
30
32
 
31
33
  collection do
@@ -3,7 +3,7 @@ require 'cgi'
3
3
  module EffectivePostsHelper
4
4
 
5
5
  def effective_posts_header_tags
6
- return unless @post.present? && @post.kind_of?(Effective::Post)
6
+ return unless @post && @post.kind_of?(Effective::Post) && @post.persisted?
7
7
 
8
8
  @effective_pages_og_type = 'article'
9
9
 
@@ -31,14 +31,15 @@ module EffectivePostsHelper
31
31
  def effective_post_category_path(category, opts = nil)
32
32
  return effective_posts.posts_path(opts || {}) unless category.present?
33
33
 
34
- category = category.to_s.downcase
34
+ category = category.to_s
35
+ category_path = category.to_s.downcase.parameterize
35
36
  opts = (opts || {}).compact
36
37
  query = ('?' + opts.to_query) if opts.present?
37
38
 
38
39
  if EffectivePosts.use_blog_routes
39
- "/blog/category/#{category}#{query}"
40
+ "/blog/category/#{category_path}#{query}"
40
41
  elsif EffectivePosts.use_category_routes
41
- "/#{category}#{query}"
42
+ "/#{category_path}#{query}"
42
43
  else
43
44
  effective_posts.posts_path(opts.merge(category: category.presence).compact)
44
45
  end
@@ -68,7 +69,7 @@ module EffectivePostsHelper
68
69
  end
69
70
 
70
71
  def admin_post_status_badge(post)
71
- return nil unless EffectivePosts.authorized?(self, :admin, :effective_posts)
72
+ return nil unless EffectiveResources.authorized?(self, :admin, :effective_posts)
72
73
 
73
74
  if post.draft?
74
75
  content_tag(:span, 'DRAFT', class: 'badge badge-info')
@@ -77,29 +78,9 @@ module EffectivePostsHelper
77
78
  end
78
79
  end
79
80
 
80
- # Only supported options are:
81
- # :label => 'Read more' to set the label of the 'Read More' link
82
- # :omission => '...' passed to the final text node's truncate
83
- # :length => 200 to set the max inner_text length of the content
84
81
  # All other options are passed to the link_to 'Read more'
85
- def post_excerpt(post, read_more_link: true, label: 'Continue reading', omission: '...', length: nil)
86
- content = effective_region(post, :body, editable: false) { '<p>Default content</p>'.html_safe }
87
- divider = content.index(Effective::Snippets::ReadMoreDivider::TOKEN)
88
- excerpt = post.excerpt.to_s
89
-
90
- read_more = (read_more_link && label.present?) ? readmore_link(post, label: label) : ''
91
-
92
- html = (
93
- if divider.present?
94
- truncate_html(content, Effective::Snippets::ReadMoreDivider::TOKEN, '')
95
- elsif length.present?
96
- truncate_html(excerpt, length, omission)
97
- else
98
- excerpt
99
- end
100
- ).html_safe
101
-
102
- (html + read_more).html_safe
82
+ def post_excerpt(post, label: 'Continue reading')
83
+ (post.excerpt.to_s + readmore_link(post, label: label)).html_safe
103
84
  end
104
85
 
105
86
  def read_more_link(post, options = {})
@@ -10,7 +10,8 @@ module Effective
10
10
  mail(
11
11
  to: EffectivePosts.mailer[:admin_email],
12
12
  from: EffectivePosts.mailer[:default_from],
13
- subject: subject_for_post_submitted_to_admin(@post)
13
+ subject: subject_for_post_submitted_to_admin(@post),
14
+ tenant: (Tenant.current if defined?(Tenant))
14
15
  )
15
16
  end
16
17
 
@@ -1,55 +1,63 @@
1
1
  module Effective
2
2
  class Post < ActiveRecord::Base
3
- acts_as_regionable
3
+ attr_accessor :current_user
4
+
4
5
  acts_as_slugged
5
6
 
6
- if EffectivePosts.use_effective_roles && respond_to?(:acts_as_role_restricted)
7
- acts_as_role_restricted
8
- end
7
+ log_changes if respond_to?(:log_changes)
8
+ acts_as_role_restricted if respond_to?(:acts_as_role_restricted)
9
9
 
10
- if EffectivePosts.use_active_storage && respond_to?(:has_one_attached)
11
- has_one_attached :image
12
- end
10
+ has_one_attached :image
11
+
12
+ has_rich_text :excerpt
13
+ has_rich_text :body
13
14
 
14
15
  self.table_name = EffectivePosts.posts_table_name.to_s
15
16
 
16
- belongs_to :user, optional: true
17
+ belongs_to :user, polymorphic: true, optional: true
17
18
 
18
- # Attributes
19
- # title :string
20
- # description :string
19
+ effective_resource do
20
+ title :string
21
+ description :string
21
22
 
22
- # slug :string
23
+ category :string
24
+ slug :string
23
25
 
24
- # category :string
26
+ draft :boolean
27
+ published_at :datetime
28
+ tags :text
25
29
 
26
- # draft :boolean
27
- # published_at :datetime
28
- # tags :text
30
+ roles_mask :integer
29
31
 
30
- # roles_mask :integer
32
+ # Event Fields
33
+ start_at :datetime
34
+ end_at :datetime
31
35
 
32
- # Event Fields
33
- # start_at :datetime
34
- # end_at :datetime
35
- # location :string
36
- # website_name :website_name
37
- # website_href :website_href
36
+ location :string
37
+ website_name :string
38
+ website_href :string
38
39
 
39
- # timestamps
40
+ timestamps
41
+ end
42
+
43
+ before_validation(if: -> { current_user.present? }) do
44
+ self.user ||= current_user
45
+ end
40
46
 
41
47
  validates :title, presence: true, length: { maximum: 255 }
42
48
  validates :description, presence: true, length: { maximum: 150 }
43
49
  validates :category, presence: true
44
50
  validates :published_at, presence: true
45
51
 
46
- validates :start_at, presence: true, if: -> { category == 'events'}
52
+ validates :start_at, presence: true, if: -> { category == 'events' }
47
53
 
48
54
  scope :drafts, -> { where(draft: true) }
49
55
  scope :published, -> { where(draft: false).where("#{EffectivePosts.posts_table_name}.published_at < ?", Time.zone.now) }
50
56
  scope :unpublished, -> { where(draft: true).or(where("#{EffectivePosts.posts_table_name}.published_at > ?", Time.zone.now)) }
51
57
  scope :with_category, -> (category) { where(category: category.to_s.downcase) }
52
58
 
59
+ scope :deep, -> { with_rich_text_excerpt_and_embeds.with_rich_text_body_and_embeds }
60
+
53
61
  scope :paginate, -> (page: nil, per_page: EffectivePosts.per_page) {
54
62
  page = (page || 1).to_i
55
63
  offset = [(page - 1), 0].max * per_page
@@ -58,7 +66,7 @@ module Effective
58
66
  }
59
67
 
60
68
  scope :posts, -> (user: nil, category: nil, unpublished: false) {
61
- scope = all.includes(:regions).order(published_at: :desc)
69
+ scope = all.deep.order(published_at: :desc)
62
70
 
63
71
  if defined?(EffectiveRoles) && EffectivePosts.use_effective_roles
64
72
  if user.present? && user.respond_to?(:roles)
@@ -77,16 +85,12 @@ module Effective
77
85
  scope
78
86
  }
79
87
 
80
- def to_param
81
- slug.presence || "#{id}-#{title.parameterize}"
82
- end
83
-
84
88
  def to_s
85
89
  title.presence || 'New Post'
86
90
  end
87
91
 
88
92
  def published?
89
- !draft? && published_at < Time.zone.now
93
+ !draft? && published_at.present? && published_at < Time.zone.now
90
94
  end
91
95
 
92
96
  def approved?
@@ -97,53 +101,34 @@ module Effective
97
101
  category == 'events'
98
102
  end
99
103
 
100
- def body
101
- region(:body).content
102
- end
103
-
104
- def body=(input)
105
- region(:body).content = input
106
- end
107
-
108
104
  # 3.333 words/second is the default reading speed.
109
105
  def time_to_read_in_seconds(reading_speed = 3.333)
110
106
  (regions.to_a.sum { |region| (region.content || '').scan(/\w+/).size } / reading_speed).seconds
111
107
  end
112
108
 
113
109
  def send_post_submitted_to_admin!
114
- send_email(:post_submitted_to_admin, to_param)
110
+ deliver_method = EffectivePosts.mailer[:deliver_method] || raise('expected an EffectivePosts.deliver_method')
111
+ Effective::PostsMailer.post_submitted_to_admin(to_param).send(deliver_method)
115
112
  end
116
113
 
117
114
  # Returns a duplicated post object, or throws an exception
118
- def duplicate!
115
+ def duplicate
119
116
  Post.new(attributes.except('id', 'updated_at', 'created_at')).tap do |post|
120
117
  post.title = post.title + ' (Copy)'
121
118
  post.slug = post.slug + '-copy'
122
119
  post.draft = true
123
120
 
124
- regions.each do |region|
125
- post.regions.build(region.attributes.except('id', 'updated_at', 'created_at'))
126
- end
127
-
128
- post.save!
121
+ post.body = body
122
+ post.excerpt = excerpt
129
123
  end
130
124
  end
131
125
 
132
- private
126
+ def duplicate!
127
+ duplicate.tap { |post| post.save! }
128
+ end
133
129
 
134
- def send_email(email, *mailer_args)
135
- begin
136
- if EffectivePosts.mailer[:delayed_job_deliver] && EffectivePosts.mailer[:deliver_method] == :deliver_later
137
- Effective::PostsMailer.delay.public_send(email, *mailer_args)
138
- elsif EffectivePosts.mailer[:deliver_method].present?
139
- Effective::PostsMailer.public_send(email, *mailer_args).public_send(EffectivePosts.mailer[:deliver_method])
140
- else
141
- Effective::PostsMailer.public_send(email, *mailer_args).deliver_now
142
- end
143
- rescue => e
144
- raise e unless Rails.env.production?
145
- return false
146
- end
130
+ def approve!
131
+ update!(draft: false)
147
132
  end
148
133
 
149
134
  end