gluttonberg-core 2.6.4 → 3.0.0

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 (613) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +29 -3
  3. data/Rakefile +32 -15
  4. data/app/assets/images/chosen-sprite-2x.png +0 -0
  5. data/app/assets/images/chosen-sprite.png +0 -0
  6. data/app/assets/images/{library/gb_sort_by_asc.png → gb_sort_by_asc.png} +0 -0
  7. data/app/assets/images/{library/gb_sort_by_desc.png → gb_sort_by_desc.png} +0 -0
  8. data/app/assets/javascripts/chosen-jquery-min.js +2 -0
  9. data/app/assets/javascripts/gb_360player.js +676 -0
  10. data/app/assets/javascripts/gb_application.js +708 -463
  11. data/app/assets/javascripts/gb_html5.js +9 -0
  12. data/app/assets/javascripts/gb_jeditable.js +356 -356
  13. data/app/assets/javascripts/gb_jquery-nestable.js +490 -0
  14. data/app/assets/javascripts/gb_utils.js +1808 -0
  15. data/app/assets/javascripts/gluttonberg.js +26 -0
  16. data/app/assets/javascripts/jcrop/css/gb_jquery-Jcrop.css +163 -31
  17. data/app/assets/javascripts/jcrop/js/jquery-Jcrop-min.js +19 -243
  18. data/app/assets/javascripts/jquery-1-10-1.js +6 -0
  19. data/app/assets/javascripts/jquery-ui-1-10-3.custom-min.js +6 -0
  20. data/app/assets/javascripts/jquery-validate.js +652 -718
  21. data/app/assets/javascripts/rails.js +372 -106
  22. data/app/assets/javascripts/redactormin.js +7348 -0
  23. data/app/assets/stylesheets/chosen.css +430 -0
  24. data/app/assets/stylesheets/gb_360player.css +2 -10
  25. data/app/assets/stylesheets/gb_admin-override.sass +466 -22
  26. data/app/assets/stylesheets/gb_bootstrap.css +7 -1
  27. data/app/assets/stylesheets/gluttonberg.css +17 -0
  28. data/app/assets/stylesheets/redactor.css +864 -0
  29. data/app/assets/stylesheets/user-styles.sass +0 -3
  30. data/app/controllers/gluttonberg/admin/asset_library/assets_ajax_controller.rb +65 -0
  31. data/app/controllers/gluttonberg/admin/asset_library/assets_bulk_controller.rb +47 -0
  32. data/app/controllers/gluttonberg/admin/asset_library/assets_controller.rb +43 -266
  33. data/app/controllers/gluttonberg/admin/asset_library/base_controller.rb +29 -0
  34. data/app/controllers/gluttonberg/admin/asset_library/collections_controller.rb +11 -37
  35. data/app/controllers/gluttonberg/admin/base_controller.rb +117 -178
  36. data/app/controllers/gluttonberg/admin/content/auto_save_controller.rb +63 -0
  37. data/app/controllers/gluttonberg/admin/content/flag_controller.rb +6 -6
  38. data/app/controllers/gluttonberg/admin/content/galleries_controller.rb +29 -37
  39. data/app/controllers/gluttonberg/admin/content/page_localizations_controller.rb +82 -49
  40. data/app/controllers/gluttonberg/admin/content/pages_controller.rb +59 -32
  41. data/app/controllers/gluttonberg/admin/main_controller.rb +77 -7
  42. data/app/controllers/gluttonberg/admin/membership/base_controller.rb +2 -1
  43. data/app/controllers/gluttonberg/admin/membership/groups_controller.rb +27 -33
  44. data/app/controllers/gluttonberg/admin/membership/main_controller.rb +3 -2
  45. data/app/controllers/gluttonberg/admin/membership/members_controller.rb +37 -42
  46. data/app/controllers/gluttonberg/admin/password_resets_controller.rb +16 -28
  47. data/app/controllers/gluttonberg/admin/settings/configurations_controller.rb +101 -0
  48. data/app/controllers/gluttonberg/admin/settings/embeds_controller.rb +79 -0
  49. data/app/controllers/gluttonberg/admin/settings/locales_controller.rb +22 -28
  50. data/app/controllers/gluttonberg/admin/settings/stylesheets_controller.rb +31 -36
  51. data/app/controllers/gluttonberg/admin/settings/users_controller.rb +45 -40
  52. data/app/controllers/gluttonberg/base_controller.rb +95 -0
  53. data/app/controllers/gluttonberg/public/base_controller.rb +104 -157
  54. data/app/controllers/gluttonberg/public/flag_controller.rb +2 -7
  55. data/app/controllers/gluttonberg/public/gallery_controller.rb +1 -0
  56. data/app/controllers/gluttonberg/public/member_password_resets_controller.rb +5 -17
  57. data/app/controllers/gluttonberg/public/members_controller.rb +5 -15
  58. data/app/controllers/gluttonberg/public/pages_controller.rb +25 -14
  59. data/app/controllers/gluttonberg/public/public_assets_controller.rb +4 -2
  60. data/app/helpers/gluttonberg/admin.rb +86 -368
  61. data/app/helpers/gluttonberg/admin/assets.rb +84 -0
  62. data/app/helpers/gluttonberg/admin/form.rb +159 -0
  63. data/app/helpers/gluttonberg/admin/messages.rb +32 -0
  64. data/app/helpers/gluttonberg/admin/versioning.rb +196 -0
  65. data/app/helpers/gluttonberg/application_helper.rb +34 -7
  66. data/app/helpers/gluttonberg/asset_library.rb +29 -254
  67. data/app/helpers/gluttonberg/content_helpers.rb +17 -69
  68. data/app/helpers/gluttonberg/deprecated.rb +24 -0
  69. data/app/helpers/gluttonberg/public.rb +51 -244
  70. data/app/helpers/gluttonberg/public/assets.rb +31 -0
  71. data/app/helpers/gluttonberg/public/cms_stylesheets.rb +35 -0
  72. data/app/helpers/gluttonberg/public/html_truncate.rb +74 -0
  73. data/app/helpers/gluttonberg/public/meta_tags.rb +27 -0
  74. data/app/helpers/gluttonberg/public/nav_tree.rb +99 -0
  75. data/app/helpers/gluttonberg/public/page_info.rb +168 -0
  76. data/app/mailer/gluttonberg/base_notifier.rb +25 -0
  77. data/app/mailer/member_notifier.rb +8 -20
  78. data/app/mailer/notifier.rb +14 -39
  79. data/app/models/ability.rb +48 -34
  80. data/app/models/flag.rb +7 -7
  81. data/app/models/gluttonberg/asset.rb +115 -166
  82. data/app/models/gluttonberg/asset_bulk_import.rb +70 -0
  83. data/app/models/gluttonberg/asset_category.rb +75 -29
  84. data/app/models/gluttonberg/asset_collection.rb +65 -12
  85. data/app/models/gluttonberg/asset_mime_type.rb +5 -0
  86. data/app/models/gluttonberg/asset_thumbnail.rb +6 -1
  87. data/app/models/gluttonberg/asset_type.rb +49 -38
  88. data/app/models/gluttonberg/audio_asset_attribute.rb +7 -3
  89. data/app/models/gluttonberg/authorization.rb +10 -0
  90. data/app/models/gluttonberg/auto_save.rb +32 -0
  91. data/app/models/gluttonberg/collapsed_page.rb +13 -0
  92. data/app/models/gluttonberg/embed.rb +13 -0
  93. data/app/models/gluttonberg/feed.rb +14 -5
  94. data/app/models/gluttonberg/gallery.rb +35 -9
  95. data/app/models/gluttonberg/gallery_image.rb +9 -2
  96. data/app/models/gluttonberg/group.rb +18 -2
  97. data/app/models/gluttonberg/html_content.rb +5 -1
  98. data/app/models/gluttonberg/image_content.rb +5 -1
  99. data/app/models/gluttonberg/locale.rb +28 -9
  100. data/app/models/gluttonberg/member.rb +48 -197
  101. data/app/models/gluttonberg/page.rb +78 -288
  102. data/app/models/gluttonberg/page_localization.rb +63 -66
  103. data/app/models/gluttonberg/plain_text_content.rb +6 -0
  104. data/app/models/gluttonberg/repeater.rb +30 -0
  105. data/app/models/gluttonberg/search.rb +96 -72
  106. data/app/models/gluttonberg/select_content.rb +12 -0
  107. data/app/models/gluttonberg/setting.rb +79 -29
  108. data/app/models/gluttonberg/sitemap.rb +1 -0
  109. data/app/models/gluttonberg/stylesheet.rb +12 -6
  110. data/app/models/gluttonberg/textarea_content.rb +14 -0
  111. data/app/models/gluttonberg/version.rb +9 -0
  112. data/app/models/user.rb +137 -13
  113. data/app/observers/gluttonberg/locale_observer.rb +33 -22
  114. data/app/observers/gluttonberg/page_localization_observer.rb +22 -12
  115. data/app/observers/gluttonberg/page_observer.rb +50 -35
  116. data/app/views/{gluttonberg/public/exceptions → exceptions}/access_denied.html.haml +0 -0
  117. data/app/views/{gluttonberg/public/exceptions → exceptions}/not_found.html.haml +0 -0
  118. data/app/views/gluttonberg/admin/asset_library/assets/_browser_root.html.haml +17 -12
  119. data/app/views/gluttonberg/admin/asset_library/assets/_form.html.haml +5 -7
  120. data/app/views/gluttonberg/admin/asset_library/assets/browser.html.haml +5 -5
  121. data/app/views/gluttonberg/admin/asset_library/assets/show.html.haml +13 -7
  122. data/app/views/gluttonberg/admin/asset_library/assets/show.json.rabl +3 -0
  123. data/app/views/gluttonberg/admin/asset_library/{assets → assets_ajax}/browser_collection.json.haml +0 -0
  124. data/app/views/gluttonberg/admin/asset_library/{assets → assets_bulk}/add_assets_in_bulk.html.haml +6 -20
  125. data/app/views/gluttonberg/admin/asset_library/{assets → assets_bulk}/create_assets_in_bulk.html.haml +0 -0
  126. data/app/views/gluttonberg/admin/asset_library/collections/_form.html.haml +8 -5
  127. data/app/views/gluttonberg/admin/asset_library/shared/_asset_browser.html.haml +34 -0
  128. data/app/views/gluttonberg/admin/asset_library/shared/_asset_panels.html.haml +15 -11
  129. data/app/views/gluttonberg/admin/content/editors/_html_content.html.haml +2 -2
  130. data/app/views/gluttonberg/admin/content/editors/_select_content.html.haml +7 -0
  131. data/app/views/gluttonberg/admin/content/editors/_textarea_content.html.haml +6 -0
  132. data/app/views/gluttonberg/admin/content/flag/index.html.haml +48 -39
  133. data/app/views/gluttonberg/admin/content/galleries/_form.html.haml +46 -9
  134. data/app/views/gluttonberg/admin/content/galleries/_image_repeater.html.haml +30 -0
  135. data/app/views/gluttonberg/admin/content/galleries/edit.html.haml +1 -12
  136. data/app/views/gluttonberg/admin/content/galleries/index.html.haml +18 -9
  137. data/app/views/gluttonberg/admin/content/galleries/new.html.haml +1 -1
  138. data/app/views/gluttonberg/admin/content/main/_sidebar.html.haml +28 -16
  139. data/app/views/gluttonberg/admin/content/page_localizations/_form.html.haml +11 -20
  140. data/app/views/gluttonberg/admin/content/page_localizations/edit.html.haml +7 -0
  141. data/app/views/gluttonberg/admin/content/pages/_form.html.haml +11 -4
  142. data/app/views/gluttonberg/admin/content/pages/_page_settings.html.haml +4 -7
  143. data/app/views/gluttonberg/admin/content/pages/_row.html.haml +38 -30
  144. data/app/views/gluttonberg/admin/content/pages/index.html.haml +23 -15
  145. data/app/views/gluttonberg/admin/content/pages/pages_list_for_tinymce.html.haml +14 -3
  146. data/app/views/gluttonberg/admin/content/pages/show.html.haml +1 -1
  147. data/app/views/gluttonberg/admin/main/index.html.haml +13 -12
  148. data/app/views/gluttonberg/admin/main/waiting_for_approval.html.haml +33 -0
  149. data/app/views/gluttonberg/admin/membership/groups/index.html.haml +5 -5
  150. data/app/views/gluttonberg/admin/membership/members/_form.html.haml +3 -1
  151. data/app/views/gluttonberg/admin/membership/members/edit.html.haml +1 -0
  152. data/app/views/gluttonberg/admin/membership/members/index.html.haml +1 -1
  153. data/app/views/gluttonberg/admin/password_resets/edit.html.haml +36 -16
  154. data/app/views/gluttonberg/admin/password_resets/new.html.haml +19 -11
  155. data/app/views/gluttonberg/admin/settings/configurations/_form.html.haml +28 -0
  156. data/app/views/gluttonberg/admin/settings/configurations/_settings_table.html.haml +42 -0
  157. data/app/views/gluttonberg/admin/settings/{generic_settings → configurations}/_value_tag.html.haml +0 -0
  158. data/app/views/gluttonberg/admin/settings/configurations/edit.html.haml +4 -0
  159. data/app/views/gluttonberg/admin/settings/configurations/index.html.haml +31 -0
  160. data/app/views/gluttonberg/admin/settings/{generic_settings → configurations}/new.html.haml +2 -2
  161. data/app/views/gluttonberg/admin/settings/embeds/_form.html.haml +19 -0
  162. data/app/views/gluttonberg/admin/settings/embeds/edit.html.haml +12 -0
  163. data/app/views/gluttonberg/admin/settings/embeds/index.html.haml +36 -0
  164. data/app/views/gluttonberg/admin/settings/embeds/list_for_redactor.html.haml +29 -0
  165. data/app/views/gluttonberg/admin/settings/embeds/new.html.haml +12 -0
  166. data/app/views/gluttonberg/admin/settings/locales/edit.html.haml +9 -1
  167. data/app/views/gluttonberg/admin/settings/locales/index.html.haml +2 -1
  168. data/app/views/gluttonberg/admin/settings/locales/new.html.haml +10 -1
  169. data/app/views/gluttonberg/admin/settings/main/_sidebar.html.haml +9 -7
  170. data/app/views/gluttonberg/admin/settings/stylesheets/_form.html.haml +11 -9
  171. data/app/views/gluttonberg/admin/settings/stylesheets/edit.html.haml +11 -2
  172. data/app/views/gluttonberg/admin/settings/stylesheets/index.html.haml +45 -36
  173. data/app/views/gluttonberg/admin/settings/stylesheets/new.html.haml +11 -2
  174. data/app/views/gluttonberg/admin/settings/users/_form.html.haml +29 -18
  175. data/app/views/gluttonberg/admin/settings/users/index.html.haml +1 -1
  176. data/app/views/gluttonberg/admin/shared/_asset_panel.html.haml +19 -4
  177. data/app/views/gluttonberg/admin/shared/_auto_save_version.html.haml +12 -0
  178. data/app/views/gluttonberg/admin/shared/_datetime_field.html.haml +19 -0
  179. data/app/views/gluttonberg/admin/shared/_previous_version_warning.html.haml +5 -0
  180. data/app/views/gluttonberg/admin/shared/_version_alerts.html.haml +34 -0
  181. data/app/views/gluttonberg/admin/shared/_version_dashboard_notifications.html.haml +11 -0
  182. data/app/views/gluttonberg/admin/shared/_version_listing.html.haml +23 -0
  183. data/app/views/gluttonberg/admin/shared/delete.html.haml +21 -48
  184. data/app/views/gluttonberg/admin/shared/generic.html.haml +20 -19
  185. data/app/views/gluttonberg/admin/user_sessions/new.html.haml +14 -9
  186. data/app/views/gluttonberg/public/member_password_resets/edit.html.haml +2 -0
  187. data/app/views/gluttonberg/public/member_password_resets/new.html.haml +3 -0
  188. data/app/views/gluttonberg/public/members/_form.html.haml +3 -0
  189. data/app/views/gluttonberg/public/members/edit.html.haml +7 -9
  190. data/app/views/gluttonberg/public/members/show.html.haml +1 -3
  191. data/app/views/gluttonberg/public/pages/restrict_site_access.html.haml +3 -4
  192. data/app/views/gluttonberg/public/shared/_gallery_images_lis.html.haml +9 -0
  193. data/app/views/layouts/_flash_messages.html.haml +5 -3
  194. data/app/views/layouts/bare.html.haml +8 -17
  195. data/app/views/layouts/gluttonberg.html.haml +37 -44
  196. data/app/views/notifier/version_declined.html.haml +21 -0
  197. data/config/locales/en_au.yml +1 -1
  198. data/config/locales/en_gb.yml +2 -1
  199. data/config/routes.rb +70 -85
  200. data/db/migrate/20130801050257_create_repeater.rb +14 -0
  201. data/lib/audio_job.rb +11 -9
  202. data/lib/engine.rb +115 -72
  203. data/lib/generators/gluttonberg/resource/resource_generator.rb +51 -41
  204. data/lib/generators/gluttonberg/resource/templates/admin_controller.rb +16 -11
  205. data/lib/generators/gluttonberg/resource/templates/backend_view_edit.html.haml +7 -2
  206. data/lib/generators/gluttonberg/resource/templates/backend_view_form.html.haml +3 -14
  207. data/lib/generators/gluttonberg/resource/templates/backend_view_import.html.haml +10 -7
  208. data/lib/generators/gluttonberg/resource/templates/backend_view_index.html.haml +6 -5
  209. data/lib/generators/gluttonberg/resource/templates/backend_view_show.html.haml +2 -2
  210. data/lib/generators/gluttonberg/resource/templates/migration.rb +12 -1
  211. data/lib/generators/gluttonberg/resource/templates/model.rb +18 -1
  212. data/lib/generators/gluttonberg/resource/templates/public_view_index.html.haml +27 -10
  213. data/lib/generators/gluttonberg/resource/templates/public_view_show.html.haml +10 -4
  214. data/lib/gluttonberg.rb +68 -37
  215. data/lib/gluttonberg/can_flag.rb +64 -76
  216. data/lib/gluttonberg/components.rb +47 -24
  217. data/lib/gluttonberg/content.rb +15 -0
  218. data/lib/gluttonberg/content/block.rb +99 -85
  219. data/lib/gluttonberg/content/block_localization.rb +11 -8
  220. data/lib/gluttonberg/content/clean_html.rb +12 -15
  221. data/lib/gluttonberg/content/default_template_file.rb +44 -0
  222. data/lib/gluttonberg/content/despamilator/filter/naughty_words.rb +4 -2
  223. data/lib/gluttonberg/content/home_page_info.rb +39 -0
  224. data/lib/gluttonberg/content/import_export_csv.rb +243 -130
  225. data/lib/gluttonberg/content/localization.rb +137 -148
  226. data/lib/gluttonberg/content/page_children.rb +36 -0
  227. data/lib/gluttonberg/content/page_components.rb +23 -0
  228. data/lib/gluttonberg/content/page_description_info.rb +55 -0
  229. data/lib/gluttonberg/content/page_duplicate.rb +68 -0
  230. data/lib/gluttonberg/content/page_finder.rb +63 -0
  231. data/lib/gluttonberg/content/page_localization_slug.rb +89 -0
  232. data/lib/gluttonberg/content/page_repairer.rb +117 -0
  233. data/lib/gluttonberg/content/publishable.rb +77 -71
  234. data/lib/gluttonberg/content/slug_management.rb +74 -26
  235. data/lib/gluttonberg/content/validations.rb +58 -0
  236. data/lib/gluttonberg/content/versioning.rb +40 -22
  237. data/lib/gluttonberg/drag_tree.rb +0 -1
  238. data/lib/gluttonberg/drag_tree/action_controller.rb +49 -37
  239. data/lib/gluttonberg/drag_tree/action_view.rb +0 -6
  240. data/lib/gluttonberg/drag_tree/active_record.rb +49 -49
  241. data/lib/gluttonberg/extensions.rb +1 -0
  242. data/lib/gluttonberg/extensions/string.rb +20 -0
  243. data/lib/gluttonberg/gb_file.rb +30 -0
  244. data/lib/gluttonberg/helpers/form_builder.rb +91 -38
  245. data/lib/gluttonberg/library.rb +9 -90
  246. data/lib/gluttonberg/library/attachment_mixin.rb +88 -98
  247. data/lib/gluttonberg/library/config/image_sizes.rb +22 -19
  248. data/lib/gluttonberg/library/default_asset_types.rb +104 -0
  249. data/lib/gluttonberg/library/processor/audio.rb +32 -16
  250. data/lib/gluttonberg/library/processor/image.rb +78 -69
  251. data/lib/gluttonberg/library/quick_magick/image.rb +72 -319
  252. data/lib/gluttonberg/library/quick_magick/image/draw.rb +133 -0
  253. data/lib/gluttonberg/library/quick_magick/image/operators_and_settings.rb +78 -0
  254. data/lib/gluttonberg/library/quick_magick/image/serialization.rb +79 -0
  255. data/lib/gluttonberg/library/quick_magick/image_list.rb +0 -1
  256. data/lib/gluttonberg/library/storage/filesystem.rb +45 -46
  257. data/lib/gluttonberg/library/storage/s3.rb +123 -119
  258. data/lib/gluttonberg/membership.rb +9 -0
  259. data/lib/gluttonberg/membership/export.rb +82 -0
  260. data/lib/gluttonberg/membership/import.rb +179 -0
  261. data/lib/gluttonberg/middleware/honeypot.rb +1 -2
  262. data/lib/gluttonberg/middleware/locales.rb +69 -18
  263. data/lib/gluttonberg/middleware/rewriter.rb +57 -16
  264. data/lib/gluttonberg/mixin_manager.rb +19 -0
  265. data/lib/gluttonberg/page_description.rb +82 -112
  266. data/lib/gluttonberg/random_string_generator.rb +31 -0
  267. data/lib/gluttonberg/record_history.rb +5 -7
  268. data/lib/gluttonberg/tasks/asset.rake +19 -8
  269. data/lib/gluttonberg/tasks/gluttonberg.rake +167 -13
  270. data/lib/gluttonberg/templates.rb +1 -3
  271. data/lib/gluttonberg/version.rb +1 -1
  272. data/lib/photo_job.rb +16 -0
  273. data/spec/controllers/auto_save_controller_spec.rb +57 -0
  274. data/spec/controllers/record_history_spec.rb +75 -0
  275. data/spec/dummy/README.rdoc +261 -0
  276. data/spec/dummy/Rakefile +7 -0
  277. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  278. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  279. data/spec/dummy/app/controllers/admin/staff_profiles_controller.rb +56 -0
  280. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  281. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  282. data/spec/dummy/app/models/staff_profile.rb +20 -0
  283. data/spec/dummy/app/models/vendor_mixin.rb +14 -0
  284. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  285. data/spec/dummy/config.ru +4 -0
  286. data/spec/dummy/config/application.rb +18 -0
  287. data/spec/dummy/config/boot.rb +10 -0
  288. data/spec/dummy/config/database.yml +8 -0
  289. data/spec/dummy/config/environment.rb +5 -0
  290. data/spec/dummy/config/environments/development.rb +37 -0
  291. data/spec/dummy/config/environments/production.rb +67 -0
  292. data/spec/dummy/config/environments/test.rb +37 -0
  293. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  294. data/spec/dummy/config/initializers/gluttonberg_advance_settings.rb +73 -0
  295. data/spec/dummy/config/initializers/gluttonberg_basic_settings.rb +65 -0
  296. data/spec/dummy/config/initializers/gluttonberg_menu_settings.rb +1 -0
  297. data/spec/dummy/config/initializers/inflections.rb +15 -0
  298. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  299. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  300. data/spec/dummy/config/initializers/session_store.rb +8 -0
  301. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  302. data/spec/dummy/config/locales/en.yml +5 -0
  303. data/{lib/generators/gluttonberg/installer/templates → spec/dummy/config}/page_descriptions.rb +103 -65
  304. data/spec/dummy/config/routes.rb +10 -0
  305. data/spec/dummy/db/20130625060411_create_staff_profile.rb +35 -0
  306. data/spec/dummy/db/schema.rb +474 -0
  307. data/spec/dummy/public/404.html +26 -0
  308. data/spec/dummy/public/422.html +26 -0
  309. data/spec/dummy/public/500.html +25 -0
  310. data/spec/dummy/public/favicon.ico +0 -0
  311. data/spec/dummy/script/rails +6 -0
  312. data/spec/dummy/tmp/cache/041/891/setting_library_number_of_recent_assets +0 -0
  313. data/spec/dummy/tmp/cache/08E/741/setting_comment_number_of_emails_allowed +0 -0
  314. data/spec/dummy/tmp/cache/580/D10/setting_title +0 -0
  315. data/spec/dummy/tmp/cache/62E/160/setting_fb_icon +0 -0
  316. data/spec/dummy/tmp/cache/6D6/FB0/setting_keywords +0 -0
  317. data/spec/dummy/tmp/cache/6D8/B60/setting_s3_key_id +0 -0
  318. data/spec/dummy/tmp/cache/6E1/A40/setting_s3_bucket +0 -0
  319. data/spec/dummy/tmp/cache/779/DF0/setting_from_email +0 -0
  320. data/spec/dummy/tmp/cache/7C5/450/setting_title_site1 +0 -0
  321. data/spec/dummy/tmp/cache/7C6/460/setting_title_site2 +0 -0
  322. data/spec/dummy/tmp/cache/802/000/setting_description +0 -0
  323. data/spec/dummy/tmp/cache/836/DD0/setting_backend_logo +0 -0
  324. data/spec/dummy/tmp/cache/862/FA0/setting_audio_assets +1 -0
  325. data/spec/dummy/tmp/cache/867/4E0/setting_video_assets +0 -0
  326. data/spec/dummy/tmp/cache/867/710/setting_enable_WYSIWYG +0 -0
  327. data/spec/dummy/tmp/cache/873/9E0/setting_fb_icon_site1 +0 -0
  328. data/spec/dummy/tmp/cache/874/9F0/setting_fb_icon_site2 +0 -0
  329. data/spec/dummy/tmp/cache/87D/A10/setting_s3_access_key +0 -0
  330. data/spec/dummy/tmp/cache/8AC/280/setting_s3_server_url +0 -0
  331. data/spec/dummy/tmp/cache/91B/730/setting_keywords_site1 +0 -0
  332. data/spec/dummy/tmp/cache/91C/740/setting_keywords_site2 +0 -0
  333. data/spec/dummy/tmp/cache/933/980/setting_auto_save_time +0 -0
  334. data/spec/dummy/tmp/cache/9BE/290/setting_from_email_site1 +0 -0
  335. data/spec/dummy/tmp/cache/9BF/2A0/setting_from_email_site2 +0 -0
  336. data/spec/dummy/tmp/cache/A02/5E0/setting_google_analytics +0 -0
  337. data/spec/dummy/tmp/cache/A47/800/setting_description_site1 +0 -0
  338. data/spec/dummy/tmp/cache/A48/810/setting_description_site2 +0 -0
  339. data/spec/dummy/tmp/cache/A69/B60/setting_comment_blacklist +0 -0
  340. data/spec/dummy/tmp/cache/B5C/D40/setting_number_of_revisions +0 -0
  341. data/spec/dummy/tmp/cache/BB3/350/setting_restrict_site_access +0 -0
  342. data/spec/dummy/tmp/cache/BB7/620/setting_comment_notification +0 -0
  343. data/spec/dummy/tmp/cache/BFB/140/setting_comment_email_as_spam +0 -0
  344. data/spec/dummy/tmp/cache/C47/DE0/setting_google_analytics_site1 +0 -0
  345. data/spec/dummy/tmp/cache/C48/DF0/setting_google_analytics_site2 +0 -0
  346. data/spec/dummy/tmp/cache/D3E/E20/setting_number_of_per_page_items +0 -0
  347. data/spec/dummy/tmp/cache/DF8/DB0/setting_restrict_site_access_site1 +0 -0
  348. data/spec/dummy/tmp/cache/DF9/DC0/setting_restrict_site_access_site2 +0 -0
  349. data/spec/dummy/tmp/cache/DFC/200/setting_comment_notification_site1 +0 -0
  350. data/spec/dummy/tmp/cache/DFD/210/setting_comment_notification_site2 +0 -0
  351. data/spec/dummy/tmp/cache/FD9/200/setting_comment_number_of_urls_allowed +0 -0
  352. data/spec/fixtures/assets/assets_import.zip +0 -0
  353. data/spec/fixtures/assets/audio.mp3 +0 -0
  354. data/spec/fixtures/assets/c3-add-interactive.mov +0 -0
  355. data/spec/fixtures/assets/gb_banner.jpg +0 -0
  356. data/spec/fixtures/assets/gb_logo.png +0 -0
  357. data/spec/fixtures/assets/high_res_photo.jpg +0 -0
  358. data/spec/fixtures/assets/untitled +0 -0
  359. data/spec/fixtures/members.csv +5 -0
  360. data/spec/fixtures/staff_profiles.csv +4 -0
  361. data/spec/helpers/public/assets_spec.rb +73 -0
  362. data/spec/helpers/public/content_helpers_spec.rb +71 -0
  363. data/spec/helpers/public/html_truncate_spec.rb +37 -0
  364. data/spec/helpers/public/meta_tags_spec.rb +29 -0
  365. data/spec/helpers/public/page_info_spec.rb +233 -0
  366. data/spec/helpers/public_spec.rb +114 -0
  367. data/spec/lib/content/import_export_csv_spec.rb +177 -0
  368. data/spec/lib/content/localization_spec.rb +107 -0
  369. data/spec/lib/content/page_finder_spec.rb +71 -0
  370. data/spec/lib/content/page_repairer_spec.rb +151 -0
  371. data/spec/lib/content/publishable_spec.rb +54 -0
  372. data/spec/lib/content/validations_spec.rb +88 -0
  373. data/spec/lib/drag_tree/action_controller_spec.rb +137 -0
  374. data/spec/lib/drag_tree/active_record_spec.rb +86 -0
  375. data/spec/lib/library/s3_rspec.rb +78 -0
  376. data/spec/lib/membership/export_spec.rb +89 -0
  377. data/spec/lib/membership/import_spec.rb +68 -0
  378. data/spec/lib/middleware/locales_spec.rb +192 -0
  379. data/spec/lib/middleware/rewriter_spec.rb +186 -0
  380. data/spec/lib/page_description_spec.rb +68 -0
  381. data/spec/mailers/member_notifier_spec.rb +140 -0
  382. data/spec/mailers/notifier_spec.rb +86 -0
  383. data/spec/models/asset_bulk_import_spec.rb +43 -0
  384. data/spec/models/asset_category_spec.rb +77 -0
  385. data/spec/models/asset_collection_spec.rb +72 -0
  386. data/spec/models/asset_spec.rb +278 -0
  387. data/spec/models/asset_type_spec.rb +109 -0
  388. data/spec/models/member_spec.rb +128 -0
  389. data/spec/models/page_localization_spec.rb +81 -0
  390. data/spec/models/page_spec.rb +221 -0
  391. data/spec/models/setting_spec.rb +49 -0
  392. data/spec/models/user_spec.rb +385 -0
  393. data/spec/observers/locale_observer_spec.rb +79 -0
  394. data/spec/observers/page_localization_observer_spec.rb +87 -0
  395. data/spec/observers/page_observer_spec.rb +130 -0
  396. data/spec/spec_helper.rb +90 -0
  397. metadata +508 -331
  398. data/app/assets/images/gb_360-button-pause-light.gif +0 -0
  399. data/app/assets/images/gb_360-button-pause-light.png +0 -0
  400. data/app/assets/images/gb_360-button-pause.gif +0 -0
  401. data/app/assets/images/gb_360-button-pause.png +0 -0
  402. data/app/assets/images/gb_360-button-play-light.gif +0 -0
  403. data/app/assets/images/gb_360-button-play-light.png +0 -0
  404. data/app/assets/images/gb_360-button-play.gif +0 -0
  405. data/app/assets/images/gb_360-button-play.png +0 -0
  406. data/app/assets/images/gb_360-button-vis-pause-light.gif +0 -0
  407. data/app/assets/images/gb_360-button-vis-pause-light.png +0 -0
  408. data/app/assets/images/gb_360-button-vis-pause.gif +0 -0
  409. data/app/assets/images/gb_360-button-vis-pause.png +0 -0
  410. data/app/assets/images/gb_360-button-vis-play-light.gif +0 -0
  411. data/app/assets/images/gb_360-button-vis-play-light.png +0 -0
  412. data/app/assets/images/gb_360-button-vis-play.gif +0 -0
  413. data/app/assets/images/gb_360-button-vis-play.png +0 -0
  414. data/app/assets/images/gb_button_bkg_grey.gif +0 -0
  415. data/app/assets/images/gb_icon_content_2.png +0 -0
  416. data/app/assets/images/gb_icon_dash.png +0 -0
  417. data/app/assets/images/gb_icon_library_2.png +0 -0
  418. data/app/assets/images/gb_page_content_fillin.gif +0 -0
  419. data/app/assets/images/gb_spinner_for_dialouge.gif +0 -0
  420. data/app/assets/images/gb_sub_nav_back_bkg.gif +0 -0
  421. data/app/assets/images/gb_subnav_bkg.gif +0 -0
  422. data/app/assets/images/gb_table_head_bkg.gif +0 -0
  423. data/app/assets/images/gb_wrapper_bkg.png +0 -0
  424. data/app/assets/images/gb_wysiwyg.png +0 -0
  425. data/app/assets/images/help/gb_help.jpg +0 -0
  426. data/app/assets/images/icons/gb_collapsed.png +0 -0
  427. data/app/assets/images/icons/gb_expanded.png +0 -0
  428. data/app/assets/images/library/gb_back.gif +0 -0
  429. data/app/assets/images/library/gb_dialog_overlay.png +0 -0
  430. data/app/assets/images/library/gb_inactive_tab.jpg +0 -0
  431. data/app/assets/images/library/gb_search_icon.gif +0 -0
  432. data/app/assets/images/library/gb_wysiwyg_pic.png +0 -0
  433. data/app/assets/javascripts/gb_ajaxfileupload.js +0 -205
  434. data/app/assets/javascripts/gb_berniecode-animator.js +0 -674
  435. data/app/assets/javascripts/gb_bootstrap-datepicker.js +0 -501
  436. data/app/assets/javascripts/gb_expander.js +0 -81
  437. data/app/assets/javascripts/gb_jquery-dragTree.js +0 -525
  438. data/app/assets/javascripts/gb_jquery-tagarea.js +0 -404
  439. data/app/assets/javascripts/gb_login.js +0 -33
  440. data/app/assets/javascripts/gb_tags.js +0 -177
  441. data/app/assets/javascripts/jquery-1-7-1.js +0 -9267
  442. data/app/assets/javascripts/jquery-dimensions-min.js +0 -12
  443. data/app/assets/javascripts/jquery-ui-1-8-23-custom-min.js +0 -85
  444. data/app/assets/javascripts/tiny_mce/jquery.tinymce.js +0 -1
  445. data/app/assets/javascripts/tiny_mce/langs/en.js +0 -223
  446. data/app/assets/javascripts/tiny_mce/plugins/advhr/css/advhr.css +0 -5
  447. data/app/assets/javascripts/tiny_mce/plugins/advhr/editor_plugin.js +0 -1
  448. data/app/assets/javascripts/tiny_mce/plugins/advhr/js/rule.js +0 -43
  449. data/app/assets/javascripts/tiny_mce/plugins/advhr/langs/en_dlg.js +0 -7
  450. data/app/assets/javascripts/tiny_mce/plugins/advhr/rule.htm +0 -58
  451. data/app/assets/javascripts/tiny_mce/plugins/advlink/css/advlink.css +0 -8
  452. data/app/assets/javascripts/tiny_mce/plugins/advlink/editor_plugin.js +0 -61
  453. data/app/assets/javascripts/tiny_mce/plugins/advlink/js/advlink.js +0 -564
  454. data/app/assets/javascripts/tiny_mce/plugins/advlink/langs/en_dlg.js +0 -54
  455. data/app/assets/javascripts/tiny_mce/plugins/advlink/link.htm +0 -355
  456. data/app/assets/javascripts/tiny_mce/plugins/advlist/editor_plugin.js +0 -1
  457. data/app/assets/javascripts/tiny_mce/plugins/autolink/editor_plugin.js +0 -1
  458. data/app/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +0 -1
  459. data/app/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -109
  460. data/app/assets/javascripts/tiny_mce/plugins/gb_assets/editor_plugin.js +0 -47
  461. data/app/assets/javascripts/tiny_mce/plugins/gb_assets/editor_plugin_src.js +0 -43
  462. data/app/assets/javascripts/tiny_mce/plugins/gb_assets/emotions.htm +0 -41
  463. data/app/assets/javascripts/tiny_mce/plugins/gb_assets/js/emotions.js +0 -22
  464. data/app/assets/javascripts/tiny_mce/plugins/gb_assets/langs/en_dlg.js +0 -20
  465. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +0 -1
  466. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif +0 -0
  467. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif +0 -0
  468. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif +0 -0
  469. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif +0 -0
  470. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif +0 -0
  471. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif +0 -0
  472. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif +0 -0
  473. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +0 -90
  474. data/app/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +0 -387
  475. data/app/assets/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin.js +0 -1
  476. data/app/assets/javascripts/tiny_mce/plugins/lists/editor_plugin.js +0 -1
  477. data/app/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +0 -1
  478. data/app/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +0 -36
  479. data/app/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +0 -51
  480. data/app/assets/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +0 -5
  481. data/app/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +0 -27
  482. data/app/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +0 -21
  483. data/app/assets/javascripts/tiny_mce/plugins/preview/editor_plugin.js +0 -1
  484. data/app/assets/javascripts/tiny_mce/plugins/preview/jscripts/embed.js +0 -73
  485. data/app/assets/javascripts/tiny_mce/plugins/preview/preview.html +0 -18
  486. data/app/assets/javascripts/tiny_mce/plugins/style/css/props.css +0 -13
  487. data/app/assets/javascripts/tiny_mce/plugins/style/editor_plugin.js +0 -1
  488. data/app/assets/javascripts/tiny_mce/plugins/style/js/props.js +0 -635
  489. data/app/assets/javascripts/tiny_mce/plugins/style/langs/en_dlg.js +0 -70
  490. data/app/assets/javascripts/tiny_mce/plugins/style/props.htm +0 -838
  491. data/app/assets/javascripts/tiny_mce/plugins/table/cell.htm +0 -180
  492. data/app/assets/javascripts/tiny_mce/plugins/table/css/cell.css +0 -17
  493. data/app/assets/javascripts/tiny_mce/plugins/table/css/row.css +0 -25
  494. data/app/assets/javascripts/tiny_mce/plugins/table/css/table.css +0 -13
  495. data/app/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +0 -1
  496. data/app/assets/javascripts/tiny_mce/plugins/table/js/cell.js +0 -319
  497. data/app/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +0 -27
  498. data/app/assets/javascripts/tiny_mce/plugins/table/js/row.js +0 -237
  499. data/app/assets/javascripts/tiny_mce/plugins/table/js/table.js +0 -450
  500. data/app/assets/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +0 -75
  501. data/app/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +0 -32
  502. data/app/assets/javascripts/tiny_mce/plugins/table/row.htm +0 -158
  503. data/app/assets/javascripts/tiny_mce/plugins/table/table.htm +0 -188
  504. data/app/assets/javascripts/tiny_mce/plugins/wordcount/editor_plugin.js +0 -1
  505. data/app/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +0 -26
  506. data/app/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +0 -1
  507. data/app/assets/javascripts/tiny_mce/themes/advanced/editor_template_src.js +0 -1358
  508. data/app/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  509. data/app/assets/javascripts/tiny_mce/themes/advanced/img/trans.gif +0 -0
  510. data/app/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +0 -42
  511. data/app/assets/javascripts/tiny_mce/themes/advanced/js/link.js +0 -153
  512. data/app/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +0 -56
  513. data/app/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +0 -68
  514. data/app/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +0 -54
  515. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +0 -47
  516. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +0 -117
  517. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  518. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  519. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  520. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  521. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  522. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  523. data/app/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +0 -227
  524. data/app/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +0 -25
  525. data/app/assets/javascripts/tiny_mce/tiny_mce.js +0 -1
  526. data/app/assets/javascripts/tiny_mce/tiny_mce_popup.js +0 -5
  527. data/app/assets/javascripts/tiny_mce/utils/editable_selects.js +0 -70
  528. data/app/assets/javascripts/tiny_mce/utils/form_utils.js +0 -210
  529. data/app/assets/javascripts/tiny_mce/utils/mctabs.js +0 -162
  530. data/app/assets/javascripts/tiny_mce/utils/validate.js +0 -252
  531. data/app/controllers/gluttonberg/admin/content/articles_controller.rb +0 -139
  532. data/app/controllers/gluttonberg/admin/content/blogs_controller.rb +0 -101
  533. data/app/controllers/gluttonberg/admin/content/comments_controller.rb +0 -130
  534. data/app/controllers/gluttonberg/admin/content/main_controller.rb +0 -13
  535. data/app/controllers/gluttonberg/admin/help_controller.rb +0 -15
  536. data/app/controllers/gluttonberg/admin/settings/generic_settings_controller.rb +0 -90
  537. data/app/controllers/gluttonberg/admin/settings/main_controller.rb +0 -11
  538. data/app/controllers/gluttonberg/public/articles_controller.rb +0 -79
  539. data/app/controllers/gluttonberg/public/blogs_controller.rb +0 -44
  540. data/app/controllers/gluttonberg/public/comments_controller.rb +0 -46
  541. data/app/models/gluttonberg/article.rb +0 -73
  542. data/app/models/gluttonberg/article_localization.rb +0 -21
  543. data/app/models/gluttonberg/blog.rb +0 -19
  544. data/app/models/gluttonberg/comment.rb +0 -142
  545. data/app/models/gluttonberg/comment_subscription.rb +0 -28
  546. data/app/models/gluttonberg/help.rb +0 -48
  547. data/app/views/gluttonberg/admin/content/articles/_form.html.haml +0 -115
  548. data/app/views/gluttonberg/admin/content/articles/edit.html.haml +0 -11
  549. data/app/views/gluttonberg/admin/content/articles/index.html.haml +0 -71
  550. data/app/views/gluttonberg/admin/content/articles/new.html.haml +0 -11
  551. data/app/views/gluttonberg/admin/content/blogs/_form.html.haml +0 -56
  552. data/app/views/gluttonberg/admin/content/blogs/edit.html.haml +0 -3
  553. data/app/views/gluttonberg/admin/content/blogs/index.html.haml +0 -35
  554. data/app/views/gluttonberg/admin/content/blogs/new.html.haml +0 -10
  555. data/app/views/gluttonberg/admin/content/comments/index.html.haml +0 -66
  556. data/app/views/gluttonberg/admin/content/galleries/_images_list.html.haml +0 -21
  557. data/app/views/gluttonberg/admin/content/galleries/add_image.html.haml +0 -1
  558. data/app/views/gluttonberg/admin/content/main/index.html.haml +0 -20
  559. data/app/views/gluttonberg/admin/content/pages/edit_home.html.haml +0 -11
  560. data/app/views/gluttonberg/admin/exceptions/internal_server_error.html.haml +0 -11
  561. data/app/views/gluttonberg/admin/exceptions/not_acceptable.html.haml +0 -9
  562. data/app/views/gluttonberg/admin/membership/main/index.html.haml +0 -11
  563. data/app/views/gluttonberg/admin/settings/generic_settings/_form.html.haml +0 -26
  564. data/app/views/gluttonberg/admin/settings/generic_settings/edit.html.haml +0 -4
  565. data/app/views/gluttonberg/admin/settings/generic_settings/index.html.haml +0 -58
  566. data/app/views/gluttonberg/admin/settings/main/index.html.haml +0 -18
  567. data/app/views/gluttonberg/public/articles/index.rss.builder +0 -21
  568. data/app/views/gluttonberg/public/blogs/show.rss.builder +0 -21
  569. data/app/views/gluttonberg/public/exceptions/internal_server_error.html.haml +0 -11
  570. data/app/views/gluttonberg/public/exceptions/not_acceptable.html.haml +0 -9
  571. data/app/views/help/gluttonberg/admin/AssetLibrary/assets/add_assets_in_bulk.html.haml +0 -41
  572. data/app/views/help/gluttonberg/admin/AssetLibrary/assets/edit.html.haml +0 -61
  573. data/app/views/help/gluttonberg/admin/AssetLibrary/assets/index.html.haml +0 -16
  574. data/app/views/help/gluttonberg/admin/AssetLibrary/assets/new.html.haml +0 -57
  575. data/app/views/help/gluttonberg/admin/AssetLibrary/collections/edit.html.haml +0 -15
  576. data/app/views/help/gluttonberg/admin/AssetLibrary/collections/index.html.haml +0 -41
  577. data/app/views/help/gluttonberg/admin/AssetLibrary/collections/new.html.haml +0 -15
  578. data/app/views/help/gluttonberg/admin/AssetLibrary/main/index.html.haml +0 -34
  579. data/app/views/help/gluttonberg/admin/content/page_localizations/edit.html.haml +0 -89
  580. data/app/views/help/gluttonberg/admin/content/pages/_page_description_help.html.haml +0 -14
  581. data/app/views/help/gluttonberg/admin/content/pages/edit.html.haml +0 -62
  582. data/app/views/help/gluttonberg/admin/content/pages/index.html.haml +0 -111
  583. data/app/views/help/gluttonberg/admin/content/pages/new.html.haml +0 -61
  584. data/app/views/help/gluttonberg/admin/settings/dialects/edit.html.haml +0 -47
  585. data/app/views/help/gluttonberg/admin/settings/dialects/index.html.haml +0 -50
  586. data/app/views/help/gluttonberg/admin/settings/dialects/new.html.haml +0 -47
  587. data/app/views/help/gluttonberg/admin/settings/generic_settings/index.html.haml +0 -74
  588. data/app/views/help/gluttonberg/admin/settings/locales/edit.html.haml +0 -71
  589. data/app/views/help/gluttonberg/admin/settings/locales/index.html.haml +0 -57
  590. data/app/views/help/gluttonberg/admin/settings/locales/new.html.haml +0 -71
  591. data/app/views/help/gluttonberg/admin/settings/users/edit.html.haml +0 -63
  592. data/app/views/help/gluttonberg/admin/settings/users/index.html.haml +0 -60
  593. data/app/views/help/gluttonberg/admin/settings/users/new.html.haml +0 -69
  594. data/app/views/notifier/comment_notification.html.haml +0 -17
  595. data/app/views/notifier/comment_notification_for_admin.html.haml +0 -19
  596. data/db/migrate/20121106025800_add_artist_and_link_to_assets.rb +0 -6
  597. data/lib/acts_as_versioned.rb +0 -496
  598. data/lib/generators/gluttonberg/blog/blog_generator.rb +0 -46
  599. data/lib/generators/gluttonberg/blog/templates/articles_index.html.haml +0 -18
  600. data/lib/generators/gluttonberg/blog/templates/articles_show.html.haml +0 -63
  601. data/lib/generators/gluttonberg/blog/templates/articles_tag.html.haml +0 -24
  602. data/lib/generators/gluttonberg/blog/templates/blog_migration.rb +0 -90
  603. data/lib/generators/gluttonberg/blog/templates/blogs_index.html.haml +0 -15
  604. data/lib/generators/gluttonberg/blog/templates/blogs_show.html.haml +0 -25
  605. data/lib/generators/gluttonberg/installer/USAGE +0 -1
  606. data/lib/generators/gluttonberg/installer/installer_generator.rb +0 -106
  607. data/lib/generators/gluttonberg/installer/templates/delayed_job_script +0 -5
  608. data/lib/generators/gluttonberg/installer/templates/gluttonberg_migration.rb +0 -368
  609. data/lib/generators/gluttonberg/installer/templates/public.html.haml +0 -24
  610. data/lib/generators/gluttonberg/installer/templates/sitemap.rb +0 -70
  611. data/lib/gluttonberg/authorizable.rb +0 -51
  612. data/lib/gluttonberg/helpers.rb +0 -20
  613. data/lib/rails/railties/tasks.rake +0 -3
