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,80 @@
1
+ module Admin::ConfigurationHelper
2
+ # Defines helper methods for use in the admin interface when displaying or editing configuration.
3
+
4
+ # Renders the setting as label and value:
5
+ #
6
+ # show_config("admin.title")
7
+ # => <label for="admin_title">Admin title<label><span id="admin_title">TrustyCms CMS</span>
8
+ #
9
+ def show_config(key, options={})
10
+ setting = setting_for(key)
11
+ setting.valid?
12
+ domkey = key.gsub(/\W/, '_')
13
+ html = ""
14
+ html << content_tag(:label, t("@trusty_config.#{key}").titlecase, :for => domkey)
15
+ if setting.boolean?
16
+ value = setting.checked? ? t('yes') : t('no')
17
+ html << content_tag(:span, value, :id => domkey, :class => "#{value} #{options[:class]}")
18
+ else
19
+ value = setting.selected_value || setting.value
20
+ html << content_tag(:span, value, :id => domkey, :class => options[:class])
21
+ end
22
+ html << content_tag(:span, " #{t("units.#{setting.units}")}", :class => 'units') if setting.units
23
+ html << content_tag(:span, " #{t('warning')}: #{[setting.errors.on(:value)].flatten.first}", :class => 'warning') if setting.errors.on(:value)
24
+ html
25
+ end
26
+
27
+ # Renders the setting as label and appropriate input field:
28
+ #
29
+ # edit_setting("admin.title")
30
+ # => <label for="admin_title">Admin title<label><input type="text" name="config['admin.title']" id="admin_title" value="TrustyCms CMS" />
31
+ #
32
+ # edit_config("defaults.page.status")
33
+ # =>
34
+ # <label for="defaults_page_status">Default page status<label>
35
+ # <select type="text" name="config['defaults.page.status']" id="defaults_page_status">
36
+ # <option value="Draft">Draft</option>
37
+ # ...
38
+ # </select>
39
+ #
40
+ # edit_setting("user.allow_password_reset?")
41
+ # => <label for="user_allow_password_reset_">Admin title<label><input type="checkbox" name="config['user.allow_password_reset?']" id="user_allow_password_reset_" value="1" checked="checked" />
42
+ #
43
+ def edit_config(key, options={})
44
+ setting = setting_for(key)
45
+ domkey = key.gsub(/\W/, '_')
46
+ name = "@trusty_config[#{key}]"
47
+ title = t("@trusty_config.#{key}").titlecase
48
+ title << content_tag(:span, " (#{t("units.#{setting.units}")})", :class => 'units') if setting.units
49
+ value = params[key.to_sym].nil? ? setting.value : params[key.to_sym]
50
+ html = ""
51
+ if setting.boolean?
52
+ html << hidden_field_tag(name, 0)
53
+ html << check_box_tag(name, 1, value, :class => 'setting', :id => domkey)
54
+ html << content_tag(:label, title, :class => 'checkbox', :for => domkey)
55
+ elsif setting.selector?
56
+ html << content_tag(:label, title, :for => domkey)
57
+ html << select_tag(name, options_for_select(setting.definition.selection, value), :class => 'setting', :id => domkey)
58
+ else
59
+ html << content_tag(:label, title, :for => domkey)
60
+ html << text_field_tag(name, value, :class => 'textbox', :id => domkey)
61
+ end
62
+ if setting.errors.on(:value)
63
+ html << content_tag(:span, [setting.errors.on(:value)].flatten.first, :class => 'error')
64
+ html = content_tag(:span, html, :class => "error-with-field")
65
+ end
66
+ html
67
+ end
68
+
69
+ def setting_for(key)
70
+ @config ||= {} # normally initialized in Admin::ConfigurationController
71
+ @config[key] ||= TrustyCms.config.find_or_create_by_key(key)
72
+ end
73
+
74
+ def definition_for(key)
75
+ if setting = setting_for(key)
76
+ setting.definition
77
+ end
78
+ end
79
+
80
+ end
@@ -0,0 +1,2 @@
1
+ module Admin::ExportHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module Admin::ExtensionsHelper
2
+ end
@@ -0,0 +1,21 @@
1
+ module Admin::LayoutsHelper
2
+ def layout_edit_javascripts
3
+ <<-CODE
4
+ var tagReferenceWindows = {};
5
+ function loadTagReference() {
6
+ var pageType = 'Page';
7
+ if (!tagReferenceWindows[pageType])
8
+ tagReferenceWindows[pageType] = new Popup.AjaxWindow("#{admin_reference_path('tags')}?class_name=" + encodeURIComponent(pageType), {reload: false});
9
+ var window = tagReferenceWindows[pageType];
10
+ if('Page' != pageType) {
11
+ $('tag_reference_link').highlight();
12
+ window.show();
13
+ } else {
14
+ window.toggle();
15
+ }
16
+ lastPageType = pageType;
17
+ return false;
18
+ }
19
+ CODE
20
+ end
21
+ end
@@ -0,0 +1,96 @@
1
+ module Admin::NodeHelper
2
+
3
+ def render_node(page, locals = {})
4
+ @current_node = page
5
+ page.extend MenuRenderer
6
+ page.view = self
7
+ if page.additional_menu_features?
8
+ page.extend(*page.menu_renderer_modules)
9
+ end
10
+ locals.reverse_merge!(:level => 0, :simple => false).merge!(:page => page)
11
+ render :partial => 'admin/pages/node', :locals => locals
12
+ end
13
+
14
+ def homepage
15
+ @homepage ||= Page.find_by_parent_id(nil)
16
+ end
17
+
18
+ def show_all?
19
+ @controller.action_name == 'remove'
20
+ end
21
+
22
+ def expanded_rows
23
+ unless @expanded_rows
24
+ @expanded_rows = case
25
+ when rows = cookies[:expanded_rows]
26
+ rows.split(',').map { |x| Integer(x) rescue nil }.compact
27
+ else
28
+ []
29
+ end
30
+
31
+ if homepage and !@expanded_rows.include?(homepage.id)
32
+ @expanded_rows << homepage.id
33
+ end
34
+ end
35
+ @expanded_rows
36
+ end
37
+
38
+ def expanded
39
+ show_all? || expanded_rows.include?(@current_node.id)
40
+ end
41
+
42
+ def padding_left(level)
43
+ (level * 23) + 9
44
+ end
45
+
46
+ def children_class
47
+ unless @current_node.children.empty?
48
+ if expanded
49
+ " children_visible"
50
+ else
51
+ " children_hidden"
52
+ end
53
+ else
54
+ " no_children"
55
+ end
56
+ end
57
+
58
+ def virtual_class
59
+ @current_node.virtual? ? " virtual": ""
60
+ end
61
+
62
+ def expander(level)
63
+ unless @current_node.children.empty? or level == 0
64
+ image((expanded ? "collapse" : "expand"),
65
+ :class => "expander", :alt => 'toggle children',
66
+ :title => '')
67
+ else
68
+ ""
69
+ end
70
+ end
71
+
72
+ def icon
73
+ icon_name = @current_node.virtual? ? 'virtual_page' : 'page'
74
+ image(icon_name, :class => "icon", :alt => '', :title => '')
75
+ end
76
+
77
+ def node_title
78
+ %{<span class="title">#{ h(@current_node.title) }</span>}
79
+ end
80
+
81
+ def page_type
82
+ display_name = @current_node.class.display_name
83
+ if display_name == 'Page'
84
+ ""
85
+ else
86
+ %{<span class="info">(#{ h(display_name) })</span>}
87
+ end
88
+ end
89
+
90
+ def spinner
91
+ image('spinner.gif',
92
+ :class => 'busy', :id => "busy_#{@current_node.id}",
93
+ :alt => "", :title => "",
94
+ :style => 'display: none;')
95
+ end
96
+ end
@@ -0,0 +1,117 @@
1
+ module Admin::PagesHelper
2
+ include Admin::NodeHelper
3
+ include Admin::ReferencesHelper
4
+
5
+ def class_of_page
6
+ @page.class
7
+ end
8
+
9
+ def filter
10
+ @page.parts.empty? ? nil : @page.parts.first.filter
11
+ end
12
+
13
+ def meta_errors?
14
+ !!(@page.errors[:slug] or @page.errors[:breadcrumb])
15
+ end
16
+
17
+ def default_filter_name
18
+ @page.parts.empty? ? "" : @page.parts[0].filter_id
19
+ end
20
+
21
+ def status_to_display
22
+ @page.status_id = 100 if @page.status_id == 90
23
+ @display_status = Status.selectable.map{ |s| [I18n.translate(s.name.downcase), s.id] }
24
+ end
25
+
26
+ def clean_page_description(page)
27
+ page.description.to_s.strip.gsub(/\t/,'').gsub(/\s+/,' ')
28
+ end
29
+
30
+ def page_edit_javascripts
31
+ <<-CODE
32
+ function addPart(form) {
33
+ if (validPartName()) {
34
+ new Ajax.Updater(
35
+ $('tab_control').down('.pages'),
36
+ '#{admin_page_parts_path}',
37
+ {
38
+ asynchronous: true,
39
+ evalScripts: true,
40
+ insertion: 'bottom',
41
+ onComplete: function(request){ partAdded() },
42
+ onLoading: function(request){ partLoading() },
43
+ parameters: Form.serialize(form)
44
+ }
45
+ );
46
+ }
47
+ }
48
+ function removePart() {
49
+ if(confirm('Remove the current part?')) {
50
+ TabControls['tab_control'].removeSelected();
51
+ }
52
+ }
53
+ function partAdded() {
54
+ var tabControl = TabControls['tab_control'];
55
+ $('add_part_busy').hide();
56
+ $('add_part_button').disabled = false;
57
+ $('add_part_popup').closePopup();
58
+ $('part_name_field').value = '';
59
+ tabControl.updateTabs();
60
+ tabControl.select(tabControl.tabs.last());
61
+ }
62
+ function partLoading() {
63
+ $('add_part_button').disabled = true;
64
+ $('add_part_busy').appear();
65
+ }
66
+ function validPartName() {
67
+ var partNameField = $('part_name_field');
68
+ var name = partNameField.value.downcase();
69
+ if (name.blank()) {
70
+ alert('Part name cannot be empty.');
71
+ return false;
72
+ }
73
+ if (TabControls['tab_control'].findTabByCaption(name)) {
74
+ alert('Part name must be unique.');
75
+ return false;
76
+ }
77
+ return true;
78
+ }
79
+
80
+ var lastPageType = '#{@page.class.name}';
81
+ var tagReferenceWindows = {};
82
+ function loadTagReference(part) {
83
+ var pageType = $F('page_class_name');
84
+ if (!tagReferenceWindows[pageType])
85
+ tagReferenceWindows[pageType] = new Popup.AjaxWindow("#{admin_reference_path('tags')}?class_name=" + encodeURIComponent(pageType), {reload: false});
86
+ var window = tagReferenceWindows[pageType];
87
+ if(lastPageType != pageType) {
88
+ $('tag_reference_link_' + part).highlight();
89
+ window.show();
90
+ } else {
91
+ window.toggle();
92
+ }
93
+ lastPageType = pageType;
94
+ return false;
95
+ }
96
+
97
+ var lastFilter = '#{default_filter_name}';
98
+ var filterWindows = {};
99
+ function loadFilterReference(part) {
100
+ var filter = $F("part_" + part + "_filter_id");
101
+ if (filter != "") {
102
+ if (!filterWindows[filter]) filterWindows[filter] = new Popup.AjaxWindow("#{admin_reference_path('filters')}?filter_name="+encodeURIComponent(filter), {reload: false});
103
+ var window = filterWindows[filter];
104
+ if(lastFilter != filter) {
105
+ window.show();
106
+ } else {
107
+ window.toggle();
108
+ }
109
+ lastFilter = filter;
110
+ } else {
111
+ alert('No documentation for filter.');
112
+ }
113
+ return false;
114
+ }
115
+ CODE
116
+ end
117
+ end
@@ -0,0 +1,3 @@
1
+ module Admin::PreferencesHelper
2
+
3
+ end
@@ -0,0 +1,46 @@
1
+ require "RedCloth"
2
+
3
+ module Admin::ReferencesHelper
4
+ def tag_reference
5
+ String.new.tap do |output|
6
+ class_of_page.tag_descriptions.sort.each do |tag_name, description|
7
+ value = t("desc.#{tag_name.gsub(':','-')}").match('desc') ? description : t("desc.#{tag_name.gsub(':','-')}")
8
+ output << render(:partial => "admin/references/tag_reference.haml",
9
+ :locals => {:tag_name => tag_name,
10
+ :description => RedCloth.new(TrustyCms::Taggable::Util.strip_leading_whitespace(value)).to_html
11
+ })
12
+ end
13
+ end
14
+ end
15
+
16
+ def filter_reference
17
+ unless filter.blank?
18
+ if filter.description.blank?
19
+ "There is no documentation on this filter."
20
+ else
21
+ filter.description
22
+ end
23
+ else
24
+ "There is no filter on the current page part."
25
+ end
26
+ end
27
+
28
+ def _display_name
29
+ case params[:type]
30
+ when 'filters'
31
+ filter ? filter.filter_name : t('select.none')
32
+ when 'tags'
33
+ class_of_page.display_name
34
+ end
35
+ end
36
+
37
+ def filter
38
+ @filter ||= begin
39
+ TextFilter.find_descendant(params[:filter_name])
40
+ end
41
+ end
42
+
43
+ def class_of_page
44
+ @page_class ||= (params[:class_name].blank? ? 'Page' : params[:class_name]).constantize
45
+ end
46
+ end
@@ -0,0 +1,28 @@
1
+ module Admin::RegionsHelper
2
+ def render_region(region, options={}, &block)
3
+ lazy_initialize_region_set
4
+ default_partials = TrustyCms::AdminUI::RegionPartials.new(self)
5
+ if block_given?
6
+ block.call(default_partials)
7
+ (options[:locals] ||= {}).merge!(:defaults => default_partials)
8
+ end
9
+ output = @region_set[region].compact.map do |partial|
10
+ begin
11
+ render options.merge(:partial => partial)
12
+ rescue ::ActionView::MissingTemplate # couldn't find template
13
+ default_partials[partial]
14
+ rescue ::ActionView::TemplateError => e # error in template
15
+ raise e
16
+ end
17
+ end.join
18
+ block_given? ? concat(output) : output
19
+ end
20
+
21
+ def lazy_initialize_region_set
22
+ unless @region_set
23
+ @controller_name ||= @controller.controller_name
24
+ @template_name ||= @controller.template_name
25
+ @region_set = admin.send(@controller_name).send(@template_name)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,2 @@
1
+ module Admin::ResourceHelper
2
+ end
@@ -0,0 +1,8 @@
1
+ module Admin::UsersHelper
2
+ def roles(user)
3
+ roles = []
4
+ roles << I18n.t('admin') if user.admin?
5
+ roles << I18n.t('designer') if user.designer?
6
+ roles.join(', ')
7
+ end
8
+ end
@@ -0,0 +1,2 @@
1
+ module Admin::WelcomeHelper
2
+ end
@@ -0,0 +1,241 @@
1
+ module ApplicationHelper
2
+ include Admin::RegionsHelper
3
+
4
+ #def config
5
+ # TrustyCms::Config
6
+ #end
7
+
8
+ def default_page_title
9
+ title + ' - ' + subtitle
10
+ end
11
+
12
+ def title
13
+ @trusty_config['admin.title'] || 'TrustyCms CMS'
14
+ end
15
+
16
+ def subtitle
17
+ @trusty_config['admin.subtitle'] || 'Publishing for Small Teams'
18
+ end
19
+
20
+ def logged_in?
21
+ !current_user.nil?
22
+ end
23
+
24
+ def onsubmit_status(model)
25
+ model.new_record? ? t('creating_status', :model => t(model.class.name.downcase)) : "#{I18n.t('saving_changes')}&#8230;"
26
+ end
27
+
28
+ def save_model_button(model, options = {})
29
+ model_name = model.class.name.underscore
30
+ human_model_name = model_name.humanize.titlecase
31
+ options[:label] ||= model.new_record? ?
32
+ t('buttons.create', :name => t(model_name, :default => human_model_name), :default => 'Create ' + human_model_name) :
33
+ t('buttons.save_changes', :default => 'Save Changes')
34
+ options[:class] ||= "button"
35
+ options[:accesskey] ||= 'S'
36
+ submit_tag options.delete(:label), options
37
+ end
38
+
39
+ def save_model_and_continue_editing_button(model)
40
+ submit_tag t('buttons.save_and_continue'), :name => 'continue', :class => 'button', :accesskey => "s"
41
+ end
42
+
43
+ def current_item?(item)
44
+ if item.tab && item.tab.many? {|i| current_url?(i.relative_url) }
45
+ # Accept only stricter URL matches if more than one matches
46
+ current_page?(item.url)
47
+ else
48
+ current_url?(item.relative_url)
49
+ end
50
+ end
51
+
52
+ def current_tab?(tab)
53
+ @current_tab ||= tab if tab.any? {|item| current_url?(item.relative_url) }
54
+ @current_tab == tab
55
+ end
56
+
57
+ def current_url?(options)
58
+ url = case options
59
+ when Hash
60
+ url_for options
61
+ else
62
+ options.to_s
63
+ end
64
+ request.request_uri =~ Regexp.new('^' + Regexp.quote(clean(url)))
65
+ end
66
+
67
+ def clean(url)
68
+ uri = URI.parse(url)
69
+ uri.path.gsub(%r{/+}, '/').gsub(%r{/$}, '')
70
+ end
71
+
72
+ def nav_link_to(name, options)
73
+ if current_url?(options)
74
+ %{<strong>#{ link_to translate_with_default(name), options }</strong>}
75
+ else
76
+ link_to translate_with_default(name), options
77
+ end
78
+ end
79
+
80
+ def admin?
81
+ current_user and current_user.admin?
82
+ end
83
+
84
+ def designer?
85
+ current_user and (current_user.designer? or current_user.admin?)
86
+ end
87
+
88
+ def focus(field_name)
89
+ javascript_tag "Field.activate('#{field_name}');"
90
+ end
91
+
92
+ def updated_stamp(model)
93
+ unless model.new_record?
94
+ updated_by = (model.updated_by || model.created_by)
95
+ name = updated_by ? updated_by.name : nil
96
+ time = (model.updated_at || model.created_at)
97
+ if name or time
98
+ html = %{<p class="updated_line">#{t('timestamp.last_updated')} }
99
+ html << %{#{t('timestamp.by')} <strong>#{name}</strong> } if name
100
+ html << %{#{t('timestamp.at')} #{timestamp(time)}} if time
101
+ html << %{</p>}
102
+ html
103
+ end
104
+ end
105
+ end
106
+
107
+ def timestamp(time)
108
+ # time.strftime("%I:%M %p on %B %e, %Y").sub("AM", 'am').sub("PM", 'pm')
109
+ I18n.localize(time, :format => :timestamp)
110
+ end
111
+
112
+ def meta_visible(symbol)
113
+ v = case symbol
114
+ when :meta_more
115
+ not meta_errors?
116
+ when :meta, :meta_less
117
+ meta_errors?
118
+ end
119
+ v ? {} : {:style => "display: none"}
120
+ end
121
+
122
+ def meta_errors?
123
+ false
124
+ end
125
+
126
+ def meta_label
127
+ meta_errors? ? 'Less' : 'More'
128
+ end
129
+
130
+ def toggle_javascript_for(id)
131
+ "Element.toggle('#{id}'); Element.toggle('more-#{id}'); Element.toggle('less-#{id}'); return false;"
132
+ end
133
+
134
+ def image(name, options = {})
135
+ image_tag(append_image_extension("admin/#{name}"), options)
136
+ end
137
+
138
+ def image_submit(name, options = {})
139
+ image_submit_tag(append_image_extension("admin/#{name}"), options)
140
+ end
141
+
142
+ def admin
143
+ TrustyCms::AdminUI.instance
144
+ end
145
+
146
+ def filter_options_for_select(selected=nil)
147
+ options_for_select([[t('select.none'), '']] + TextFilter.descendants_names, selected)
148
+ end
149
+
150
+ def body_classes
151
+ @body_classes ||= []
152
+ end
153
+
154
+ def nav_tabs
155
+ admin.nav
156
+ end
157
+
158
+ def translate_with_default(name)
159
+ t(name.underscore.downcase, :default => name)
160
+ end
161
+
162
+ def available_locales_select
163
+ [[t('select.default'),'']] + TrustyCms::AvailableLocales.locales
164
+ end
165
+
166
+ def stylesheet_and_javascript_overrides
167
+ overrides = ''
168
+ if File.exist?("#{Rails.root}/public/stylesheets/admin/overrides.css") || File.exist?("#{Rails.root}/public/stylesheets/sass/admin/overrides.sass")
169
+ overrides << stylesheet_link_tag('admin/overrides')
170
+ end
171
+ if File.exist?("#{Rails.root}/public/javascripts/admin/overrides.js")
172
+ overrides << javascript_include_tag('admin/overrides')
173
+ end
174
+ overrides
175
+ end
176
+
177
+ # Returns a Gravatar URL associated with the email parameter.
178
+ # See: http://douglasfshearer.com/blog/gravatar-for-ruby-and-ruby-on-rails
179
+ def gravatar_url(email, options={})
180
+ # Default to highest rating. Rating can be one of G, PG, R X.
181
+ options[:rating] ||= "G"
182
+
183
+ # Default size of the image.
184
+ options[:size] ||= "32px"
185
+
186
+ # Default image url to be used when no gravatar is found
187
+ # or when an image exceeds the rating parameter.
188
+ local_avatar_url = "/images/admin/avatar_#{([options[:size].to_i] * 2).join('x')}.png"
189
+ default_avatar_url = "#{request.protocol}#{request.host_with_port}#{ActionController::Base.relative_url_root}#{local_avatar_url}"
190
+ options[:default] ||= default_avatar_url
191
+
192
+ unless email.blank?
193
+ # Build the Gravatar url.
194
+ url = '//gravatar.com/avatar/'
195
+ url << "#{Digest::MD5.new.update(email)}?"
196
+ url << "rating=#{options[:rating]}" if options[:rating]
197
+ url << "&size=#{options[:size]}" if options[:size]
198
+ url << "&default=#{options[:default]}" if options[:default]
199
+ # Test the Gravatar url
200
+ require 'open-uri'
201
+ begin; open "http:#{url}", :proxy => true
202
+ rescue; local_avatar_url
203
+ else; url
204
+ end
205
+ else
206
+ local_avatar_url
207
+ end
208
+ end
209
+
210
+ # returns the usual set of pagination links.
211
+ # options are passed through to will_paginate
212
+ # and a 'show all' depagination link is added if relevant.
213
+ def pagination_for(list, options={})
214
+ if list.respond_to? :total_pages
215
+ options = {
216
+ :max_per_page => @trusty_config['pagination.max_per_page'] || 500,
217
+ :depaginate => true
218
+ }.merge(options.symbolize_keys)
219
+ depaginate = options.delete(:depaginate) # supply :depaginate => false to omit the 'show all' link
220
+ depagination_limit = options.delete(:max_per_page) # supply :max_per_page => false to include the 'show all' link no matter how large the collection
221
+ html = will_paginate(list, will_paginate_options.merge(options))
222
+ if depaginate && list.total_pages > 1 && (!depagination_limit.blank? || list.total_entries <= depagination_limit.to_i)
223
+ html << content_tag(:div, link_to(t('show_all'), :pp => 'all'), :class => 'depaginate')
224
+ elsif depaginate && list.total_entries > depagination_limit.to_i
225
+ html = content_tag(:div, link_to("paginate", :p => 1), :class => 'pagination')
226
+ end
227
+ html
228
+ end
229
+ end
230
+
231
+ private
232
+
233
+ def append_image_extension(name)
234
+ unless name =~ /\.(.*?)$/
235
+ name + '.png'
236
+ else
237
+ name
238
+ end
239
+ end
240
+
241
+ end
@@ -0,0 +1,2 @@
1
+ module SiteHelper
2
+ end