biovision-post 0.1.180127 → 0.2.180325

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/articles_controller.rb +2 -2
  3. data/app/controllers/blog_posts_controller.rb +2 -2
  4. data/app/controllers/news_controller.rb +2 -2
  5. data/app/controllers/post_categories_controller.rb +4 -4
  6. data/app/controllers/posts_controller.rb +5 -15
  7. data/app/helpers/biovision_posts_helper.rb +4 -4
  8. data/app/models/concerns/post_child_with_priority.rb +49 -0
  9. data/app/models/post.rb +21 -15
  10. data/app/models/post_link.rb +15 -0
  11. data/app/models/post_note.rb +16 -0
  12. data/app/models/post_reference.rb +19 -0
  13. data/app/models/post_type.rb +3 -1
  14. data/app/services/post_manager.rb +9 -6
  15. data/app/services/post_manager/article_handler.rb +2 -2
  16. data/app/services/post_manager/blog_post_handler.rb +2 -2
  17. data/app/services/post_manager/news_handler.rb +2 -2
  18. data/app/views/admin/index/dashboard/_biovision_post.html.erb +1 -1
  19. data/app/views/admin/post_categories/entity/_in_list.html.erb +3 -3
  20. data/app/views/admin/post_categories/show.html.erb +3 -3
  21. data/app/views/admin/post_types/entity/_in_list.html.erb +1 -1
  22. data/app/views/admin/post_types/new_post.html.erb +1 -1
  23. data/app/views/admin/post_types/show.html.erb +2 -2
  24. data/app/views/admin/posts/entity/_in_list.html.erb +17 -3
  25. data/app/views/admin/posts/show.html.erb +4 -2
  26. data/app/views/articles/category.html.erb +1 -1
  27. data/app/views/blog_posts/category.html.erb +1 -1
  28. data/app/views/index/dashboard/_biovision_post.html.erb +5 -0
  29. data/app/views/news/category.html.erb +1 -1
  30. data/app/views/post_categories/edit.html.erb +1 -1
  31. data/app/views/posts/_form.html.erb +160 -22
  32. data/app/views/posts/_post.html.erb +1 -1
  33. data/app/views/posts/edit.html.erb +1 -1
  34. data/app/views/posts/entity/_metadata.html.erb +10 -6
  35. data/config/locales/posts-en.yml +4 -3
  36. data/config/locales/posts-ru.yml +3 -2
  37. data/config/routes.rb +39 -35
  38. data/db/migrate/20170930000001_create_post_types.rb +1 -0
  39. data/db/migrate/20170930000003_create_posts.rb +2 -0
  40. data/db/migrate/20171218111111_add_meta_fields_to_posts.rb +1 -1
  41. data/db/migrate/20171219111112_add_author_fields_to_posts.rb +1 -1
  42. data/db/migrate/20180124111113_add_language_to_posts.rb +1 -1
  43. data/db/migrate/20180318215555_add_active_to_post_types.rb +11 -0
  44. data/db/migrate/20180321100000_create_post_references.rb +21 -0
  45. data/db/migrate/20180321100001_create_post_notes.rb +18 -0
  46. data/db/migrate/20180321100002_create_post_links.rb +20 -0
  47. data/lib/biovision/post/engine.rb +2 -3
  48. data/lib/biovision/post/version.rb +1 -1
  49. metadata +11 -6
  50. data/app/views/index/index/_recent_posts.html.erb +0 -5
  51. data/app/views/posts/edit.js.erb +0 -1
  52. data/app/views/posts/form/_wysiwyg.html.erb +0 -14
  53. data/app/views/posts/new.js.erb +0 -1
@@ -4,7 +4,7 @@
4
4
  <% if post.editable_by? current_user %>
5
5
  <ul class="actions">
6
6
  <% if UserPrivilege.user_in_group?(current_user, :editors) %>
7
- <li><%= gear_icon(admin_post_path(post.id)) %></li>
7
+ <li><%= gear_icon(admin_post_path(id: post.id)) %></li>
8
8
  <% end %>
9
9
  <% unless post.locked? %>
10
10
  <li><%= edit_icon(handler.edit_path) %></li>
@@ -4,7 +4,7 @@
4
4
  <h1><%= t('.heading') %></h1>
5
5
 