@@ -1,10 +1,14 @@
1
1
  module Gluttonberg
2
+ # Page content for html content (wisiwyg). All content/localization related functionality
3
+ # is provided Content::Block mixin
4
+ # Stores user input in :text column all other information is just meta information
2
5
  class HtmlContent < ActiveRecord::Base
3
6
  include Content::Block
4
7
  self.table_name = "gb_html_contents"
8
+ attr_accessible :text
5
9
 
6
10
  is_localized do
11
+ attr_accessible :text
7
12
  end
8
-
9
13
  end
10
14
  end
@@ -1,10 +1,14 @@
1
1
  module Gluttonberg
2
+ # Page content for Image content (asset id). All content related functionality
3
+ # is provided Content::Block mixin
4
+ # Stores user input in :asset_id column all other information is just meta information
2
5
  class ImageContent < ActiveRecord::Base
3
6
  include Content::Block
4
7
  self.table_name = "gb_image_contents"
5
- belongs_to :asset
8
+ belongs_to :asset, :class_name => "Gluttonberg::Asset"
6
9
  attr_accessible :asset_id, :section_name
7
10
  is_versioned
11
+ delegate :current_user_id, :to => :page
8
12
 
9
13
  end
10
14
  end
@@ -1,19 +1,26 @@
1
1
  module Gluttonberg
