pages_core 3.4.2

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 (271) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +29 -0
  3. data/Rakefile +10 -0
  4. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  5. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  6. data/app/assets/images/pages/admin/drag-icon.png +0 -0
  7. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  8. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  9. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  10. data/app/assets/images/pages/admin/icon.png +0 -0
  11. data/app/assets/images/pages/admin/image-editor-bg.png +0 -0
  12. data/app/assets/images/pages/admin/list-table-pin-blue.gif +0 -0
  13. data/app/assets/images/pages/admin/list-table-pin-disabled.gif +0 -0
  14. data/app/assets/images/pages/admin/list-table-pin-green.gif +0 -0
  15. data/app/assets/images/pages/admin/list-table-pin-red.gif +0 -0
  16. data/app/assets/images/pages/admin/list-table-pin-yellow.gif +0 -0
  17. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  18. data/app/assets/images/pages/admin/loading-modal.gif +0 -0
  19. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  20. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  21. data/app/assets/images/pages/admin/warning-icon.gif +0 -0
  22. data/app/assets/images/pages/favicon.gif +0 -0
  23. data/app/assets/images/pages/feed-icon-14x14.png +0 -0
  24. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +4 -0
  25. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +139 -0
  26. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +9 -0
  27. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +47 -0
  28. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +122 -0
  29. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +66 -0
  30. data/app/assets/javascripts/pages/admin/features/page_images.js +329 -0
  31. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +40 -0
  32. data/app/assets/javascripts/pages/admin/features/tag_editor.js +159 -0
  33. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +17 -0
  34. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +21 -0
  35. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +57 -0
  36. data/app/assets/javascripts/pages/admin.js.coffee +54 -0
  37. data/app/assets/javascripts/pages/login_form.js.coffee +17 -0
  38. data/app/assets/stylesheets/pages/admin/buttons.css.erb +5 -0
  39. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +94 -0
  40. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +58 -0
  41. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +178 -0
  42. data/app/assets/stylesheets/pages/admin/controllers/users.css.erb +3 -0
  43. data/app/assets/stylesheets/pages/admin/editable_image.css.erb +19 -0
  44. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +73 -0
  45. data/app/assets/stylesheets/pages/admin/header.css.erb +129 -0
  46. data/app/assets/stylesheets/pages/admin/images.css.scss.erb +160 -0
  47. data/app/assets/stylesheets/pages/admin/links.css.erb +34 -0
  48. data/app/assets/stylesheets/pages/admin/list_table.css.erb +56 -0
  49. data/app/assets/stylesheets/pages/admin/login.css.scss.erb +32 -0
  50. data/app/assets/stylesheets/pages/admin/modal.css.erb +14 -0
  51. data/app/assets/stylesheets/pages/admin/pagination.css.scss +22 -0
  52. data/app/assets/stylesheets/pages/admin/print.css.erb +17 -0
  53. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +39 -0
  54. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +18 -0
  55. data/app/assets/stylesheets/pages/admin/tag_editor.css.scss.erb +48 -0
  56. data/app/assets/stylesheets/pages/admin/textarea.css.erb +55 -0
  57. data/app/assets/stylesheets/pages/admin.css.erb +404 -0
  58. data/app/assets/stylesheets/pages/errors.css +126 -0
  59. data/app/controller_dummies/admin/admin_controller.rb +6 -0
  60. data/app/controller_dummies/application_controller.rb +6 -0
  61. data/app/controller_dummies/frontend_controller.rb +4 -0
  62. data/app/controller_dummies/images_controller.rb +4 -0
  63. data/app/controller_dummies/page_files_controller.rb +4 -0
  64. data/app/controller_dummies/pages_controller.rb +4 -0
  65. data/app/controller_dummies/sitemaps_controller.rb +4 -0
  66. data/app/controllers/admin/categories_controller.rb +57 -0
  67. data/app/controllers/admin/images_controller.rb +48 -0
  68. data/app/controllers/admin/invites_controller.rb +79 -0
  69. data/app/controllers/admin/page_comments_controller.rb +61 -0
  70. data/app/controllers/admin/page_files_controller.rb +81 -0
  71. data/app/controllers/admin/page_images_controller.rb +116 -0
  72. data/app/controllers/admin/pages_controller.rb +179 -0
  73. data/app/controllers/admin/password_resets_controller.rb +83 -0
  74. data/app/controllers/admin/users_controller.rb +102 -0
  75. data/app/controllers/concerns/pages_core/authentication.rb +48 -0
  76. data/app/controllers/concerns/pages_core/domain_based_cache.rb +28 -0
  77. data/app/controllers/concerns/pages_core/exception_handler.rb +114 -0
  78. data/app/controllers/concerns/pages_core/policies_helper.rb +40 -0
  79. data/app/controllers/concerns/pages_core/process_titler.rb +44 -0
  80. data/app/controllers/errors_controller.rb +45 -0
  81. data/app/controllers/pages_core/admin_controller.rb +109 -0
  82. data/app/controllers/pages_core/application_controller.rb +31 -0
  83. data/app/controllers/pages_core/frontend/page_files_controller.rb +42 -0
  84. data/app/controllers/pages_core/frontend/pages_controller.rb +308 -0
  85. data/app/controllers/pages_core/frontend_controller.rb +34 -0
  86. data/app/controllers/pages_core/images_controller.rb +15 -0
  87. data/app/controllers/pages_core/sitemaps_controller.rb +73 -0
  88. data/app/controllers/sessions_controller.rb +38 -0
  89. data/app/formatters/pages_core/html_formatter.rb +86 -0
  90. data/app/helpers/admin/admin_helper.rb +7 -0
  91. data/app/helpers/admin/menu_helper.rb +65 -0
  92. data/app/helpers/admin/pages_helper.rb +74 -0
  93. data/app/helpers/application_helper.rb +5 -0
  94. data/app/helpers/frontend_helper.rb +5 -0
  95. data/app/helpers/pages_core/admin/admin_helper.rb +108 -0
  96. data/app/helpers/pages_core/admin/labelled_field_helper.rb +73 -0
  97. data/app/helpers/pages_core/admin/tag_editor_helper.rb +46 -0
  98. data/app/helpers/pages_core/application_helper.rb +65 -0
  99. data/app/helpers/pages_core/form_builder.rb +187 -0
  100. data/app/helpers/pages_core/frontend_helper.rb +21 -0
  101. data/app/helpers/pages_core/head_tags_helper.rb +270 -0
  102. data/app/helpers/pages_core/images_helper.rb +36 -0
  103. data/app/helpers/pages_core/login_helper.rb +14 -0
  104. data/app/indices/page_file_index.rb +9 -0
  105. data/app/indices/page_index.rb +29 -0
  106. data/app/indices/user_index.rb +11 -0
  107. data/app/jobs/pages_core/autopublish_job.rb +11 -0
  108. data/app/jobs/pages_core/sweep_cache_job.rb +11 -0
  109. data/app/mailers/admin_mailer.rb +46 -0
  110. data/app/models/autopublisher.rb +33 -0
  111. data/app/models/category.rb +23 -0
  112. data/app/models/concerns/pages_core/has_roles.rb +25 -0
  113. data/app/models/concerns/pages_core/humanizable_param.rb +17 -0
  114. data/app/models/concerns/pages_core/page_tree.rb +85 -0
  115. data/app/models/concerns/pages_core/searchable_page.rb +33 -0
  116. data/app/models/concerns/pages_core/sweepable.rb +23 -0
  117. data/app/models/concerns/pages_core/taggable.rb +46 -0
  118. data/app/models/concerns/pages_core/templateable.rb +85 -0
  119. data/app/models/image.rb +23 -0
  120. data/app/models/invite.rb +33 -0
  121. data/app/models/invite_role.rb +11 -0
  122. data/app/models/localization.rb +27 -0
  123. data/app/models/page.rb +281 -0
  124. data/app/models/page_builder.rb +61 -0
  125. data/app/models/page_comment.rb +18 -0
  126. data/app/models/page_file.rb +74 -0
  127. data/app/models/page_image.rb +62 -0
  128. data/app/models/password_reset_token.rb +38 -0
  129. data/app/models/role.rb +51 -0
  130. data/app/models/tag.rb +64 -0
  131. data/app/models/tagging.rb +22 -0
  132. data/app/models/user.rb +131 -0
  133. data/app/policies/invite_policy.rb +29 -0
  134. data/app/policies/page_file_policy.rb +25 -0
  135. data/app/policies/page_image_policy.rb +25 -0
  136. data/app/policies/page_policy.rb +33 -0
  137. data/app/policies/policy.rb +64 -0
  138. data/app/policies/user_policy.rb +49 -0
  139. data/app/serializers/admin/image_serializer.rb +10 -0
  140. data/app/serializers/admin/page_image_serializer.rb +6 -0
  141. data/app/serializers/page_image_serializer.rb +38 -0
  142. data/app/serializers/page_serializer.rb +21 -0
  143. data/app/views/admin/invites/new.html.erb +16 -0
  144. data/app/views/admin/invites/show.html.erb +25 -0
  145. data/app/views/admin/pages/_edit_comments.html.erb +21 -0
  146. data/app/views/admin/pages/_edit_content.html.erb +10 -0
  147. data/app/views/admin/pages/_edit_images.html.erb +84 -0
  148. data/app/views/admin/pages/_edit_metadata.html.erb +24 -0
  149. data/app/views/admin/pages/_edit_options.html.erb +72 -0
  150. data/app/views/admin/pages/_pagelisting.html.erb +63 -0
  151. data/app/views/admin/pages/edit.html.erb +161 -0
  152. data/app/views/admin/pages/index.html.erb +67 -0
  153. data/app/views/admin/pages/new.html.erb +48 -0
  154. data/app/views/admin/pages/news.html.erb +69 -0
  155. data/app/views/admin/password_resets/show.html.erb +24 -0
  156. data/app/views/admin/users/_access_control.html.erb +14 -0
  157. data/app/views/admin/users/_list.html.erb +62 -0
  158. data/app/views/admin/users/_login_form.html.erb +47 -0
  159. data/app/views/admin/users/deactivated.html.erb +12 -0
  160. data/app/views/admin/users/edit.html.erb +54 -0
  161. data/app/views/admin/users/index.html.erb +27 -0
  162. data/app/views/admin/users/login.html.erb +15 -0
  163. data/app/views/admin/users/new.html.erb +23 -0
  164. data/app/views/admin/users/new_password.html.erb +19 -0
  165. data/app/views/admin/users/show.html.erb +64 -0
  166. data/app/views/admin_mailer/comment_notification.text.erb +7 -0
  167. data/app/views/admin_mailer/error_report.html.erb +70 -0
  168. data/app/views/admin_mailer/invite.text.erb +9 -0
  169. data/app/views/admin_mailer/password_reset.text.erb +13 -0
  170. data/app/views/errors/403.html.erb +6 -0
  171. data/app/views/errors/404.html.erb +11 -0
  172. data/app/views/errors/405.html.erb +4 -0
  173. data/app/views/errors/500.html.erb +19 -0
  174. data/app/views/errors/500_critical.html.erb +7 -0
  175. data/app/views/errors/_generic_help.html.erb +21 -0
  176. data/app/views/errors/report.html.erb +4 -0
  177. data/app/views/feeds/pages.rss.builder +39 -0
  178. data/app/views/layouts/admin/_analytics.html.erb +18 -0
  179. data/app/views/layouts/admin/_header.html.erb +37 -0
  180. data/app/views/layouts/admin.html.erb +79 -0
  181. data/app/views/layouts/errors.html.erb +23 -0
  182. data/app/views/sitemaps/show.xml.builder +9 -0
  183. data/config/locales/en.yml +6 -0
  184. data/config/removed_migrations.yml +60 -0
  185. data/config/routes.rb +127 -0
  186. data/db/migrate/20111219033112_create_pages_tables.rb +281 -0
  187. data/db/migrate/20120627033112_rename_textbits.rb +19 -0
  188. data/db/migrate/20121010055412_drop_removed_tables.rb +83 -0
  189. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +11 -0
  190. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +11 -0
  191. data/db/migrate/20130303160632_remove_imagesets.rb +24 -0
  192. data/db/migrate/20130303161732_remove_sms_subscribers.rb +16 -0
  193. data/db/migrate/20130823133208_update_page_redirect_to.rb +25 -0
  194. data/db/migrate/20140203183900_create_roles.rb +63 -0
  195. data/db/migrate/20140414150500_change_locale_names.rb +13 -0
  196. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +15 -0
  197. data/db/migrate/20140604142100_remove_openid_url.rb +9 -0
  198. data/db/migrate/20140920231700_convert_images_to_dis.rb +79 -0
  199. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +50 -0
  200. data/db/migrate/20141004003100_create_password_reset_tokens.rb +10 -0
  201. data/db/migrate/20141006181300_remove_user_cruft.rb +11 -0
  202. data/db/migrate/20141007173000_create_invites.rb +16 -0
  203. data/db/migrate/20150204130800_update_delayed_job_table.rb +9 -0
  204. data/db/migrate/20150401131300_localize_images.rb +39 -0
  205. data/db/migrate/20150520174300_add_meta_image_to_page.rb +5 -0
  206. data/db/migrate/20150904164200_add_pinned_to_tags.rb +5 -0
  207. data/lib/pages_core/admin_menu_item.rb +22 -0
  208. data/lib/pages_core/archive_finder.rb +75 -0
  209. data/lib/pages_core/cache_sweeper.rb +112 -0
  210. data/lib/pages_core/configuration/base.rb +85 -0
  211. data/lib/pages_core/configuration/pages.rb +23 -0
  212. data/lib/pages_core/configuration.rb +9 -0
  213. data/lib/pages_core/engine.rb +27 -0
  214. data/lib/pages_core/extensions/hash_extensions.rb +23 -0
  215. data/lib/pages_core/extensions/string_extensions.rb +17 -0
  216. data/lib/pages_core/extensions.rb +4 -0
  217. data/lib/pages_core/localizable/active_record_extension.rb +41 -0
  218. data/lib/pages_core/localizable/class_methods.rb +51 -0
  219. data/lib/pages_core/localizable/configuration.rb +50 -0
  220. data/lib/pages_core/localizable/instance_methods.rb +130 -0
  221. data/lib/pages_core/localizable/localizer.rb +72 -0
  222. data/lib/pages_core/localizable/scope_extension.rb +22 -0
  223. data/lib/pages_core/localizable.rb +49 -0
  224. data/lib/pages_core/pages_plugin.rb +14 -0
  225. data/lib/pages_core/paginates.rb +102 -0
  226. data/lib/pages_core/plugin.rb +118 -0
  227. data/lib/pages_core/templates/block_configuration.rb +17 -0
  228. data/lib/pages_core/templates/configuration.rb +81 -0
  229. data/lib/pages_core/templates/configuration_handler.rb +62 -0
  230. data/lib/pages_core/templates/configuration_proxy.rb +28 -0
  231. data/lib/pages_core/templates/controller_actions.rb +32 -0
  232. data/lib/pages_core/templates/template_configuration.rb +198 -0
  233. data/lib/pages_core/templates.rb +53 -0
  234. data/lib/pages_core/version.rb +5 -0
  235. data/lib/pages_core.rb +89 -0
  236. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +68 -0
  237. data/lib/rails/generators/pages_core/frontend/templates/application.css.scss.erb +3 -0
  238. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +16 -0
  239. data/lib/rails/generators/pages_core/frontend/templates/base.css.scss.erb +3 -0
  240. data/lib/rails/generators/pages_core/frontend/templates/breakpoints.css.scss.erb +24 -0
  241. data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +8 -0
  242. data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +15 -0
  243. data/lib/rails/generators/pages_core/frontend/templates/normalize.css.erb +425 -0
  244. data/lib/rails/generators/pages_core/install/install_generator.rb +135 -0
  245. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +1 -0
  246. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +11 -0
  247. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +5 -0
  248. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +11 -0
  249. data/lib/rails/generators/pages_core/install/templates/default_page_template.html.erb +5 -0
  250. data/lib/rails/generators/pages_core/install/templates/delayed_job +7 -0
  251. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +3 -0
  252. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +6 -0
  253. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +5 -0
  254. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +25 -0
  255. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +67 -0
  256. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +4 -0
  257. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +45 -0
  258. data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +12 -0
  259. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +34 -0
  260. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +9 -0
  261. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +9 -0
  262. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +51 -0
  263. data/lib/tasks/db.rake +96 -0
  264. data/lib/tasks/pages/assets.rake +65 -0
  265. data/lib/tasks/pages/cache.rake +16 -0
  266. data/lib/tasks/pages/update.rake +19 -0
  267. data/lib/tasks/pages.rake +76 -0
  268. data/template.rb +19 -0
  269. data/vendor/assets/javascripts/jquery.dimscreen.js +77 -0
  270. data/vendor/assets/javascripts/jquery.fieldselection.js +59 -0
  271. metadata +690 -0
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ class AddQueueToDelayedJobs < ActiveRecord::Migration
4
+ def self.up
5
+ add_column :delayed_jobs, :queue, :string
6
+ end
7
+
8
+ def self.down
9
+ remove_column :delayed_jobs, :queue
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+
3
+ class RemoveFilterFromLocalizations < ActiveRecord::Migration
4
+ def self.up
5
+ remove_column :localizations, :filter
6
+ end
7
+
8
+ def self.down
9
+ add_column :localizations, :filter, :string
10
+ end
11
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ class RemoveImagesets < ActiveRecord::Migration
4
+ def self.up
5
+ drop_table :imagesets
6
+ drop_table :images_imagesets
7
+ end
8
+
9
+ def self.down
10
+ create_table "images_imagesets" do |t|
11
+ t.integer "relation_id"
12
+ t.integer "imageset_id"
13
+ t.integer "image_id"
14
+ t.integer "position"
15
+ end
16
+
17
+ create_table "imagesets" do |t|
18
+ t.string "name"
19
+ t.text "description"
20
+ t.datetime "created_at"
21
+ t.integer "user_id"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ class RemoveSmsSubscribers < ActiveRecord::Migration
4
+ def self.up
5
+ drop_table :sms_subscribers
6
+ end
7
+
8
+ def self.down
9
+ create_table "sms_subscribers" do |t|
10
+ t.string "msisdn"
11
+ t.string "group", default: "Default"
12
+ t.datetime "created_at"
13
+ t.datetime "updated_at"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ class UpdatePageRedirectTo < ActiveRecord::Migration
4
+ def self.up
5
+ include Rails.application.routes.url_helpers
6
+
7
+ pages = Page.where('redirect_to IS NOT NULL AND redirect_to != ""')
8
+ pages.each do |page|
9
+ if page.redirect_to == "0" || page.redirect_to == "--- \"\"\n" || page.redirect_to == "--- ''\n"
10
+ page.update(redirect_to: nil)
11
+ elsif page.redirect_to.start_with?("---")
12
+ options = YAML.load(page.redirect_to)
13
+ path = url_for(options.merge(locale: ":locale", only_path: true))
14
+ page.update(redirect_to: path)
15
+ elsif !(page.redirect_to =~ /\A(\/|https?:\/\/)/)
16
+ fail "Not a valid Page redirect_to: #{page.redirect_to.inspect}"
17
+ end
18
+ end
19
+ change_column :pages, :redirect_to, :string
20
+ end
21
+
22
+ def self.down
23
+ change_column :pages, :redirect_to, :text
24
+ end
25
+ end
@@ -0,0 +1,63 @@
1
+ class CreateRoles < ActiveRecord::Migration
2
+ def connection
3
+ @connection ||= ActiveRecord::Base.connection
4
+ end
5
+
6
+ def define_roles(flag, role)
7
+ connection.select_rows(
8
+ "SELECT id
9
+ FROM #{connection.quote_table_name('users')}
10
+ WHERE #{connection.quote_column_name(flag)} = #{connection.quote(true)}"
11
+ ).each do |u|
12
+ connection.execute(
13
+ "INSERT INTO #{connection.quote_table_name('roles')} (user_id, name, created_at, updated_at)
14
+ VALUES (#{u[0]}, #{connection.quote(role)}, #{connection.quote(Time.now)}, #{connection.quote(Time.now)})"
15
+ )
16
+ end
17
+ end
18
+
19
+ def undo_role(role, flag)
20
+ connection.select_rows(
21
+ "SELECT user_id
22
+ FROM #{connection.quote_table_name('roles')}
23
+ WHERE name = #{connection.quote(role)}"
24
+ ).each do |r|
25
+ connection.execute(
26
+ "UPDATE #{connection.quote_table_name('users')}
27
+ SET #{connection.quote_column_name(flag)} = #{connection.quote(true)}
28
+ WHERE id = #{connection.quote(r[0])}"
29
+ )
30
+ end
31
+ end
32
+
33
+ def up
34
+ create_table :roles do |t|
35
+ t.belongs_to :user
36
+ t.string :name
37
+ t.timestamps
38
+ end
39
+ add_index :roles, :user_id
40
+
41
+ define_roles :is_admin, "pages"
42
+ define_roles :is_admin, "users"
43
+ define_roles :is_reviewer, "reviewer"
44
+
45
+ remove_column :users, :is_admin
46
+ remove_column :users, :is_super_admin
47
+ remove_column :users, :is_reviewer
48
+ remove_column :users, :sms_sender
49
+ end
50
+
51
+ def down
52
+ add_column :users, :sms_sender, :boolean, default: false, null: false
53
+ add_column :users, :is_reviewer, :boolean, default: false, null: false
54
+ add_column :users, :is_super_admin, :boolean, default: false, null: false
55
+ add_column :users, :is_admin, :boolean, default: false, null: false
56
+
57
+ undo_role "pages", :is_admin
58
+ undo_role "users", :is_admin
59
+ undo_role "reviewer", :is_reviewer
60
+
61
+ drop_table :roles
62
+ end
63
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ class ChangeLocaleNames < ActiveRecord::Migration
4
+ def self.up
5
+ Localization.where(locale: "nor").update_all(locale: "nb")
6
+ Localization.where(locale: "eng").update_all(locale: "en")
7
+ end
8
+
9
+ def self.down
10
+ Localization.where(locale: "en").update_all(locale: "eng")
11
+ Localization.where(locale: "nb").update_all(locale: "nor")
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ class RemoveSphinxDeltas < ActiveRecord::Migration
2
+ def self.up
3
+ remove_index :users, name: :delta_index
4
+ remove_index :pages, name: :delta_index
5
+ remove_column :pages, :delta
6
+ remove_column :users, :delta
7
+ end
8
+
9
+ def self.down
10
+ add_index "users", ["delta"], name: "delta_index"
11
+ add_index "pages", ["delta"], name: "delta_index"
12
+ add_column :users, :delta, :boolean, null: false, default: false
13
+ add_column :pages, :delta, :boolean, null: false, default: false
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ class RemoveOpenidUrl < ActiveRecord::Migration
2
+ def self.up
3
+ remove_column :users, :openid_url
4
+ end
5
+
6
+ def self.down
7
+ add_column :users, :openid_url, :string
8
+ end
9
+ end
@@ -0,0 +1,79 @@
1
+ class ConvertImagesToDis < ActiveRecord::Migration
2
+ class Image < ActiveRecord::Base; end
3
+ class Binary < ActiveRecord::Base; end
4
+
5
+ def change
6
+ add_column :images, :content_hash, :string, null: false
7
+ change_column :images, :content_type, :string, null: false
8
+ add_column :images, :content_length, :integer, null: false
9
+ change_column :images, :filename, :string, null: false
10
+ add_column :images, :colorspace, :string, null: false
11
+ add_column :images, :real_width, :integer, null: false
12
+ add_column :images, :real_height, :integer, null: false
13
+ add_column :images, :crop_width, :integer
14
+ add_column :images, :crop_height, :integer
15
+ add_column :images, :crop_start_x, :integer
16
+ add_column :images, :crop_start_y, :integer
17
+ add_column :images, :crop_gravity_x, :integer
18
+ add_column :images, :crop_gravity_y, :integer
19
+
20
+ Image.reset_column_information
21
+ reversible do |dir|
22
+ dir.up do
23
+ Image.all.each do |image|
24
+ binary = Binary.find(image.binary_id)
25
+ hash = binary.sha1_hash
26
+
27
+ if binary_exist?(hash)
28
+ f = binary_file(hash)
29
+ image.content_length = f.size
30
+ image.content_hash = Dis::Storage.store("images", f)
31
+ f.close
32
+ else
33
+ image.content_hash = hash
34
+ image.content_length = 0
35
+ end
36
+
37
+ image.colorspace = "rgb"
38
+
39
+ image.real_width, image.real_height = Vector2d(image.original_size).to_a
40
+
41
+ if image.cropped?
42
+ image.crop_start_x, image.crop_start_y = Vector2d(image.crop_start).to_a
43
+ image.crop_width, image.crop_height = Vector2d(image.crop_size).to_a
44
+ end
45
+
46
+ image.save
47
+ end
48
+ end
49
+ end
50
+
51
+ remove_column :images, :folder, :integer
52
+ remove_column :images, :user_id, :integer
53
+ remove_column :images, :filters, :text
54
+ remove_column :images, :original_size, :string
55
+ remove_column :images, :hotspot, :string
56
+ remove_column :images, :binary_id, :integer
57
+ remove_column :images, :original_binary_id, :integer
58
+ remove_column :images, :url, :string
59
+ remove_column :images, :cropped, :boolean, null: false, default: false
60
+ remove_column :images, :crop_start, :string
61
+ remove_column :images, :crop_size, :string
62
+ end
63
+
64
+ private
65
+
66
+ def binary_file(hash)
67
+ File.open(binary_path(hash), "rb")
68
+ end
69
+
70
+ def binary_exist?(hash)
71
+ File.exist?(binary_path(hash))
72
+ end
73
+
74
+ def binary_path(hash)
75
+ folder = hash[0...2]
76
+ filename = hash[2..hash.length]
77
+ Rails.root.join("db", "binary-objects", Rails.env, folder, filename)
78
+ end
79
+ end
@@ -0,0 +1,50 @@
1
+ class ConvertPageFilesToDis < ActiveRecord::Migration
2
+ class PageFile < ActiveRecord::Base; end
3
+ class Binary < ActiveRecord::Base; end
4
+
5
+ def change
6
+ add_column :page_files, :content_hash, :string, null: false
7
+ change_column :page_files, :content_type, :string, null: false
8
+ rename_column :page_files, :filesize, :content_length
9
+ change_column :page_files, :content_length, :integer, null: false
10
+ change_column :page_files, :filename, :string, null: false
11
+
12
+ PageFile.reset_column_information
13
+ reversible do |dir|
14
+ dir.up do
15
+ PageFile.all.each do |page_file|
16
+ binary = Binary.find(page_file.binary_id)
17
+ hash = binary.sha1_hash
18
+
19
+ if binary_exist?(hash)
20
+ f = binary_file(hash)
21
+ page_file.content_hash = Dis::Storage.store("page_files", f)
22
+ f.close
23
+ else
24
+ page_file.content_hash = hash
25
+ end
26
+
27
+ page_file.save
28
+ end
29
+ end
30
+ end
31
+
32
+ remove_column :page_files, :binary_id, :integer
33
+ end
34
+
35
+ private
36
+
37
+ def binary_file(hash)
38
+ File.open(binary_path(hash), "rb")
39
+ end
40
+
41
+ def binary_exist?(hash)
42
+ File.exist?(binary_path(hash))
43
+ end
44
+
45
+ def binary_path(hash)
46
+ folder = hash[0...2]
47
+ filename = hash[2..hash.length]
48
+ Rails.root.join("db", "binary-objects", Rails.env, folder, filename)
49
+ end
50
+ end
@@ -0,0 +1,10 @@
1
+ class CreatePasswordResetTokens < ActiveRecord::Migration
2
+ def change
3
+ create_table :password_reset_tokens do |t|
4
+ t.belongs_to :user
5
+ t.string :token
6
+ t.datetime :expires_at
7
+ t.timestamps
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ class RemoveUserCruft < ActiveRecord::Migration
2
+ def change
3
+ remove_column :users, :token, :string
4
+ remove_column :users, :is_deleted, :boolean, default: false, null: false
5
+ remove_column :users, :born_on, :date
6
+ remove_column :users, :mobile, :string
7
+ remove_column :users, :web_link, :string
8
+ rename_column :users, :is_activated, :activated
9
+ rename_column :users, :realname, :name
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ class CreateInvites < ActiveRecord::Migration
2
+ def change
3
+ create_table :invites do |t|
4
+ t.belongs_to :user
5
+ t.string :email, :token
6
+ t.datetime :sent_at
7
+ t.timestamps
8
+ end
9
+
10
+ create_table :invite_roles do |t|
11
+ t.belongs_to :invite
12
+ t.string :name
13
+ t.timestamps
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ class UpdateDelayedJobTable < ActiveRecord::Migration
2
+ def up
3
+ change_column :delayed_jobs, :last_error, :text
4
+ end
5
+
6
+ def down
7
+ change_column :delayed_jobs, :last_error, :string
8
+ end
9
+ end
@@ -0,0 +1,39 @@
1
+ class LocalizeImages < ActiveRecord::Migration
2
+ def locale
3
+ I18n.default_locale
4
+ end
5
+
6
+ def up
7
+ Image.all.in_locale(locale).each do |image|
8
+ unless image.attributes["byline"].blank?
9
+ Localization.create(
10
+ localizable: image,
11
+ name: "caption",
12
+ locale: locale,
13
+ value: image.attributes["byline"]
14
+ )
15
+ end
16
+ end
17
+ remove_column :images, :name, :string
18
+ remove_column :images, :byline, :string
19
+ remove_column :images, :description, :string
20
+ end
21
+
22
+ def down
23
+ add_column :images, :name, :string
24
+ add_column :images, :byline, :string
25
+ add_column :images, :description, :string
26
+
27
+ Localization.where(
28
+ localizable_type: "Image",
29
+ name: "caption",
30
+ locale: locale
31
+ ).each do |localization|
32
+ localization.localizable.update_column(
33
+ "byline",
34
+ localization.value
35
+ )
36
+ localization.destroy
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ class AddMetaImageToPage < ActiveRecord::Migration
2
+ def change
3
+ add_column :pages, :meta_image_id, :integer
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddPinnedToTags < ActiveRecord::Migration
2
+ def change
3
+ add_column :tags, :pinned, :boolean, default: false, null: false
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ class AdminMenuItem
5
+ attr_reader :label, :path, :group, :options
6
+
7
+ class << self
8
+ def items
9
+ @items ||= []
10
+ end
11
+
12
+ def register(label, path, group = :custom, options = {})
13
+ entry = new(label, path, group, options)
14
+ items << entry unless items.include?(entry)
15
+ end
16
+ end
17
+
18
+ def initialize(label, path, group = :custom, options = {})
19
+ @label, @path, @group, @options = label, path, group, options
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,75 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ class ArchiveFinder
5
+ def initialize(relation, options = {})
6
+ @relation, @options = relation, options
7
+ end
8
+
9
+ def by_year(year)
10
+ filter_by_time(range_for_year(year))
11
+ end
12
+
13
+ def by_year_and_month(year, month)
14
+ filter_by_time(range_for_year_and_month(year, month))
15
+ end
16
+
17
+ def latest_year_and_month
18
+ ordered_relation.first.try do |record|
19
+ [
20
+ record[timestamp_attribute].year,
21
+ record[timestamp_attribute].month
22
+ ]
23
+ end
24
+ end
25
+
26
+ def months_in_year(year)
27
+ by_year(year)
28
+ .reorder("#{timestamp_attribute} ASC")
29
+ .group("MONTH(#{timestamp_attribute})")
30
+ .map { |record| record[timestamp_attribute].month }
31
+ end
32
+
33
+ def months_in_year_with_count(year)
34
+ by_year(year)
35
+ .group("MONTH(#{timestamp_attribute})")
36
+ .count
37
+ .to_a
38
+ end
39
+
40
+ def timestamp_attribute
41
+ @options[:timestamp] || :created_at
42
+ end
43
+
44
+ def years
45
+ @relation
46
+ .reorder("#{timestamp_attribute} ASC")
47
+ .group("YEAR(#{timestamp_attribute})")
48
+ .map { |record| record[timestamp_attribute].year }
49
+ end
50
+
51
+ private
52
+
53
+ def filter_by_time(range)
54
+ @relation.where(
55
+ "#{timestamp_attribute} >= ? AND #{timestamp_attribute} <= ?",
56
+ range.first,
57
+ range.last
58
+ )
59
+ end
60
+
61
+ def range_for_year(year)
62
+ date_time = DateTime.new(year.to_i, 1, 1)
63
+ date_time..date_time.end_of_year
64
+ end
65
+
66
+ def range_for_year_and_month(year, month)
67
+ date_time = DateTime.new(year.to_i, month.to_i, 1)
68
+ date_time..date_time.end_of_month
69
+ end
70
+
71
+ def ordered_relation
72
+ @relation.reorder("#{timestamp_attribute} DESC")
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,112 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ class CacheSweeper
5
+ class << self
6
+ attr_accessor :enabled
7
+
8
+ def disable(&_block)
9
+ old_value = enabled
10
+ self.enabled = false
11
+ yield
12
+ self.enabled = old_value
13
+ end
14
+
15
+ def once(&block)
16
+ disable(&block)
17
+ PagesCore::SweepCacheJob.perform_later
18
+ end
19
+
20
+ # Returns the default configuration.
21
+ def default_config
22
+ OpenStruct.new(
23
+ cache_path: ActionController::Base.page_cache_directory,
24
+ observe: [Page, PageComment, Image],
25
+ patterns: [
26
+ /^\/index\.[\w]+$/,
27
+ /^\/sitemap\.[\w]+$/,
28
+ %r{^/pages/[\w]{2,3}[/\.](.*)$},
29
+ %r{^/[\w]{2,3}/(.*)$}
30
+ ]
31
+ )
32
+ end
33
+
34
+ # Returns the configuration. Accepts a block, ie:
35
+ #
36
+ # PagesCore::CacheSweeper.config do |c|
37
+ # c.observe += [:store, :store_test]
38
+ # c.patterns += [/^\/arkiv(.*)$/, /^\/tests(.*)$/]
39
+ # end
40
+ def config
41
+ @configuration ||= default_config
42
+ if block_given?
43
+ yield @configuration
44
+ extend_observed_models!
45
+ end
46
+ @configuration
47
+ end
48
+
49
+ def extend_observed_models!
50
+ config.observe.each do |klass|
51
+ if klass.is_a?(Symbol) || klass.is_a?(String)
52
+ klass = klass.to_s.camelize.constantize
53
+ end
54
+ unless klass.include?(PagesCore::Sweepable)
55
+ klass.send(:include, PagesCore::Sweepable)
56
+ end
57
+ end
58
+ end
59
+
60
+ # Purge the entire pages cache
61
+ def purge!
62
+ cache_dir = config.cache_path
63
+ `rm -rf "#{cache_dir}/*"` if File.exist?(cache_dir)
64
+ end
65
+
66
+ # Sweep all cached pages
67
+ def sweep!
68
+ return [] unless enabled
69
+ cache_dirs.flat_map { |d| sweep_dir(d) }
70
+ end
71
+
72
+ private
73
+
74
+ def cache_dirs
75
+ if PagesCore.config(:domain_based_cache)
76
+ Dir.entries(config.cache_path)
77
+ .select { |d| visible_dir?(d) }
78
+ .map { |d| File.join(config.cache_path, d) }
79
+ .map(&:to_s)
80
+ else
81
+ [config.cache_path.to_s]
82
+ end
83
+ end
84
+
85
+ def visible_dir?(dir)
86
+ !(dir =~ /^\./) && File.directory?(File.join(config.cache_path, dir))
87
+ end
88
+
89
+ def sweep_dir(cache_dir)
90
+ return [] unless File.exist?(cache_dir)
91
+ swept_files = []
92
+ Find.find(cache_dir + "/") do |path|
93
+ Find.prune if skip_path?(cache_dir, path)
94
+ file = path.gsub(Regexp.new("^#{cache_dir}"), "")
95
+ config.patterns.each do |p|
96
+ if file =~ p && File.exist?(path)
97
+ swept_files << path
98
+ FileUtils.rm_rf(path)
99
+ end
100
+ end
101
+ end
102
+ swept_files
103
+ end
104
+
105
+ def skip_path?(cache_dir, path)
106
+ path =~ Regexp.new("^#{cache_dir}/dynamic_image[s]?")
107
+ end
108
+ end
109
+
110
+ self.enabled ||= true
111
+ end
112
+ end