6
6
  <ul class="actions">
7
- <li><%= back_icon(admin_post_path(@entity.id)) %></li>
7
+ <li><%= back_icon(admin_post_path(id: @entity.id)) %></li>
8
8
  <li class="danger"><%= destroy_icon(@entity) %></li>
9
9
  </ul>
10
10
 
@@ -1,12 +1,16 @@
1
1
  <% content_for :meta_description, (entity.meta_description.blank? ? entity.lead : entity.meta_description) %>
2
2
  <% content_for :meta_type, 'article' %>
3
3
  <% content_for :meta_type_extension do %>
4
- <meta property="og:article:published_time" content="<%= entity.created_at.strftime('%Y-%m-%d') %>"/>
5
- <meta property="og:article:modified_time" content="<%= entity.updated_at.strftime('%Y-%m-%d') %>"/>
6
- <% if entity.show_owner? %>
7
- <meta property="og:article:author" content="<%= entity.user.screen_name %>"/>
8
- <% end %>
4
+ <meta property="og:article:published_time" content="<%= entity.created_at.strftime('%Y-%m-%d') %>"/>
5
+ <meta property="og:article:modified_time" content="<%= entity.updated_at.strftime('%Y-%m-%d') %>"/>
6
+ <% if entity.show_owner? %>
7
+ <meta property="og:article:author" content="<%= entity.user.screen_name %>"/>
8
+ <% end %>
9
9
  <% end %>
10
10
  <% content_for :meta_image, (request.protocol + request.host_with_port + entity.image.url) unless entity.image.blank? %>
11
- <% content_for :meta_title, entity.meta_title unless entity.meta_title.blank? %>
11
+ <% if entity.meta_title.blank? %>
12
+ <% content_for :meta_title, entity.title %>
13
+ <% else %>
14
+ <% content_for :meta_title, entity.meta_title %>
15
+ <% end %>
12
16
  <% content_for :meta_keywords, entity.meta_keywords unless entity.meta_keywords.blank? %>
@@ -132,11 +132,12 @@ en:
132
132
  author_name: "If specified, shown instead of current user"
133
133
  author_title: "For example, occupation of status"
134
134
  author_url: "If specified, author name will link here"
135
- image: "Maximum dimensions is 3000×3000, format — JPG or PNG."
135
+ image: "Maximum dimensions are 3000×3000, format — JPG or PNG."
136
136
  image_alt_text: "Brief description of image. Maximum 200 chars."
137
137
  image_author_link: "Will be opened when one clicks on author name."
138
138
  image_author_name: "Person or organization name. Will be shown near image."
139
139
  image_name: "Will be shown as image caption."
140
+ language_id: "Language"
140
141
  lead: "Post essence, maximum 350 chars."
141
142
  meta_description: "50–55 words. Maximum 250 chars"
142
143
  meta_keywords: "Maximum 250 chars."
@@ -151,8 +152,8 @@ en:
151
152
  post:
152
153
  source: "Source"
153
154
  index:
154
- index:
155
- recent_posts:
155
+ dashboard:
156
+ biovision_post:
156
157
  heading: "Recent posts"
157
158
  articles:
158
159
  index:
@@ -137,6 +137,7 @@ ru:
137
137
  image_author_link: "Будет открываться при нажатии на имя автора картинки."
138
138
  image_author_name: "ФИО или название организации. Будет отображаться в подписи к картинке."
139
139
  image_name: "Будет отображаться в качестве подписи к картинке."
140
+ language_id: "Язык"
140
141
  lead: "Краткая суть, максимум 350 символов."
141
142
  meta_description: "50–55 слов. Максимум 250 символов."
142
143
  meta_keywords: "Максимум 250 символов."
@@ -151,8 +152,8 @@ ru:
151
152
  post:
152
153
  source: "Источник"
153
154
  index:
154
- index:
155
- recent_posts:
155
+ dashboard:
156
+ biovision_post:
156
157
  heading: "Недавние публикации"
157
158
  articles:
158
159
  index:
data/config/routes.rb CHANGED
@@ -2,47 +2,51 @@ Rails.application.routes.draw do
2
2
  category_slug_pattern = /[a-z]+[-_0-9a-z]*[0-9a-z]/
3
3
  post_slug_pattern = /[a-z0-9]+[-_.a-z0-9]*[a-z0-9]+/