2
2
  class Locale < ActiveRecord::Base
3
- include Content::SlugManagement
4
3
  self.table_name = "gb_locales"
5
4
 
6
- has_many :page_localizations, :class_name => "Gluttonberg::PageLocalization" , :dependent => :destroy
5
+ include Content::SlugManagement
6
+
7
+ has_many :page_localizations, :class_name => "Gluttonberg::PageLocalization" , :dependent => :destroy
7
8
 
8
9
  validates_presence_of :name , :slug
9
10
  validates_uniqueness_of :slug , :name
11
+
10
12
  attr_accessible :name, :slug, :slug_type, :default
13
+ after_save :clear_cache
11
14
 
12
- SLUG_TYPES = ["prefix"]
15
+ # Included mixins which are registered by host app for extending functionality
16
+ MixinManager.load_mixins(self)
13
17
 
14
- def self.first_default(opts={})
15
- opts[:default] = true
16
- find(:first , :conditions => opts )
18
+ # Currently gluttonberg only supports prefix.
19
+ # TODO Subdomain based localization can be supported later
20
+ SLUG_TYPES = ["prefix"]
21
+
22
+ def self.first_default(opts={})
23
+ @@first_default ||= self.where(opts.merge(:default => true)).first
17
24
  end
18
25
 
19
26
  def self.prefix_slug_type
