trusty-cms 1.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 (388) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +23 -0
  3. data/CHANGELOG.md +754 -0
  4. data/CONTRIBUTORS.md +263 -0
  5. data/Gemfile +40 -0
  6. data/Gemfile.lock +177 -0
  7. data/INSTALL.md +10 -0
  8. data/LICENSE.md +21 -0
  9. data/README.md +85 -0
  10. data/Rakefile +7 -0
  11. data/app/controllers/admin/configuration_controller.rb +50 -0
  12. data/app/controllers/admin/extensions_controller.rb +11 -0
  13. data/app/controllers/admin/layouts_controller.rb +8 -0
  14. data/app/controllers/admin/page_fields_controller.rb +9 -0
  15. data/app/controllers/admin/page_parts_controller.rb +9 -0
  16. data/app/controllers/admin/pages_controller.rb +89 -0
  17. data/app/controllers/admin/preferences_controller.rb +46 -0
  18. data/app/controllers/admin/references_controller.rb +7 -0
  19. data/app/controllers/admin/resource_controller.rb +245 -0
  20. data/app/controllers/admin/users_controller.rb +40 -0
  21. data/app/controllers/admin/welcome_controller.rb +48 -0
  22. data/app/controllers/application_controller.rb +114 -0
  23. data/app/controllers/site_controller.rb +97 -0
  24. data/app/helpers/admin/configuration_helper.rb +80 -0
  25. data/app/helpers/admin/export_helper.rb +2 -0
  26. data/app/helpers/admin/extensions_helper.rb +2 -0
  27. data/app/helpers/admin/layouts_helper.rb +21 -0
  28. data/app/helpers/admin/node_helper.rb +96 -0
  29. data/app/helpers/admin/pages_helper.rb +117 -0
  30. data/app/helpers/admin/preferences_helper.rb +3 -0
  31. data/app/helpers/admin/references_helper.rb +46 -0
  32. data/app/helpers/admin/regions_helper.rb +28 -0
  33. data/app/helpers/admin/resource_helper.rb +2 -0
  34. data/app/helpers/admin/users_helper.rb +8 -0
  35. data/app/helpers/admin/welcome_helper.rb +2 -0
  36. data/app/helpers/application_helper.rb +241 -0
  37. data/app/helpers/site_helper.rb +2 -0
  38. data/app/models/deprecated_tags.rb +42 -0
  39. data/app/models/file_not_found_page.rb +32 -0
  40. data/app/models/layout.rb +15 -0
  41. data/app/models/menu_renderer.rb +140 -0
  42. data/app/models/page.rb +377 -0
  43. data/app/models/page_context.rb +53 -0
  44. data/app/models/page_field.rb +3 -0
  45. data/app/models/page_part.rb +20 -0
  46. data/app/models/standard_tags.rb +1318 -0
  47. data/app/models/status.rb +41 -0
  48. data/app/models/text_filter.rb +36 -0
  49. data/app/models/trusty_cms/config.rb +313 -0
  50. data/app/models/trusty_cms/page_response_cache_director.rb +43 -0
  51. data/app/models/user.rb +96 -0
  52. data/app/models/user_action_observer.rb +25 -0
  53. data/app/views/admin/configuration/edit.html.haml +38 -0
  54. data/app/views/admin/configuration/show.html.haml +58 -0
  55. data/app/views/admin/extensions/index.html.haml +41 -0
  56. data/app/views/admin/layouts/_form.html.haml +39 -0
  57. data/app/views/admin/layouts/edit.html.haml +9 -0
  58. data/app/views/admin/layouts/index.html.haml +35 -0
  59. data/app/views/admin/layouts/new.html.haml +7 -0
  60. data/app/views/admin/layouts/remove.html.haml +16 -0
  61. data/app/views/admin/page_fields/_page_field.html.haml +12 -0
  62. data/app/views/admin/page_parts/_page_part.html.haml +18 -0
  63. data/app/views/admin/pages/_fields.html.haml +71 -0
  64. data/app/views/admin/pages/_meta_row.html.haml +8 -0
  65. data/app/views/admin/pages/_node.html.haml +26 -0
  66. data/app/views/admin/pages/_popups.html.haml +27 -0
  67. data/app/views/admin/pages/children.html.haml +2 -0
  68. data/app/views/admin/pages/edit.html.haml +12 -0
  69. data/app/views/admin/pages/index.html.haml +26 -0
  70. data/app/views/admin/pages/new.html.haml +10 -0
  71. data/app/views/admin/pages/remove.html.haml +18 -0
  72. data/app/views/admin/preferences/edit.html.haml +44 -0
  73. data/app/views/admin/references/_tag_reference.haml +3 -0
  74. data/app/views/admin/references/filters.haml +6 -0
  75. data/app/views/admin/references/tags.haml +30 -0
  76. data/app/views/admin/users/_avatar.html.haml +5 -0
  77. data/app/views/admin/users/_form.html.haml +53 -0
  78. data/app/views/admin/users/_password_fields.html.haml +18 -0
  79. data/app/views/admin/users/edit.html.haml +9 -0
  80. data/app/views/admin/users/index.html.haml +39 -0
  81. data/app/views/admin/users/new.html.haml +6 -0
  82. data/app/views/admin/users/remove.html.haml +16 -0
  83. data/app/views/admin/welcome/login.html.haml +23 -0
  84. data/app/views/layouts/application.html.haml +50 -0
  85. data/app/views/site/not_found.html.haml +3 -0
  86. data/bin/ci/before_script +15 -0
  87. data/bin/trusty_cms +53 -0
  88. data/config/application.rb +124 -0
  89. data/config/boot.rb +9 -0
  90. data/config/compass.config +15 -0
  91. data/config/database.db2.yml +20 -0
  92. data/config/database.mysql.yml +25 -0
  93. data/config/database.postgresql.yml +25 -0
  94. data/config/database.sqlite.yml +16 -0
  95. data/config/database.sqlserver.yml +20 -0
  96. data/config/environment.rb +5 -0
  97. data/config/environments/development.rb +19 -0
  98. data/config/environments/production.rb +27 -0
  99. data/config/environments/test.rb +35 -0
  100. data/config/initializers/active_record_extensions.rb +1 -0
  101. data/config/initializers/configuration_extensions.rb +0 -0
  102. data/config/initializers/haml.rb +2 -0
  103. data/config/initializers/object_extensions.rb +1 -0
  104. data/config/initializers/radiant_config.rb +16 -0
  105. data/config/initializers/rails_patch.rb +2 -0
  106. data/config/initializers/response_cache_timeout.rb +3 -0
  107. data/config/initializers/string_extensions.rb +1 -0
  108. data/config/initializers/symbol_extensions.rb +1 -0
  109. data/config/initializers/tmp.rb +2 -0
  110. data/config/locales/en.yml +230 -0
  111. data/config/locales/en_available_tags.yml +625 -0
  112. data/config/preinitializer.rb +18 -0
  113. data/config/routes.rb +30 -0
  114. data/db/migrate/001_create_radiant_tables.rb +75 -0
  115. data/db/migrate/002_insert_initial_data.rb +12 -0
  116. data/db/migrate/003_rename_behavior_column.rb +9 -0
  117. data/db/migrate/004_rename_filter_column.rb +11 -0
  118. data/db/migrate/005_add_virtual_column_to_page.rb +9 -0
  119. data/db/migrate/006_integer_columns_to_boolean.rb +36 -0
  120. data/db/migrate/007_remove_virtual_column_from_page.rb +9 -0
  121. data/db/migrate/008_add_virtual_column_to_page_again.rb +9 -0
  122. data/db/migrate/009_add_content_type_field_to_layout.rb +9 -0
  123. data/db/migrate/010_merge_behaviors_and_pages.rb +57 -0
  124. data/db/migrate/011_rename_type_column_on_page_to_class_name.rb +9 -0
  125. data/db/migrate/012_create_extension_meta.rb +13 -0
  126. data/db/migrate/013_add_notes_field_to_user.rb +9 -0
  127. data/db/migrate/014_rename_config_default_parts_key.rb +17 -0
  128. data/db/migrate/015_add_optimistic_locking.rb +15 -0
  129. data/db/migrate/016_add_sessions.rb +16 -0
  130. data/db/migrate/017_rename_created_by_updated_by_columns.rb +15 -0
  131. data/db/migrate/018_add_description_and_keywords_to_pages.rb +11 -0
  132. data/db/migrate/019_add_salt_to_users.rb +11 -0
  133. data/db/migrate/020_add_session_info_to_users.rb +11 -0
  134. data/db/migrate/021_remove_session_expire_from_users.rb +9 -0
  135. data/db/migrate/20081203140407_add_indexes.rb +19 -0
  136. data/db/migrate/20090226140109_add_user_language.rb +9 -0
  137. data/db/migrate/20090929164633_rename_developer_role_to_designer.rb +9 -0
  138. data/db/migrate/20091003095744_change_user_language_to_locale.rb +9 -0
  139. data/db/migrate/20100805154952_add_page_fields.rb +15 -0
  140. data/db/migrate/20100805155020_convert_page_metas.rb +24 -0
  141. data/db/migrate/20100810151922_add_field_name_index.rb +11 -0
  142. data/db/migrate/20110902203823_add_allowed_children_cache_to_pages.rb +13 -0
  143. data/db/migrate/20111016150725_extend_page_part_content_limit.rb +15 -0
  144. data/db/migrate/20120209231801_change_pages_allowed_children_cache_to_text.rb +11 -0
  145. data/db/schema.rb +128 -0
  146. data/lib/active_record_extensions/active_record_extensions.rb +27 -0
  147. data/lib/annotatable.rb +68 -0
  148. data/lib/configuration_extensions/configuration_extensions.rb +357 -0
  149. data/lib/generators/extension/USAGE +30 -0
  150. data/lib/generators/extension/extension_generator.rb +97 -0
  151. data/lib/generators/extension/templates/README.md +6 -0
  152. data/lib/generators/extension/templates/RSpecRakefile +109 -0
  153. data/lib/generators/extension/templates/Rakefile +25 -0
  154. data/lib/generators/extension/templates/cucumber.yml +1 -0
  155. data/lib/generators/extension/templates/cucumber_env.rb +11 -0
  156. data/lib/generators/extension/templates/cucumber_paths.rb +22 -0
  157. data/lib/generators/extension/templates/en.yml +3 -0
  158. data/lib/generators/extension/templates/extension.rb +21 -0
  159. data/lib/generators/extension/templates/functional_test.rb +15 -0
  160. data/lib/generators/extension/templates/gemspec.rb +29 -0
  161. data/lib/generators/extension/templates/lib.rb +8 -0
  162. data/lib/generators/extension/templates/migration.rb +9 -0
  163. data/lib/generators/extension/templates/radiant_config.rb +3 -0
  164. data/lib/generators/extension/templates/routes.rb +5 -0
  165. data/lib/generators/extension/templates/spec.opts +6 -0
  166. data/lib/generators/extension/templates/spec_helper.rb +42 -0
  167. data/lib/generators/extension/templates/tasks.rake +47 -0
  168. data/lib/generators/extension/templates/test_helper.rb +26 -0
  169. data/lib/generators/extension_controller/USAGE +36 -0
  170. data/lib/generators/extension_controller/extension_controller_generator.rb +84 -0
  171. data/lib/generators/extension_controller/templates/controller.rb +10 -0
  172. data/lib/generators/extension_controller/templates/controller_spec.rb +23 -0
  173. data/lib/generators/extension_controller/templates/functional_test.rb +11 -0
  174. data/lib/generators/extension_controller/templates/helper.rb +2 -0
  175. data/lib/generators/extension_controller/templates/helper_spec.rb +11 -0
  176. data/lib/generators/extension_controller/templates/helper_test.rb +4 -0
  177. data/lib/generators/extension_controller/templates/view.html.erb +2 -0
  178. data/lib/generators/extension_controller/templates/view_spec.rb +12 -0
  179. data/lib/generators/extension_mailer/USAGE +17 -0
  180. data/lib/generators/extension_mailer/extension_mailer_generator.rb +68 -0
  181. data/lib/generators/extension_mailer/templates/fixture.erb +3 -0
  182. data/lib/generators/extension_mailer/templates/mailer.rb +15 -0
  183. data/lib/generators/extension_mailer/templates/unit_test.rb +21 -0
  184. data/lib/generators/extension_mailer/templates/view.erb +3 -0
  185. data/lib/generators/extension_migration/USAGE +34 -0
  186. data/lib/generators/extension_migration/extension_migration_generator.rb +25 -0
  187. data/lib/generators/extension_migration/templates/migration.rb +11 -0
  188. data/lib/generators/extension_model/USAGE +35 -0
  189. data/lib/generators/extension_model/extension_model_generator.rb +68 -0
  190. data/lib/generators/extension_model/templates/fixtures.yml +19 -0
  191. data/lib/generators/extension_model/templates/migration.rb +16 -0
  192. data/lib/generators/extension_model/templates/model.rb +2 -0
  193. data/lib/generators/extension_model/templates/model_spec.rb +11 -0
  194. data/lib/generators/extension_model/templates/unit_test.rb +8 -0
  195. data/lib/generators/generator_base_extension.rb +16 -0
  196. data/lib/generators/instance/instance_generator.rb +148 -0
  197. data/lib/generators/instance/templates/databases/db2.yml +40 -0
  198. data/lib/generators/instance/templates/databases/mysql.yml +47 -0
  199. data/lib/generators/instance/templates/databases/postgresql.yml +44 -0
  200. data/lib/generators/instance/templates/databases/sqlite3.yml +16 -0
  201. data/lib/generators/instance/templates/databases/sqlserver.yml +21 -0
  202. data/lib/generators/instance/templates/instance_boot.rb +122 -0
  203. data/lib/generators/instance/templates/instance_config.ru +2 -0
  204. data/lib/generators/instance/templates/instance_environment.rb +83 -0
  205. data/lib/generators/instance/templates/instance_gemfile +81 -0
  206. data/lib/generators/instance/templates/instance_generate +6 -0
  207. data/lib/generators/instance/templates/instance_radiant_config.rb +16 -0
  208. data/lib/generators/instance/templates/instance_rakefile +3 -0
  209. data/lib/generators/instance/templates/instance_routes.rb +1 -0
  210. data/lib/generators/language_extension/USAGE +27 -0
  211. data/lib/generators/language_extension/language_extension_generator.rb +71 -0
  212. data/lib/generators/language_extension/templates/README +3 -0
  213. data/lib/generators/language_extension/templates/RSpecRakefile +123 -0
  214. data/lib/generators/language_extension/templates/Rakefile +25 -0
  215. data/lib/generators/language_extension/templates/available_tags.yml +553 -0
  216. data/lib/generators/language_extension/templates/cucumber.yml +1 -0
  217. data/lib/generators/language_extension/templates/cucumber_env.rb +16 -0
  218. data/lib/generators/language_extension/templates/cucumber_paths.rb +14 -0
  219. data/lib/generators/language_extension/templates/extension.rb +12 -0
  220. data/lib/generators/language_extension/templates/functional_test.rb +15 -0
  221. data/lib/generators/language_extension/templates/gemspec.rb +24 -0
  222. data/lib/generators/language_extension/templates/lang.yml +181 -0
  223. data/lib/generators/language_extension/templates/lib.rb +8 -0
  224. data/lib/generators/language_extension/templates/spec.opts +6 -0
  225. data/lib/generators/language_extension/templates/spec_helper.rb +36 -0
  226. data/lib/generators/language_extension/templates/tasks.rake +28 -0
  227. data/lib/generators/language_extension/templates/test_helper.rb +26 -0
  228. data/lib/inheritable_class_attributes.rb +65 -0
  229. data/lib/local_time.rb +6 -0
  230. data/lib/login_system.rb +132 -0
  231. data/lib/method_observer.rb +50 -0
  232. data/lib/object_extensions/object_extensions.rb +5 -0
  233. data/lib/simpleton.rb +21 -0
  234. data/lib/string_extensions/string_extensions.rb +25 -0
  235. data/lib/symbol_extensions/symbol_extensions.rb +5 -0
  236. data/lib/tasks/database.rake +85 -0
  237. data/lib/tasks/environments.rake +11 -0
  238. data/lib/tasks/extensions.rake +85 -0
  239. data/lib/tasks/framework.rake +255 -0
  240. data/lib/tasks/instance.rake +23 -0
  241. data/lib/tasks/prototype.rake +31 -0
  242. data/lib/tasks/radiant_config.rake +18 -0
  243. data/lib/tasks/release.rake +131 -0
  244. data/lib/tasks/translate.rake +59 -0
  245. data/lib/tasks/undefine.rake +28 -0
  246. data/lib/translation_support.rb +54 -0
  247. data/lib/trusty_cms/admin_ui/region_partials.rb +23 -0
  248. data/lib/trusty_cms/admin_ui/region_set.rb +35 -0
  249. data/lib/trusty_cms/admin_ui.rb +244 -0
  250. data/lib/trusty_cms/available_locales.rb +19 -0
  251. data/lib/trusty_cms/cache.rb +100 -0
  252. data/lib/trusty_cms/config/definition.rb +142 -0
  253. data/lib/trusty_cms/engine.rb +10 -0
  254. data/lib/trusty_cms/extension/script.rb +395 -0
  255. data/lib/trusty_cms/extension.rb +146 -0
  256. data/lib/trusty_cms/extension_loader.rb +130 -0
  257. data/lib/trusty_cms/extension_migrator.rb +98 -0
  258. data/lib/trusty_cms/extension_path.rb +200 -0
  259. data/lib/trusty_cms/initializer.rb +162 -0
  260. data/lib/trusty_cms/pagination/controller.rb +41 -0
  261. data/lib/trusty_cms/pagination/link_renderer.rb +34 -0
  262. data/lib/trusty_cms/resource_responses.rb +121 -0
  263. data/lib/trusty_cms/setup.rb +227 -0
  264. data/lib/trusty_cms/taggable.rb +138 -0
  265. data/lib/trusty_cms/task_support.rb +66 -0
  266. data/lib/trusty_cms.rb +19 -0
  267. data/log/.keep +0 -0
  268. data/public/.htaccess +40 -0
  269. data/public/404.html +8 -0
  270. data/public/500.html +8 -0
  271. data/public/dispatch.cgi +10 -0
  272. data/public/dispatch.fcgi +24 -0
  273. data/public/dispatch.rb +10 -0
  274. data/public/favicon.ico +0 -0
  275. data/public/images/admin/add_tab.png +0 -0
  276. data/public/images/admin/avatar_32x32.png +0 -0
  277. data/public/images/admin/avatar_64x64.png +0 -0
  278. data/public/images/admin/avatar_96x96.png +0 -0
  279. data/public/images/admin/brown_bottom_line.gif +0 -0
  280. data/public/images/admin/calendar_down.gif +0 -0
  281. data/public/images/admin/collapse.png +0 -0
  282. data/public/images/admin/draft_page.png +0 -0
  283. data/public/images/admin/expand.png +0 -0
  284. data/public/images/admin/image.png +0 -0
  285. data/public/images/admin/javascript.png +0 -0
  286. data/public/images/admin/layout.png +0 -0
  287. data/public/images/admin/metadata_toggle.png +0 -0
  288. data/public/images/admin/minus.png +0 -0
  289. data/public/images/admin/minus_disabled.png +0 -0
  290. data/public/images/admin/minus_grey.png +0 -0
  291. data/public/images/admin/navigation_secondary_separator.gif +0 -0
  292. data/public/images/admin/page.png +0 -0
  293. data/public/images/admin/plus.png +0 -0
  294. data/public/images/admin/plus_disabled.png +0 -0
  295. data/public/images/admin/plus_grey.png +0 -0
  296. data/public/images/admin/popup_border_background.png +0 -0
  297. data/public/images/admin/popup_border_bottom_left.png +0 -0
  298. data/public/images/admin/popup_border_bottom_right.png +0 -0
  299. data/public/images/admin/popup_border_top_left.png +0 -0
  300. data/public/images/admin/popup_border_top_right.png +0 -0
  301. data/public/images/admin/search.png +0 -0
  302. data/public/images/admin/single_form_shadow.png +0 -0
  303. data/public/images/admin/snippet.png +0 -0
  304. data/public/images/admin/spinner.gif +0 -0
  305. data/public/images/admin/status_background.png +0 -0
  306. data/public/images/admin/status_bottom_left.png +0 -0
  307. data/public/images/admin/status_bottom_right.png +0 -0
  308. data/public/images/admin/status_spinner.gif +0 -0
  309. data/public/images/admin/status_top_left.png +0 -0
  310. data/public/images/admin/status_top_right.png +0 -0
  311. data/public/images/admin/stylesheet.png +0 -0
  312. data/public/images/admin/tab_close.png +0 -0
  313. data/public/images/admin/upload.png +0 -0
  314. data/public/images/admin/virtual_page.png +0 -0
  315. data/public/images/radiant/radiant-badge-color.png +0 -0
  316. data/public/javascripts/admin/application.js +94 -0
  317. data/public/javascripts/admin/codearea.js +165 -0
  318. data/public/javascripts/admin/controls.js +965 -0
  319. data/public/javascripts/admin/cookie.js +80 -0
  320. data/public/javascripts/admin/dateinput.js +402 -0
  321. data/public/javascripts/admin/dragdrop.js +974 -0
  322. data/public/javascripts/admin/dropdown.js +216 -0
  323. data/public/javascripts/admin/effects.js +1122 -0
  324. data/public/javascripts/admin/lowpro.js +340 -0
  325. data/public/javascripts/admin/overrides.js +1 -0
  326. data/public/javascripts/admin/page_preview.js +41 -0
  327. data/public/javascripts/admin/pagefield.js +54 -0
  328. data/public/javascripts/admin/pagestatus.js +17 -0
  329. data/public/javascripts/admin/popup.js +339 -0
  330. data/public/javascripts/admin/prototype.js +4874 -0
  331. data/public/javascripts/admin/ruledtable.js +13 -0
  332. data/public/javascripts/admin/shortcuts.js +33 -0
  333. data/public/javascripts/admin/sitemap.js +149 -0
  334. data/public/javascripts/admin/status.js +233 -0
  335. data/public/javascripts/admin/tabcontrol.js +123 -0
  336. data/public/javascripts/admin/toggle.js +430 -0
  337. data/public/javascripts/admin/utility.js +53 -0
  338. data/public/javascripts/admin/validationerror.js +18 -0
  339. data/public/loading-iframe.html +11 -0
  340. data/public/robots.txt +1 -0
  341. data/public/stylesheets/sass/admin/_base.sass +18 -0
  342. data/public/stylesheets/sass/admin/main.sass +27 -0
  343. data/public/stylesheets/sass/admin/modules/_boxes.sass +6 -0
  344. data/public/stylesheets/sass/admin/modules/_gradients.sass +4 -0
  345. data/public/stylesheets/sass/admin/modules/_links.sass +18 -0
  346. data/public/stylesheets/sass/admin/overrides.sass +2 -0
  347. data/public/stylesheets/sass/admin/partials/_actions.sass +96 -0
  348. data/public/stylesheets/sass/admin/partials/_avatars.sass +10 -0
  349. data/public/stylesheets/sass/admin/partials/_content.sass +58 -0
  350. data/public/stylesheets/sass/admin/partials/_dateinput.sass +62 -0
  351. data/public/stylesheets/sass/admin/partials/_deprecated.sass +55 -0
  352. data/public/stylesheets/sass/admin/partials/_dropdown.sass +28 -0
  353. data/public/stylesheets/sass/admin/partials/_footer.sass +12 -0
  354. data/public/stylesheets/sass/admin/partials/_forms.sass +322 -0
  355. data/public/stylesheets/sass/admin/partials/_header.sass +114 -0
  356. data/public/stylesheets/sass/admin/partials/_index.sass +147 -0
  357. data/public/stylesheets/sass/admin/partials/_layout.sass +10 -0
  358. data/public/stylesheets/sass/admin/partials/_messages.sass +10 -0
  359. data/public/stylesheets/sass/admin/partials/_popup.sass +213 -0
  360. data/public/stylesheets/sass/admin/partials/_tabcontrol.sass +72 -0
  361. data/public/stylesheets/sass/admin/partials/_toolbar.sass +31 -0
  362. data/public/stylesheets/sass/admin/partials/_typography.sass +60 -0
  363. data/public/stylesheets/sass/admin/partials/_validations.sass +19 -0
  364. data/rails/init.rb +1 -0
  365. data/script/about +4 -0
  366. data/script/breakpointer +3 -0
  367. data/script/console +3 -0
  368. data/script/dbconsole +3 -0
  369. data/script/destroy +3 -0
  370. data/script/extension +5 -0
  371. data/script/generate +3 -0
  372. data/script/performance/benchmarker +3 -0
  373. data/script/performance/profiler +3 -0
  374. data/script/performance/request +3 -0
  375. data/script/plugin +3 -0
  376. data/script/process/inspector +3 -0
  377. data/script/process/reaper +3 -0
  378. data/script/process/spawner +3 -0
  379. data/script/process/spinner +3 -0
  380. data/script/rails +6 -0
  381. data/script/runner +3 -0
  382. data/script/server +3 -0
  383. data/script/version +5 -0
  384. data/spec/ci/database.mysql.yml +4 -0
  385. data/spec/ci/database.postgresql.yml +4 -0
  386. data/spec/ci/database.sqlite.yml +3 -0
  387. data/trusty_cms.gemspec +50 -0
  388. metadata +781 -0