4
4
 
5
- resources :post_categories, except: [:index, :show]
6
- resources :posts, except: [:new]
5
+ resources :post_categories, :posts, only: [:update, :destroy]
7
6
 
8
- scope :articles, controller: :articles do
9
- get '/' => :index, as: :articles
10
- get '/:category_slug' => :category, as: :articles_category, constraints: { category_slug: category_slug_pattern }
11
- get '/:post_id-:post_slug' => :show, as: :show_article, constraints: { post_id: /\d+/, post_slug: post_slug_pattern }
12
- end
7
+ scope '/(:locale)', constraints: { locale: /[a-z]{2}/ } do
8
+ resources :post_categories, except: [:index, :show, :update, :destroy]
9
+ resources :posts, except: [:new, :update, :destroy]
13
10
 
14
- scope :news, controller: :news do
15
- get '/' => :index, as: :news_index
16
- get '/:category_slug' => :category, as: :news_category, constraints: { category_slug: category_slug_pattern }
17
- get '/:post_id-:post_slug' => :show, as: :show_news, constraints: { post_id: /\d+/, post_slug: post_slug_pattern }
18
- end
11
+ scope :articles, controller: :articles do
12
+ get '/' => :index, as: :articles
13
+ get '/:category_slug' => :category, as: :articles_category, constraints: { category_slug: category_slug_pattern }
14
+ get '/:post_id-:post_slug' => :show, as: :show_article, constraints: { post_id: /\d+/, post_slug: post_slug_pattern }
15
+ end
19
16
 
20
- scope :blog_posts, controller: :blog_posts do
21
- get '/' => :index, as: :blog_posts
22
- get '/:category_slug' => :category, as: :blog_posts_category, constraints: { category_slug: category_slug_pattern }
23
- get '/:post_id-:post_slug' => :show, as: :show_blog_post, constraints: { post_id: /\d+/, post_slug: post_slug_pattern }
24
- end
17
+ scope :news, controller: :news do
18
+ get '/' => :index, as: :news_index
19
+ get '/:category_slug' => :category, as: :news_category, constraints: { category_slug: category_slug_pattern }
20
+ get '/:post_id-:post_slug' => :show, as: :show_news, constraints: { post_id: /\d+/, post_slug: post_slug_pattern }
21
+ end
25
22
 
26
- namespace :admin do
27
- resources :post_types, only: [:index, :show] do
28
- member do
29
- get :post_categories
30
- get :new_post
31
- end
23
+ scope :blog_posts, controller: :blog_posts do
24
+ get '/' => :index, as: :blog_posts
25
+ get '/:category_slug' => :category, as: :blog_posts_category, constraints: { category_slug: category_slug_pattern }
26
+ get '/:post_id-:post_slug' => :show, as: :show_blog_post, constraints: { post_id: /\d+/, post_slug: post_slug_pattern }
32
27
  end
33
- resources :post_categories, only: [:show] do
34
- member do
35
- put 'lock', defaults: { format: :json }
36
- delete 'lock', action: :unlock, defaults: { format: :json }
37
- post 'priority', defaults: { format: :json }
38
- post 'toggle', defaults: { format: :json }
28
+
29
+ namespace :admin do
30
+ resources :post_types, only: [:index, :show] do
31
+ member do
32
+ get :post_categories
33
+ get :new_post
34
+ end
39
35
  end
40
- end
41
- resources :posts, only: [:index, :show] do
42
- member do
43
- put 'lock', defaults: { format: :json }
44
- delete 'lock', action: :unlock, defaults: { format: :json }
45
- post 'toggle', defaults: { format: :json }
36
+ resources :post_categories, only: [:show] do
37
+ member do
38
+ put 'lock', defaults: { format: :json }
39
+ delete 'lock', action: :unlock, defaults: { format: :json }
40
+ post 'priority', defaults: { format: :json }
41
+ post 'toggle', defaults: { format: :json }
42
+ end
43
+ end
44
+ resources :posts, only: [:index, :show] do
45
+ member do
46
+ put 'lock', defaults: { format: :json }
47
+ delete 'lock', action: :unlock, defaults: { format: :json }
48
+ post 'toggle', defaults: { format: :json }
49
+ end
46
50
  end