@@ -25,13 +32,25 @@ module Gluttonberg
25
32
  end
26
33
 
27
34
  def self.find_by_locale(locale_slug)
28
- find(:first , :conditions => { :slug => locale_slug } )
35
+ where(:slug => locale_slug).first
29
36
  end
30
37
 
38
+ # English (en) is the default locale
31
39
  def self.generate_default_locale
32
- if Gluttonberg::Locale.find(:first , :conditions => {:slug => "en-au"}).blank?
33
- locale = Gluttonberg::Locale.create( :slug => "en-au" , :name => "Australia English" , :default => true , :slug_type => Gluttonberg::Locale.prefix_slug_type )
40
+ if Gluttonberg::Locale.where(:slug => "en").count == 0
41
+ locale = Gluttonberg::Locale.create({
42
+ :slug => "en",
43
+ :name => "English",
44
+ :default => true,
45
+ :slug_type => Gluttonberg::Locale.prefix_slug_type
46
+ })
34
47
  end
35
48
  end
49
+
50
+ private
51
+ # Caching is used to avoid database query everywhere when locale is used
52
+ def clear_cache
53
+ @@first_default = nil
54
+ end
36
55
  end
37
56
  end
@@ -2,35 +2,43 @@ module Gluttonberg
2
2
  class Member < ActiveRecord::Base
