zena 1.2.7 → 1.2.8

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 (407) hide show
  1. data/History.txt +80 -25
  2. data/Rakefile +2 -2
  3. data/app/controllers/columns_controller.rb +2 -2
  4. data/app/controllers/nodes_controller.rb +22 -29
  5. data/app/controllers/user_sessions_controller.rb +35 -10
  6. data/app/controllers/users_controller.rb +2 -2
  7. data/app/controllers/versions_controller.rb +2 -2
  8. data/app/models/group.rb +15 -1
  9. data/app/models/node.rb +109 -8
  10. data/app/models/role.rb +4 -0
  11. data/app/models/site.rb +64 -58
  12. data/app/models/template.rb +1 -1
  13. data/app/models/user.rb +135 -29
  14. data/app/models/user_session.rb +0 -1
  15. data/app/models/virtual_class.rb +11 -6
  16. data/app/views/columns/_form.html.erb +3 -1
  17. data/app/views/columns/_li.html.erb +1 -1
  18. data/app/views/columns/create.rjs +1 -1
  19. data/app/views/groups/_form.rhtml +16 -13
  20. data/app/views/relations/_form.erb +18 -6
  21. data/app/views/sites/_form.erb +12 -6
  22. data/app/views/users/_form.rhtml +23 -8
  23. data/app/views/users/_li.rhtml +14 -3
  24. data/app/views/users/index.rhtml +1 -1
  25. data/app/views/virtual_classes/_form.erb +12 -2
  26. data/app/views/zafu/default/Node-+login.zafu +8 -1
  27. data/app/views/zafu/default/Node-+search.zafu +1 -1
  28. data/bricks/acls/lib/bricks/acls.rb +1 -0
  29. data/bricks/acls/zena/migrate/20130903150356_longer_names_for_acl.rb +9 -0
  30. data/bricks/acls/zena/test/integration/acl_integration_test.rb +2 -2
  31. data/bricks/currency/lib/bricks/currency.rb +120 -0
  32. data/bricks/currency/zena/test/unit/currency_test.rb +43 -0
  33. data/bricks/fs_skin/lib/bricks/fs_skin.rb +1 -1
  34. data/bricks/fs_skin/zena/skins/blog/Node-+search.zafu +1 -1
  35. data/bricks/fs_skin/zena/skins/blog/Node.zafu +1 -1
  36. data/bricks/fs_skin/zena/test/unit/fs_skin_view_test.rb +35 -0
  37. data/bricks/pdf/lib/bricks/pdf.rb +1 -1
  38. data/bricks/sphinx/lib/bricks/sphinx.rb +2 -0
  39. data/bricks/sphinx/zena/init.rb +14 -0
  40. data/bricks/tags/zena/test/zafu/tags.yml +5 -1
  41. data/bricks/worker/lib/bricks/worker.rb +3 -2
  42. data/bricks/zena/zena/migrate/20130829093753_add_versioned_flag_to_column.rb +10 -0
  43. data/bricks/zena/zena/migrate/20130903084909_count_login_attempts.rb +11 -0
  44. data/bricks/zena/zena/migrate/20131104153126_index_fullpath.rb +10 -0
  45. data/bricks/zena/zena/migrate/20131104210011_rebuild_fullpath_after_change.rb +10 -0
  46. data/bricks/zena/zena/migrate/20131105160420_add_skin_id_to_sites.rb +9 -0
  47. data/bricks/zena/zena/migrate/20131105175822_add_profile_to_users.rb +11 -0
  48. data/bricks/zena/zena/migrate/20140213120038_fix_idx_scope.rb +13 -0
  49. data/bricks/zena/zena/migrate/20140628140247_add_site_readonly.rb +9 -0
  50. data/config/bricks.yml +8 -4
  51. data/config/gems.yml +5 -3
  52. data/db/init/base/skins/default/Node-+login.zafu +8 -1
  53. data/db/init/base/skins/default/Node-+search.zafu +1 -1
  54. data/lib/bricks/loader.rb +5 -5
  55. data/lib/gettext_strings.rb +3 -0
  56. data/lib/tasks/zena.rake +25 -22
  57. data/lib/zafu/process/context.rb +4 -0
  58. data/lib/zena/acts/secure_node.rb +3 -3
  59. data/lib/zena/app.rb +1 -0
  60. data/lib/zena/deploy.rb +1 -1
  61. data/lib/zena/deploy/template.rb +1 -1
  62. data/lib/zena/foxy_parser.rb +5 -2
  63. data/lib/zena/info.rb +1 -1
  64. data/lib/zena/site_worker.rb +2 -2
  65. data/lib/zena/test_controller.rb +5 -2
  66. data/lib/zena/use/action.rb +9 -2
  67. data/lib/zena/use/ajax.rb +20 -4
  68. data/lib/zena/use/ancestry.rb +89 -15
  69. data/lib/zena/use/authlogic.rb +8 -2
  70. data/lib/zena/use/context.rb +1 -0
  71. data/lib/zena/use/display.rb +1 -97
  72. data/lib/zena/use/forms.rb +28 -8
  73. data/lib/zena/use/html_tags.rb +16 -7
  74. data/lib/zena/use/i18n.rb +1 -1
  75. data/lib/zena/use/prop_eval.rb +6 -1
  76. data/lib/zena/use/query_node.rb +69 -4
  77. data/lib/zena/use/recursion.rb +1 -1
  78. data/lib/zena/use/refactor.rb +5 -2
  79. data/lib/zena/use/relations.rb +1 -0
  80. data/lib/zena/use/rendering.rb +7 -4
  81. data/lib/zena/use/test_helper.rb +8 -4
  82. data/lib/zena/use/upload.rb +14 -0
  83. data/lib/zena/use/urls.rb +39 -23
  84. data/lib/zena/use/version_hash.rb +5 -2
  85. data/lib/zena/use/workflow.rb +116 -70
  86. data/lib/zena/use/zafu_eval.rb +41 -0
  87. data/lib/zena/use/zafu_safe_definitions.rb +1 -0
  88. data/lib/zena/use/zafu_templates.rb +32 -26
  89. data/lib/zena/use/zazen.rb +8 -7
  90. data/locale/app.pot +5 -1
  91. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  92. data/locale/de/zena.po +385 -281
  93. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  94. data/locale/en/zena.po +378 -271
  95. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  96. data/locale/fr/zena.po +387 -272
  97. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  98. data/locale/it/zena.po +433 -404
  99. data/locale/zena.pot +362 -268
  100. data/public/javascripts/grid.js +280 -104
  101. data/public/javascripts/zena.js +43 -15
  102. data/public/stylesheets/admin.css +8 -2
  103. data/public/stylesheets/grid.css +5 -2
  104. data/public/stylesheets/popup.css +1 -1
  105. data/test/fixtures/files/TestNode.zafu +51 -0
  106. data/test/functional/nodes_controller_test.rb +20 -5
  107. data/test/functional/user_sessions_controller_test.rb +41 -6
  108. data/test/functional/users_controller_test.rb +1 -2
  109. data/test/integration/navigation_test.rb +22 -4
  110. data/test/integration/query_node/basic.yml +7 -0
  111. data/test/integration/query_node/complex.yml +1 -1
  112. data/test/integration/query_node/errors.yml +1 -1
  113. data/test/integration/query_node/filters.yml +34 -1
  114. data/test/integration/query_node/relations.yml +6 -13
  115. data/test/integration/query_node_test.rb +22 -3
  116. data/test/integration/zafu_compiler/action.yml +1 -1
  117. data/test/integration/zafu_compiler/alias_site.yml +52 -0
  118. data/test/integration/zafu_compiler/complex.yml +1 -1
  119. data/test/integration/zafu_compiler/complex_ok.yml +5 -5
  120. data/test/integration/zafu_compiler/context.yml +1 -1
  121. data/test/integration/zafu_compiler/display.yml +56 -5
  122. data/test/integration/zafu_compiler/forms.yml +35 -2
  123. data/test/integration/zafu_compiler/meta.yml +4 -0
  124. data/test/integration/zafu_compiler/rubyless.yml +1 -1
  125. data/test/integration/zafu_compiler/safe_definitions.yml +4 -0
  126. data/test/integration/zafu_compiler/security.yml +10 -0
  127. data/test/integration/zafu_compiler/site.yml +5 -1
  128. data/test/integration/zafu_compiler/urls.yml +8 -2
  129. data/test/integration/zafu_compiler/zafu_attributes.yml +2 -1
  130. data/test/integration/zafu_compiler/zazen.yml +4 -0
  131. data/test/integration/zafu_compiler_test.rb +47 -4
  132. data/test/selenium/Grid/grid1.rsel +8 -8
  133. data/test/sites/complex/sites.yml +2 -2
  134. data/test/sites/complex/users.yml +1 -0
  135. data/test/sites/zena/columns.yml +4 -0
  136. data/test/sites/zena/sites.yml +1 -0
  137. data/test/sites/zena/users.yml +1 -0
  138. data/test/unit/node_test.rb +53 -5
  139. data/test/unit/note_test.rb +1 -1
  140. data/test/unit/relation_proxy_test.rb +20 -0
  141. data/test/unit/role_test.rb +2 -0
  142. data/test/unit/site_test.rb +28 -6
  143. data/test/unit/user_test.rb +332 -1
  144. data/test/unit/virtual_class_test.rb +55 -0
  145. data/test/unit/workflow_test.rb +175 -0
  146. data/test/unit/zena/use/ancestry_test.rb +52 -10
  147. data/test/unit/zena/use/prop_eval_test.rb +44 -0
  148. data/test/unit/zena/use/rendering_test.rb +48 -2
  149. data/test/unit/zena/use/upload_test.rb +15 -13
  150. data/test/unit/zena/use/urls_test.rb +1 -0
  151. data/vendor/plugins/ar_mysql_full_text/lib/ar_mysql_full_text.rb +39 -25
  152. data/zena.gemspec +69 -307
  153. metadata +143 -368
  154. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +0 -24
  155. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +0 -58
  156. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +0 -88
  157. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +0 -27
  158. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +0 -23
  159. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +0 -19
  160. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +0 -19
  161. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +0 -16
  162. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +0 -16
  163. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +0 -16
  164. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +0 -18
  165. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +0 -18
  166. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +0 -16
  167. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +0 -18
  168. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +0 -16
  169. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +0 -16
  170. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +0 -16
  171. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +0 -16
  172. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +0 -16
  173. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +0 -16
  174. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +0 -18
  175. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +0 -16
  176. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +0 -17
  177. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +0 -17
  178. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +0 -18
  179. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +0 -22
  180. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +0 -23
  181. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +0 -25
  182. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +0 -18
  183. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +0 -18
  184. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +0 -18
  185. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +0 -16
  186. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +0 -16
  187. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +0 -20
  188. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +0 -20
  189. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +0 -16
  190. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +0 -16
  191. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +0 -16
  192. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +0 -16
  193. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +0 -16
  194. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +0 -16
  195. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +0 -16
  196. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +0 -18
  197. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +0 -16
  198. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +0 -16
  199. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +0 -16
  200. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +0 -16
  201. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +0 -16
  202. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +0 -16
  203. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +0 -16
  204. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +0 -16
  205. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +0 -16
  206. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +0 -16
  207. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +0 -16
  208. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +0 -16
  209. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +0 -16
  210. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +0 -16
  211. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +0 -16
  212. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +0 -16
  213. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +0 -16
  214. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +0 -16
  215. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +0 -16
  216. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +0 -16
  217. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +0 -16
  218. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +0 -16
  219. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +0 -16
  220. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +0 -16
  221. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +0 -16
  222. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +0 -16
  223. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +0 -16
  224. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +0 -16
  225. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +0 -16
  226. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +0 -16
  227. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +0 -16
  228. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +0 -16
  229. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  230. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +0 -104
  231. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  232. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +0 -17
  233. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +0 -13
  234. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +0 -25
  235. data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +0 -166
  236. data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +0 -304
  237. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +0 -37
  238. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +0 -52
  239. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  240. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +0 -118
  241. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  242. data/vendor/TextMate/Zena.tmbundle/info.plist +0 -17
  243. data/vendor/plugins/selenium-on-rails/CHANGELOG +0 -125
  244. data/vendor/plugins/selenium-on-rails/LICENSE-2.0.txt +0 -202
  245. data/vendor/plugins/selenium-on-rails/README.md +0 -202
  246. data/vendor/plugins/selenium-on-rails/Rakefile +0 -38
  247. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumController.html +0 -265
  248. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumHelper.html +0 -148
  249. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails.html +0 -126
  250. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/FixtureLoader.html +0 -231
  251. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/PartialsSupport.html +0 -195
  252. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Paths.html +0 -295
  253. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/RSelenese.html +0 -219
  254. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Renderer.html +0 -156
  255. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Selenese.html +0 -179
  256. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/SuiteRenderer.html +0 -223
  257. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilder.html +0 -441
  258. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderAccessors.html +0 -3098
  259. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderActions.html +0 -2080
  260. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserAccessors.html +0 -116
  261. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserActions.html +0 -116
  262. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRailsConfig.html +0 -150
  263. data/vendor/plugins/selenium-on-rails/doc/files/CHANGELOG.html +0 -422
  264. data/vendor/plugins/selenium-on-rails/doc/files/README.html +0 -321
  265. data/vendor/plugins/selenium-on-rails/doc/files/lib/controllers/selenium_controller_rb.html +0 -108
  266. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_helper_rb.html +0 -101
  267. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/acceptance_test_runner_rb.html +0 -222
  268. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/fixture_loader_rb.html +0 -109
  269. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/partials_support_rb.html +0 -111
  270. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/paths_rb.html +0 -101
  271. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/renderer_rb.html +0 -101
  272. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/rselenese_rb.html +0 -118
  273. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/selenese_rb.html +0 -101
  274. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/suite_renderer_rb.html +0 -101
  275. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_accessors_rb.html +0 -114
  276. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_actions_rb.html +0 -113
  277. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_rb.html +0 -120
  278. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_config_rb.html +0 -108
  279. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_rb.html +0 -115
  280. data/vendor/plugins/selenium-on-rails/doc/fr_class_index.html +0 -42
  281. data/vendor/plugins/selenium-on-rails/doc/fr_file_index.html +0 -43
  282. data/vendor/plugins/selenium-on-rails/doc/fr_method_index.html +0 -182
  283. data/vendor/plugins/selenium-on-rails/doc/index.html +0 -24
  284. data/vendor/plugins/selenium-on-rails/doc/rdoc-style.css +0 -208
  285. data/vendor/plugins/selenium-on-rails/generators/selenium/USAGE +0 -19
  286. data/vendor/plugins/selenium-on-rails/generators/selenium/selenium_generator.rb +0 -50
  287. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rhtml.rhtml +0 -16
  288. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rselenese.rhtml +0 -14
  289. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/selenese.rhtml +0 -11
  290. data/vendor/plugins/selenium-on-rails/init.rb +0 -15
  291. data/vendor/plugins/selenium-on-rails/lib/controllers/selenium_controller.rb +0 -122
  292. data/vendor/plugins/selenium-on-rails/lib/controllers/switch_environment_controller.rb +0 -16
  293. data/vendor/plugins/selenium-on-rails/lib/selenium_helper.rb +0 -8
  294. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails.rb +0 -11
  295. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/acceptance_test_runner.rb +0 -215
  296. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/fixture_loader.rb +0 -57
  297. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/partials_support.rb +0 -36
  298. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/paths.rb +0 -61
  299. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/renderer.rb +0 -20
  300. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/rselenese.rb +0 -44
  301. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/selenese.rb +0 -87
  302. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/suite_renderer.rb +0 -56
  303. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder.rb +0 -116
  304. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_accessors.rb +0 -1002
  305. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_actions.rb +0 -514
  306. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_accessors.rb.example +0 -91
  307. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_actions.rb.example +0 -24
  308. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails_config.rb +0 -30
  309. data/vendor/plugins/selenium-on-rails/lib/views/layouts/layout.rhtml +0 -18
  310. data/vendor/plugins/selenium-on-rails/lib/views/record.rhtml +0 -5
  311. data/vendor/plugins/selenium-on-rails/lib/views/selenium_helper.rb +0 -9
  312. data/vendor/plugins/selenium-on-rails/lib/views/setup.rhtml +0 -67
  313. data/vendor/plugins/selenium-on-rails/lib/views/test_suite.rhtml +0 -26
  314. data/vendor/plugins/selenium-on-rails/routes.rb +0 -24
  315. data/vendor/plugins/selenium-on-rails/selenium-core/Blank.html +0 -7
  316. data/vendor/plugins/selenium-on-rails/selenium-core/InjectedRemoteRunner.html +0 -8
  317. data/vendor/plugins/selenium-on-rails/selenium-core/RemoteRunner.html +0 -110
  318. data/vendor/plugins/selenium-on-rails/selenium-core/SeleniumLog.html +0 -109
  319. data/vendor/plugins/selenium-on-rails/selenium-core/TestPrompt.html +0 -145
  320. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner-splash.html +0 -55
  321. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.hta +0 -177
  322. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.html +0 -177
  323. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butmin.gif +0 -0
  324. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butplus.gif +0 -0
  325. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.css +0 -298
  326. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.html +0 -16
  327. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/selenium-domviewer.js +0 -205
  328. data/vendor/plugins/selenium-on-rails/selenium-core/icons/all.png +0 -0
  329. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue.png +0 -0
  330. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue_disabled.png +0 -0
  331. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause.png +0 -0
  332. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause_disabled.png +0 -0
  333. data/vendor/plugins/selenium-on-rails/selenium-core/icons/selected.png +0 -0
  334. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step.png +0 -0
  335. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step_disabled.png +0 -0
  336. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc-core.xml +0 -1759
  337. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc.xml +0 -1800
  338. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/cssQuery-p.js +0 -6
  339. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level2.js +0 -142
  340. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level3.js +0 -150
  341. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-standard.js +0 -53
  342. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery.js +0 -356
  343. data/vendor/plugins/selenium-on-rails/selenium-core/lib/prototype.js +0 -2006
  344. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/builder.js +0 -101
  345. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/controls.js +0 -815
  346. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/dragdrop.js +0 -915
  347. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/effects.js +0 -958
  348. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/scriptaculous.js +0 -47
  349. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/slider.js +0 -283
  350. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/unittest.js +0 -383
  351. data/vendor/plugins/selenium-on-rails/selenium-core/lib/snapsie.js +0 -91
  352. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/find_matching_child.js +0 -69
  353. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/htmlutils.js +0 -1616
  354. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/injection.html +0 -72
  355. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-api.js +0 -3184
  356. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserbot.js +0 -2300
  357. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserdetect.js +0 -153
  358. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-commandhandlers.js +0 -377
  359. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-executionloop.js +0 -175
  360. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-logging.js +0 -148
  361. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-remoterunner.js +0 -695
  362. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-testrunner.js +0 -1362
  363. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-version.js +0 -5
  364. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-doc.html +0 -803
  365. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-element.js +0 -1537
  366. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-map-sample.js +0 -979
  367. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js +0 -3
  368. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js.sample +0 -75
  369. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/xmlextras.js +0 -153
  370. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-logo.png +0 -0
  371. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-test.css +0 -43
  372. data/vendor/plugins/selenium-on-rails/selenium-core/selenium.css +0 -316
  373. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/dom.js +0 -566
  374. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/javascript-xpath-0.1.11.js +0 -2816
  375. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/util.js +0 -549
  376. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xmltoken.js +0 -149
  377. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xpath.js +0 -2450
  378. data/vendor/plugins/selenium-on-rails/tasks/test_acceptance.rake +0 -8
  379. data/vendor/plugins/selenium-on-rails/test/fixtures/config.yml +0 -37
  380. data/vendor/plugins/selenium-on-rails/test/fixtures/selenium.yml +0 -27
  381. data/vendor/plugins/selenium-on-rails/test/paths_test.rb +0 -72
  382. data/vendor/plugins/selenium-on-rails/test/renderer_test.rb +0 -157
  383. data/vendor/plugins/selenium-on-rails/test/rselenese_test.rb +0 -708
  384. data/vendor/plugins/selenium-on-rails/test/selenese_test.rb +0 -242
  385. data/vendor/plugins/selenium-on-rails/test/selenium_controller_test.rb +0 -67
  386. data/vendor/plugins/selenium-on-rails/test/selenium_on_rails_config_test.rb +0 -43
  387. data/vendor/plugins/selenium-on-rails/test/selenium_support_test.rb +0 -35
  388. data/vendor/plugins/selenium-on-rails/test/setup_test.rb +0 -31
  389. data/vendor/plugins/selenium-on-rails/test/suite_renderer_test.rb +0 -109
  390. data/vendor/plugins/selenium-on-rails/test/switch_environment_controller_test.rb +0 -17
  391. data/vendor/plugins/selenium-on-rails/test/test_builder_functions_authortest.rb +0 -51
  392. data/vendor/plugins/selenium-on-rails/test/test_helper.rb +0 -101
  393. data/vendor/plugins/selenium-on-rails/test_data/_partial.rsel +0 -1
  394. data/vendor/plugins/selenium-on-rails/test_data/own_layout.html +0 -12
  395. data/vendor/plugins/selenium-on-rails/test_data/partials/_html.html +0 -6
  396. data/vendor/plugins/selenium-on-rails/test_data/partials/_nesting.rsel +0 -2
  397. data/vendor/plugins/selenium-on-rails/test_data/partials/_rhtml.rhtml +0 -6
  398. data/vendor/plugins/selenium-on-rails/test_data/partials/_rsel.rsel +0 -1
  399. data/vendor/plugins/selenium-on-rails/test_data/partials/_sel.sel +0 -5
  400. data/vendor/plugins/selenium-on-rails/test_data/partials/all_partials.rsel +0 -5
  401. data/vendor/plugins/selenium-on-rails/test_data/rhtml.rhtml +0 -7
  402. data/vendor/plugins/selenium-on-rails/test_data/rselenese.rsel +0 -8
  403. data/vendor/plugins/selenium-on-rails/test_data/selenese.sel +0 -7
  404. data/vendor/plugins/selenium-on-rails/test_data/suite_one/subsuite/suite_one_subsuite_testcase.sel +0 -1
  405. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase1.sel +0 -1
  406. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase2.sel +0 -1
  407. data/vendor/plugins/selenium-on-rails/test_data/suite_two/suite_two_testcase.sel +0 -1