47
51
  end
48
52
  end
@@ -3,6 +3,7 @@ class CreatePostTypes < ActiveRecord::Migration[5.1]
3
3
  unless PostType.table_exists?
4
4
  create_table :post_types do |t|
5
5
  t.timestamps
6
+ t.boolean :active, default: true, null: false
6
7
  t.integer :posts_count, default: 0, null: false
7
8
  t.integer :category_depth, limit: 2, default: 0
8
9
  t.string :name, null: false
@@ -47,6 +47,8 @@ class CreatePosts < ActiveRecord::Migration[5.1]
47
47
  execute "create index posts_created_at_month_idx on posts using btree (date_trunc('month', created_at), post_type_id, user_id);"
48
48
 
49
49
  add_foreign_key :posts, :posts, column: :original_post_id, on_update: :cascade, on_delete: :nullify
50
+
51
+ add_index :posts, :created_at
50
52
  end
51
53
  end
52
54
 
@@ -10,6 +10,6 @@ class AddMetaFieldsToPosts < ActiveRecord::Migration[5.1]
10
10
  end
11
11
 
12
12
  def down
13
- # No need to rollback
13
+ # No need to rollback
14
14
  end
15
15
  end
@@ -6,6 +6,6 @@ class AddAuthorFieldsToPosts < ActiveRecord::Migration[5.1]
6
6
  end
7
7
 
8
8
  def down
9
- # no rollback
9
+ # no rollback
10
10
  end
11
11
  end
@@ -6,6 +6,6 @@ class AddLanguageToPosts < ActiveRecord::Migration[5.1]
6
6
  end
7
7
 
8
8
  def down
9
- # no rollback
9
+ # no rollback
10
10
  end
11
11
  end
@@ -0,0 +1,11 @@
1
+ class AddActiveToPostTypes < ActiveRecord::Migration[5.1]
2
+ def up
3
+ unless column_exists? :post_types, :active
4
+ add_column :post_types, :active, :boolean, default: true, null: false
5
+ end
6
+ end
7
+
8
+ def down
9
+ # no rollback
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ class CreatePostReferences < ActiveRecord::Migration[5.1]
2
+ def up
3
+ unless PostReference.table_exists?
4
+ create_table :post_references do |t|
5
+ t.timestamps
6
+ t.references :post, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
7
+ t.integer :priority, limit: 2, default: 1, null: false
8
+ t.string :authors
9
+ t.string :title, null: false
10
+ t.string :url
11
+ t.string :publishing_info
12
+ end
13
+ end
14
+ end
15
+
16
+ def down
17
+ if PostReference.table_exists?
18
+ drop_table :post_references
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ class CreatePostNotes < ActiveRecord::Migration[5.1]
2
+ def up
3
+ unless PostNote.table_exists?
4
+ create_table :post_notes do |t|
5
+ t.timestamps
6
+ t.references :post, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
7
+ t.integer :priority, limit: 2, default: 1, null: false
8
+ t.text :text, null: false
9
+ end
10
+ end
11
+ end
12
+
13
+ def down
14
+ if PostNote.table_exists?
15
+ drop_table :post_notes
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ class CreatePostLinks < ActiveRecord::Migration[5.1]
2
+ def up
3
+ unless PostLink.table_exists?
4
+ create_table :post_links do |t|
5
+ t.timestamps
6
+ t.references :post, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
7
+ t.integer :other_post_id, null: false
8
+ t.integer :priority, limit: 2, default: 1, null: false
9
+ end
10
+
11
+ add_foreign_key :post_links, :posts, column: :other_post_id, on_update: :cascade, on_delete: :cascade
12
+ end
13
+ end
14
+
15
+ def down
16
+ if PostLink.table_exists?
17
+ drop_table :post_links
18
+ end
19
+ end
20
+ end
@@ -8,12 +8,11 @@ module Biovision
8
8
  class Engine < ::Rails::Engine
9
9
  config.generators do |g|
10
10
  g.test_framework :rspec
11
- g.fixture_replacement :factory_girl, :dir => 'spec/factories'
11
+ g.fixture_replacement :factory_bot, :dir => 'spec/factories'
12
12
  end
13
13
 
14
14
  config.assets.precompile << %w(admin.scss)
