spina 0.6.11

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 (326) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +40 -0
  4. data/app/assets/images/spina/admin/logo@2x.png +0 -0
  5. data/app/assets/javascripts/spina/admin/account.js.coffee +15 -0
  6. data/app/assets/javascripts/spina/admin/application.js +8 -0
  7. data/app/assets/javascripts/spina/admin/aviary.js.coffee +26 -0
  8. data/app/assets/javascripts/spina/admin/confirm_delete.js.coffee +24 -0
  9. data/app/assets/javascripts/spina/admin/pages.js.coffee +49 -0
  10. data/app/assets/javascripts/spina/application.js +15 -0
  11. data/app/assets/stylesheets/spina/_mixins.css.scss +34 -0
  12. data/app/assets/stylesheets/spina/_normalize.css +396 -0
  13. data/app/assets/stylesheets/spina/admin/application.css.sass +1 -0
  14. data/app/assets/stylesheets/spina/application.css.sass +6 -0
  15. data/app/controllers/spina/admin/accounts_controller.rb +50 -0
  16. data/app/controllers/spina/admin/admin_controller.rb +36 -0
  17. data/app/controllers/spina/admin/attachments_controller.rb +55 -0
  18. data/app/controllers/spina/admin/inquiries_controller.rb +63 -0
  19. data/app/controllers/spina/admin/page_parts_controller.rb +11 -0
  20. data/app/controllers/spina/admin/pages_controller.rb +92 -0
  21. data/app/controllers/spina/admin/photos_controller.rb +77 -0
  22. data/app/controllers/spina/admin/sessions_controller.rb +30 -0
  23. data/app/controllers/spina/admin/users_controller.rb +64 -0
  24. data/app/controllers/spina/application_controller.rb +26 -0
  25. data/app/controllers/spina/inquiries_controller.rb +30 -0
  26. data/app/controllers/spina/pages_controller.rb +47 -0
  27. data/app/controllers/spina/sitemaps_controller.rb +7 -0
  28. data/app/helpers/spina/admin/accounts_helper.rb +6 -0
  29. data/app/helpers/spina/admin/inquiries_helper.rb +6 -0
  30. data/app/helpers/spina/admin/page_parts_helper.rb +6 -0
  31. data/app/helpers/spina/admin/pages_helper.rb +16 -0
  32. data/app/helpers/spina/admin/photos_helper.rb +6 -0
  33. data/app/helpers/spina/admin/sessions_helper.rb +6 -0
  34. data/app/helpers/spina/admin/users_helper.rb +6 -0
  35. data/app/helpers/spina/application_helper.rb +68 -0
  36. data/app/mailers/spina/inquiry_mailer.rb +19 -0
  37. data/app/models/spina/ability.rb +20 -0
  38. data/app/models/spina/account.rb +72 -0
  39. data/app/models/spina/attachment.rb +28 -0
  40. data/app/models/spina/attachment_collection.rb +15 -0
  41. data/app/models/spina/inquiry.rb +41 -0
  42. data/app/models/spina/layout_part.rb +38 -0
  43. data/app/models/spina/line.rb +6 -0
  44. data/app/models/spina/page.rb +125 -0
  45. data/app/models/spina/page_part.rb +38 -0
  46. data/app/models/spina/photo.rb +23 -0
  47. data/app/models/spina/photo_collection.rb +30 -0
  48. data/app/models/spina/photo_collections_photo.rb +6 -0
  49. data/app/models/spina/spina.rb +7 -0
  50. data/app/models/spina/text.rb +6 -0
  51. data/app/models/spina/user.rb +31 -0
  52. data/app/presenters/spina/pages/menu_presenter.rb +82 -0
  53. data/app/uploaders/spina/file_uploader.rb +56 -0
  54. data/app/uploaders/spina/logo_uploader.rb +52 -0
  55. data/app/uploaders/spina/photo_uploader.rb +42 -0
  56. data/app/views/layouts/spina/admin/application.html.haml +37 -0
  57. data/app/views/layouts/spina/admin/media_library.html.haml +14 -0
  58. data/app/views/layouts/spina/admin/messages.html.haml +22 -0
  59. data/app/views/layouts/spina/admin/settings.html.haml +30 -0
  60. data/app/views/layouts/spina/admin/website.html.haml +26 -0
  61. data/app/views/layouts/spina/email.html.erb +124 -0
  62. data/app/views/layouts/spina/login.html.haml +21 -0
  63. data/app/views/spina/admin/accounts/_form.html.haml +55 -0
  64. data/app/views/spina/admin/accounts/analytics.html.haml +21 -0
  65. data/app/views/spina/admin/accounts/edit.html.haml +1 -0
  66. data/app/views/spina/admin/accounts/social.html.haml +23 -0
  67. data/app/views/spina/admin/accounts/style.html.haml +32 -0
  68. data/app/views/spina/admin/attachments/_attachment.html.haml +7 -0
  69. data/app/views/spina/admin/attachments/_attachment_collection.html.haml +2 -0
  70. data/app/views/spina/admin/attachments/_select.html.haml +25 -0
  71. data/app/views/spina/admin/attachments/_select_collection.html.haml +25 -0
  72. data/app/views/spina/admin/attachments/create.js.erb +5 -0
  73. data/app/views/spina/admin/attachments/index.html.haml +19 -0
  74. data/app/views/spina/admin/attachments/insert.js.erb +5 -0
  75. data/app/views/spina/admin/attachments/insert_collection.js.erb +7 -0
  76. data/app/views/spina/admin/attachments/select.js.erb +2 -0
  77. data/app/views/spina/admin/attachments/select_collection.js.erb +2 -0
  78. data/app/views/spina/admin/inquiries/inbox.html.haml +30 -0
  79. data/app/views/spina/admin/inquiries/index.html.haml +36 -0
  80. data/app/views/spina/admin/inquiries/show.html.haml +23 -0
  81. data/app/views/spina/admin/inquiries/spam.html.haml +36 -0
  82. data/app/views/spina/admin/layout_partables/_line_form.html.haml +4 -0
  83. data/app/views/spina/admin/page_partables/_attachment_collection_form.html.haml +9 -0
  84. data/app/views/spina/admin/page_partables/_attachment_form.html.haml +8 -0
  85. data/app/views/spina/admin/page_partables/_line_form.html.haml +2 -0
  86. data/app/views/spina/admin/page_partables/_photo_collection_form.html.haml +12 -0
  87. data/app/views/spina/admin/page_partables/_photo_form.html.haml +11 -0
  88. data/app/views/spina/admin/page_partables/_text_form.html.haml +21 -0
  89. data/app/views/spina/admin/page_parts/_wysihtml5_link.html.haml +12 -0
  90. data/app/views/spina/admin/page_parts/insert_wysihtml5_link.js +5 -0
  91. data/app/views/spina/admin/page_parts/wysihtml5_link.js +2 -0
  92. data/app/views/spina/admin/pages/_attachment_fields.html.haml +8 -0
  93. data/app/views/spina/admin/pages/_form.html.haml +83 -0
  94. data/app/views/spina/admin/pages/_page.html.haml +17 -0
  95. data/app/views/spina/admin/pages/edit.html.haml +11 -0
  96. data/app/views/spina/admin/pages/index.html.haml +37 -0
  97. data/app/views/spina/admin/pages/new.html.haml +11 -0
  98. data/app/views/spina/admin/pages/update.js.coffee +4 -0
  99. data/app/views/spina/admin/photos/_photo.html.haml +7 -0
  100. data/app/views/spina/admin/photos/_photo_collection.html.haml +5 -0
  101. data/app/views/spina/admin/photos/_photo_collection_select.html.haml +20 -0
  102. data/app/views/spina/admin/photos/_photo_link.html.haml +11 -0
  103. data/app/views/spina/admin/photos/_photo_select.html.haml +20 -0
  104. data/app/views/spina/admin/photos/_wysihtml5_select.html.haml +20 -0
  105. data/app/views/spina/admin/photos/create.js.erb +5 -0
  106. data/app/views/spina/admin/photos/enhance.js +0 -0
  107. data/app/views/spina/admin/photos/index.html.haml +7 -0
  108. data/app/views/spina/admin/photos/insert_photo.js.erb +10 -0
  109. data/app/views/spina/admin/photos/insert_photo_collection.js.erb +23 -0
  110. data/app/views/spina/admin/photos/link.js.erb +2 -0
  111. data/app/views/spina/admin/photos/photo_collection_select.js.erb +2 -0
  112. data/app/views/spina/admin/photos/photo_select.js.erb +2 -0
  113. data/app/views/spina/admin/photos/wysihtml5_insert.js.erb +5 -0
  114. data/app/views/spina/admin/photos/wysihtml5_select.js.erb +2 -0
  115. data/app/views/spina/admin/sessions/new.html.haml +4 -0
  116. data/app/views/spina/admin/shared/_navigation.html.haml +16 -0
  117. data/app/views/spina/admin/shared/_notifications.html.haml +16 -0
  118. data/app/views/spina/admin/users/_form.html.haml +54 -0
  119. data/app/views/spina/admin/users/edit.html.haml +1 -0
  120. data/app/views/spina/admin/users/index.html.haml +21 -0
  121. data/app/views/spina/admin/users/new.html.haml +1 -0
  122. data/app/views/spina/inquiries/create.html.haml +2 -0
  123. data/app/views/spina/inquiries/index.html.haml +19 -0
  124. data/app/views/spina/inquiry_mailer/inquiry.html.haml +15 -0
  125. data/app/views/spina/pages/_page.html.haml +3 -0
  126. data/app/views/spina/pages/homepage.html.haml +3 -0
  127. data/app/views/spina/pages/robots.text.erb +4 -0
  128. data/app/views/spina/pages/show.html.haml +1 -0
  129. data/app/views/spina/shared/_admin_bar.html.haml +4 -0
  130. data/app/views/spina/shared/_analytics.html.erb +11 -0
  131. data/app/views/spina/shared/_navigation.html.haml +3 -0
  132. data/app/views/spina/shared/_social.html.haml +5 -0
  133. data/app/views/spina/sitemaps/show.xml.builder +18 -0
  134. data/config/initializers/time_formats.rb +1 -0
  135. data/config/locales/en.yml +10 -0
  136. data/config/locales/nl.yml +213 -0
  137. data/config/routes.rb +88 -0
  138. data/db/migrate/20130412140449_create_spina_pages.rb +15 -0
  139. data/db/migrate/20130412140656_change_columns_pages.rb +6 -0
  140. data/db/migrate/20130412173041_create_spina_users.rb +12 -0
  141. data/db/migrate/20130412175403_create_spina_page_parts.rb +12 -0
  142. data/db/migrate/20130412175531_change_admin_of_users.rb +5 -0
  143. data/db/migrate/20130412180027_create_spina_page_includes.rb +12 -0
  144. data/db/migrate/20130412182257_create_spina_photos.rb +9 -0
  145. data/db/migrate/20130412191946_create_spina_accounts.rb +16 -0
  146. data/db/migrate/20130414145608_create_spina_inquiries.rb +13 -0
  147. data/db/migrate/20130422094248_add_theme_to_spina_accounts.rb +5 -0
  148. data/db/migrate/20130422161041_remove_theme_from_spina_accounts.rb +5 -0
  149. data/db/migrate/20130422194143_change_default_value_column_archived_inquiries.rb +5 -0
  150. data/db/migrate/20130425080630_change_page_includes.rb +8 -0
  151. data/db/migrate/20130426122705_add_parent_id_to_spina_pages.rb +5 -0
  152. data/db/migrate/20130426133425_change_colum_n_spina_pages_again.rb +5 -0
  153. data/db/migrate/20130426133606_bring_out_the_nukes.rb +6 -0
  154. data/db/migrate/20130429092708_add_name_to_spina_pages.rb +5 -0
  155. data/db/migrate/20130429124414_change_column_stomme_onzin.rb +6 -0
  156. data/db/migrate/20130503072744_add_last_logged_in_to_users.rb +5 -0
  157. data/db/migrate/20130503073613_change_column_spina_users.rb +5 -0
  158. data/db/migrate/20130503104857_create_spina_spina_files.rb +9 -0
  159. data/db/migrate/20130503105356_add_file_to_spina_page_parts.rb +5 -0
  160. data/db/migrate/20130503105943_change_columns_spina_files.rb +6 -0
  161. data/db/migrate/20130503110240_fix_namespaces.rb +12 -0
  162. data/db/migrate/20130503133649_create_spina_galleries.rb +10 -0
  163. data/db/migrate/20130504163456_add_seo_title_to_spina_pages.rb +5 -0
  164. data/db/migrate/20130516132913_add_spam_to_spina_inquiries.rb +5 -0
  165. data/db/migrate/20130523132347_add_page_partable_to_spina_page_parts.rb +137 -0
  166. data/db/migrate/20130527124130_remove_deprecated_columns_from_spina_page_parts.rb +11 -0
  167. data/db/migrate/20130715151201_switch_to_nested_sets_instead_of_position_pages.rb +10 -0
  168. data/db/migrate/20130719120007_add_skip_to_first_child_and_templates_to_spina_pages.rb +7 -0
  169. data/db/migrate/20130719121520_add_draft_to_spina_pages.rb +5 -0
  170. data/db/migrate/20130719122139_add_link_url_to_spina_pages.rb +5 -0
  171. data/db/migrate/20130719134545_rename_spina_file_to_attachments.rb +9 -0
  172. data/db/migrate/20130725111749_add_ancestry_to_spina_pages.rb +10 -0
  173. data/db/migrate/20130730185527_add_materialized_path_to_spina_pages.rb +5 -0
  174. data/db/migrate/20130918133920_change_column_page_parts.rb +6 -0
  175. data/db/migrate/20130919074011_create_spina_texts.rb +9 -0
  176. data/db/migrate/20130919074023_create_spina_lines.rb +9 -0
  177. data/db/migrate/20130919074838_remove_column_from_spina_page_parts.rb +5 -0
  178. data/db/migrate/20131210122702_change_column_spina_texts.rb +5 -0
  179. data/db/migrate/20131212080016_add_required_stuff_to_spina_accounts.rb +6 -0
  180. data/db/migrate/20140225141812_create_layout_parts.rb +12 -0
  181. data/db/migrate/20140225151146_add_account_id_to_spina_layout_parts.rb +5 -0
  182. data/db/migrate/20140407095608_add_active_to_spina_pages.rb +5 -0
  183. data/db/migrate/20140711154425_add_robots_allowed_to_spina_accounts.rb +5 -0
  184. data/db/migrate/20140718095419_add_position_to_spina_photo_collections_photos.rb +5 -0
  185. data/db/seeds.rb +14 -0
  186. data/lib/spina.rb +1 -0
  187. data/lib/spina/engine.rb +67 -0
  188. data/lib/spina/plugin.rb +10 -0
  189. data/lib/spina/theme.rb +21 -0
  190. data/lib/spina/version.rb +3 -0
  191. data/lib/tasks/spina_tasks.rake +12 -0
  192. data/test/dummy/README.rdoc +261 -0
  193. data/test/dummy/Rakefile +7 -0
  194. data/test/dummy/app/assets/javascripts/application.js +15 -0
  195. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  196. data/test/dummy/app/controllers/application_controller.rb +3 -0
  197. data/test/dummy/app/helpers/application_helper.rb +2 -0
  198. data/test/dummy/config.ru +4 -0
  199. data/test/dummy/config/application.rb +50 -0
  200. data/test/dummy/config/boot.rb +10 -0
  201. data/test/dummy/config/database.yml +26 -0
  202. data/test/dummy/config/environment.rb +5 -0
  203. data/test/dummy/config/environments/development.rb +41 -0
  204. data/test/dummy/config/environments/production.rb +70 -0
  205. data/test/dummy/config/environments/test.rb +36 -0
  206. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  207. data/test/dummy/config/initializers/inflections.rb +15 -0
  208. data/test/dummy/config/initializers/mime_types.rb +5 -0
  209. data/test/dummy/config/initializers/secret_token.rb +8 -0
  210. data/test/dummy/config/initializers/session_store.rb +8 -0
  211. data/test/dummy/config/initializers/spina.rb +7 -0
  212. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  213. data/test/dummy/config/locales/en.yml +5 -0
  214. data/test/dummy/config/locales/nl.yml +214 -0
  215. data/test/dummy/config/routes.rb +4 -0
  216. data/test/dummy/db/migrate/20130412140523_create_spina_pages.spina.rb +16 -0
  217. data/test/dummy/db/migrate/20130412140723_change_columns_pages.spina.rb +7 -0
  218. data/test/dummy/db/migrate/20130412175127_create_spina_users.spina.rb +13 -0
  219. data/test/dummy/db/migrate/20130412175554_create_spina_page_parts.spina.rb +13 -0
  220. data/test/dummy/db/migrate/20130412175555_change_admin_of_users.spina.rb +6 -0
  221. data/test/dummy/db/migrate/20130412180101_create_spina_page_includes.spina.rb +13 -0
  222. data/test/dummy/db/migrate/20130412182303_create_spina_photos.spina.rb +10 -0
  223. data/test/dummy/db/migrate/20130412191955_create_spina_accounts.spina.rb +17 -0
  224. data/test/dummy/db/migrate/20130414145616_create_spina_inquiries.spina.rb +14 -0
  225. data/test/dummy/db/migrate/20130422094426_add_theme_to_spina_accounts.spina.rb +6 -0
  226. data/test/dummy/db/migrate/20130422161301_remove_theme_from_spina_accounts.spina.rb +6 -0
  227. data/test/dummy/db/migrate/20130422194211_change_default_value_column_archived_inquiries.spina.rb +6 -0
  228. data/test/dummy/db/migrate/20130425080933_change_page_includes.spina.rb +9 -0
  229. data/test/dummy/db/migrate/20130426122731_add_parent_id_to_spina_pages.spina.rb +6 -0
  230. data/test/dummy/db/migrate/20130426132453_change_column_spina_pages.spina.rb +6 -0
  231. data/test/dummy/db/migrate/20130426133450_change_colum_n_spina_pages_again.spina.rb +6 -0
  232. data/test/dummy/db/migrate/20130426133636_bring_out_the_nukes.spina.rb +7 -0
  233. data/test/dummy/db/migrate/20130429092958_add_name_to_spina_pages.spina.rb +6 -0
  234. data/test/dummy/db/migrate/20130503072811_change_column_stomme_onzin.spina.rb +7 -0
  235. data/test/dummy/db/migrate/20130503072850_add_last_logged_in_to_users.spina.rb +6 -0
  236. data/test/dummy/db/migrate/20130503073738_change_column_spina_users.spina.rb +6 -0
  237. data/test/dummy/db/migrate/20130503104917_create_spina_spina_files.spina.rb +10 -0
  238. data/test/dummy/db/migrate/20130503105407_add_file_to_spina_page_parts.spina.rb +6 -0
  239. data/test/dummy/db/migrate/20130503110055_change_columns_spina_files.spina.rb +7 -0
  240. data/test/dummy/db/migrate/20130503110354_fix_namespaces.spina.rb +13 -0
  241. data/test/dummy/db/migrate/20130503135202_create_spina_galleries.spina.rb +11 -0
  242. data/test/dummy/db/migrate/20130504171717_add_seo_title_to_spina_pages.spina.rb +6 -0
  243. data/test/dummy/db/migrate/20130516132920_add_spam_to_spina_inquiries.spina.rb +6 -0
  244. data/test/dummy/db/migrate/20130524104253_add_page_partable_to_spina_page_parts.spina.rb +131 -0
  245. data/test/dummy/db/migrate/20130528195734_remove_deprecated_columns_from_spina_page_parts.spina.rb +14 -0
  246. data/test/dummy/db/migrate/20130715152615_switch_to_nested_sets_instead_of_position_pages.spina.rb +11 -0
  247. data/test/dummy/db/migrate/20130719120131_add_skip_to_first_child_and_templates_to_spina_pages.spina.rb +8 -0
  248. data/test/dummy/db/migrate/20130719121553_add_draft_to_spina_pages.spina.rb +6 -0
  249. data/test/dummy/db/migrate/20130719122158_add_link_url_to_spina_pages.spina.rb +6 -0
  250. data/test/dummy/db/migrate/20130719134709_rename_spina_file_to_attachments.spina.rb +10 -0
  251. data/test/dummy/db/migrate/20130725112244_add_ancestry_to_spina_pages.spina.rb +11 -0
  252. data/test/dummy/db/migrate/20130730185551_add_materialized_path_to_spina_pages.spina.rb +6 -0
  253. data/test/dummy/db/migrate/20130918133920_change_column_page_parts.spina.rb +6 -0
  254. data/test/dummy/db/migrate/20130919074011_create_spina_texts.spina.rb +9 -0
  255. data/test/dummy/db/migrate/20130919074023_create_spina_lines.spina.rb +9 -0
  256. data/test/dummy/db/migrate/20130919074838_remove_column_from_spina_page_parts.spina.rb +5 -0
  257. data/test/dummy/db/migrate/20131210122702_change_column_spina_texts.rb +5 -0
  258. data/test/dummy/db/migrate/20131212080016_add_required_stuff_to_spina_accounts.rb +6 -0
  259. data/test/dummy/db/migrate/20140225141812_create_layout_parts.rb +12 -0
  260. data/test/dummy/db/migrate/20140225151146_add_account_id_to_spina_layout_parts.rb +5 -0
  261. data/test/dummy/db/migrate/20140407095608_add_active_to_spina_pages.rb +5 -0
  262. data/test/dummy/db/schema.rb +141 -0
  263. data/test/dummy/db/seeds.rb +1 -0
  264. data/test/dummy/public/404.html +26 -0
  265. data/test/dummy/public/422.html +26 -0
  266. data/test/dummy/public/500.html +25 -0
  267. data/test/dummy/public/favicon.ico +0 -0
  268. data/test/dummy/script/rails +6 -0
  269. data/test/fixtures/spina/accounts.yml +21 -0
  270. data/test/fixtures/spina/galleries.yml +9 -0
  271. data/test/fixtures/spina/inquiries.yml +15 -0
  272. data/test/fixtures/spina/lines.yml +7 -0
  273. data/test/fixtures/spina/page_includes.yml +13 -0
  274. data/test/fixtures/spina/page_parts.yml +13 -0
  275. data/test/fixtures/spina/pages.yml +19 -0
  276. data/test/fixtures/spina/photo_collection_files.yml +11 -0
  277. data/test/fixtures/spina/photo_collections.yml +11 -0
  278. data/test/fixtures/spina/photos.yml +7 -0
  279. data/test/fixtures/spina/texts.yml +7 -0
  280. data/test/fixtures/spina/users.yml +13 -0
  281. data/test/functional/spina/accounts_controller_test.rb +9 -0
  282. data/test/functional/spina/inquiries_controller_test.rb +9 -0
  283. data/test/functional/spina/page_parts_controller_test.rb +9 -0
  284. data/test/functional/spina/pages_controller_test.rb +9 -0
  285. data/test/functional/spina/photos_controller_test.rb +9 -0
  286. data/test/functional/spina/sessions_controller_test.rb +9 -0
  287. data/test/functional/spina/spina/inquiry_mailer_test.rb +9 -0
  288. data/test/functional/spina/users_controller_test.rb +9 -0
  289. data/test/integration/navigation_test.rb +10 -0
  290. data/test/models/spina/line_test.rb +9 -0
  291. data/test/models/spina/text_test.rb +9 -0
  292. data/test/spina_test.rb +7 -0
  293. data/test/support/images/after sun 2.jpg +0 -0
  294. data/test/support/images/after sun.jpg +0 -0
  295. data/test/support/images/amygdalus.jpg +0 -0
  296. data/test/support/images/at sunset-1.jpg +0 -0
  297. data/test/support/images/colorfull.jpg +0 -0
  298. data/test/support/images/nature tree.jpg +0 -0
  299. data/test/support/images/orchid.jpg +0 -0
  300. data/test/support/images/smooth.jpg +0 -0
  301. data/test/support/images/soft.jpg +0 -0
  302. data/test/support/images/spring memory.jpg +0 -0
  303. data/test/support/images/spring purple.jpg +0 -0
  304. data/test/support/images/spring.jpg +0 -0
  305. data/test/support/images/yew-tree.jpg +0 -0
  306. data/test/test_helper.rb +15 -0
  307. data/test/unit/helpers/spina/accounts_helper_test.rb +6 -0
  308. data/test/unit/helpers/spina/inquiries_helper_test.rb +6 -0
  309. data/test/unit/helpers/spina/page_parts_helper_test.rb +6 -0
  310. data/test/unit/helpers/spina/pages_helper_test.rb +6 -0
  311. data/test/unit/helpers/spina/photos_helper_test.rb +6 -0
  312. data/test/unit/helpers/spina/sessions_helper_test.rb +6 -0
  313. data/test/unit/helpers/spina/users_helper_test.rb +6 -0
  314. data/test/unit/spina/account_test.rb +9 -0
  315. data/test/unit/spina/file_collection_file_test.rb +9 -0
  316. data/test/unit/spina/gallery_test.rb +9 -0
  317. data/test/unit/spina/inquiry_test.rb +9 -0
  318. data/test/unit/spina/page_include_test.rb +9 -0
  319. data/test/unit/spina/page_part_test.rb +9 -0
  320. data/test/unit/spina/page_test.rb +9 -0
  321. data/test/unit/spina/photo_collection_file_test.rb +9 -0
  322. data/test/unit/spina/photo_collection_test.rb +9 -0
  323. data/test/unit/spina/photo_test.rb +9 -0
  324. data/test/unit/spina/spina/file_test.rb +9 -0
  325. data/test/unit/spina/user_test.rb +9 -0
  326. metadata +676 -0