@@ -1,3 +1,58 @@
1
+ In this history, elements listed with a '~' still need to be documented.
2
+
3
+ == 1.2.8
4
+
5
+ * Major changes
6
+ * Added "update_attributes_without_clone" and "save_without_clone" to update attributes
7
+ without versioning (used to sync attributes with external app). This does not change
8
+ timestamps nor version or node author.
9
+ * Added login retry wait delay on failures.
10
+ * Added support for 'in home' or 'from home' in sqliss.
11
+ * Added support for any scope with 'in sub_nodes' (uses fullpath field).
12
+ ~ Added forced skin setting for sites (overwrites all but ACL skin settings).
13
+ ~ Added support for profile users.
14
+ * Added support to edit auth_user (linked user) through node's pseudo attribute 'auth' (admin only) or
15
+ through 'auth_user'.
16
+ ~ Created 'manager' user status: can edit users (only through 'auth').
17
+ ~ Created 'currency' brick to fetch openexchangerates.org exchange rates.
18
+ * Do not render an older Ajax reply if a newer one has already been received. This fixes the
19
+ live query confusion.
20
+ * Fixed loose requirements of httparty and rubyzip preventing installation.
21
+ * Added 'fsize' method in view to display human readable octet size.
22
+ ~ Added 'pasteTable' option to disable (by setting false) multi cell paste in grid.
23
+ ~ Using contenteditable in grid instead of input form. Turn off with contenteditable option.
24
+ * Fixed grid bug when leaving page while in input field.
25
+ ~ Implemented 'fulltext match' or 'sphinx match' to use fulltext search in node query.
26
+ ~ Added 'group_id_to_name' to visitor (enables group name display from node auth settings).
27
+ ~ Added 'site_readonly' attribute to site with 'site.readonly?' rubyless. Useful for locking site during updates or migrations.
28
+
29
+ * Minor changes
30
+ * Fixed gemspec to not include TextMate helper and selenium plugin.
31
+ * Fixed xml generated file caching.
32
+ ~ Added NODE_ID in 'redir' param on node creation (replaced by actual id).
33
+ * Added fetch_html rubyless method to views (does an HTTP GET and returns body).
34
+ * Fixed a bug in site alias zafu compilation (wrong home reference).
35
+ * Fixed anchor in zazen url "":22#foo should link to anchor #foo in node '22'.
36
+ * Prop eval returning nil for title properly replaces title with class name.
37
+ * Type ctrl+return to enter a newline inside a grid.
38
+ * Checking for defined accessors on links before passing to relation proxy (this enables custom code
39
+ on relation modification without passing through RelationProxy).
40
+ * Refuses to delete user node unless visitor is a manager.
41
+ * Marks user as deleted and remove profile if node is destroyed.
42
+ ~ Enable 'parent_id', 'project_id', 'section_id' Rubyless methods.
43
+ * Fixed a critical bug related to changing a virtual class' superclass.
44
+ * Do not trigger Ajax 'loading' unless it takes more then 300 ms (avoid blink).
45
+ * Fixed tlabel on [input] when there is a default label (should overwride default).
46
+ * Fixed "<p do='input'..." so that the "p" tag is preserved.
47
+ * Using shift+enter to insert carriage return in grid.
48
+ * Improved jobs display.
49
+ * Fixed a cache handling bug where a page could exist in the filesystem without having a cache entry
50
+ in the database.
51
+ * Fixed building templates on the fly with fs_skin on JS call.
52
+ * Fixed rebuild_fullpath and added link in sites on web interface.
53
+ * Removing bricks.yml and other initial config files from 'rake zena:assets'.
54
+ * Request for 'login' page while logged in redirects to home page instead of clearing session (fixes iPhone login issues).
55
+
1
56
  == 1.2.6, 1.2.7 2013-08-16
