enjoy_cms 0.1.0.beta1

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 (172) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile.lock +249 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +137 -0
  10. data/Rakefile +1 -0
  11. data/app/assets/javascripts/enjoy_cms.coffee +6 -0
  12. data/app/assets/javascripts/enjoy_cms/flash.js.coffee +3 -0
  13. data/app/assets/javascripts/enjoy_cms/map.js.coffee +22 -0
  14. data/app/assets/javascripts/head.load.js +707 -0
  15. data/app/assets/javascripts/jquery.placeholder.js +157 -0
  16. data/app/assets/stylesheets/enjoy_cms.sass +5 -0
  17. data/app/assets/stylesheets/enjoy_cms/flash.sass +63 -0
  18. data/app/assets/stylesheets/enjoy_cms/normalize.scss +406 -0
  19. data/app/assets/stylesheets/enjoy_cms/powered.sass +18 -0
  20. data/app/controllers/concerns/enjoy/errors.rb +93 -0
  21. data/app/controllers/concerns/enjoy/fancybox.rb +14 -0
  22. data/app/controllers/concerns/enjoy/localizeable.rb +33 -0
  23. data/app/controllers/concerns/enjoy/nav_menu.rb +64 -0
  24. data/app/controllers/concerns/enjoy/no_cache.rb +12 -0
  25. data/app/controllers/concerns/enjoy/seo_pages.rb +83 -0
  26. data/app/controllers/enjoy/contacts_controller.rb +5 -0
  27. data/app/controllers/enjoy/home_controller.rb +6 -0
  28. data/app/controllers/enjoy/news_controller.rb +5 -0
  29. data/app/controllers/enjoy/pages_controller.rb +5 -0
  30. data/app/controllers/enjoy/search_controller.rb +6 -0
  31. data/app/helpers/enjoy/gzip_helper.rb +27 -0
  32. data/app/helpers/enjoy/powered_helper.rb +12 -0
  33. data/app/mailers/enjoy/contact_mailer.rb +17 -0
  34. data/app/models/concerns/enjoy/boolean_field.rb +17 -0
  35. data/app/models/concerns/enjoy/enableable.rb +8 -0
  36. data/app/models/concerns/enjoy/geocodeable.rb +4 -0
  37. data/app/models/concerns/enjoy/mappable.rb +95 -0
  38. data/app/models/concerns/enjoy/mongoid_paperclip.rb +37 -0
  39. data/app/models/concerns/enjoy/seoable.rb +36 -0
  40. data/app/models/concerns/enjoy/sitemap_data.rb +23 -0
  41. data/app/models/concerns/enjoy/sort_field.rb +20 -0
  42. data/app/models/concerns/enjoy/sortable.rb +8 -0
  43. data/app/models/enjoy/contact_message.rb +12 -0
  44. data/app/models/enjoy/embedded_element.rb +15 -0
  45. data/app/models/enjoy/embedded_gallery_image.rb +15 -0
  46. data/app/models/enjoy/gallery.rb +10 -0
  47. data/app/models/enjoy/gallery_image.rb +10 -0
  48. data/app/models/enjoy/menu.rb +12 -0
  49. data/app/models/enjoy/news.rb +12 -0
  50. data/app/models/enjoy/page.rb +12 -0
  51. data/app/models/enjoy/seo.rb +13 -0
  52. data/app/views/blocks/_favicon.html.slim +21 -0
  53. data/app/views/blocks/_footer.html.slim +1 -0
  54. data/app/views/blocks/_seo_block.html.slim +18 -0
  55. data/app/views/blocks/_seo_block_with_obj.html.slim +27 -0
  56. data/app/views/devise/registrations/edit.html.slim +21 -0
  57. data/app/views/devise/registrations/new.html.slim +21 -0
  58. data/app/views/devise/sessions/new.html.slim +22 -0
  59. data/app/views/devise/shared/_links.html.slim +11 -0
  60. data/app/views/enjoy/contact_mailer/new_message_email.html.slim +15 -0
  61. data/app/views/enjoy/contacts/index.html.slim +10 -0
  62. data/app/views/enjoy/contacts/new.html.slim +10 -0
  63. data/app/views/enjoy/contacts/sent.html.slim +4 -0
  64. data/app/views/enjoy/home/index.html.slim +1 -0
  65. data/app/views/enjoy/news/index.html.slim +9 -0
  66. data/app/views/enjoy/news/show.html.slim +8 -0
  67. data/app/views/enjoy/pages/show.html.slim +1 -0
  68. data/app/views/enjoy/search/index.html.slim +19 -0
  69. data/app/views/errors/_base.html.slim +3 -0
  70. data/app/views/errors/error_403.html.slim +1 -0
  71. data/app/views/errors/error_404.html.slim +1 -0
  72. data/app/views/errors/error_500.html.slim +1 -0
  73. data/app/views/layouts/application.html.slim +25 -0
  74. data/app/views/rails_admin/main/_check_boxes.html.slim +27 -0
  75. data/app/views/rails_admin/main/_enum_check_boxes.html.slim +5 -0
  76. data/app/views/rails_admin/main/_enum_radio_buttons.html.slim +5 -0
  77. data/app/views/rails_admin/main/_form_raw.html.slim +1 -0
  78. data/app/views/shared/_admin_link.html.slim +3 -0
  79. data/app/views/shared/_messages.html.slim +7 -0
  80. data/app/views/shared/_meta.html.slim +19 -0
  81. data/app/views/shared/_obj.html.slim +21 -0
  82. data/app/views/shared/_og.html.slim +4 -0
  83. data/app/views/simple_captcha/_simple_captcha.html.slim +12 -0
  84. data/config/initializers/simple_captcha.rb +29 -0
  85. data/config/locales/en.enjoy.yml +29 -0
  86. data/config/locales/en.enjoy_admin.yml +6 -0
  87. data/config/locales/ru.cancan.yml +4 -0
  88. data/config/locales/ru.devise.yml +65 -0
  89. data/config/locales/ru.enjoy.yml +39 -0
  90. data/config/locales/ru.enjoy_admin.yml +6 -0
  91. data/config/locales/ru.kaminari.yml +17 -0
  92. data/config/locales/ru.models.yml +103 -0
  93. data/config/locales/ru.mongoid.yml +450 -0
  94. data/config/locales/ru.rails_admin.yml +148 -0
  95. data/config/locales/ru.simple_captcha.yml +3 -0
  96. data/config/locales/ru.simple_form.yml +9 -0
  97. data/config/routes.rb +14 -0
  98. data/enjoy_cms.gemspec +53 -0
  99. data/lib/enjoy/admin.rb +350 -0
  100. data/lib/enjoy/admin/contact_message.rb +36 -0
  101. data/lib/enjoy/admin/embedded_element.rb +11 -0
  102. data/lib/enjoy/admin/embedded_gallery_image.rb +15 -0
  103. data/lib/enjoy/admin/gallery.rb +20 -0
  104. data/lib/enjoy/admin/gallery_image.rb +18 -0
  105. data/lib/enjoy/admin/menu.rb +27 -0
  106. data/lib/enjoy/admin/news.rb +57 -0
  107. data/lib/enjoy/admin/page.rb +81 -0
  108. data/lib/enjoy/admin/seo.rb +17 -0
  109. data/lib/enjoy/configuration.rb +73 -0
  110. data/lib/enjoy/controller.rb +31 -0
  111. data/lib/enjoy/controllers/contacts.rb +70 -0
  112. data/lib/enjoy/controllers/news.rb +36 -0
  113. data/lib/enjoy/controllers/pages.rb +22 -0
  114. data/lib/enjoy/controllers/search.rb +62 -0
  115. data/lib/enjoy/elastic_search.rb +31 -0
  116. data/lib/enjoy/engine.rb +46 -0
  117. data/lib/enjoy/migration.rb +34 -0
  118. data/lib/enjoy/model.rb +22 -0
  119. data/lib/enjoy/models/active_record/contact_message.rb +14 -0
  120. data/lib/enjoy/models/active_record/menu.rb +17 -0
  121. data/lib/enjoy/models/active_record/news.rb +26 -0
  122. data/lib/enjoy/models/active_record/page.rb +20 -0
  123. data/lib/enjoy/models/active_record/seo.rb +17 -0
  124. data/lib/enjoy/models/contact_message.rb +37 -0
  125. data/lib/enjoy/models/embedded_element.rb +12 -0
  126. data/lib/enjoy/models/embedded_gallery_image.rb +16 -0
  127. data/lib/enjoy/models/gallery.rb +29 -0
  128. data/lib/enjoy/models/gallery_image.rb +23 -0
  129. data/lib/enjoy/models/menu.rb +28 -0
  130. data/lib/enjoy/models/mongoid/contact_message.rb +20 -0
  131. data/lib/enjoy/models/mongoid/embedded_element.rb +13 -0
  132. data/lib/enjoy/models/mongoid/embedded_gallery_image.rb +19 -0
  133. data/lib/enjoy/models/mongoid/gallery.rb +23 -0
  134. data/lib/enjoy/models/mongoid/gallery_image.rb +21 -0
  135. data/lib/enjoy/models/mongoid/menu.rb +15 -0
  136. data/lib/enjoy/models/mongoid/news.rb +29 -0
  137. data/lib/enjoy/models/mongoid/page.rb +25 -0
  138. data/lib/enjoy/models/mongoid/seo.rb +28 -0
  139. data/lib/enjoy/models/news.rb +58 -0
  140. data/lib/enjoy/models/page.rb +90 -0
  141. data/lib/enjoy/models/seo.rb +22 -0
  142. data/lib/enjoy/patch.rb +58 -0
  143. data/lib/enjoy/rails_admin_menu.rb +145 -0
  144. data/lib/enjoy/simple_form_patch.rb +12 -0
  145. data/lib/enjoy/tasks.rb +13 -0
  146. data/lib/enjoy/version.rb +3 -0
  147. data/lib/enjoy_cms.rb +109 -0
  148. data/lib/filename_to_slug.rb +34 -0
  149. data/lib/generators/enjoy/ability_generator.rb +14 -0
  150. data/lib/generators/enjoy/admin_generator.rb +21 -0
  151. data/lib/generators/enjoy/capify_generator.rb +39 -0
  152. data/lib/generators/enjoy/layout_generator.rb +14 -0
  153. data/lib/generators/enjoy/migration_generator.rb +18 -0
  154. data/lib/generators/enjoy/templates/Capfile +17 -0
  155. data/lib/generators/enjoy/templates/ability.erb +26 -0
  156. data/lib/generators/enjoy/templates/admin.erb +89 -0
  157. data/lib/generators/enjoy/templates/deploy.erb +47 -0
  158. data/lib/generators/enjoy/templates/dl.erb +30 -0
  159. data/lib/generators/enjoy/templates/migration_contact_messages.rb +15 -0
  160. data/lib/generators/enjoy/templates/migration_news.rb +26 -0
  161. data/lib/generators/enjoy/templates/migration_pages.rb +45 -0
  162. data/lib/generators/enjoy/templates/migration_seos.rb +14 -0
  163. data/lib/generators/enjoy/templates/production.erb +8 -0
  164. data/lib/generators/enjoy/templates/unicorn.erb +66 -0
  165. data/lib/generators/enjoy/utils.rb +21 -0
  166. data/lib/manual_slug.rb +10 -0
  167. data/lib/manual_slug/active_record.rb +32 -0
  168. data/lib/manual_slug/mongoid.rb +36 -0
  169. data/lib/rails_admin/custom_show_in_app.rb +43 -0
  170. data/release.sh +13 -0
  171. data/template.rb +824 -0
  172. metadata +579 -0