15
- config.assets.precompile << %w(biovision/base/icons/*)
16
- config.assets.precompile << %w(biovision/base/placeholders/*)
15
+ config.assets.precompile << %w(biovision/base/**/*)
17
16
  end
18
17
  end
19
18
  end
@@ -1,5 +1,5 @@
1
1
  module Biovision
2
2
  module Post
3
- VERSION = '0.1.180127'
3
+ VERSION = '0.2.180325'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: biovision-post
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.180127
4
+ version: 0.2.180325
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maxim Khan-Magomedov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-28 00:00:00.000000000 Z
11
+ date: 2018-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -138,8 +138,12 @@ files:
138
138
  - app/mailers/biovision/post/application_mailer.rb
139
139
  - app/models/application_record.rb
140
140
  - app/models/biovision/post/application_record.rb
141
+ - app/models/concerns/post_child_with_priority.rb
141
142
  - app/models/post.rb
142
143
  - app/models/post_category.rb
144
+ - app/models/post_link.rb
145
+ - app/models/post_note.rb
146
+ - app/models/post_reference.rb
143
147
  - app/models/post_type.rb
144
148
  - app/services/post_manager.rb
145
149
  - app/services/post_manager/article_handler.rb
@@ -168,7 +172,7 @@ files:
168
172
  - app/views/blog_posts/index.html.erb
169
173
  - app/views/blog_posts/index.jbuilder
170
174
  - app/views/blog_posts/show.html.erb
171
- - app/views/index/index/_recent_posts.html.erb
175
+ - app/views/index/dashboard/_biovision_post.html.erb
172
176
  - app/views/layouts/biovision/post/application.html.erb
173
177
  - app/views/news/category.html.erb
174
178
  - app/views/news/index.html.erb
@@ -187,11 +191,8 @@ files:
187
191
  - app/views/posts/_post.html.erb
188
192
  - app/views/posts/_preview.html.erb
189
193
  - app/views/posts/edit.html.erb
190
- - app/views/posts/edit.js.erb
191
194
  - app/views/posts/entity/_metadata.html.erb
192
195
  - app/views/posts/entity/_publisher.html.erb
193
- - app/views/posts/form/_wysiwyg.html.erb
194
- - app/views/posts/new.js.erb
195
196
  - app/views/posts/show.html.erb
196
197
  - config/locales/posts-en.yml
197
198
  - config/locales/posts-ru.yml
@@ -202,6 +203,10 @@ files:
202
203
  - db/migrate/20171218111111_add_meta_fields_to_posts.rb
203
204
  - db/migrate/20171219111112_add_author_fields_to_posts.rb
204
205
  - db/migrate/20180124111113_add_language_to_posts.rb
206
+ - db/migrate/20180318215555_add_active_to_post_types.rb
207
+ - db/migrate/20180321100000_create_post_references.rb
208
+ - db/migrate/20180321100001_create_post_notes.rb
209
+ - db/migrate/20180321100002_create_post_links.rb
205
210
  - lib/biovision/post.rb
206
211
  - lib/biovision/post/engine.rb
207
212
  - lib/biovision/post/version.rb
@@ -1,5 +0,0 @@
1
- <section class="recent-posts">
2
- <h2><%= t('.heading') %></h2>
3
-
4
- <%= render partial: 'posts/list', locals: { collection: collection } %>
5
- </section>
@@ -1 +0,0 @@
1
- <%= render partial: 'shared/forms/list_of_errors', locals: { entity: @entity, form_id: 'post-form' } %>
@@ -1,14 +0,0 @@
1
- <script src="//cdn.ckeditor.com/4.7.3/full/ckeditor.js"></script>
2
- <script>
3
- 'use strict';
4
-
5
- document.addEventListener('DOMContentLoaded', function () {
6
- const editor = document.getElementById('post_body');
7
-
8
- CKEDITOR.replace(editor, {
9
- filebrowserUploadUrl: '/media_files/ckeditor',
10
- removePlugins: 'forms,save,preview,flash,bidi,language,print,templates,newpage,iframe,about,scayt,wsc',
11
- // extraPlugins: 'embed'
12
- });
13
- });
14
- </script>
@@ -1 +0,0 @@
1
- <%= render partial: 'shared/forms/list_of_errors', locals: { entity: @entity, form_id: 'post-form' } %>