2
57
 
3
58
  * Major changes
@@ -5,8 +60,8 @@
5
60
  * Added support for wkhtmltopdf (Thanks Jean-Baptiste).
6
61
 
7
62
  * Minor changes
8
- * Added 'cmd' option for pdf brick. <== TODO: Document
9
- * Added 'local_ips' option to bricks.yml (used when pdf engine cannot render non-public assets). <== TODO: Document
63
+ ~ Added 'cmd' option for pdf brick.
64
+ ~ Added 'local_ips' option to bricks.yml (used when pdf engine cannot render non-public assets).
10
65
  * Fixed dependency on newer versions of rails.
11
66
 
12
67
  == 1.2.5 2013-07-15
@@ -16,14 +71,14 @@
16
71
  implies changes to vhost files !
17
72
  * WARN: Properties in list context do not resolve with first element anymore. "first" prefix needed.
18
73
  * Enable VirtualClass on native classes !
19
- * Added 'activity' brick which records visitor's last "seen_at" date. <== TODO: Document
20
- * Support for site alias (other domain pointing to same data) "rake mkalias". <== TODO: Document
74
+ ~ Added 'activity' brick which records visitor's last "seen_at" date.
75
+ ~ Support for site alias (other domain pointing to same data) "rake mkalias".
21
76
 