3
3
  self.table_name = "gb_members"
4
4
 
5
- attr_accessible :first_name , :last_name , :email , :password , :password_confirmation , :bio , :image , :image_delete , :term_and_conditions, :group_ids
5
+ attr_accessible :first_name , :last_name , :email , :password
6
+ attr_accessible :password_confirmation , :bio , :image , :image_delete , :term_and_conditions, :group_ids, :groups
7
+ attr_accessible :return_url
6
8
 
7
9
  has_and_belongs_to_many :groups, :class_name => "Group" , :join_table => "gb_groups_members"
8
10
  has_attached_file :image, :styles => { :profile => ["600x600"], :thumb => ["142x95#"] , :thumb_for_backend => ["100x75#"]}
9
11
 
10
- validates_format_of :password, :with => /^(?=.*\d)(?=.*[a-zA-Z])(?!.*[^\w\S\s]).{6,}$/ , :if => :require_password?, :message => "must be a minimum of 6 characters in length, contain at least 1 letter and at least 1 number"
12
+ # Validate content type
13
+ validates_attachment_content_type :image, :content_type => /\Aimage/
14
+ # Validate filename
15
+ validates_attachment_file_name :image, :matches => [/png\Z/, /jpe?g\Z/]
11
16
 
17
+ validates_format_of :password, :with => Rails.configuration.password_pattern , :if => :require_password?, :message => Rails.configuration.password_validation_message
12
18
  validates_presence_of :first_name , :email