@@ -0,0 +1,26 @@
1
+ module Spina
2
+ class ApplicationController < ActionController::Base
3
+ include ApplicationHelper
4
+
5
+ private
6
+
7
+ def current_ability
8
+ @current_ability ||= Ability.new(current_user)
9
+ end
10
+
11
+ def current_theme
12
+ @current_theme = ::Spina.themes.first
13
+ end
14
+ helper_method :current_theme
15
+
16
+ def current_user
17
+ @current_user ||= User.where(id: session[:user_id]).first if session[:user_id]
18
+ end
19
+ helper_method :current_user
20
+
21
+ def current_account
22
+ @current_account ||= Account.first
23
+ end
24
+ helper_method :current_account
25
+ end
26
+ end
@@ -0,0 +1,30 @@
1
+ module Spina
2
+ class InquiriesController < ApplicationController
3
+
4
+ before_filter :setup_negative_captcha, :only => [:create]
5
+
6
+ def create
7
+ @inquiry = Inquiry.new(@captcha.values)
8
+
9
+ if @inquiry.save
10
+ @inquiry.spam! unless @captcha.valid?
11
+ InquiryMailer.inquiry(@inquiry).deliver unless @inquiry.spam
12
+ else
13
+ flash[:notice] = @captcha.error if @captcha.error
14
+ render :failed
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def setup_negative_captcha
21
+ @captcha = NegativeCaptcha.new(
22
+ secret: Engine.config.NEGATIVE_CAPTCHA_SECRET,
23
+ spinner: request.remote_ip,
24
+ fields: [:email, :message, :name],
25
+ params: params
26
+ )
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,47 @@
1
+ module Spina
2
+ class PagesController < ApplicationController
3
+ before_action :current_user_can_view_page?, except: [:robots]
4
+
5
+ def homepage
6
+ render_with_template(page)
7
+ end
8
+
9
+ def show
10
+ if should_skip_to_first_child?
11
+ if page.is_root?
12
+ redirect_to spina.subpage_path(page, first_live_child) and return
13
+ else
14
+ redirect_to spina.third_level_page_path(page.parent, page, first_live_child) and return
15
+ end
16
+ elsif page.link_url.present?
17
+ redirect_to page.link_url and return
18
+ end
19
+
20
+ render_with_template(page)
21
+ end
22
+
23
+ private
24
+
25
+ def page
26
+ @page ||= (action_name == 'homepage') ? Page.find_by(name: 'homepage') : Page.find(params[:id])
27
+ end
28
+ helper_method :page
29
+
30
+ def current_user_can_view_page?
31
+ raise ActiveRecord::RecordNotFound unless page.live? || current_user.present?
32
+ end
33
+
34
+ def should_skip_to_first_child?
35
+ page.skip_to_first_child && first_live_child
36
+ end
37
+
38
+ def first_live_child
39
+ page.children.sorted.live.first
40
+ end
41
+
42
+ def render_with_template(page)
43
+ render layout: "#{current_theme.to_s.underscore}/application", template: "#{current_theme.to_s.underscore}/pages/#{page.view_template || 'show'}"
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,7 @@
1
+ module Spina
2
+ class SitemapsController < ApplicationController
3
+ def show
4
+ @pages = Page.sorted
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ module Spina
2
+ module Admin
3
+ module AccountsHelper
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Spina
2
+ module Admin
3
+ module InquiriesHelper
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Spina
2
+ module Admin
3
+ module PagePartsHelper
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ module Spina
2
+ module Admin
3
+ module PagesHelper
4
+ def link_to_add_fields(f, association, &block)
5
+ new_object = f.object.send(association).klass.new
6
+ id = new_object.object_id
7
+ fields = f.fields_for(association, new_object, child_index: id) do |builder|
8
+ render(association.to_s.singularize + "_fields", f: builder)
9
+ end
10
+ link_to '#', class: "add_fields button", data: {id: id, fields: fields.gsub("\n", "")} do
11
+ block.yield
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ module Spina
2
+ module Admin
3
+ module PhotosHelper
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Spina
2
+ module Admin
3
+ module SessionsHelper
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module Spina
2
+ module Admin
3
+ module UsersHelper
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,68 @@
1
+ module Spina
2
+ module ApplicationHelper
3
+
4
+ def markdown(text)
5
+ sha = Digest::SHA1.hexdigest(text.to_s)
6
+ Rails.cache.fetch sha do
7
+ renderer = Redcarpet::Render::HTML.new(hard_wrap: true, filter_html: false)
8
+ options = {
9
+ autolink: true,
10
+ no_intra_emphasis: true,
11
+ fenced_code_blocks: true,
12
+ lax_spacing: true,
13
+ strikethrough: true,
14
+ superscript: true
15
+ }
16
+ html = Redcarpet::Markdown.new(renderer, options).render(text.to_s)
17
+
18
+ html.gsub!(/\[vimeo\s+(\d*)\]/, '<figure class="video"><iframe src="http://player.vimeo.com/video/\1?portrait=0&title=0&byline=0" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></figure>')
19
+ html.gsub!(/\[button\s+(.*)\](.*)\[\/button\]/, '<a href="\1" class="button">\2</a>')
20
+ html.html_safe
21
+ end
22
+ end
23
+
24
+ def link_to_add_fields(name, f, association)
25
+ new_object = f.object.send(association).klass.new
26
+ id = new_object.object_id
27
+ fields = f.fields_for(association, new_object, child_index: id) do |builder|
28
+ render(association.to_s.singularize + "_fields", f: builder)
29
+ end
30
+ link_to(name, '#', class: "add_fields button button-primary button-link", data: {id: id, fields: fields.gsub("\n", ""), icon: '&'})
31
+ end
32
+
33
+ def current_account
34
+ @current_account ||= Account.first
35
+ end
36
+
37
+ def image_tag_with_at2x(name_at_1x, options={})
38
+ name_at_2x = name_at_1x.gsub(%r{\.\w+$}, '@2x\0')
39
+ image_tag(name_at_1x, options.merge("data-at2x" => asset_path(name_at_2x)))
40
+ end
41
+
42
+ def error_explanation!(resource)
43
+ return "" if resource.errors.empty?
44
+
45
+ messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
46
+ sentence = I18n.t("errors.messages.not_saved", count: resource.errors.count, resource: resource.class.model_name.human.downcase)
47
+
48
+ html = <<-HTML
49
+ <div id="error_explanation" class="notification notification-error" data-icon='m'>
50
+ <p>#{sentence}</p>
51
+ <ul>#{messages}</ul>
52
+ </div>
53
+ HTML
54
+
55
+ html.html_safe
56
+ end
57
+
58
+ def captcha
59
+ NegativeCaptcha.new(
60
+ secret: Engine.config.NEGATIVE_CAPTCHA_SECRET,
61
+ spinner: request.remote_ip,
62
+ fields: [:email, :message, :name],
63
+ params: params
64
+ )
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,19 @@
1
+ module Spina
2
+ class InquiryMailer < ActionMailer::Base
3
+ layout 'spina/email'
4
+
5
+ def inquiry(inquiry)
6
+ @inquiry = inquiry
7
+ @current_account = Account.first
8
+
9
+ # attachments.inline['logo.jpg'] = LogoUploader.new.read(@current_account.logo) if @current_account.logo.url
10
+
11
+ mail(
12
+ to: "\"#{@current_account.name}\" <#{ @current_account.email }>",
13
+ from: "\"#{@inquiry.name}\" <#{@inquiry.email}>",
14
+ subject: @inquiry.message.truncate(97, separator: ' ')
15
+ )
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module Spina
2
+ class Ability
3
+ include CanCan::Ability
4
+
5
+ def initialize(user)
6
+ if user.admin?
7
+ can :manage, :all
8
+ else
9
+ can :manage, Page
10
+ can :manage, Photo
11
+ can :manage, Account
12
+ can :manage, Inquiry
13
+
14
+ # Engine.config.plugins.each do |plugin|
15
+ # can :manage, "#{plugin.class_name}".constantize
16
+ # end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,72 @@
1
+ module Spina
2
+ class Account < ActiveRecord::Base
3
+ serialize :preferences
4
+
5
+ mount_uploader :logo, LogoUploader
6
+
7
+ has_many :layout_parts, dependent: :destroy
8
+ accepts_nested_attributes_for :layout_parts, allow_destroy: true
9
+
10
+ after_save :bootstrap_website
11
+
12
+ def to_s
13
+ name
14
+ end
15
+
16
+ def layout_part(layout_part)
17
+ layout_part = layout_parts.where(name: layout_part[:name]).first || layout_parts.build(layout_part)
18
+ layout_part.layout_partable = layout_part.layout_partable_type.constantize.new unless layout_part.layout_partable.present?
19
+ layout_part
20
+ end
21
+
22
+ def content(layout_part)
23
+ layout_part = layout_parts.where(name: layout_part).first
24
+ layout_part.try(:content)
25
+ end
26
+
27
+ private
28
+
29
+ def bootstrap_website
30
+ theme = ::Spina.theme(self.theme)
31
+ bootstrap_pages(theme) if theme
32
+ end
33
+
34
+ def bootstrap_pages(theme)
35
+ find_or_create_custom_pages(theme)
36
+ deactivate_unused_view_templates(theme)
37
+ activate_used_view_templates(theme)
38
+ end
39
+
40
+ def find_or_create_custom_pages(theme)
41
+ theme.config.custom_pages.each do |page|
42
+ Page.where(name: page[:name], deletable: false).first_or_create(title: page[:title], view_template: page[:view_template]).activate!
43
+ end
44
+ end
45
+
46
+ def deactivate_unused_view_templates(theme)
47
+ Page.where.not(view_template: theme.config.view_templates.map{|t|t[0]}).each &:deactivate!
48
+ end
49
+
50
+ def activate_used_view_templates(theme)
51
+ Page.where(view_template: theme.config.view_templates.map{|t|t[0]}).each &:activate!
52
+ end
53
+
54
+ def self.serialized_attr_accessor(*args)
55
+ args.each do |method_name|
56
+ eval "
57
+ def #{method_name}
58
+ (self.preferences || {})[:#{method_name}]
59
+ end
60
+
61
+ def #{method_name}=(value)
62
+ self.preferences ||= {}
63
+ self.preferences[:#{method_name}] = value
64
+ end
65
+ "
66
+ end
67
+ end
68
+
69
+ serialized_attr_accessor :google_analytics, :google_site_verification, :facebook, :twitter, :google_plus, :theme
70
+
71
+ end
72
+ end
@@ -0,0 +1,28 @@
1
+ module Spina
2
+ class Attachment < ActiveRecord::Base
3
+
4
+ has_one :page_part, as: :page_partable
5
+ has_and_belongs_to_many :attachment_collections, join_table: 'spina_attachment_collections_attachments'
6
+
7
+ attr_accessor :_destroy
8
+
9
+ scope :sorted, -> { order('created_at DESC') }
10
+ scope :file_attached, -> { where('file IS NOT NULL') }
11
+
12
+ mount_uploader :file, FileUploader
13
+
14
+ def name
15
+ file.file.try(:filename)
16
+ end
17
+
18
+ alias_method :old_update_attributes, :update_attributes
19
+ def update_attributes(attributes)
20
+ if attributes["_destroy"] == "1" && attributes["file"].blank?
21
+ self.page_part.destroy
22
+ else
23
+ old_update_attributes(attributes)
24
+ end
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,15 @@
1
+ module Spina
2
+ class AttachmentCollection < ActiveRecord::Base
3
+
4
+ has_one :page_part, as: :page_partable
5
+ has_and_belongs_to_many :attachments, join_table: 'spina_attachment_collections_attachments'
6
+
7
+ attr_reader :attachment_tokens
8
+ accepts_nested_attributes_for :attachments, allow_destroy: true
9
+
10
+ def attachment_tokens=(ids)
11
+ self.attachment_ids = ids.split(",")
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,41 @@
1
+ module Spina
2
+ class Inquiry < ActiveRecord::Base
3
+ include ActionView::Helpers::TextHelper
4
+
5
+ validates_presence_of :email, :message, :name
6
+ validates :email, format: {with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i}
7
+
8
+ before_save :archive_if_spam
9
+
10
+ # Filters spam gem incompatible met rails 4.1
11
+ # filters_spam({
12
+ # author_field: :name,
13
+ # message_field: :message,
14
+ # email_field: :email,
15
+ # other_fields: [],
16
+ # extra_spam_words: %w()
17
+ # })
18
+
19
+ scope :ham, -> { where(spam: [false, nil]) }
20
+ scope :spam, -> { where(spam: true)}
21
+ scope :new_messages, -> { ham.where(archived: false) }
22
+ scope :sorted, -> { ham.order("created_at DESC") }
23
+
24
+ def archive_if_spam
25
+ self.archived = true if self.spam
26
+ end
27
+
28
+ def summary
29
+ truncate(message, length: 120)
30
+ end
31
+
32
+ def ham!
33
+ update_attributes({spam: false}, without_protection: true)
34
+ end
35
+
36
+ def spam!
37
+ update_attributes({spam: true}, without_protection: true)
38
+ end
39
+
40
+ end
41
+ end