22
77
  * Minor changes
23
78
  * Fixed encode_params in Ajax requests.
24
79
  * Fixed cached path in vhost file.
25
- * Added "uuid" method (generates a unique id). <== TODO: Document
26
- * Added support for JSON String in [string_hash] <== TODO: Document
80
+ ~ Added "uuid" method (generates a unique id).
81
+ ~ Added support for JSON String in [string_hash]
27
82
  * Added 'login_info' to Node.
28
83
  * Added 'group_names' to User class.
29
84
  * Fixed [headers] when 'Status' is set (change to redirect on 300).
@@ -31,10 +86,10 @@
31
86
  == 1.2.4 2013-06-13
32
87
 
33
88
  * Major changes
34
- * Added class filtering to Acl in 'create' action. <== TODO: Document
89
+ ~ Added class filtering to Acl in 'create' action.
35
90
  * Uploading html files does not transform them into zafu (use .zafu ext for this)
36
91
  * Added file upload support from zena remote API.
37
- * Added 'content_type' regexp to force virtual class on Document creation. <== TODO: Document
92
+ ~ Added 'content_type' regexp to force virtual class on Document creation.
38
93
  * Extended "create group" in vclass to be "allow group" (edit).
39
94
  * Added support for [versions_list] to display list of versions and status.