19
+ validates :first_name, :last_name, :email, :length => { :maximum => 255 }
20
+
21
+ before_validation :verify_confirmation_status
22
+
13
23
  attr_accessor :return_url , :term_and_conditions
14
24
  attr_accessor :image_delete
15
25
 
16
- member_mixins = Rails.configuration.member_mixins
17
- unless member_mixins.blank?
18
- member_mixins.each do |mixin|
19
- include mixin
20
- end
21
- end
26
+ # Included mixins which are registered by host app for extending functionality
27
+ MixinManager.load_mixins(self)
28
+
29
+ include Membership::Import
30
+ include Membership::Export
22
31
 
23
32
  clean_html [:bio]
24
33
 
25
34
  acts_as_authentic do |c|
26
35
  c.session_class = MemberSession
27
36
  c.login_field = "email"
37
+ c.crypto_provider = Authlogic::CryptoProviders::Sha512
28
38
  end
29
39
 
30
40
  def full_name
31
- self.first_name = "" if self.first_name.blank?
32
- self.last_name = "" if self.last_name.blank?
33
- self.first_name + " " + self.last_name
41
+ "#{self.first_name} #{self.last_name}".strip
34
42
  end
35
43
 
36
44
  def deliver_password_reset_instructions!(current_localization_slug = "")
@@ -51,11 +59,7 @@ module Gluttonberg
51
59
  end
52
60
 
53
61
  def self.enable_members
54
- if Rails.configuration.enable_members == true || Rails.configuration.enable_members.kind_of?(Hash)
55
- true
56
- else
57
- false
58
- end
62
+ Rails.configuration.enable_members == true || Rails.configuration.enable_members.kind_of?(Hash)
59
63
  end
60
64
 
61
65
  def self.does_email_verification_required
@@ -73,15 +77,23 @@ module Gluttonberg
73
77
  end
74
78
 
75
79
  def self.generateRandomString(length=10)
76
- chars = ("A".."Z").to_a + ("0".."9").to_a
77
- numbers = ("0".."9").to_a
78
- similar_chars = %w{ i I 1 0 O o 5 S s }
79
- chars.delete_if {|x| similar_chars.include? x}
80
- numbers.delete_if {|x| similar_chars.include? x}
81
- newpass = ""
82
- 1.upto(length-1) { |i| newpass << chars[rand(chars.size-1)] }
83
- 1.upto(1) { |i| newpass << numbers[rand(numbers.size-1)] }
84
- newpass
80
+ RandomStringGenerator.generate(length)
81
+ end
82
+
83
+ def self.generate_password_hash
84
+ password = self.generateRandomString
85
+ password_hash = {
86
+ :password => password ,
87
+ :password_confirmation => password
88
+ }
89
+ end
90
+
91
+ def assign_groups(group_ids)
92
+ if !group_ids.blank? && group_ids.kind_of?(String)
93
+ self.group_ids = [group_ids]
94
+ else
95
+ self.group_ids = group_ids
96
+ end
85
97
  end
86
98
 
87
99
  def does_member_have_access_to_the_page?( page)
@@ -96,182 +108,21 @@ module Gluttonberg
96
108
  end
97
109
  end
98
110
 
99
- ###############################
100
- # takes complete path to csv file.
101
- # and returns successfull_users , failed_users and updated_users arrays that contains user objects
102
- # if user exist with given email then update its information
103
- # otherwise create a new user for it
104
- # returns [successfull_users , failed_users , updated_users , ]
105
- # if csv format is incorrect then it will return a string "CSV file format is invalid"
106
- def self.importCSV(file_path , invite , group_ids )
107
- begin
108
- if RUBY_VERSION >= "1.9"
109
- require 'csv'
110
- csv_table = CSV.read(file_path)
111
- else
112
- csv_table = FasterCSV.read(file_path)
113
- end
114
- rescue => e
115
- return "Please provide a valid CSV file with correct column names."
116
- end
117
- first_name_column_num = self.find_column_position(csv_table , Rails.configuration.member_csv_metadata[:first_name] )
118
- last_name_column_num = self.find_column_position(csv_table , Rails.configuration.member_csv_metadata[:last_name] )
119
- email_column_num = self.find_column_position(csv_table , Rails.configuration.member_csv_metadata[:email] )
120
- groups_column_num = self.find_column_position(csv_table , Rails.configuration.member_csv_metadata[:groups] )
121
- other_columns = {}
122
-
123
- Rails.configuration.member_csv_metadata.each do |key , val|
124
- if ![:first_name, :last_name , :email, :groups].include?(key)
125
- other_columns[key] = self.find_column_position(csv_table , val )
126
- end
127
- end
128
-
129
- successfull_users = []
130
- failed_users = []
131
- updated_users = []
132
-
133
-
134
- if first_name_column_num && last_name_column_num && email_column_num
135
- csv_table.each_with_index do |row , index |
136
- if index > 0 # ignore first row because its meta data row
137
- #user information hash
138
- user_info = {
139
- :first_name => row[first_name_column_num] ,
140
- :last_name => row[last_name_column_num] ,
141
- :email => row[email_column_num],
142
- :group_ids => []
143
- }
144
- other_columns.each do |key , val|
145
- if !val.blank? && val >= 0
146
- if row[val].blank? || !user_info[key].kind_of?(String)
147
- user_info[key] = row[val]
148
- else
149
- user_info[key] = row[val].force_encoding("UTF-8")
150
- end
151
- end
152
- end
153
-
154
- #attach user to an industry if its valid
155
- unless groups_column_num.blank? || row[groups_column_num].blank?
156
- group_names = row[groups_column_num].split(";")
157
- temp_group_ids = []
158
- group_names.each do |group_name|
159
- group = Group.find(:first,:conditions=>{:name => group_name.strip})
160
- temp_group_ids << group.id unless group.blank?
161
- end
162
- user_info[:group_ids] = temp_group_ids
163
- end
164
-
165
- unless group_ids.blank?
166
- if user_info[:group_ids].blank?
167
- user_info[:group_ids] = group_ids
168
- else
169
- user_info[:group_ids] << group_ids
170
- end
171
- end
172
-
173
- user = self.find(:first , :conditions => { :email => row[email_column_num] } )
174
- if user.blank?
175
- # generate random password
176
- temp_password = self.generateRandomString
177
- password_hash = {
178
- :password => temp_password ,
179
- :password_confirmation => temp_password
180
- }
181
-
182
- # make user object
183
- user = self.new(user_info.merge(password_hash))
184
-
185
- #if its valid then save it send an email and also add it to successfull_users array
186
- if user.valid?
187
- user.save
188
- if invite == "1"
189
- # we will regenerate password and send it member
190
- MemberNotifier.delay.welcome(user)
191
- end
192
- successfull_users << user
193
- else # if failed then add it to failed list
194
- failed_users << user
195
- end
196
- else
197
- if !self.contains_user?(user , successfull_users) and !self.contains_user?(user , updated_users)
198
- if user.update_attributes(user_info)
199
- updated_users << user
200
- else
201
- failed_users << user
202
- end
203
- end
204
- end
205
- end # if csv row index > 0
206
-
207
- end #loop
208
- else
209
- return "Please provide a valid CSV file with correct column names"
210
- end #if
211
- [successfull_users , failed_users , updated_users ]
111
+ def generate_confirmation_key
112
+ self.confirmation_key = Digest::SHA1.hexdigest(Time.now.to_s + rand(12341234).to_s)[1..24]
212
113
  end
