ack_rocket_cms 0.7.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +19 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +244 -0
- data/LICENSE.txt +22 -0
- data/README.md +74 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/head.load.js +707 -0
- data/app/assets/javascripts/jquery.placeholder.js +157 -0
- data/app/assets/javascripts/rocket_cms.js.coffee +10 -0
- data/app/assets/javascripts/rocket_cms/flash.js.coffee +3 -0
- data/app/assets/javascripts/rocket_cms/map.js.coffee +22 -0
- data/app/assets/stylesheets/rocket_cms.css.sass +6 -0
- data/app/assets/stylesheets/rocket_cms/flash.css.sass +66 -0
- data/app/assets/stylesheets/rocket_cms/normalize.css.scss +406 -0
- data/app/controllers/concerns/no_cache.rb +12 -0
- data/app/controllers/concerns/rs_errors.rb +63 -0
- data/app/controllers/concerns/rs_menu.rb +45 -0
- data/app/controllers/concerns/rs_pages.rb +41 -0
- data/app/controllers/contacts_controller.rb +3 -0
- data/app/controllers/home_controller.rb +5 -0
- data/app/controllers/news_controller.rb +3 -0
- data/app/controllers/pages_controller.rb +4 -0
- data/app/controllers/search_controller.rb +4 -0
- data/app/mailers/contact_mailer.rb +15 -0
- data/app/models/concerns/boolean_field.rb +17 -0
- data/app/models/concerns/enableable.rb +8 -0
- data/app/models/concerns/geocodeable.rb +4 -0
- data/app/models/concerns/mappable.rb +95 -0
- data/app/models/concerns/seoable.rb +42 -0
- data/app/models/concerns/sitemap_data.rb +20 -0
- data/app/models/concerns/sort_field.rb +17 -0
- data/app/models/concerns/sortable.rb +8 -0
- data/app/models/contact_message.rb +11 -0
- data/app/models/menu.rb +11 -0
- data/app/models/news.rb +10 -0
- data/app/models/page.rb +11 -0
- data/app/views/blocks/_footer.html.haml +1 -0
- data/app/views/contact_mailer/new_message_email.html.haml +16 -0
- data/app/views/contacts/index.html.haml +10 -0
- data/app/views/contacts/new.html.haml +10 -0
- data/app/views/contacts/sent.html.haml +4 -0
- data/app/views/errors/_base.html.haml +3 -0
- data/app/views/errors/error_403.html.haml +1 -0
- data/app/views/errors/error_404.html.haml +1 -0
- data/app/views/errors/error_500.html.haml +1 -0
- data/app/views/home/index.html.haml +1 -0
- data/app/views/layouts/application.html.haml +23 -0
- data/app/views/layouts/application.html.slim +24 -0
- data/app/views/news/index.html.haml +9 -0
- data/app/views/news/show.html.haml +8 -0
- data/app/views/pages/show.html.haml +1 -0
- data/app/views/rails_admin/main/_check_boxes.html.haml +27 -0
- data/app/views/rails_admin/main/_enum_check_boxes.html.haml +5 -0
- data/app/views/rails_admin/main/_enum_radio_buttons.html.haml +5 -0
- data/app/views/rails_admin/main/_form_raw.html.haml +1 -0
- data/app/views/search/index.html.haml +19 -0
- data/app/views/shared/_admin_link.html.haml +3 -0
- data/app/views/shared/_messages.html.haml +7 -0
- data/app/views/shared/_meta.html.haml +6 -0
- data/app/views/shared/_obj.html.haml +20 -0
- data/app/views/shared/_og.html.haml +4 -0
- data/config/locales/en.rocket_admin.yml +6 -0
- data/config/locales/en.rs.yml +20 -0
- data/config/locales/ru.cancan.yml +4 -0
- data/config/locales/ru.devise.yml +65 -0
- data/config/locales/ru.kaminari.yml +17 -0
- data/config/locales/ru.models.yml +92 -0
- data/config/locales/ru.mongoid.yml +450 -0
- data/config/locales/ru.rails_admin.yml +148 -0
- data/config/locales/ru.rocket_admin.yml +6 -0
- data/config/locales/ru.rs.yml +20 -0
- data/config/locales/ru.simple_captcha.yml +3 -0
- data/config/locales/ru.simple_form.yml +9 -0
- data/lib/filename_to_slug.rb +34 -0
- data/lib/generators/rocket_cms/ability_generator.rb +15 -0
- data/lib/generators/rocket_cms/admin_generator.rb +21 -0
- data/lib/generators/rocket_cms/capify_generator.rb +40 -0
- data/lib/generators/rocket_cms/layout_generator.rb +15 -0
- data/lib/generators/rocket_cms/migration_generator.rb +19 -0
- data/lib/generators/rocket_cms/templates/Capfile +17 -0
- data/lib/generators/rocket_cms/templates/ability.erb +28 -0
- data/lib/generators/rocket_cms/templates/admin.erb +81 -0
- data/lib/generators/rocket_cms/templates/deploy.erb +47 -0
- data/lib/generators/rocket_cms/templates/dl.erb +30 -0
- data/lib/generators/rocket_cms/templates/migration_contact_messages.rb +15 -0
- data/lib/generators/rocket_cms/templates/migration_news.rb +21 -0
- data/lib/generators/rocket_cms/templates/migration_pages.rb +36 -0
- data/lib/generators/rocket_cms/templates/production.erb +8 -0
- data/lib/generators/rocket_cms/templates/unicorn.erb +66 -0
- data/lib/generators/rocket_cms/utils.rb +22 -0
- data/lib/manual_slug.rb +11 -0
- data/lib/manual_slug/active_record.rb +32 -0
- data/lib/manual_slug/mongoid.rb +36 -0
- data/lib/rails_admin/custom_show_in_app.rb +39 -0
- data/lib/rocket_cms.rb +88 -0
- data/lib/rocket_cms/admin.rb +152 -0
- data/lib/rocket_cms/configuration.rb +67 -0
- data/lib/rocket_cms/controller.rb +24 -0
- data/lib/rocket_cms/controllers/contacts.rb +70 -0
- data/lib/rocket_cms/controllers/news.rb +31 -0
- data/lib/rocket_cms/controllers/pages.rb +19 -0
- data/lib/rocket_cms/controllers/search.rb +45 -0
- data/lib/rocket_cms/elastic_search.rb +31 -0
- data/lib/rocket_cms/engine.rb +39 -0
- data/lib/rocket_cms/migration.rb +31 -0
- data/lib/rocket_cms/model.rb +25 -0
- data/lib/rocket_cms/models/active_record/contact_message.rb +14 -0
- data/lib/rocket_cms/models/active_record/menu.rb +14 -0
- data/lib/rocket_cms/models/active_record/news.rb +23 -0
- data/lib/rocket_cms/models/active_record/page.rb +17 -0
- data/lib/rocket_cms/models/contact_message.rb +27 -0
- data/lib/rocket_cms/models/menu.rb +29 -0
- data/lib/rocket_cms/models/mongoid/contact_message.rb +20 -0
- data/lib/rocket_cms/models/mongoid/menu.rb +12 -0
- data/lib/rocket_cms/models/mongoid/news.rb +27 -0
- data/lib/rocket_cms/models/mongoid/page.rb +26 -0
- data/lib/rocket_cms/models/news.rb +50 -0
- data/lib/rocket_cms/models/page.rb +76 -0
- data/lib/rocket_cms/patch.rb +58 -0
- data/lib/rocket_cms/rails_admin_menu.rb +145 -0
- data/lib/rocket_cms/simple_form_patch.rb +12 -0
- data/lib/rocket_cms/tasks.rb +13 -0
- data/lib/rocket_cms/version.rb +3 -0
- data/release.sh +13 -0
- data/rocket_cms.gemspec +54 -0
- data/template.rb +557 -0
- metadata +533 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
def self.configuration
|
3
|
+
@configuration ||= Configuration.new
|
4
|
+
end
|
5
|
+
def self.config
|
6
|
+
@configuration ||= Configuration.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.configure
|
10
|
+
yield configuration
|
11
|
+
end
|
12
|
+
|
13
|
+
class Configuration
|
14
|
+
attr_accessor :news_image_styles
|
15
|
+
attr_accessor :news_per_page
|
16
|
+
attr_accessor :news_excerpt
|
17
|
+
|
18
|
+
attr_accessor :error_layout
|
19
|
+
attr_accessor :menu_max_depth
|
20
|
+
|
21
|
+
attr_accessor :search_enabled
|
22
|
+
attr_accessor :search_per_page
|
23
|
+
attr_accessor :search_models
|
24
|
+
|
25
|
+
attr_accessor :contacts_captcha
|
26
|
+
attr_accessor :contacts_fields
|
27
|
+
attr_accessor :contacts_message_required
|
28
|
+
attr_accessor :contacts_captcha_error_message
|
29
|
+
|
30
|
+
attr_accessor :localize
|
31
|
+
|
32
|
+
attr_accessor :recreate_contact_message_action
|
33
|
+
|
34
|
+
def initialize
|
35
|
+
@news_image_styles = {
|
36
|
+
main: '400x200>',
|
37
|
+
thumb: '200x100>',
|
38
|
+
}
|
39
|
+
@news_per_page = 10
|
40
|
+
@news_excerpt = 12
|
41
|
+
|
42
|
+
@error_layout = 'application'
|
43
|
+
@menu_max_depth = 2
|
44
|
+
|
45
|
+
@search_enabled = false
|
46
|
+
@search_per_page = 10
|
47
|
+
@search_models = []
|
48
|
+
|
49
|
+
@contacts_captcha = false
|
50
|
+
@contacts_fields = {}
|
51
|
+
@contacts_message_required = true
|
52
|
+
|
53
|
+
@contacts_captcha_error_message = "Код проверки введен неверно"
|
54
|
+
@recreate_contact_message_action = "new"
|
55
|
+
|
56
|
+
@localize = false
|
57
|
+
end
|
58
|
+
|
59
|
+
def search_enabled=(val)
|
60
|
+
@search_enabled = val
|
61
|
+
if @search_enabled
|
62
|
+
@search_models << 'Page'
|
63
|
+
@search_models << 'News'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module RocketCMS::Controller
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
included do
|
4
|
+
include RsErrors
|
5
|
+
include RsPages
|
6
|
+
include RsMenu
|
7
|
+
protect_from_forgery with: :exception
|
8
|
+
helper_method :page_title
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def page_title
|
14
|
+
if @seo_page.nil?
|
15
|
+
Settings ? Settings.default_title : "" #temp
|
16
|
+
else
|
17
|
+
@seo_page.page_title
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def ckeditor_authenticate
|
22
|
+
redirect_to '/' unless user_signed_in? && current_user.has_role?('admin')
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
module Controllers
|
3
|
+
module Contacts
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
def index
|
6
|
+
@contact_message = ContactMessage.new
|
7
|
+
after_initialize
|
8
|
+
end
|
9
|
+
|
10
|
+
def new
|
11
|
+
@contact_message = model.new
|
12
|
+
after_initialize
|
13
|
+
end
|
14
|
+
|
15
|
+
def create
|
16
|
+
@contact_message = model.new(message_params)
|
17
|
+
after_initialize
|
18
|
+
if RocketCMS.configuration.contacts_captcha
|
19
|
+
meth = :save_with_captcha
|
20
|
+
else
|
21
|
+
meth = :save
|
22
|
+
end
|
23
|
+
if @contact_message.send(meth)
|
24
|
+
after_create
|
25
|
+
if request.xhr? && process_ajax
|
26
|
+
ajax_success
|
27
|
+
else
|
28
|
+
redirect_after_done
|
29
|
+
end
|
30
|
+
else
|
31
|
+
render_error
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def sent
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def render_error
|
40
|
+
if request.xhr? && process_ajax
|
41
|
+
render json: {errors: @contact_message.errors}, status: 422
|
42
|
+
else
|
43
|
+
flash.now[:alert] = @contact_message.errors.full_messages.join("\n")
|
44
|
+
render action: RocketCMS.configuration.recreate_contact_message_action, status: 422
|
45
|
+
end
|
46
|
+
end
|
47
|
+
def process_ajax
|
48
|
+
true
|
49
|
+
end
|
50
|
+
def ajax_success
|
51
|
+
render json: {ok: true}
|
52
|
+
end
|
53
|
+
def redirect_after_done
|
54
|
+
redirect_to :contacts_sent
|
55
|
+
end
|
56
|
+
def after_initialize
|
57
|
+
# overrideable hook for updating message
|
58
|
+
end
|
59
|
+
def after_create
|
60
|
+
# overrideable hook for updating message
|
61
|
+
end
|
62
|
+
def model
|
63
|
+
ContactMessage
|
64
|
+
end
|
65
|
+
def message_params
|
66
|
+
params.require(:contact_message).permit(RocketCMS.configuration.contacts_fields.keys + [:name, :email, :phone, :content, :captcha, :captcha_key])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
module Controllers
|
3
|
+
module News
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def index
|
7
|
+
@news = model.enabled.after_now.by_date
|
8
|
+
|
9
|
+
unless RocketCMS.configuration.news_per_page.nil?
|
10
|
+
@news = @news.page(params[:page])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def show
|
15
|
+
@news = model.after_now.find(params[:id])
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def model
|
20
|
+
::News
|
21
|
+
end
|
22
|
+
def page_title
|
23
|
+
if @news.class.name == model.name
|
24
|
+
@news.page_title
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
module Controllers
|
3
|
+
module Pages
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
def show
|
6
|
+
if @seo_page.nil? || !@seo_page.persisted?
|
7
|
+
unless params[:id].blank?
|
8
|
+
@seo_page = Page.enabled.find(params[:id])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
if @seo_page.nil?
|
12
|
+
render_404
|
13
|
+
return
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
module Controllers
|
3
|
+
module Search
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
# def index
|
6
|
+
# if params[:query].blank?
|
7
|
+
# @results = []
|
8
|
+
# else
|
9
|
+
# @results = Mongoid::Elasticsearch.search({
|
10
|
+
# body: {
|
11
|
+
# query: {
|
12
|
+
# query_string: {
|
13
|
+
# query: Mongoid::Elasticsearch::Utils.clean(params[:query])
|
14
|
+
# }
|
15
|
+
# },
|
16
|
+
# highlight: {
|
17
|
+
# fields: {
|
18
|
+
# name: {},
|
19
|
+
# content: {}
|
20
|
+
# }
|
21
|
+
# }
|
22
|
+
# }},
|
23
|
+
# page: params[:page],
|
24
|
+
# per_page: RocketCMS.configuration.search_per_page,
|
25
|
+
# )
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
|
29
|
+
def index
|
30
|
+
if params[:q].blank?
|
31
|
+
@results = []
|
32
|
+
else
|
33
|
+
query = params[:q].to_s.gsub(/\P{Word}+/, ' ').gsub(/ +/, ' ').strip
|
34
|
+
@results = Page.search(query,
|
35
|
+
per_page: 10,
|
36
|
+
highlight: true,
|
37
|
+
suggest: true,
|
38
|
+
page: params[:page],
|
39
|
+
per_page: RocketCMS.configuration.search_per_page
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RocketCMS::ElasticSearch
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
included do
|
4
|
+
searchkick(
|
5
|
+
language: "Russian",
|
6
|
+
suggest: ["name"],
|
7
|
+
settings: {
|
8
|
+
analysis: {
|
9
|
+
analyzer: {
|
10
|
+
default_index: {
|
11
|
+
type: "custom",
|
12
|
+
tokenizer: "standard",
|
13
|
+
filter: ["standard", "lowercase", "asciifolding", "searchkick_index_shingle", "searchkick_stemmer", "snowball"]
|
14
|
+
|
15
|
+
# https://github.com/imotov/elasticsearch-analysis-morphology
|
16
|
+
# filter: ["standard", "lowercase", "asciifolding", "searchkick_index_shingle", "searchkick_stemmer", "snowball", "russian_morphology", "english_morphology"]
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
)
|
22
|
+
|
23
|
+
def search_data
|
24
|
+
{
|
25
|
+
_id: _id,
|
26
|
+
name: name,
|
27
|
+
content: SmartExcerpt.strip_tags(content),
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
rake_tasks do
|
4
|
+
require File.expand_path('../tasks', __FILE__)
|
5
|
+
end
|
6
|
+
|
7
|
+
initializer "rocket_cms.email_defaults" do
|
8
|
+
# Write default email settings to DB so they can be changed.
|
9
|
+
|
10
|
+
#temp
|
11
|
+
begin
|
12
|
+
if Settings.table_exists?
|
13
|
+
Settings.default_email_from(default: 'noreply@gpk-holding.ru')
|
14
|
+
Settings.form_email(default: 'admin@gpk-holding.ru')
|
15
|
+
Settings.email_topic(default: 'с сайта')
|
16
|
+
end
|
17
|
+
rescue
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
initializer 'rocket_cms.paperclip' do
|
22
|
+
require 'paperclip/style'
|
23
|
+
module ::Paperclip
|
24
|
+
class Style
|
25
|
+
alias_method :processor_options_without_auto_orient, :processor_options
|
26
|
+
def processor_options
|
27
|
+
processor_options_without_auto_orient.merge(auto_orient: false)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
config.after_initialize do
|
34
|
+
# trigger autoload so models are registered in Mongoid::Elasticearch
|
35
|
+
RocketCMS.configuration.search_models.map(&:constantize)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
module Migration
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def seo_fields(t)
|
6
|
+
t.string :name, null: false
|
7
|
+
t.string :h1
|
8
|
+
t.string :title
|
9
|
+
t.text :keywords
|
10
|
+
t.text :description
|
11
|
+
t.string :robots
|
12
|
+
t.string :og_title
|
13
|
+
t.attachment :og_image
|
14
|
+
|
15
|
+
#if RocketCMS.localize
|
16
|
+
#t.column :name_translations, 'hstore'
|
17
|
+
#t.column :name_translations, 'hstore'
|
18
|
+
#end
|
19
|
+
end
|
20
|
+
|
21
|
+
def map_fields(t)
|
22
|
+
t.text :address
|
23
|
+
t.text :map_address
|
24
|
+
t.text :map_hint
|
25
|
+
t.float :latitude
|
26
|
+
t.float :longitude
|
27
|
+
t.float :lat
|
28
|
+
t.float :lon
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
module Model
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
included do
|
5
|
+
if RocketCMS.mongoid?
|
6
|
+
include Mongoid::Document
|
7
|
+
include Mongoid::Timestamps::Short
|
8
|
+
end
|
9
|
+
include ActiveModel::ForbiddenAttributesProtection
|
10
|
+
include BooleanField
|
11
|
+
include SortField
|
12
|
+
|
13
|
+
if RocketCMS.mongoid?
|
14
|
+
include Mongoid::Paperclip
|
15
|
+
end
|
16
|
+
|
17
|
+
include SmartExcerpt
|
18
|
+
include SimpleCaptcha::ModelHelpers
|
19
|
+
|
20
|
+
if RocketCMS.mongoid? && defined?(Trackable)
|
21
|
+
include Trackable
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module RocketCMS
|
2
|
+
module Models
|
3
|
+
module ActiveRecord
|
4
|
+
module News
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
included do
|
7
|
+
unless RocketCMS.configuration.news_image_styles.nil?
|
8
|
+
has_attached_file :image, styles: RocketCMS.configuration.news_image_styles
|
9
|
+
validates_attachment_content_type :image, content_type: %w(image/gif image/jpeg image/jpg image/png), if: :image?
|
10
|
+
end
|
11
|
+
|
12
|
+
has_paper_trail
|
13
|
+
|
14
|
+
validates_lengths_from_database only: [:name, :title, :content, :excerpt, :h1, :keywords, :robots, :og_title]
|
15
|
+
|
16
|
+
scope :after_now, -> { where("time < ?", Time.now) }
|
17
|
+
scope :by_date, -> { order(time: :desc) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|