40
95
 
@@ -42,7 +97,7 @@
42
97
  * Support for raw html in zazen with '<notextile>' or '<html>' tag. Must be allowed with notextile='true' on [zazen] tag.
43
98
  * Fixed preview of content with ACL (considering the POST on /zafu as a 'read').
44
99
  * Added support for "class not like Image" or "class <> Image" to sqliss.
45
- * Added url to clear cache with /sites/clear_cache (admin only). <== TODO: Document
100
+ ~ Added url to clear cache with /sites/clear_cache (admin only).
46
101
  * encode_params now supports arrays.
47
102
  * Add 'id' to date input.
48
103
  * Fixed 404 error.
@@ -64,20 +119,20 @@
64
119
  * html_escape all properties by default
65
120
  * Better support for Passenger (default deployment method now)
66
121
  * Simplified caching (using cachestamp in filename)
67
- * Added preview='dom_id' to [form]. (Use preview_node to show preview content.) <== TODO: Document
68
- * Added "in_group" zafu method on visitor. <== TODO: Document
69
- * Added [upload_field] method to zafu to allow custom upload forms. <== TODO: Document
70
- * Added support for custom images on nodes with the "img_tag_{mode}" string attribute or the 'img_tag' hash attribute. <== TODO: Document
71
- * Added support for tag clouds through sqliss (<r:void do='tag_cloud from nodes in site' do='each' join=', '><r:name/> (<r:link_count/>)</r:void>). <== TODO: Document
122
+ ~ Added preview='dom_id' to [form]. (Use preview_node to show preview content.)
123
+ ~ Added "in_group" zafu method on visitor.
124
+ ~ Added [upload_field] method to zafu to allow custom upload forms.
125
+ ~ Added support for custom images on nodes with the "img_tag_{mode}" string attribute or the 'img_tag' hash attribute.
126
+ * Added support for tag clouds through sqliss (<r:void do='tag_cloud from nodes in site' do='each' join=', '><r:name/> (<r:link_count/>)</r:void>).
72
127
 
73
128
  * Minor changes
74
- * Support for 'lang_list' when creating vhost file <== TODO: Document
75
- * Support for Range in zafu. <== TODO: Document
76
- * Added options to query_parse to ignore unwanted parameters <== TODO: Document
77
- * Added 'hparams' option to only return Hash parameters from params. <== TODO: Document
129
+ ~ Support for 'lang_list' when creating vhost file
130
+ ~ Support for Range in zafu.
131
+ ~ Added options to query_parse to ignore unwanted parameters
132
+ ~ Added 'hparams' option to only return Hash parameters from params.
78
133
  * Fixed query_parse to convert dates to UTC.
79
134
  * Fixed form preview inside block.
80
- * Added unique id to img_tag_{mode} code generated 'UUID'. <== TODO: Document
135
+ ~ Added unique id to img_tag_{mode} code generated 'UUID'.
81
136
  * Added PATH_mode.format and [JS] marker to img_tag_{mode}.
82
137
  * Fixed form preview with long text (use POST).
83
138
 
@@ -100,12 +155,12 @@
100
155
  * Minor changes
101
156
  * Fixed label traduction for param.
102
157
  * Enable ajax response on Node destroy (use dummy update parameter).
103
- * Added 'sum' method on array. <===== TODO: Document
158
+ ~ Added 'sum' method on array.
104
159
  * Added 'loading' option to [filter].
105
160
  * Added 'master_template' zafu method to access the master template used for compilation.
106
161
  * Fixed creation of modules bug.
107
162
  * Using latest QueryBuilder (fixes default scope bug).
108
- * Added 'ssl_on_auth' option to force https after (and during) login. <=== TODO: Document
163
+ ~ Added 'ssl_on_auth' option to force https after (and during) login.
109
164
  * Removing evaluated strings if copy_id is blank.
110
165
  * Exporting relations by class name instead of kpath (may differ from site to site).
111
166
  * Using any character to build kpath if no character from the class name can be used.
@@ -113,7 +168,7 @@
113
168
  * Added support for "target" in [zazen] when rendering links.
114
169
  * Fixed kpath propagation to relations on kpath change.
115
170
  * Fixed [block] in [block] with [filter] bug.
116
- * Added support for KPATH_VALUE(ClassName) in custom queries. <==== TODO: Document
171
+ ~ Added support for KPATH_VALUE(ClassName) in custom queries.
117
172
  * Fixed class scoping Contact? when current node is more specialized.
118
173
  * Fixed bug on syntax error in Acl query.
119
174
  * Fixed cache expire bug (some pages were not properly removed).
@@ -124,7 +179,7 @@
124
179
  * Added 'remove_from_db' method to remove a site from the database.
125
180
  * Fixed asset caching PLEASE FIX YOUR VHOST FILES: rake zena:create_vhost -s host='xxxxx'.
126
181
  * Fixed deadlock_retry (a bug in the error message aborted the retry).
127
- * Created 'spreadsheet' brick to ease xlsx and csv generation. <===== TODO: Document
182
+ ~ Created 'spreadsheet' brick to ease xlsx and csv generation.
128
183
  * Better JS based grid editor.
129
184
 
130
185
  * Minor changes
@@ -134,9 +189,9 @@
134
189
  * Enabled 'alt_class' to work on multiple elements ([each]).
135
190
  * Fixed ajax bugs with dom_ids in nested partials.