213
114
 
214
- def self.contains_user?(user , list)
215
- list.each do |record|
216
- return true if record.id == user.id || record.email == user.email
217
- end
218
- false
219
- end
115
+ private
220
116
 
221
- # csv_table is two dimentional array
222
- # col_name is a string.
223
- # if structure is proper and column name found it returns column index from 0 to n-1
224
- # otherwise nil
225
- def self.find_column_position(csv_table , col_name)
226
- if csv_table.instance_of?(Array) && csv_table.count > 0 && csv_table.first.count > 0
227
- csv_table.first.each_with_index do |table_col , index|
228
- return index if table_col.to_s.upcase == col_name.to_s.upcase
229
- end
230
- nil
231
- else
232
- nil
233
- end
234
- end
235
-
236
- #############################
237
- #export to a csv
238
- def self.exportCSV
239
- all_records = self.all
240
- csv_class = nil
241
- if RUBY_VERSION >= "1.9"
242
- require 'csv'
243
- csv_class = CSV
244
- else
245
- csv_class = FasterCSV
246
- end
247
- other_columns = {}
248
- csv_string = csv_class.generate do |csv|
249
- header_row = ["DATABASE ID",Rails.configuration.member_csv_metadata[:first_name],Rails.configuration.member_csv_metadata[:last_name], Rails.configuration.member_csv_metadata[:email], Rails.configuration.member_csv_metadata[:groups]]
250
-
251
- index = 0
252
- Rails.configuration.member_csv_metadata.each do |key , val|
253
- if ![:first_name, :last_name , :email , :groups].include?(key)
254
- other_columns[key] = index + 5
255
- header_row << val
256
- index += 1
257
- end
258
- end
259
- csv << header_row
260
-
261
- all_records.each do |record|
262
- data_row = [record.id, record.first_name, record.last_name , record.email , record.groups_name("; ")]
263
- other_columns.each do |key , val|
264
- if !val.blank? && val >= 0
265
- data_row[val] = record.send(key)
266
- end
267
- end
268
- csv << data_row
117
+ def verify_confirmation_status
118
+ if self.profile_confirmed != true
119
+ if self.class.does_email_verification_required
120
+ self.generate_confirmation_key
121
+ else
122
+ self.profile_confirmed = true
269
123
  end
124
+ end
270
125
  end
271
126
 
272
- csv_string
273
- end
274
-
275
-
276
127
  end
277
- end
128
+ end
@@ -1,204 +1,99 @@
1
1
  # encoding: utf-8
2
- # Do not remove above encoding line utf-8, its required for ruby 1.9.2. We are using some special chars in this file.
2
+ # Do not remove above encoding line utf-8, its required for ruby 1.9.2.
3
+ # We are using some special chars in this file.
3
4
 
4
5
  module Gluttonberg
6
+ # One of the most important model of Gluttonberg.
7
+ # It stores basic meta data about page and have associations with its related models
8
+
5
9
  class Page < ActiveRecord::Base
6
- include Content::Publishable
7
- include Content::SlugManagement
10
+ include Content::PageComponents
11
+
12
+ # this is used by slug management for the purpose of uniqueness within tree
13
+ self.slug_scope = :parent_id
14
+
15
+ self.table_name = "gb_pages"
16
+
17
+ # User who has created this page
8
18
  belongs_to :user
9
- has_many :localizations, :class_name => "Gluttonberg::PageLocalization" , :dependent => :destroy
19
+
20
+ # Page Lolcalizations
21
+ has_many :localizations, :class_name => "Gluttonberg::PageLocalization", :dependent => :destroy
22
+
23
+ # Groups (membership) This is used to restrict pages to particular group members
10
24
  has_and_belongs_to_many :groups, :class_name => "Group" , :join_table => "gb_groups_pages"
11
25
 
12
26
  attr_protected :user_id , :state , :published_at
13
- attr_accessible :parent_id, :name, :navigation_label, :slug, :description_name, :hide_in_nav, :group_ids, :home
27
+ attr_accessible :parent_id, :parent, :position, :name
28
+ attr_accessible :navigation_label, :slug, :description_name
29
+ attr_accessible :hide_in_nav, :group_ids, :home
14
30
 
15
- # Generate the associations for the block/content classes
16
- Content::Block.classes.each do |klass|
17
- has_many klass.association_name, :class_name => klass.name, :dependent => :destroy
18
- end
31
+ # Store information regarding collapsed/expanded pages on pages tree
32
+ has_many :collapsed_pages, :class_name => "Gluttonberg::CollapsedPage", :dependent => :destroy
19
33
 
20
34
  validates_presence_of :name , :description_name
21
35
 
22
- self.table_name = "gb_pages"
23
-
24
- after_save :check_for_home_update
36
+ is_drag_tree :scope => :parent_id, :flat => false , :order => "position", :counter_cache => :children_count
25
37
 
26
- is_drag_tree :scope => :parent_id, :flat => false , :order => "position"
27
-
28
- attr_accessor :current_localization, :locale_id, :paths_need_recaching
38
+ attr_accessor :current_localization, :locale_id, :paths_need_recaching, :current_user_id
39
+ delegate :version, :loaded_version, :to => :current_localization
29
40
 
41
+ # Returns content for a page section
42
+ #
43
+ # @param section_name [String or Symbol]
44
+ # @param opts [Hash] Its a optional parameter.
45
+ # :locale
46
+ # :url_for for image contents. Pass image size symbol.
47
+ # @return [String] Html safe text content or image path depending on content type
30
48
  def easy_contents(section_name, opts = {})
31
49
  begin
50
+ prepared_content = nil
32
51
  section_name = section_name.to_sym
33
- load_localization
34
- content = localized_contents.pluck {|c| c.section[:name] == section_name}
35
- if content.class.name == "Gluttonberg::ImageContent"
36
- if opts[:url_for].blank?
37
- content.asset.url
38
- else
39
- content.asset.url_for(opts[:url_for].to_sym)
40
- end
41
- elsif content.class.name == "Gluttonberg::HtmlContent"
42
- content.current_localization.text.html_safe
43
- elsif content.class.name == "Gluttonberg::PlainTextContent"
44
- content.current_localization.text
45
- else
46
- nil
47
- end
52
+ load_localization(opts[:locale]) if current_localization.blank?
53
+ content = current_localization.contents.pluck {|c| (c.respond_to?(:parent) && c.parent.section[:name] == section_name ) || (c.respond_to?(:section) && c.section[:name] == section_name ) }
54
+ prepared_content = _prepare_content(content, opts)
48
55
  rescue
49
- nil
50
- end
51
- end
52
-
53
- # A custom finder used to find a page + locale combination which most
54
- # closely matches the path specified. It will also optionally limit it's
55
- # search to the specified locale, otherwise it will fall back to the
56
- # default.
57
- def self.find_by_path(path, locale = nil , domain_name=nil)
58
- path = path.match(/^\/(\S+)/)
59
- if( !locale.blank? && !path.blank?)
60
- path = path[1]
61
- page = joins(:localizations).where("locale_id = ? AND gb_page_localizations.path LIKE ? ", locale.id, path).first
62
- unless page.blank?
63
- page.current_localization = page.localizations.where("locale_id = ? AND path LIKE ? ", locale.id, path).first
64
- end
65
- page
66
- elsif path.blank? #looking for home
67
- locale = Gluttonberg::Locale.first_default if locale.blank?
68
- if !Rails.configuration.multisite.blank?
69
- page_desc = PageDescription.all.find{|key , val| val.home_for_domain?(domain_name) }
70
- page_desc = page_desc.last unless page_desc.blank?
71
- unless page_desc.blank?
72
- pages = joins(:localizations).where("locale_id = ? AND description_name = ?", locale.id, page_desc.name)
73
- end
74
- end
75
-
76
- if pages.blank?
77
- pages = joins(:localizations).where("locale_id = ? AND home = ?", locale.id, true)
78
- end
79
-
80
- page = pages.first unless pages.blank?
81
- unless page.blank?
82
- page.current_localization = page.localizations.where("locale_id = ? ", locale.id).first
83
- end
84
- page
85
- else # default locale
86
- path = path[1]
87
- locale = Gluttonberg::Locale.first_default
88
- page = joins(:localizations).where("locale_id = ? AND gb_page_localizations.path LIKE ? ", locale.id, path).first
89
- unless page.blank?
90
- page.current_localization = page.localizations.where("locale_id = ? AND path LIKE ? ", locale.id, path).first
91
- end
92
- page
93
56
  end
57
+ prepared_content
94
58
  end
95
59
 