@@ -0,0 +1,89 @@
1
+ class Admin::PagesController < Admin::ResourceController
2
+ before_filter :initialize_meta_rows_and_buttons, :only => [:new, :edit, :create, :update]
3
+ before_filter :count_deleted_pages, :only => [:destroy]
4
+
5
+ class PreviewStop < ActiveRecord::Rollback
6
+ def message
7
+ 'Changes not saved!'
8
+ end
9
+ end
10
+
11
+ responses do |r|
12
+ r.plural.js do
13
+ @level = params[:level].to_i
14
+ @template_name = 'index'
15
+ self.models = Page.find(params[:page_id]).children.all
16
+ response.headers['Content-Type'] = 'text/html;charset=utf-8'
17
+ render :action => 'children.html.haml', :layout => false
18
+ end
19
+ end
20
+
21
+ def index
22
+ @homepage = Page.find_by_parent_id(nil)
23
+ response_for :plural
24
+ end
25
+
26
+ def new
27
+ @page = self.model = model_class.new_with_defaults(trusty_config)
28
+ assign_page_attributes
29
+ response_for :new
30
+ end
31
+
32
+ def preview
33
+ render_preview
34
+ rescue PreviewStop => exception
35
+ render :text => exception.message unless @performed_render
36
+ end
37
+
38
+ private
39
+ def assign_page_attributes
40
+ if params[:page_id].blank?
41
+ self.model.slug = '/'
42
+ end
43
+ self.model.parent_id = params[:page_id]
44
+ end
45
+
46
+ def model_class
47
+ if Page.descendants.any? { |d| d.to_s == params[:page_class] }
48
+ params[:page_class].constantize
49
+ elsif params[:page_id]
50
+ Page.find(params[:page_id]).children
51
+ else
52
+ Page
53
+ end
54
+ end
55
+
56
+ def render_preview
57
+ Page.transaction do
58
+ page_class = Page.descendants.include?(model_class) ? model_class : Page
59
+ if request.referer =~ %r{/admin/pages/(\d+)/edit}
60
+ page = Page.find($1).becomes(page_class)
61
+ page.update_attributes(params[:page])
62
+ page.published_at ||= Time.now
63
+ else
64
+ page = page_class.new(params[:page])
65
+ page.published_at = page.updated_at = page.created_at = Time.now
66
+ page.parent = Page.find($1) if request.referer =~ %r{/admin/pages/(\d+)/children/new}
67
+ end
68
+ page.pagination_parameters = pagination_parameters
69
+ process_with_exception(page)
70
+ end
71
+ end
72
+
73
+ def process_with_exception(page)
74
+ page.process(request, response)
75
+ @performed_render = true
76
+ raise PreviewStop
77
+ end
78
+
79
+ def count_deleted_pages
80
+ @count = model.children.count + 1
81
+ end
82
+
83
+ def initialize_meta_rows_and_buttons
84
+ @buttons_partials ||= []
85
+ @meta ||= []
86
+ @meta << {:field => "slug", :type => "text_field", :args => [{:class => 'textbox', :maxlength => 100}]}
87
+ @meta << {:field => "breadcrumb", :type => "text_field", :args => [{:class => 'textbox', :maxlength => 160}]}
88
+ end
89
+ end
@@ -0,0 +1,46 @@
1
+ class Admin::PreferencesController < ApplicationController
2
+ before_filter :load_user
3
+
4
+ def initialize
5
+ @controller_name = 'user'
6
+ @template_name = 'preferences'
7
+ end
8
+
9
+ def show
10
+ set_standard_body_style
11
+ render :edit
12
+ end
13
+
14
+ def edit
15
+ render
16
+ end
17
+
18
+ def update
19
+ if valid_params?
20
+ if @user.update_attributes(params[:user])
21
+ redirect_to admin_configuration_path
22
+ else
23
+ flash[:error] = t('preferences_controller.error_updating')
24
+ render :edit
25
+ end
26
+ else
27
+ announce_bad_data
28
+ render :edit
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def load_user
35
+ @user = current_user
36
+ end
37
+
38
+ def valid_params?
39
+ hash = (params[:user] || {}).symbolize_keys
40
+ (hash.keys - User.unprotected_attributes).size == 0
41
+ end
42
+
43
+ def announce_bad_data
44
+ flash[:error] = 'Bad form data.'
45
+ end
46
+ end
@@ -0,0 +1,7 @@
1
+ class Admin::ReferencesController < ApplicationController
2
+ def show
3
+ respond_to do |format|
4
+ format.any { render :action => params[:type], :content_type => "text/html", :layout => false }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,245 @@
1
+ require 'trusty_cms/resource_responses'
2
+ require 'will_paginate'
3
+ class Admin::ResourceController < ApplicationController
4
+ extend TrustyCms::ResourceResponses
5
+
6
+ helper_method :model, :current_object, :models, :current_objects, :model_symbol, :plural_model_symbol, :model_class, :model_name, :plural_model_name
7
+ before_filter :populate_format
8
+ before_filter :never_cache
9
+ before_filter :load_models, :only => :index
10
+ before_filter :load_model, :only => [:new, :create, :edit, :update, :remove, :destroy]
11
+ after_filter :clear_model_cache, :only => [:create, :update, :destroy]
12
+
13
+ cattr_reader :paginated
14
+ cattr_accessor :default_per_page, :will_paginate_options
15
+
16
+ responses do |r|
17
+ # Equivalent respond_to block for :plural responses:
18
+ # respond_to do |wants|
19
+ # wants.xml { render :xml => models }
20
+ # wants.json { render :json => models }
21
+ # wants.any
22
+ # end
23
+ r.plural.publish(:xml, :json) { render format_symbol => models }
24
+
25
+ r.singular.publish(:xml, :json) { render format_symbol => model }
26
+ r.singular.default { redirect_to edit_model_path if action_name == "show" }
27
+
28
+ r.not_found.publish(:xml, :json) { head :not_found }
29
+ r.not_found.default { announce_not_found; redirect_to :action => "index" }
30
+
31
+ r.invalid.publish(:xml, :json) { render format_symbol => model.errors, :status => :unprocessable_entity }
32
+ r.invalid.default { announce_validation_errors; render :action => template_name }
33
+
34
+ r.stale.publish(:xml, :json) { head :conflict }
35
+ r.stale.default { announce_update_conflict; render :action => template_name }
36
+
37
+ r.create.publish(:xml, :json) { render format_symbol => model, :status => :created, :location => url_for(:format => format_symbol, :id => model) }
38
+ r.create.default { redirect_to continue_url(params) }
39
+
40
+ r.update.publish(:xml, :json) { head :ok }
41
+ r.update.default { redirect_to continue_url(params) }
42
+
43
+ r.destroy.publish(:xml, :json) { head :deleted }
44
+ r.destroy.default { redirect_to continue_url(params) }
45
+ end
46
+
47
+ def index
48
+ response_for :plural
49
+ end
50
+
51
+ [:show, :new, :edit, :remove].each do |action|
52
+ class_eval %{
53
+ def #{action} # def show
54
+ response_for :singular # response_for :singular
55
+ end # end
56
+ }, __FILE__, __LINE__
57
+ end
58
+
59
+ [:create, :update].each do |action|
60
+ class_eval %{
61
+ def #{action} # def create
62
+ model.update_attributes!(params[model_symbol]) # model.update_attributes!(params[model_symbol])
63
+ response_for :#{action} # response_for :create
64
+ end # end
65
+ }, __FILE__, __LINE__
66
+ end
67
+
68
+ def destroy
69
+ model.destroy
70
+ response_for :destroy
71
+ end
72
+
73
+ def self.model_class(model_class = nil)
74
+ @model_class ||= (model_class || self.controller_name).to_s.singularize.camelize.constantize
75
+ end
76
+
77
+ # call paginate_models to declare that will_paginate should be used in the index view
78
+ # options specified here are accessible in the view by calling will_paginate_options
79
+ # eg.
80
+ #
81
+ # Class MyController < Admin::ResourceController
82
+ # paginate_models :per_page => 100
83
+
84
+ def self.paginate_models(options={})
85
+ @@paginated = true
86
+ @@will_paginate_options = options.slice(:class, :previous_label, :next_label, :inner_window, :outer_window, :separator, :container).merge(:param_name => :p)
87
+ @@default_per_page = options[:per_page]
88
+ end
89
+
90
+ # returns a hash of options that can be passed to will_paginate
91
+ # the @pagination_for@ helper method calls @will_paginate_options@ unless other options are supplied.
92
+ #
93
+ # pagination_for(@events)
94
+
95
+ def will_paginate_options
96
+ self.class.will_paginate_options || {}
97
+ end
98
+ helper_method :will_paginate_options
99
+
100
+ # a convenience method that returns true if paginate_models has been called on this controller class
101
+ # and can be used to make display decisions in controller and view
102
+ def paginated?
103
+ self.class.paginated == true && params[:pp] != 'all'
104
+ end
105
+ helper_method :paginated?
106
+
107
+ # return a hash of page and per_page that can be used to build a will_paginate collection
108
+ # the per_page figure can be set in several ways:
109
+ # request parameter > declared by paginate_models > default set in config entry @admin.pagination.per_page@ > overall default of 50
110
+ def pagination_parameters
111
+ pp = params[:pp] || TrustyCms.config['admin.pagination.per_page']
112
+ pp = (self.class.default_per_page || 50) if pp.blank?
113
+ {
114
+ :page => (params[:p] || 1).to_i,
115
+ :per_page => pp.to_i
116
+ }
117
+ end
118
+
119
+ protected
120
+
121
+ def rescue_action(exception)
122
+ case exception
123
+ when ActiveRecord::RecordInvalid
124
+ response_for :invalid
125
+ when ActiveRecord::StaleObjectError
126
+ response_for :stale
127
+ when ActiveRecord::RecordNotFound
128
+ response_for :not_found
129
+ else
130
+ super
131
+ end
132
+ end
133
+
134
+ def model_class
135
+ self.class.model_class
136
+ end
137
+
138
+ def model
139
+ instance_variable_get("@#{model_symbol}") || load_model
140
+ end
141
+ alias :current_object :model
142
+ def model=(object)
143
+ instance_variable_set("@#{model_symbol}", object)
144
+ end
145
+ def load_model
146
+ self.model = if params[:id]
147
+ model_class.find(params[:id])
148
+ else
149
+ model_class.new()
150
+ end
151
+ end
152
+
153
+ def models
154
+ instance_variable_get("@#{plural_model_symbol}") || load_models
155
+ end
156
+ alias :current_objects :models
157
+ def models=(objects)
158
+ instance_variable_set("@#{plural_model_symbol}", objects)
159
+ end
160
+ def load_models
161
+ self.models = paginated? ? model_class.paginate(pagination_parameters) : model_class.all
162
+ end
163
+
164
+ def model_name
165
+ model_class.name
166
+ end
167
+ def plural_model_name
168
+ model_name.pluralize
169
+ end
170
+ alias :models_name :plural_model_name
171
+
172
+ def model_symbol
173
+ model_name.underscore.intern
174
+ end
175
+ def plural_model_symbol
176
+ model_name.pluralize.underscore.intern
177
+ end
178
+ alias :models_symbol :plural_model_symbol
179
+
180
+ def humanized_model_name
181
+ t(model_name.underscore.downcase)
182
+ end
183
+
184
+ def continue_url(options)
185
+ options[:redirect_to] || (params[:continue] ? {:action => 'edit', :id => model.id} : index_page_for_model)
186
+ end
187
+
188
+ def index_page_for_model
189
+ parts = {:action => "index"}
190
+ if paginated? && model && i = model_class.all.index(model)
191
+ p = (i / pagination_parameters[:per_page].to_i) + 1
192
+ parts[:p] = p if p && p > 1
193
+ end
194
+ parts
195
+ end
196
+
197
+ def edit_model_path
198
+ method = "edit_admin_#{model_name.underscore}_path"
199
+ send method.to_sym, params[:id]
200
+ end
201
+
202
+ def announce_validation_errors
203
+ flash.now[:error] = t("resource_controller.validation_errors")
204
+ end
205
+
206
+ def announce_removed
207
+ ActiveSupport::Deprecation.warn("announce_removed is no longer encouraged in TrustyCms 0.9.x.", caller)
208
+ flash[:notice] = t("resource_controller.removed", :humanized_model_name => humanized_model_name)
209
+ end
210
+
211
+ def announce_not_found
212
+ flash[:notice] = t("resource_controller.not_found", :humanized_model_name => humanized_model_name)
213
+ end
214
+
215
+ def announce_update_conflict
216
+ flash.now[:error] = t("resource_controller.update_conflict", :humanized_model_name => humanized_model_name)
217
+ end
218
+
219
+ def clear_model_cache
220
+ TrustyCms::Cache.clear if defined?(TrustyCms::Cache)
221
+ end
222
+
223
+ def format_symbol
224
+ format.to_sym
225
+ end
226
+
227
+ def format
228
+ params[:format] || 'html'
229
+ end
230
+
231
+
232
+ # I would like to set this to expires_in(1.minute, :private => true) to allow for more fluid navigation
233
+ # but the annoyance for concurrent authors would be too great.
234
+ def never_cache
235
+ expires_now
236
+ end
237
+
238
+ # Assist with user agents that cause improper content-negotiation
239
+ # warn "Remove default HTML format, Accept header no longer used. (#{__FILE__}: #{__LINE__})" if Rails.version !~ /^2\.1/
240
+ def populate_format
241
+ params[:format] ||= 'html' unless request.xhr?
242
+ end
243
+
244
+
245
+ end
@@ -0,0 +1,40 @@
1
+ class Admin::UsersController < Admin::ResourceController
2
+ paginate_models
3
+ only_allow_access_to :index, :show, :new, :create, :edit, :update, :remove, :destroy,
4
+ :when => :admin,
5
+ :denied_url => { :controller => 'pages', :action => 'index' },
6
+ :denied_message => 'You must have administrative privileges to perform this action.'
7
+
8
+ before_filter :ensure_deletable, :only => [:remove, :destroy]
9
+
10
+ def show
11
+ redirect_to edit_admin_user_path(params[:id])
12
+ end
13
+
14
+ def update
15
+ user_params = params[model_symbol]
16
+ if user_params && user_params['admin'] == false && model == current_user
17
+ user_params.delete('admin')
18
+ annouce_cannot_remove_self_from_admin_role
19
+ end
20
+ model.update_attributes!(user_params)
21
+ response_for :update
22
+ end
23
+
24
+ def ensure_deletable
25
+ if current_user.id.to_s == params[:id].to_s
26
+ announce_cannot_delete_self
27
+ redirect_to admin_users_url
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def announce_cannot_delete_self
34
+ flash[:error] = t('users_controller.cannot_delete_self')
35
+ end
36
+
37
+ def annouce_cannot_remove_self_from_admin_role
38
+ flash[:error] = 'You cannot remove yourself from the admin role.'
39
+ end
40
+ end
@@ -0,0 +1,48 @@
1
+ class Admin::WelcomeController < ApplicationController
2
+ no_login_required
3
+ before_filter :never_cache
4
+ skip_before_filter :verify_authenticity_token
5
+
6
+ def index
7
+ redirect_to admin_pages_url
8
+ end
9
+
10
+ def login
11
+ if request.post?
12
+ @username_or_email = params[:username_or_email]
13
+ password = params[:password]
14
+ announce_invalid_user unless self.current_user = User.authenticate(@username_or_email, password)
15
+ end
16
+ if current_user
17
+ if params[:remember_me]
18
+ current_user.remember_me
19
+ set_session_cookie
20
+ end
21
+ redirect_to (session[:return_to] || welcome_url)
22
+ session[:return_to] = nil
23
+ end
24
+ end
25
+
26
+ def logout
27
+ request.cookies[:session_token] = { :expires => 1.day.ago.utc }
28
+ self.current_user.forget_me if self.current_user
29
+ self.current_user = nil
30
+ announce_logged_out
31
+ redirect_to login_url
32
+ end
33
+
34
+ private
35
+
36
+ def never_cache
37
+ expires_now
38
+ end
39
+
40
+ def announce_logged_out
41
+ flash[:notice] = t('welcome_controller.logged_out')
42
+ end
43
+
44
+ def announce_invalid_user
45
+ flash.now[:error] = t('welcome_controller.invalid_user')
46
+ end
47
+
48
+ end
@@ -0,0 +1,114 @@
1
+ #require_dependency 'trusty_cms'
2
+ require 'login_system'
3
+
4
+ class ApplicationController < ActionController::Base
5
+ include LoginSystem
6
+ # TODO: Add an ActionView::PathSet.new([paths]) for all extension view paths
7
+ prepend_view_path ("#{TRUSTY_CMS_ROOT}/app/views")
8
+
9
+ protect_from_forgery
10
+
11
+ before_filter :set_current_user
12
+ before_filter :set_timezone
13
+ before_filter :set_user_locale
14
+ before_filter :set_javascripts_and_stylesheets
15
+ before_filter :force_utf8_params if RUBY_VERSION =~ /1\.9/
16
+ before_filter :set_standard_body_style, :only => [:new, :edit, :update, :create]
17
+
18
+ attr_accessor :trusty_config, :cache
19
+ attr_reader :pagination_parameters
20
+ helper_method :pagination_parameters
21
+
22
+ def initialize
23
+ super
24
+ @trusty_config = TrustyCms::Config
25
+ end
26
+
27
+ # helpers to include additional assets from actions or views
28
+ helper_method :include_stylesheet, :include_javascript
29
+
30
+ def include_stylesheet(sheet)
31
+ @stylesheets << sheet
32
+ end
33
+
34
+ def include_javascript(script)
35
+ @javascripts << script
36
+ end
37
+
38
+ def template_name
39
+ case self.action_name
40
+ when 'index'
41
+ 'index'
42
+ when 'new','create'
43
+ 'new'
44
+ when 'show'
45
+ 'show'
46
+ when 'edit', 'update'
47
+ 'edit'
48
+ when 'remove', 'destroy'
49
+ 'remove'
50
+ else
51
+ self.action_name
52
+ end
53
+ end
54
+
55
+ def rescue_action_in_public(exception)
56
+ case exception
57
+ when ActiveRecord::RecordNotFound, ActionController::UnknownController, ActionController::UnknownAction, ActionController::RoutingError
58
+ render :template => "site/not_found", :status => 404
59
+ else
60
+ super
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def set_current_user
67
+ UserActionObserver.instance.current_user = current_user
68
+ end
69
+
70
+ def set_user_locale
71
+ I18n.locale = current_user && !current_user.locale.blank? ? current_user.locale : TrustyCms::Config['default_locale']
72
+ end
73
+
74
+ def set_timezone
75
+ Time.zone = TrustyCms::Config['local.timezone'] != nil && TrustyCms::Config['local.timezone'].empty? ? Time.zone_default : TrustyCms::Config['local.timezone']
76
+ end
77
+
78
+ def set_javascripts_and_stylesheets
79
+ @stylesheets ||= []
80
+ @stylesheets.concat %w(admin/main)
81
+ @javascripts ||= []
82
+ end
83
+
84
+ def set_standard_body_style
85
+ @body_classes ||= []
86
+ @body_classes.concat(%w(reversed))
87
+ end
88
+
89
+ # When using TrustyCms with Ruby 1.9, the strings that come in from forms are ASCII-8BIT encoded.
90
+ # That causes problems, especially when using special chars and with certain DBs, like DB2
91
+ # That's why we force the encoding of the params to UTF-8
92
+ # That's what's happening in Rails 3, too: https://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a
93
+ #
94
+ # See http://stackoverflow.com/questions/8268778/rails-2-3-9-encoding-of-query-parameters
95
+ # See https://rails.lighthouseapp.com/projects/8994/tickets/4807
96
+ # See http://jasoncodes.com/posts/ruby19-rails2-encodings (thanks for the following code, Jason!)
97
+ def force_utf8_params
98
+ traverse = lambda do |object, block|
99
+ if object.kind_of?(Hash)
100
+ object.each_value { |o| traverse.call(o, block) }
101
+ elsif object.kind_of?(Array)
102
+ object.each { |o| traverse.call(o, block) }
103
+ else
104
+ block.call(object)
105
+ end
106
+ object
107
+ end
108
+ force_encoding = lambda do |o|
109
+ o.force_encoding(Encoding::UTF_8) if o.respond_to?(:force_encoding)
110
+ end
111
+ traverse.call(params, force_encoding)
112
+ end
113
+
114
+ end
@@ -0,0 +1,97 @@
1
+ require 'trusty_cms/pagination/controller'
2
+ class SiteController < ApplicationController
3
+ include TrustyCms::Pagination::Controller
4
+
5
+ skip_filter :verify_authenticity_token
6
+ no_login_required
7
+
8
+ def self.cache_timeout=(val)
9
+ TrustyCms::PageResponseCacheDirector.cache_timeout=(val)
10
+ end
11
+ def self.cache_timeout
12
+ TrustyCms::PageResponseCacheDirector.cache_timeout
13
+ end
14
+
15
+ def show_page
16
+ url = params[:url]
17
+ if Array === url
18
+ url = url.join('/')
19
+ else
20
+ url = url.to_s
21
+ end
22
+ if @page = find_page(url)
23
+ batch_page_status_refresh if (url == "/" || url == "")
24
+ process_page(@page)
25
+ set_cache_control
26
+ @performed_render ||= true
27
+ else
28
+ render :template => 'site/not_found', :status => 404
29
+ end
30
+ rescue Page::MissingRootPageError
31
+ redirect_to welcome_url
32
+ end
33
+
34
+ def cacheable_request?
35
+ (request.head? || request.get?) && live?
36
+ end
37
+ hide_action :cacheable_request?
38
+
39
+ def set_expiry(time, options={})
40
+ expires_in time, options
41
+ end
42
+ hide_action :set_expiry
43
+
44
+ def set_etag(val)
45
+ headers['ETag'] = val
46
+ end
47
+ hide_action :set_expiry
48
+
49
+ private
50
+ def batch_page_status_refresh
51
+ @changed_pages = []
52
+ @pages = Page.where({:status_id => Status[:scheduled].id})
53
+ @pages.each do |page|
54
+ if page.published_at <= Time.now
55
+ page.status_id = Status[:published].id
56
+ page.save
57
+ @changed_pages << page.id
58
+ end
59
+ end
60
+
61
+ expires_in nil, :private=>true, "no-cache" => true if @changed_pages.length > 0
62
+ end
63
+
64
+ def set_cache_control
65
+ response_cache_director(@page).set_cache_control
66
+ end
67
+
68
+ def response_cache_director(page)
69
+ klass_name = "TrustyCms::#{page.class}ResponseCacheDirector"
70
+ begin
71
+ klass = klass_name.constantize
72
+ rescue NameError, LoadError
73
+ director_klass = "TrustyCms::PageResponseCacheDirector"
74
+ eval(%Q{class #{klass_name} < #{director_klass}; end}, TOPLEVEL_BINDING)
75
+ klass = director_klass.constantize
76
+ end
77
+ klass.new(page, self)
78
+ end
79
+
80
+ def find_page(url)
81
+ found = Page.find_by_path(url, live?)
82
+ found if found and (found.published? or dev?)
83
+ end
84
+
85
+ def process_page(page)
86
+ page.pagination_parameters = pagination_parameters
87
+ page.process(request, response)
88
+ end
89
+
90
+ def dev?
91
+ request.host == @trusty_config['dev.host'] || request.host =~ /^dev\./
92
+ end
93
+
94
+ def live?
95
+ not dev?
96
+ end
97
+ end