136
191
  * Better Acl display, comments on relations.
137
- * Support for 'to_date' on time object with proper timezone translation. <===== TODO: Document
192
+ ~ Support for 'to_date' on time object with proper timezone translation.
138
193
  * Time to 'year' should use timezone.
139
- * Added tprefix to [select] (with default value) to ease translated options for select. <===== TODO: Document
194
+ ~ Added tprefix to [select] (with default value) to ease translated options for select.
140
195
  * Fixed bug when using [input] checkbox with param.
141
196
  * Added jobs list in admin links.
142
197
 
data/Rakefile CHANGED
@@ -26,8 +26,8 @@ begin
26
26
  gemspec.rubyforge_project = 'zena'
27
27
 
28
28
  gemspec.files.exclude 'config/routes.rb'
29
- gemspec.files.exclude 'vendor/plugins/selenium-on-rails'
30
- gemspec.files.exclude 'vendor/TextMate'
29
+ gemspec.files.exclude %r{^vendor/plugins/selenium-on-rails}
30
+ gemspec.files.exclude %r{vendor/TextMate}
31
31
 
32
32
 
33
33
  # Gem dependecies
@@ -25,7 +25,7 @@ class ColumnsController < ApplicationController
25
25
  end
26
26
  end
27
27
 
28
- @column = Column.new
28
+ @column = Column.new(:versioned => true)
29
29
 
30
30
  respond_to do |format|
31
31
  format.html # index.html.erb
@@ -47,7 +47,7 @@ class ColumnsController < ApplicationController
47
47
  # GET /columns/new
48
48
  # GET /columns/new.xml
49
49
  def new
50
- @column = Column.new
50
+ @column = Column.new(:versioned => true)
51
51
 
52
52
  respond_to do |format|
53
53
  format.html # new.html.erb
@@ -18,7 +18,10 @@ Examples:
18
18
 
19
19
  =end
20
20
  class NodesController < ApplicationController
21
+ before_filter :check_not_readonly, :except => [:index, :show, :search, :zafu, :not_found]
22
+
21
23
  before_filter :check_is_admin, :only => [:export]
24
+
22
25
  before_filter :check_api_group
23
26
  if Bricks.raw_config['passenger']
24
27
  before_filter :escape_path, :only => [:index, :show]
@@ -269,7 +272,10 @@ class NodesController < ApplicationController
269
272
  if @node.errors.empty?
270
273
  flash.now[:notice] = 'Node was successfully created.'
271
274
  format.html {
272
- redirect_to params[:redir] || zen_path(@node, :mode => params[:mode], :new => 'true')
275
+ if redir = params[:redir]
276
+ redir = redir.gsub('NODE_ID', @node.zip.to_s)
277
+ end
278
+ redirect_to redir || zen_path(@node, :mode => params[:mode], :new => 'true')
273
279
  }
274
280
  format.js do
275
281
  if params[:zjs]
@@ -320,8 +326,7 @@ class NodesController < ApplicationController
320
326
  respond_to do |format|
321
327
  format.html do
322
328
  if @node.destroy
323
- # These flash messages tend to hang around stupidly
324
- # flash[:notice] = _("Node destroyed.")
329
+ flash[:notice] = _("Node destroyed.")
325
330
  redirect_to params[:redir] || zen_path(@node.parent)
326
331
  else
327
332
  flash.now[:notice] = _("Could not destroy node.")
@@ -423,11 +428,18 @@ class NodesController < ApplicationController
423
428
  params['node'] ||= {}
424
429
  file, file_error = get_attachment
425
430
  params['node']['file'] = file if file
426
- # Make sure we load the correct version for edited v_lang
427
- lang = params['node']['v_lang'] || visitor.lang
428
- @node.version(lang)
429
- @v_status_before_update = @node.v_status
430
- @node.update_attributes_with_transformation(params['node'])
431
+
432
+ #============= [TRANSACTION HERE to prevent double version bug on double submit
433
+ # This can only fix the issue if Version creation/saving is not done after_commit !!
434
+ Node.transaction do
435
+ # Make sure we load the correct version for edited v_lang
436
+ lang = params['node']['v_lang'] || visitor.lang
437
+ @node.version(lang)
438
+ @v_status_before_update = @node.v_status
439
+ @node.update_attributes_with_transformation(params['node'])
440
+ end
441
+ #============= TO HERE TRANSACTION]
442
+
431
443
  # What is this 'extfile' thing ?
432
444
  @node.errors.add('extfile', file_error) if file_error
433
445
 
@@ -456,27 +468,8 @@ class NodesController < ApplicationController
456
468
  redirect_to params[:redir] || zen_path(@node, :mode => params[:mode])
457
469
  end
458
470
  else