@@ -0,0 +1,36 @@
1
+ module ManualSlug::Mongoid
2
+ extend ActiveSupport::Concern
3
+ include ::Mongoid::Slug
4
+
5
+ def text_slug
6
+ self._slugs.empty? ? '' : self._slugs.last
7
+ end
8
+ def text_slug=(slug)
9
+ if slug.blank?
10
+ self._slugs = []
11
+ else
12
+ self._slugs.delete(slug)
13
+ self._slugs << slug
14
+ end
15
+ end
16
+
17
+ module ClassMethods
18
+ def manual_slug(field, options = {}, callback = true)
19
+ options.merge!(permanent: true, history: true)
20
+ slug field, options
21
+
22
+ # we will create slugs manually when needed
23
+ skip_callback :create, :before, :build_slug
24
+
25
+ before_validation do
26
+ self._slugs = self._slugs.map{ |s| s.strip }.reject {|s| s.blank? } if self._slugs
27
+
28
+ if self._slugs.blank?
29
+ self.build_slug
30
+ end
31
+
32
+ true
33
+ end if callback
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,43 @@
1
+ module RailsAdmin
2
+ module Config
3
+ module Actions
4
+ class CustomShowInApp < RailsAdmin::Config::Actions::Base
5
+ RailsAdmin::Config::Actions.register(self)
6
+
7
+ register_instance_option :member do
8
+ true
9
+ end
10
+
11
+ register_instance_option :visible? do
12
+ authorized? && (bindings[:controller].main_app.url_for(bindings[:object]) rescue false)
13
+ end
14
+
15
+ register_instance_option :controller do
16
+ Proc.new do
17
+ if @object.class.name == 'Enjoy::Page'
18
+ if @object.fullpath.blank?
19
+ redirect_to main_app.page_url(@object)
20
+ else
21
+ redirect_to @object.fullpath
22
+ end
23
+ elsif @object.class.name == 'Enjoy::News'
24
+ redirect_to main_app.news_url(@object)
25
+ elsif @object.class.name == 'Obj'
26
+ redirect_to main_app.object_url(@object.category, @object)
27
+ else
28
+ redirect_to main_app.url_for(@object)
29
+ end
30
+ end
31
+ end
32
+
33
+ register_instance_option :link_icon do
34
+ 'icon-eye-open'
35
+ end
36
+
37
+ register_instance_option :pjax? do
38
+ false
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
data/release.sh ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/bash
2
+ bundle update
3
+ git add --all .
4
+ git commit -am "${*:1}"
5
+ git push
6
+ git push gh master
7
+ rake release
8
+ cd mongoid
9
+ bundle update && rake release
10
+ cd ..
11
+ cd activerecord
12
+ bundle update && rake release
13
+ cd ..
data/template.rb ADDED
@@ -0,0 +1,824 @@
1
+ rails_spec = (Gem.loaded_specs["railties"] || Gem.loaded_specs["rails"])
2
+ version = rails_spec.version.to_s
3
+
4
+ mongoid = options[:skip_active_record]
5
+
6
+ if Gem::Version.new(version) < Gem::Version.new('4.2.4')
7
+ puts "You are using an old version of Rails (#{version})"
8
+ puts "Please update"
9
+ puts "Stopping"
10
+ exit 1
11
+ end
12
+
13
+ remove_file 'Gemfile'
14
+ create_file 'Gemfile' do <<-TEXT
15
+ source 'https://rubygems.org'
16
+
17
+ gem 'rails', '4.2.4' #'~> 5.0.0.beta1'
18
+ #{if mongoid then "gem 'mongoid', '~> 5.0.0'" else "gem 'pg'" end}
19
+
20
+ gem 'sass', '~> 3.4.0'
21
+ gem 'sass-rails'
22
+ gem 'compass-rails', '~> 2.0.0'
23
+ gem 'compass', '~> 1.0.0'
24
+
25
+ #{if mongoid then "gem 'Enjoy_mongoid'" else "gem 'Enjoy_activerecord'" end}, '~> 0.1.0.beta1', git: 'https://github.com/enjoycreative/Enjoy'
26
+
27
+ gem 'devise'
28
+
29
+ gem 'slim-rails'
30
+ gem 'rs_russian'
31
+ gem 'cancancan'
32
+
33
+ gem 'cloner'
34
+ gem 'unicorn'
35
+ gem 'x-real-ip'
36
+
37
+ gem 'sentry-raven'
38
+
39
+ group :development do
40
+ gem 'better_errors'
41
+ gem 'binding_of_caller'
42
+ gem 'pry-rails'
43
+ gem 'spring'
44
+
45
+ gem 'capistrano', require: false
46
+
47
+ gem 'rvm1-capistrano3', require: false
48
+ gem 'glebtv-capistrano-unicorn', require: false
49
+ gem 'capistrano-bundler', require: false
50
+ gem 'capistrano-rails', require: false
51
+
52
+ gem 'hipchat'
53
+ # gem 'coffee-rails-source-maps'
54
+ # gem 'compass-rails-source-maps'
55
+
56
+ gem 'favicon_maker', '0.3'
57
+ gem 'favicon_maker_rails'
58
+
59
+ gem 'rails_email_preview', '~> 0.2.29'
60
+ end
61
+
62
+ group :test do
63
+ gem 'rspec-rails'
64
+ gem 'database_cleaner'
65
+ gem 'email_spec'
66
+ #{if mongoid then "gem 'mongoid-rspec'" else "" end}
67
+ gem 'ffaker'
68
+ gem 'factory_girl_rails'
69
+ end
70
+
71
+ #{if mongoid then "gem 'mongo_session_store-rails4'" else "" end}
72
+
73
+ gem 'slim'
74
+ gem 'sprockets'
75
+
76
+
77
+ gem 'sitemap_generator'
78
+ gem 'rails_admin_sitemap'
79
+
80
+ gem 'uglifier'
81
+
82
+ group :production do
83
+ gem "god"
84
+ end
85
+
86
+ TEXT
87
+ end
88
+
89
+ remove_file '.gitignore'
90
+ create_file '.gitignore' do <<-TEXT
91
+ # See https://help.github.com/articles/ignoring-files for more about ignoring files.
92
+ #
93
+ # If you find yourself ignoring temporary files generated by your text editor
94
+ # or operating system, you probably want to add a global ignore instead:
95
+ # git config --global core.excludesfile '~/.gitignore_global'
96
+ .idea
97
+ .idea/*
98
+
99
+ /.bundle
100
+ /log/*.log
101
+ /tmp/*
102
+ /public/assets
103
+ /public/ckeditor_assets
104
+ TEXT
105
+ end
106
+
107
+ create_file 'extra/.gitkeep', ''
108
+
109
+ if mongoid
110
+ remove_file 'config/initializers/embedded_findable.rb'
111
+ create_file 'config/initializers/embedded_findable.rb' do <<-TEXT
112
+ module Mongoid
113
+
114
+ # Helps to override find method in an embedded document.
115
+ # Usage :
116
+ # - add to your model "include Mongoid::EmbeddedFindable"
117
+ # - override find method with:
118
+ # def self.find(id)
119
+ # find_through(Book, 'chapter', id)
120
+ # end
121
+ module EmbeddedFindable
122
+
123
+ extend ActiveSupport::Concern
124
+
125
+ included do
126
+
127
+ # Search an embedded document by id.
128
+ #
129
+ # Document is stored within embedding_class collection, and can be accessed through provided relation.
130
+ # Also supports chained relationships (if the searched document is nested in several embedded documents)
131
+ #
132
+ # Example, with a chapter embedded in a book, the book being embedded in a library.
133
+ # use find_through(Library, "books", book_id) in Book class
134
+ # and find_through(Library, "books.chapters", chapter_id) in Chapter class
135
+ def self.find_through(embedding_class, relation, id = nil)
136
+ return nil if id.nil? || id.blank?
137
+
138
+ id = BSON::ObjectId.from_string(id) if id.is_a?(String)
139
+ relation = relation.to_s unless relation.is_a?(String)
140
+
141
+ relation_parts = relation.split('.')
142
+ parent = embedding_class.send(:all)
143
+
144
+ while relation_parts.length > 0
145
+ item = if parent.is_a?(Mongoid::Criteria) || parent.is_a?(Array)
146
+ parent.where("\#{relation_parts.join('.')}._id" => id).first
147
+ else
148
+ parent
149
+ end
150
+ return nil if item.nil?
151
+ parent = item.send(relation_parts.shift)
152
+ end
153
+
154
+ if parent.is_a?(Mongoid::Criteria) || parent.is_a?(Array)
155
+ parent.where('_id' => id).first
156
+ else
157
+ parent
158
+ end
159
+ end
160
+
161
+ end
162
+
163
+ end
164
+
165
+ end
166
+ TEXT
167
+ end
168
+ end
169
+
170
+ if mongoid
171
+ remove_file 'config/initializers/cookies_serializer.rb'
172
+ create_file 'config/initializers/cookies_serializer.rb' do <<-TEXT
173
+ # Be sure to restart your server when you modify this file.
174
+ # json serializer breaks Devise + Mongoid. DO NOT ENABLE
175
+ # See https://github.com/plataformatec/devise/pull/2882
176
+ # Rails.application.config.action_dispatch.cookies_serializer = :json
177
+ Rails.application.config.action_dispatch.cookies_serializer = :marshal
178
+ TEXT
179
+ end
180
+ end
181
+
182
+ if mongoid
183
+ remove_file 'config/initializers/session_store.rb'
184
+ create_file 'config/initializers/session_store.rb' do <<-TEXT
185
+ # Be sure to restart your server when you modify this file.
186
+
187
+ #Rails.application.config.session_store :cookie_store, key: '_#{app_name.tableize.singularize}_session'
188
+ Rails.application.config.session_store :mongoid_store
189
+
190
+ TEXT
191
+ end
192
+ end
193
+
194
+ remove_file 'app/controllers/application_controller.rb'
195
+ create_file 'app/controllers/application_controller.rb' do <<-TEXT
196
+ class ApplicationController < ActionController::Base
197
+ include Enjoy::Controller
198
+ end
199
+ TEXT
200
+ end
201
+
202
+ create_file 'config/navigation.rb' do <<-TEXT
203
+ # empty file to please simple_navigation, we are not using it
204
+ # See https://github.com/enjoycreative/Enjoy/blob/master/app/controllers/concerns/enjoy/menu.rb
205
+ TEXT
206
+ end
207
+
208
+ create_file 'README.md', "## #{app_name}\nProject generated by Enjoy\nORM: #{if mongoid then 'Mongoid' else 'ActiveRecord' end}\n\n"
209
+
210
+ create_file '.ruby-version', "2.2.3\n"
211
+ create_file '.ruby-gemset', "#{app_name}\n"
212
+
213
+ run 'bundle install --without production'
214
+
215
+ # generate 'rails_email_preview:install'
216
+ remove_file 'app/mailer_previews/contact_mailer_preview.rb'
217
+ create_file 'app/mailer_previews/contact_mailer_preview.rb' do <<-TEXT
218
+ class ContactMailerPreview
219
+ def new_message_email
220
+ Enjoy::ContactMailer.new_message_email(ContactMessage.all.to_a.sample)
221
+ end
222
+ end
223
+ TEXT
224
+ end
225
+
226
+
227
+ if mongoid
228
+ create_file 'config/mongoid.yml' do <<-TEXT
229
+ development:
230
+ clients:
231
+ default:
232
+ database: #{app_name.downcase}
233
+ hosts:
234
+ - localhost:27017
235
+ production:
236
+ clients:
237
+ default:
238
+ database: #{app_name.downcase}
239
+ hosts:
240
+ - localhost:27017
241
+ test:
242
+ clients:
243
+ default:
244
+ database: #{app_name.downcase}_test
245
+ hosts:
246
+ - localhost:27017
247
+ TEXT
248
+ end
249
+ else
250
+ remove_file 'config/database.yml'
251
+ create_file 'config/database.yml' do <<-TEXT
252
+ development:
253
+ adapter: postgresql
254
+ encoding: unicode
255
+ database: #{app_name.downcase}_development
256
+ pool: 5
257
+ username: #{app_name.downcase}
258
+ password: #{app_name.downcase}
259
+ template: template0
260
+ TEXT
261
+ end
262
+ say "Please create a PostgreSQL user #{app_name.downcase} with password #{app_name.downcase} and a database #{app_name.downcase}_development owned by him for development NOW.", :red
263
+ ask("Press <enter> when done.", true)
264
+ end
265
+
266
+ unless mongoid
267
+ generate 'simple_captcha'
268
+ end
269
+
270
+ generate "devise:install"
271
+ generate "devise", "User"
272
+ remove_file "config/locales/devise.en.yml"
273
+ remove_file "config/locales/en.yml"
274
+
275
+ gsub_file 'app/models/user.rb', '# :confirmable, :lockable, :timeoutable and :omniauthable', '# :confirmable, :registerable, :timeoutable and :omniauthable'
276
+ gsub_file 'app/models/user.rb', ':registerable,', ' :lockable,'
277
+ if mongoid
278
+ gsub_file 'app/models/user.rb', '# field :failed_attempts', 'field :failed_attempts'
279
+ gsub_file 'app/models/user.rb', '# field :unlock_token', 'field :unlock_token'
280
+ gsub_file 'app/models/user.rb', '# field :locked_at', 'field :locked_at'
281
+
282
+ inject_into_file 'app/models/user.rb', before: /^end/ do <<-TEXT
283
+
284
+ field :name, type: String
285
+ field :login, type: String
286
+ field :roles, type: Array, default: []
287
+
288
+ before_save do
289
+ self.roles ||= []
290
+ self.roles.reject! { |r| r.blank? }
291
+ end
292
+
293
+ AVAILABLE_ROLES = ["admin", "manager", "client"]
294
+
295
+ AVAILABLE_ROLES.each do |r|
296
+ class_eval <<-EVAL
297
+ def \#{r}?
298
+ self.roles and self.roles.include?("\#{r}")
299
+ end
300
+
301
+ scope :\#{r.pluralize}, -> { any_in(roles: "\#{r}") }
302
+ EVAL
303
+ end
304
+
305
+ rails_admin do
306
+ list do
307
+ field :email
308
+ field :name
309
+ field :login
310
+ field :roles do
311
+ pretty_value do
312
+ bindings[:view].content_tag(:p, bindings[:object].roles.join(", "))
313
+ end
314
+ end
315
+ end
316
+
317
+ edit do
318
+ field :email, :string do
319
+ visible do
320
+ bindings[:controller].current_user.admin? or (bindings[:controller].current_user.manager? bindings[:controller].current_user == bindings[:object])
321
+ end
322
+ end
323
+ field :name, :string
324
+ field :login, :string do
325
+ visible do
326
+ bindings[:controller].current_user.admin?
327
+ end
328
+ end
329
+ field :roles, :enum do
330
+ enum do
331
+ AVAILABLE_ROLES
332
+ end
333
+
334
+ multiple do
335
+ true
336
+ end
337
+
338
+ visible do
339
+ bindings[:controller].current_user.admin?
340
+ end
341
+ end
342
+
343
+ field :password do
344
+ visible do
345
+ bindings[:controller].current_user.admin? or bindings[:controller].current_user == bindings[:object]
346
+ end
347
+ end
348
+ field :password_confirmation do
349
+ visible do
350
+ bindings[:controller].current_user.admin? or bindings[:controller].current_user == bindings[:object]
351
+ end
352
+ end
353
+ end
354
+ end
355
+ TEXT
356
+ end
357
+ end
358
+
359
+ if mongoid
360
+ generate "ckeditor:install", "--orm=mongoid", "--backend=paperclip"
361
+ else
362
+ generate "ckeditor:install", "--orm=active_record", "--backend=paperclip"
363
+ end
364
+
365
+ unless mongoid
366
+ generate "enjoy:migration"
367
+ generate "rails_admin_settings:migration"
368
+ end
369
+
370
+ generate "enjoy:admin"
371
+ generate "enjoy:ability"
372
+ generate "enjoy:layout"
373
+
374
+ unless mongoid
375
+ rake "db:migrate"
376
+ end
377
+
378
+ generate "simple_form:install"
379
+
380
+ generate "rspec:install"
381
+
382
+ remove_file 'config/routes.rb'
383
+ create_file 'config/routes.rb' do <<-TEXT
384
+ Rails.application.routes.draw do
385
+ devise_for :users
386
+ mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
387
+ mount Ckeditor::Engine => '/ckeditor'
388
+
389
+ mount Enjoy::Engine => '/'
390
+ end
391
+ TEXT
392
+ end
393
+
394
+ create_file 'config/locales/ru.yml' do <<-TEXT
395
+ ru:
396
+ attributes:
397
+ is_default: По умолчанию
398
+ mongoid:
399
+ models:
400
+ item: Товар
401
+ attributes:
402
+ item:
403
+ price: Цена
404
+ TEXT
405
+ end
406
+
407
+ remove_file 'db/seeds.rb'
408
+
409
+ require 'securerandom'
410
+ admin_pw = SecureRandom.urlsafe_base64(6)
411
+ create_file 'db/seeds.rb' do <<-TEXT
412
+ admin_pw = "#{admin_pw}"
413
+ User.destroy_all
414
+ User.create!(email: 'admin@#{app_name.dasherize.downcase}.ru', password: admin_pw, password_confirmation: admin_pw, roles: ["admin"])
415
+ TEXT
416
+ end
417
+
418
+ create_file 'config/initializers/rack.rb' do <<-TEXT
419
+ if Rails.env.development?
420
+ module Rack
421
+ class CommonLogger
422
+ alias_method :log_without_assets, :log
423
+ #{'ASSETS_PREFIX = "/#{Rails.application.config.assets.prefix[/\A\/?(.*?)\/?\z/, 1]}/"'}
424
+ def log(env, status, header, began_at)
425
+ unless env['REQUEST_PATH'].start_with?(ASSETS_PREFIX) || env['REQUEST_PATH'].start_with?('/uploads') || env['REQUEST_PATH'].start_with?('/system')
426
+ log_without_assets(env, status, header, began_at)
427
+ end
428
+ end
429
+ end
430
+ end
431
+ end
432
+
433
+ Rack::Utils.multipart_part_limit = 0
434
+ TEXT
435
+ end
436
+
437
+ create_file 'app/assets/stylesheets/rails_admin/custom/theming.sass' do <<-TEXT
438
+ .navbar-brand
439
+ margin-left: 0 !important
440
+
441
+ .input-small
442
+ width: 150px
443
+
444
+ .container-fluid
445
+ input[type=text]
446
+ width: 380px !important
447
+ input.ra-filtering-select-input[type=text]
448
+ width: 180px !important
449
+ input.hasDatepicker
450
+ width: 180px !important
451
+
452
+ .sidebar-nav
453
+ a
454
+ padding: 6px 10px !important
455
+ .dropdown-header
456
+ padding: 10px 0px 3px 9px
457
+
458
+ .label-important
459
+ background-color: #d9534f
460
+ .alert-notice
461
+ color: #5bc0de
462
+
463
+ .page-header
464
+ display: none
465
+ .breadcrumb
466
+ margin-top: 20px
467
+
468
+ .control-group
469
+ clear: both
470
+
471
+ .container-fluid
472
+ padding-left: 0
473
+ > .row
474
+ margin: 0
475
+
476
+ .last.links
477
+ a
478
+ display: inline-block
479
+ padding: 3px
480
+ font-size: 20px
481
+
482
+ .remove_nested_fields
483
+ opacity: 1 !important
484
+
485
+ body.rails_admin .modal
486
+ margin: 0 auto !important
487
+ .modal-dialog
488
+ width: 990px !important
489
+
490
+ input[type=checkbox]
491
+ width: 30px !important
492
+
493
+ body.rails_admin
494
+
495
+ .root_links
496
+
497
+ > li
498
+ display: inline-block
499
+
500
+ .dropdown-header
501
+ border-top: 2px solid #777777
502
+ text-align: right
503
+
504
+ &:first-child
505
+ border-top: none
506
+
507
+ .bank_row .logo_field, #edit_bank img
508
+ background: #ccc !important
509
+
510
+ .ui-menu-item
511
+ border: 1px solid transparent
512
+
513
+ .content > .alert
514
+ margin-top: 20px
515
+
516
+ .badge-important
517
+ background: red
518
+ .badge-success
519
+ background: green
520
+
521
+ .sidebar-nav i
522
+ margin-right: 5px
523
+
524
+ body.rails_admin .table td.paperclip_type, body.rails_admin .table td.carrierwave_type, body.rails_admin .table td.jcrop_type
525
+ img
526
+ max-width: 150px
527
+ max-height: 100px
528
+ TEXT
529
+ end
530
+
531
+ remove_file 'public/robots.txt'
532
+ create_file 'public/robots.txt' do <<-TEXT
533
+ User-Agent: *
534
+ Allow: /
535
+ Disallow: /admin
536
+ Sitemap: /sitemap.xml.gz
537
+ TEXT
538
+ end
539
+
540
+
541
+ remove_file 'app/views/layouts/application.html.erb'
542
+
543
+ gsub_file 'app/views/layouts/application.html.slim', "= favicon_link_tag '/favicon.ico'", "= render partial: 'blocks/favicon' #= favicon_link_tag '/favicon.ico'"
544
+
545
+
546
+ remove_file 'config/application.rb'
547
+ create_file 'config/application.rb' do <<-TEXT
548
+ require File.expand_path('../boot', __FILE__)
549
+
550
+ # Pick the frameworks you want:
551
+ require "active_model/railtie"
552
+ #{'#' if mongoid}require "active_record/railtie"
553
+ require "action_controller/railtie"
554
+ require "action_mailer/railtie"
555
+ require "action_view/railtie"
556
+ require "sprockets/railtie"
557
+ # require "rails/test_unit/railtie"
558
+
559
+ # Require the gems listed in Gemfile, including any gems
560
+ # you've limited to :test, :development, or :production.
561
+ Bundler.require(*Rails.groups)
562
+
563
+ module #{app_name.camelize}
564
+ class Application < Rails::Application
565
+ config.generators do |g|
566
+ g.test_framework :rspec
567
+ g.view_specs false
568
+ g.helper_specs false
569
+ g.feature_specs false
570
+ g.template_engine :slim
571
+ g.stylesheets false
572
+ g.javascripts false
573
+ g.helper false
574
+ g.fixture_replacement :factory_girl, :dir => 'spec/factories'
575
+ end
576
+
577
+ config.i18n.locale = :ru
578
+ config.i18n.default_locale = :ru
579
+ config.i18n.available_locales = [:ru, :en]
580
+ config.i18n.enforce_available_locales = true
581
+ #{'config.active_record.schema_format = :sql' unless mongoid}
582
+
583
+ #{'config.autoload_paths += %W(#{config.root}/extra)'}
584
+ #{'config.eager_load_paths += %W(#{config.root}/extra)'}
585
+
586
+ config.time_zone = 'Europe/Moscow'
587
+ config.assets.paths << Rails.root.join("app", "assets", "fonts")
588
+ end
589
+ end
590
+
591
+ TEXT
592
+ end
593
+
594
+ remove_file 'app/assets/stylesheets/application.css'
595
+ remove_file 'app/assets/stylesheets/application.css.sass'
596
+ create_file 'app/assets/stylesheets/application.sass' do <<-TEXT
597
+ @import 'compass'
598
+ @import 'Enjoy'
599
+
600
+ #wrapper
601
+ width: 960px
602
+ margin: 0 auto
603
+ #sidebar
604
+ float: left
605
+ width: 200px
606
+ #content
607
+ float: right
608
+ width: 750px
609
+
610
+ @import "compass/layout/sticky-footer"
611
+ +sticky-footer(50px)
612
+ TEXT
613
+ end
614
+
615
+ remove_file 'app/assets/javascripts/application.js'
616
+ remove_file 'app/assets/javascripts/application.js.coffee'
617
+ create_file 'app/assets/javascripts/application.coffee' do <<-TEXT
618
+ #= require Enjoy
619
+ TEXT
620
+ end
621
+
622
+
623
+ #god+unicorn
624
+ remove_file 'config/unicorn.rb'
625
+ create_file 'config/unicorn.rb' do <<-TEXT
626
+ rails_root = "/home/#{app_name.downcase}/www/#{app_name.downcase}"
627
+
628
+ worker_processes 2
629
+ working_directory rails_root
630
+
631
+ # This loads the application in the master process before forking
632
+ # worker processes
633
+ # Read more about it here:
634
+ # http://unicorn.bogomips.org/Unicorn/Configurator.html
635
+ preload_app true
636
+
637
+ timeout 30
638
+
639
+ # This is where we specify the socket.
640
+ # We will point the upstream Nginx module to this socket later on
641
+ listen "\#{rails_root}/tmp/sockets/unicorn.sock", :backlog => 64
642
+
643
+ pid "\#{rails_root}/tmp/pids/unicorn.pid"
644
+
645
+ # Set the path of the log files inside the log folder of the testapp
646
+ stderr_path "\#{rails_root}/log/unicorn.stderr.log"
647
+ stdout_path "\#{rails_root}/log/unicorn.stdout.log"
648
+
649
+
650
+ before_fork do |server, worker|
651
+ server.logger.info("worker=\#{worker.nr} spawning in \#{Dir.pwd}")
652
+
653
+ # graceful shutdown.
654
+ old_pid_file = "\#{rails_root}/tmp/pids/unicorn.pid.oldbin"
655
+ if File.exists?(old_pid_file) && server.pid != old_pid_file
656
+ begin
657
+ old_pid = File.read(old_pid_file).to_i
658
+ server.logger.info("sending QUIT to \#{old_pid}")
659
+ # we're killing old unicorn master right there
660
+ Process.kill("QUIT", old_pid)
661
+ rescue Errno::ENOENT, Errno::ESRCH
662
+ # someone else did our job for us
663
+ end
664
+ end
665
+ end
666
+
667
+ ## no need for noSQL
668
+ # before_fork do |server, worker|
669
+ # # This option works in together with preload_app true setting
670
+ # # What is does is prevent the master process from holding
671
+ # # the database connection
672
+ # defined?(ActiveRecord::Base) and
673
+ # ActiveRecord::Base.connection.disconnect!
674
+ # end
675
+ #
676
+ # after_fork do |server, worker|
677
+ # # Here we are establishing the connection after forking worker
678
+ # # processes
679
+ # defined?(ActiveRecord::Base) and
680
+ # ActiveRecord::Base.establish_connection
681
+ # end
682
+ TEXT
683
+ end
684
+
685
+ remove_file 'config/unicorn.god'
686
+ create_file 'config/unicorn.god' do <<-TEXT
687
+ # http://unicorn.bogomips.org/SIGNALS.html
688
+
689
+ rails_env = ENV['RAILS_ENV'] || 'production'
690
+ rails_root = ENV['RAILS_ROOT'] || File.dirname(File.dirname(__FILE__))
691
+
692
+ God.watch do |w|
693
+ w.name = "unicorn_qiwi_middleware"
694
+ w.interval = 30.seconds # default
695
+
696
+ # unicorn needs to be run from the rails root
697
+ w.start = "cd \#{rails_root} && unicorn -c \#{rails_root}/config/unicorn.rb -E \#{rails_env} -D"
698
+
699
+ # QUIT gracefully shuts down workers
700
+ w.stop = "kill -KILL `cat \#{rails_root}/tmp/pids/unicorn.pid`"
701
+
702
+ # USR2 causes the master to re-create itself and spawn a new worker pool
703
+ w.restart = "kill -USR2 `cat \#{rails_root}/tmp/pids/unicorn.pid`"# && cd \#{rails_root} && unicorn -c \#{rails_root}/config/unicorn.rb -E \#{rails_env} -D"
704
+
705
+ w.start_grace = 10.seconds
706
+ w.restart_grace = 10.seconds
707
+ w.pid_file = "\#{rails_root}/tmp/pids/unicorn.pid"
708
+
709
+ w.uid = 'ack'
710
+ w.gid = 'ack'
711
+
712
+ w.behavior(:clean_pid_file)
713
+
714
+ w.start_if do |start|
715
+ start.condition(:process_running) do |c|
716
+ c.interval = 5.seconds
717
+ c.running = false
718
+ end
719
+ end
720
+
721
+ w.restart_if do |restart|
722
+ restart.condition(:memory_usage) do |c|
723
+ c.above = 150.megabytes
724
+ c.times = [3, 5] # 3 out of 5 intervals
725
+ end
726
+
727
+ restart.condition(:cpu_usage) do |c|
728
+ c.above = 50.percent
729
+ c.times = 5
730
+ end
731
+ end
732
+
733
+ # lifecycle
734
+ w.lifecycle do |on|
735
+ on.condition(:flapping) do |c|
736
+ c.to_state = [:start, :restart]
737
+ c.times = 5
738
+ c.within = 5.minute
739
+ c.transition = :unmonitored
740
+ c.retry_in = 10.minutes
741
+ c.retry_times = 5
742
+ c.retry_within = 2.hours
743
+ end
744
+ end
745
+ end
746
+ TEXT
747
+ end
748
+
749
+
750
+
751
+ #scripts
752
+ remove_file 'scripts/assets_precompile.sh'
753
+ create_file 'scripts/assets_precompile.sh' do <<-TEXT
754
+ #!/bin/sh
755
+
756
+ RAILS_ENV=production rake assets:precompile
757
+ TEXT
758
+ end
759
+
760
+ remove_file 'scripts/bundle_production.sh'
761
+ create_file 'scripts/bundle_production.sh' do <<-TEXT
762
+ #!/bin/sh
763
+
764
+ rm Gemfile.lock
765
+ bundle install --without development test
766
+ TEXT
767
+ end
768
+
769
+ remove_file 'scripts/full_assets_precompile.sh'
770
+ create_file 'scripts/full_assets_precompile.sh' do <<-TEXT
771
+ #!/bin/sh
772
+
773
+ RAILS_ENV=production rake assets:precompile
774
+ TEXT
775
+ end
776
+
777
+ remove_file 'scripts/restart_thru_kill.sh'
778
+ create_file 'scripts/restart_thru_kill.sh' do <<-TEXT
779
+ #!/bin/sh
780
+
781
+ kill $(cat ./tmp/pids/unicorn.pid)
782
+ TEXT
783
+ end
784
+
785
+ remove_file 'scripts/send_usr2.sh'
786
+ create_file 'scripts/send_usr2.sh' do <<-TEXT
787
+ #!/bin/sh
788
+
789
+ kill -USR2 $(cat ./tmp/pids/unicorn.pid)
790
+ TEXT
791
+ end
792
+
793
+ remove_file 'scripts/send_hup.sh'
794
+ create_file 'scripts/send_hup.sh' do <<-TEXT
795
+ #!/bin/sh
796
+
797
+ kill -HUP $(cat ./tmp/pids/unicorn.pid)
798
+ TEXT
799
+ end
800
+
801
+ inject_into_file 'config/initializers/assets.rb', before: /\z/ do <<-TEXT
802
+ Rails.application.config.assets.precompile += %w( ckeditor/* )
803
+ TEXT
804
+ end
805
+
806
+
807
+
808
+ if mongoid
809
+ FileUtils.cp(Pathname.new(destination_root).join('config', 'mongoid.yml').to_s, Pathname.new(destination_root).join('config', 'mongoid.yml.example').to_s)
810
+ else
811
+ FileUtils.cp(Pathname.new(destination_root).join('config', 'database.yml').to_s, Pathname.new(destination_root).join('config', 'database.yml.example').to_s)
812
+ end
813
+
814
+ FileUtils.cp(Pathname.new(destination_root).join('config', 'secrets.yml').to_s, Pathname.new(destination_root).join('config', 'secrets.yml.example').to_s)
815
+
816
+ unless mongoid
817
+ generate "paper_trail:install"
818
+ generate "friendly_id"
819
+ rake "db:migrate"
820
+ end
821
+
822
+ git :init
823
+ git add: "."
824
+ git commit: %Q{ -m 'Initial commit' }