96
- # A custom finder used to find a page + locale combination which most
97
- # closely matches the path specified. It will also optionally limit it's
98
- # search to the specified locale, otherwise it will fall back to the
99
- # default.
100
- def self.find_by_previous_path(path, locale = nil , domain_name=nil)
101
- path = path.match(/^\/(\S+)/)
102
- if( !locale.blank? && !path.blank?)
103
- path = path[1]
104
- page = joins(:localizations).where("locale_id = ? AND gb_page_localizations.previous_path LIKE ? ", locale.id, path).first
105
- unless page.blank?
106
- page.current_localization = page.localizations.where("locale_id = ? AND previous_path LIKE ? ", locale.id, path).first
107
- end
108
- page
109
- elsif(!path.blank?) # default locale
110
- path = path[1]
111
- locale = Gluttonberg::Locale.first_default
112
- page = joins(:localizations).where("locale_id = ? AND gb_page_localizations.previous_path LIKE ? ", locale.id, path).first
113
- unless page.blank?
114
- page.current_localization = page.localizations.where("locale_id = ? AND previous_path LIKE ? ", locale.id, path).first
115
- end
116
- page
60
+ # Returns current localization of page if its not loaded yet then loads default localization
61
+ #
62
+ # @return [PageLocalization]
63
+ def current_localization
64
+ if @current_localization.blank?
65
+ load_localization
117
66
  end
67
+ @current_localization
118
68
  end
119
69
 
120
- def redirect_required?
121
- self.description.redirect?
122
- end
123
- def redirect_url
124
- self.description.redirect_url(self,{})
125
- end
126
-
127
- # Indicates if the page is used as a mount point for a public-facing
128
- # controller, e.g. a blog, message board etc.
129
- def rewrite_required?
130
- self.description.rewrite_required?
131
- end
132
-
133
- # Takes a path and rewrites it to point at an alternate route. The idea
134
- # being that this path points to a controller.
135
- def generate_rewrite_path(path)
136
- path.gsub(current_localization.path, self.description.rewrite_route)
137
- end
138
-
139
- # Returns the PageDescription associated with this page.
140
- def description
141
- @description = PageDescription[self.description_name.to_sym] if self.description_name
142
- @description
143
- end
144
-
145
- # Returns the name of the view template specified for this page —
146
- # determined via the associated PageDescription
147
- def view
148
- self.description if @description.blank?
149
- @description[:view] if @description
150
- end
151
-
152
- # Returns the name of the layout template specified for this page —
153
- # determined via the associated PageDescription
154
- def layout
155
- self.description if @description.blank?
156
- @description[:layout] if @description
157
- end
158
-
159
- # Returns the localized navigation label, or falls back to the page for a
160
- # the default.
70
+ # Returns the localized navigation label, or falls back to the localized page name
161
71
  def nav_label
162
- if current_localization.blank?
163
- if navigation_label.blank?
164
- name
165
- else
166
- navigation_label
167
- end
72
+ if current_localization.navigation_label.blank?
73
+ current_localization.name
168
74
  else
169
- if current_localization.navigation_label.blank?
170
- current_localization.name
171
- else
172
- current_localization.navigation_label
173
- end
75
+ current_localization.navigation_label
174
76
  end
175
77
  end
176
78
 
177
79
  # Returns the localized title for the page or a default
178
80
  def title
179
- (current_localization.blank? || current_localization.name.blank?) ? self.name : current_localization.name
81
+ current_localization.name
180
82
  end
181
83
 
182
- # Delegates to the current_localization
84
+ # Delegates to the current_localization path
183
85
  def path
184
- unless current_localization.blank?
185
- current_localization.path
186
- else
187
- localizations.first.path
188
- end
86
+ current_localization.path
189
87
  end
190
88
 
89
+ # returns public path of current localization
191
90
  def public_path
192
- unless current_localization.blank?
193
- current_localization.public_path
194
- else
195
- localizations.first.public_path
196
- end
91
+ current_localization.public_path
197
92
  end
198
93
 
199
-
94
+ # this method returns true if page path needs to be recalculated.
200
95
  def paths_need_recaching?
201
- @paths_need_recaching
96
+ self.paths_need_recaching
202
97
  end
203
98
 
204
99
  # Just palms off the request for the contents to the current localization
@@ -221,147 +116,42 @@ module Gluttonberg
221
116
  end
222
117
  end
223
118
 
224
- def home=(state)
225
- write_attribute(:home, state)
226
- @home_updated = state
227
- end
228
-
229
- def self.home_page
230
- Page.find( :first , :conditions => [ "home = ? " , true ] )
231
- end
232
-
233
- def self.home_page_name
234
- home_temp = self.home_page
235
- if home_temp.blank?
236
- "Not Selected"
237
- else
238
- home_temp.name
239
- end
240
- end
241
-
242
- # if page type is not redirection.
243
- # then create default view files for all localzations of the page.
244
- # file will be created in host appliation/app/views/pages/template_name.locale-slug.html.haml
245
- def create_default_template_file
246
- unless self.description.redirection_required?
247
- self.localizations.each do |page_localization|
248
- file_path = File.join(Rails.root, "app", "views" , "pages" , "#{self.view}.#{page_localization.locale.slug}.html.haml" )
249
- unless File.exists?(file_path)
250
- file = File.new(file_path, "w")
251
-
252
- page_localization.contents.each do |content|
253
- file.puts("= @page.easy_contents(:#{content.section_name})")
254
- end
255
- file.close
256
- end
257
- end
258
- end
119
+ # Load the default localization and set it as current_localization
120
+ def load_default_localizations
121
+ Gluttonberg::Locale.first_default.id
122
+ self.current_localization = Gluttonberg::PageLocalization.where(:page_id => id , :locale_id => Gluttonberg::Locale.first_default.id).first
259
123
  end
260
124
 
125
+ # Repair Page tree by optimizing 'position' column
261
126
  def self.repair_pages_structure
262
- pages = Page.all
263
-
264
- pages.each do |page|
265
-
266
- if page.description.blank?
267
- puts "Page description '#{page.description_name}' for '#{page.name}' page does not exist in page descriptions file. #{page.id}"
268
- elsif !page.description.sections.blank?
269
- puts("Generating stubbed content for new page #{page.id}")
270
-
271
- [PlainTextContent , HtmlContent , ImageContent].each do |klass|
272
- list = klass.find(:all , :conditions => { :page_id => page.id})
273
- list.each do |item|
274
- found = page.description.contains_section?(item.section_name , item.class.to_s.demodulize.underscore)
275
- puts found
276
- if(!found)
277
- item.destroy
278
- end
279
- end
280
- end
281
-
282
-
283
- page.description.sections.each do |name, section|
284
- # Create the content
285
- association = page.send(section[:type].to_s.pluralize)
286
- content = association.find(:first , :conditions => {:section_name => name})
287
- if content.blank?
288
- content = association.create(:section_name => name)
289
- end
290
- # Create each localization
291
- if content.class.localized?
292
- page.localizations.all.each do |localization|
293
- if content.localizations.find(:first , :conditions => { "#{section[:type]}_id" => content.id, :page_localization_id => localization.id }).blank?
294
- content.localizations.create(:parent => content, :page_localization => localization)
295
- end
296
- end
297
- end
298
- end
299
- end
300
- end # pages loop end
301
- puts "completed"
127
+ PageRepairer.repair_pages_structure
302
128
  end
303
129
 
130
+ # if page does not belongs to group (membership) then its a public page
304
131
  def is_public?
305
132
  groups.blank?
306
133
  end
307
134
 
308
- def load_default_localizations
309
- self.current_localization = Gluttonberg::PageLocalization.find(:first , :conditions => { :page_id => id , :locale_id => Gluttonberg::Locale.first_default.id } )
310
- end
311
-
312
- def published?
313
- if publishing_status == "Published"
314
- return true
315
- else
316
- return false
317
- end
318
- end
319
-
135
+ # Duplicate current page and draft it.
320
136
  def duplicate
321
- ActiveRecord::Base.transaction do
322
- duplicated_page = self.dup
323
- duplicated_page.state = "draft"
324
- duplicated_page.created_at = Time.now
325
- duplicated_page.published_at = nil
326
- duplicated_page.position = nil
327
-
328
- if duplicated_page.save
329
- self.localizations.each do |localization|
330
- dup_loc = duplicated_page.localizations.where(:locale_id => localization.locale_id).first
331
- dup_loc_contents = dup_loc.contents
332
- unless dup_loc.blank?
333
- localization.contents.each do |content|
334
- if content.respond_to?(:parent) && content.parent.localized
335
- dup_content = dup_loc_contents.find{|c| c.respond_to?(:page_localization_id) && c.page_localization_id == dup_loc.id && c.parent.section_name == content.parent.section_name}
336
- dup_content.update_attributes(:text => content.text)
337
- dup_content = nil
338
- else
339
- dup_content = dup_loc_contents.find{|c| c.respond_to?(:page_id) && c.page_id == duplicated_page.id && c.section_name == content.section_name}
340
- dup_content.update_attributes(:asset_id => content.asset_id)
341
- dup_content = nil
342
- end
343
- end
344
-
345
- end
346
- end
137
+ PageDuplicate.duplicate(self)
138
+ end
347
139
 
348
- duplicated_page
349
- else
350
- nil
351
- end
352
- end
140
+ # check if current page is collapsed for current user?
141
+ def collapsed?(current_user)
142
+ !self.collapsed_pages.find_all{|page| page.user_id == current_user.id}.blank?
353
143
  end
354
144
 
355
145
  private
356
-
357
-
358
-
359
- # Checks to see if this page has been set as the homepage. If it has, we
360
- # then go and
361
- def check_for_home_update
362
- if @home_updated && @home_updated == true
363
- previous_home = Page.find( :first , :conditions => [ "home = ? AND id <> ? " , true ,self.id ] )
364
- previous_home.update_attributes(:home => false) if previous_home
146
+ # Prepare content based on its on content type
147
+ def _prepare_content(content, opts)
148
+ case content.class.name
149
+ when "Gluttonberg::ImageContent"
150
+ content.asset.url_for opts[:url_for] unless content.asset.blank?
151
+ when "Gluttonberg::HtmlContentLocalization", "Gluttonberg::TextareaContentLocalization"
152
+ content.text.html_safe
153
+ when "Gluttonberg::PlainTextContentLocalization", "Gluttonberg::SelectContent"
154
+ content.text
365
155
  end
366
156
  end
367
157