459
- begin
460
- if request.referer
461
- route = ActionController::Routing::Routes.recognize_path(request.referer[%r{https?://[^/]+(.*)},1])
462
- else
463
- route = {:action => 'show'}
464
- end
465
- if route[:action] == 'index'
466
- mode = '+index'
467
- elsif route[:action] == 'search'
468
- mode = '+search'
469
- elsif path = route[:path]
470
- if path.last =~ Zena::Use::Urls::ALLOWED_REGEXP
471
- zip = $3
472
- name = $4
473
- mode = $5 == '' ? nil : $5[1..-1]
474
- end
475
- end
476
- rescue ActionController::RoutingError
477
- mode = nil
478
- end
479
- render_and_cache :mode => mode, :cache => false
471
+ flash[:error] = error_messages_for(:node, :object => @node).html_safe
472
+ redirect_to zen_path(@node, :mode => params[:mode])
480
473
  end
481
474
  end # html
482
475
 
@@ -8,21 +8,41 @@ class UserSessionsController < ApplicationController
8
8
 
9
9
  # /login
10
10
  def new
11
- @node = visitor.site.root_node
12
- render_and_cache :mode => '+login'
11
+ # If user is already logged in, redirect to home page
12
+ if !visitor.is_anon?
13
+ redirect_to home_path(:prefix => prefix)
14
+ else
15
+ @node = visitor.site.root_node
16
+ render_and_cache :mode => '+login'
17
+ end
13
18
  end
14
19
 
15
20
  def create
16
21
  User.send(:with_scope, :find => {:conditions => ['site_id = ?', visitor.site.id]}) do
22
+ if user = User.find_by_login(params[:login])
23
+ # FAIL: 1s, FAIL: 2s, FAIL: 4s, FAIL: 8s, FAIL: 16s, FAIL: 32s, FAIL: 64s
24
+ wait_in_seconds = 2 ** user.login_attempt_count.to_i
25
+ elapsed = Time.now.to_i - user.login_attempted_at.to_i
26
+ if elapsed < wait_in_seconds
27
+ w = Time.at(wait_in_seconds - elapsed)
28
+ msg = _("You need to wait %ih %im %is before any new attempt (%i failed attempts).")
29
+ flash[:error] = msg % [w.hour, w.min, w.sec, user.login_attempt_count.to_i]
30
+ return redirect_to login_path
31
+ end
32
+ else
33
+ flash[:error] = _("Invalid login or password.")
34
+ return redirect_to login_path
35
+ end
17
36
  @user_session = UserSession.new(:login=>params[:login], :password=>params[:password])
18
37
  if @user_session.save
19
- #flash.now[:notice] = _("Successfully logged in.")
38
+ # Reset login attempts count
39
+ Zena::Db.set_attribute(user, 'login_attempt_count', 0)
40
+ Zena::Db.set_attribute(user, 'login_attempted_at', nil)
20
41
  redirect_to redirect_after_login
21
42
  else
22
- flash[:notice] = _("Invalid login or password.")
23
- # FIXME: find a better way to lock without blocking the process.
24
- # Also lock longer and longer (exponentially).
25
- sleep(2)
43
+ flash[:error] = _("Invalid login or password.")
44
+ Zena::Db.set_attribute(user, 'login_attempt_count', user.login_attempt_count.to_i + 1)
45
+ Zena::Db.set_attribute(user, 'login_attempted_at', Time.now.utc)
26
46
  redirect_to login_path
27
47
  end
28
48
  end
@@ -41,7 +61,7 @@ class UserSessionsController < ApplicationController
41
61
  else
42
62
  # Keep current host and port settings
43
63
  host = host_with_port
44
- http = host =~ /:/ ? 'https' : 'http'
64
+ http = host =~ /:443/ ? 'https' : 'http'
45
65
  end
46
66
  #flash.now[:notice] = _("Successfully logged out.")
47
67
  redirect_to "#{http}://#{host}#{params[:redirect] || home_path(:prefix => prefix)}"
@@ -57,8 +77,13 @@ class UserSessionsController < ApplicationController
57
77
  unless site = Site.find_by_host(request.host)
58
78
  raise ActiveRecord::RecordNotFound.new("host not found #{request.host}")
59
79
  end
60
-
61
- setup_visitor(anonymous_visitor(site), site)
80
+
81
+ if params[:action] == 'new'
82
+ # keep visitor
83
+ super
84
+ else
85
+ setup_visitor(anonymous_visitor(site), site)
86
+ end
62
87
  end
63
88
 
64
89
  def redirect_after_login
@@ -15,7 +15,7 @@ class UsersController < ApplicationController
15
15
  # Show the list of users. Rendered in the admin layout.
16
16
  def index
17
17
  secure!(User) do
18
- @users = User.paginate(:all, :order => 'status DESC, login ASC', :page => params[:page], :per_page => 20)
18
+ @users = User.paginate(:all, :order => 'COALESCE(is_profile,0) DESC, status DESC, login ASC', :page => params[:page], :per_page => 20)
19
19
  end
20
20
 
21
21
  get_groups_list
@@ -151,7 +151,7 @@ class UsersController < ApplicationController
151
151
  if params[:user]
152
152
  # visitor changing his/her own info : restrict fields
153
153
  params[:user].keys.each do |k|
154
- params[:user].delete(k) unless [:login, :time_zone, :lang, :password, :time_zone, :retype_password, :old_password].include?(k.to_sym)
154
+ params[:user].delete(k) unless ['login', 'time_zone', 'lang', 'password', 'time_zone', 'retype_password', 'old_password'].include?(k.to_s)
155
155
  end
156
156
  end
157
157
  else
@@ -1,7 +1,7 @@
1
1
  require 'differ'
2
2
  class VersionsController < ApplicationController
3
3
  layout :popup_layout, :except => [:preview, :diff, :show]
4
- before_filter :find_version, :verify_access
4
+ before_filter :find_version, :check_not_readonly, :verify_access
5
5
 
6
6
  # Display a specific version of a node
7
7
  def show
@@ -284,7 +284,7 @@ class VersionsController < ApplicationController
284
284
  # make the flash available to rjs helpers
285
285
  @flash = flash
286
286
  respond_to do |format|
287
- format.html { redirect_to params[:redir] || @redirect_url || request.env['HTTP_REFERER'] || {:id => 0}}
287
+ format.html { redirect_to params[:redir] || @redirect_url || request.env['HTTP_REFERER'] || zen_path(@node)}
288
288
  # js = call from 'drive' popup
289
289
  format.js { render :action => 'update' }
290
290
  end
@@ -21,6 +21,7 @@ class Group < ActiveRecord::Base
21
21
  before_save :do_replace_by
22
22
  before_destroy :check_can_destroy
23
23
  belongs_to :site
24
+ after_save :update_dependant_users
24
25
 
25
26
  # FIXME: test translate_pseudo_id for groups
26
27
  def self.translate_pseudo_id(id,sym=:id)
@@ -116,7 +117,9 @@ class Group < ActiveRecord::Base
116
117
  errors.add('base', 'you cannot add or remove users from this group')
117
118
  return false
118
119
  end
119
-
120
+
121
+ @model_users = self.users.select {|u| u.is_profile?}
122
+ model_user_ids = @model_users.map(&:id)
120
123
  self.users = []
121
124
  visitor_added = false
122
125
  @defined_user_ids.each do |id|
@@ -125,6 +128,9 @@ class Group < ActiveRecord::Base
125
128
  next
126
129
  end
127
130
  self.users << user
131
+ if user.is_profile?
132
+ @model_users << user unless model_user_ids.include?(user.id)
133
+ end
128
134
  visitor_added = user[:id] == visitor[:id]
129
135
  end
130
136
  end
@@ -144,4 +150,12 @@ class Group < ActiveRecord::Base
144
150
  end
145
151
  return errors.empty?
146
152
  end
153
+
154
+ def update_dependant_users
155
+ if list = @model_users
156
+ list.each do |u|
157
+ u.save # Force sync
158
+ end
159
+ end
160
+ end
147
161
  end
@@ -149,6 +149,9 @@ class Node < ActiveRecord::Base
149
149
  include Property::Serialization::JSON
150
150
 
151
151
  store_properties_in :version
152
+
153
+ invalid_property_failover 'title' => 'INVALID PROPERTY', 'ext' => 'txt', 'content/type' => 'text/plain'
154
+
152
155
 
153
156
  property do |p|
154
157
  # Multilingual string index on 'title'
@@ -185,6 +188,7 @@ class Node < ActiveRecord::Base
185
188
  before_create :node_before_create
186
189
  after_save :spread_project_and_section
187
190
  after_create :node_after_create
191
+ before_destroy :node_before_destroy
188
192
  after_destroy :node_after_destroy
189
193
  attr_protected :zip, :id, :section_id, :project_id, :publish_from, :created_at, :updated_at
190
194
  attr_protected :site_id
@@ -230,7 +234,9 @@ class Node < ActiveRecord::Base
230
234
 
231
235
  # we use safe_method because the columns can be null, but the values are never null
232
236
  safe_method :kpath => String, :user_zip => Number, :user_id => Number,
233
- :parent_zip => Number, :project_zip => Number, :section_zip => Number,
237
+ :parent_id => {:class => Number, :method => 'parent_zip'}, :parent_zip => Number,
238
+ :project_id => {:class => Number, :method => 'project_zip'}, :project_zip => Number,
239
+ :section_id => {:class => Number, :method => 'section_zip'}, :section_zip => Number,
234
240
  :ref_lang => String,
235
241
  :position => Number, :rgroup_id => Number,
236
242
  :wgroup_id => Number, :dgroup_id => Number, :custom_base => Boolean,
@@ -244,8 +250,10 @@ class Node < ActiveRecord::Base
244
250
  :versions => {:class => ['Version'], :method => 'zafu_versions'},
245
251
  :version => 'Version', :v_status => Number, :v_lang => String,
246
252
  :v_publish_from => Time, :v_backup => Boolean,
247
- :zip => Number, :parent_id => {:class => Number, :nil => true, :method => 'parent_zip'},
253
+ :zip => Number, :parent_id => {:class => Number, :nil => true, :method => 'parent_zip'},
248
254
  :user => 'User',
255
+ :auth_user => {:class => 'User', :nil => true},
256
+ :auth => StringHash,
249
257
  :author => author_proc,
250
258
  :vclass => {:class => 'VirtualClass', :method => 'virtual_class'},
251
259
  :new_record? => Boolean,
@@ -640,7 +648,7 @@ class Node < ActiveRecord::Base
640
648
  if attributes['file'] && !(klass.kpath =~ %r{^ND})
641
649
  klass = VirtualClass['Document']
642
650
  end
643
-
651
+
644
652
  if klass.kind_of?(VirtualClass)
645
653
  node = secure(klass.real_class) { klass.new_instance(attributes) }
646
654
  else
@@ -1037,7 +1045,7 @@ class Node < ActiveRecord::Base
1037
1045
 
1038
1046
  # check inheritance chain through kpath
1039
1047
  def kpath_match?(kpath)
1040
- vclass.kpath =~ /^#{kpath}/
1048
+ self.kpath =~ /^#{kpath}/
1041
1049
  end
1042
1050
 
1043
1051
  # virtual class
@@ -1472,6 +1480,45 @@ class Node < ActiveRecord::Base
1472
1480
  return nil unless type = virtual_class.safe_method_type([method])
1473
1481
  res = eval(type[:method])
1474
1482
  res ? res.to_s : nil
1483
+ end
1484
+
1485
+ def auth=(params)
1486
+ return unless visitor.is_manager?
1487
+ if !users = auth_users
1488
+ # Create user
1489
+ user = secure(User) { User.new }
1490
+ users = @auth_users = [user]
1491
+ @auth_user = user
1492
+ end
1493
+ users.each do |user|
1494
+ user.attributes = params
1495
+ end
1496
+ @auth = nil
1497
+ end
1498
+
1499
+ # Find all users using this node as contact node.
1500
+ def auth_users
1501
+ @auth_users ||= new_record? ? nil : secure(User) { User.all(:conditions => {:node_id => self.id}) }
1502
+ end
1503
+
1504
+ def auth
1505
+ @auth ||= if l = auth_user
1506
+ h = StringHash.new
1507
+ [:login, :lang, :profile].each do |k|
1508
+ h[k] = auth_user.send(k)
1509
+ end
1510
+ h
1511
+ else
1512
+ {}
1513
+ end
1514
+ end
1515
+
1516
+ # Find first user using this node as contact node
1517
+ def auth_user
1518
+ @auth_user ||= begin
1519
+ l = auth_users
1520
+ l && l.first
1521
+ end
1475
1522
  end
1476
1523
 
1477
1524
  protected
@@ -1611,7 +1658,8 @@ class Node < ActiveRecord::Base
1611
1658
 
1612
1659
  # Make sure the node is complete before creating it (check parent and project references)
1613
1660
  def validate_node
1614
- errors.add(:title, "can't be blank") if title.blank?
1661
+ # Make sure title is never blank
1662
+ self.title = vclass.name if title.blank?
1615
1663
 
1616
1664
  if @parent_zip_error
1617
1665
  errors.add('parent_id', @parent_zip_error)
@@ -1663,9 +1711,21 @@ class Node < ActiveRecord::Base
1663
1711
  if vclass.auto_create_discussion
1664
1712
  Discussion.create(:node_id=>self[:id], :lang=>v_lang, :inside => false)
1665
1713
  end
1714
+
1715
+ update_auth_user
1716
+ end
1717
+
1718
+ def node_before_destroy
1719
+ if !visitor.is_manager? && auth_users
1720
+ errors.add(:base, 'Cannot destroy: node is a user')
1721
+ false
1722
+ else
1723
+ true
1724
+ end
1666
1725
  end
1667
1726
 
1668
1727
  def node_after_destroy
1728
+ update_auth_user
1669
1729
  sweep_cache
1670
1730
  end
1671
1731
 
@@ -1747,7 +1807,7 @@ class Node < ActiveRecord::Base
1747
1807
  allOK
1748
1808
  end
1749
1809
 
1750
- # This method is run whenever 'apply' is called.
1810
+ # This method is run whenever 'apply' is called (not on create or destroy).
1751
1811
  def after_all
1752
1812
  return unless super
1753
1813
  if @add_comment
@@ -1762,8 +1822,49 @@ class Node < ActiveRecord::Base
1762
1822
  remove_instance_variable(:@add_comment)
1763
1823
  end
1764
1824
  remove_instance_variable(:@discussion) if defined?(@discussion) # force reload
1765
-
1766
- true
1825
+
1826
+ update_auth_user
1827
+ end
1828
+
1829
+ def update_auth_user
1830
+ if destroyed?
1831
+ if users = auth_users
1832
+ users.each do |user|
1833
+ user.profile_id = nil
1834
+ user.node_id = nil
1835
+ user.status = User::Status[:deleted]
1836
+ if !user.save
1837
+ user.errors.each do |k,v|
1838
+ errors.add("user[#{k}]", v)
1839
+ end
1840
+ end
1841
+ end
1842
+ end
1843
+ errors.empty?
1844
+ elsif users = auth_users
1845
+ auth_user = users.first
1846
+ if auth_user.new_record? || auth_user.changed?
1847
+ users.each do |user|
1848
+ if user.new_record?
1849
+ # Creating user
1850
+ user.node_id = self.id
1851
+ end
1852
+
1853
+ if user.login.blank?
1854
+ user.login = title.strip
1855
+ end
1856
+
1857
+ if !user.save
1858
+ user.errors.each do |k,v|
1859
+ errors.add("user[#{k}]", v)
1860
+ end
1861
+ end
1862
+ end
1863
+ end
1864
+ errors.empty?
1865
+ else
1866
+ true
1867
+ end
1767
1868
  end
1768
1869
 
1769
1870
  def change_klass