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
@@ -24,7 +24,7 @@ module Zena
24
24
  v_pub = record['publish_from']
25
25
 
26
26
  if v_pub.kind_of?(String)
27
- v_pub = DateTime.parse(record['publish_from']) rescue Time.now
27
+ v_pub = DateTime.parse(record['publish_from']) rescue Time.now.utc
28
28
  end
29
29
 
30
30
  if n_pub.nil? || v_pub < n_pub
@@ -37,7 +37,10 @@ module Zena
37
37
  elsif record['status'].to_i == Zena::Status::Pub
38
38
  # ok for readers
39
39
  r_hash[lang] = record['id'].to_i
40
- v_pub = DateTime.parse(record['publish_from']) rescue Time.now
40
+ v_pub = record['publish_from']
41
+ if v_pub.kind_of?(String)
42
+ v_pub = DateTime.parse(record['publish_from']) rescue Time.now.utc
43
+ end
41
44
  if n_pub.nil? || v_pub < n_pub
42
45
  n_pub = v_pub
43
46
  end
@@ -12,7 +12,7 @@ module Zena
12
12
  module VersionMethods
13
13
  attr_reader :stored_workflow, :status_set
14
14
  # Enable the use of version.backup = 'true' to force clone
15
- attr_accessor :backup
15
+ attr_accessor :backup, :no_clone_on_change
16
16
 
17
17
  def self.included(base)
18
18
  base.before_save :store_workflow_changes
@@ -43,20 +43,28 @@ module Zena
43
43
 
44
44
  # Return true if the version should be cloned if it was changed.
45
45
  def clone_on_change?
46
- # not same user
47
- user_id != visitor.id ||
48
- # changed lang
49
- lang_changed? ||
50
- # new version on top of publication
51
- status_changed? ||
52
- # not in redit time
53
- Time.now > created_at + current_site[:redit_time].to_i
46
+ # List of changed versioned properties
47
+ if @no_clone_on_change
48
+ false
49
+ else
50
+ # not same user
51
+ user_id != visitor.id ||
52
+ # changed lang
53
+ lang_changed? ||
54
+ # new version on top of publication
55
+ status_changed? ||
56
+ # not in redit time
57
+ Time.now > created_at + current_site[:redit_time].to_i
58
+ end
54
59
  end
55
60
 
56
61
  # Returns true if the version has been edited (not just a status change)
57
62
  def edited?
58
- return true if new_record? || (changes.keys - WORKFLOW_ATTRIBUTES != [])
59
- return true if node && node.prop.changed?
63
+ new_record? ||
64
+ (changes.keys - WORKFLOW_ATTRIBUTES != []) ||
65
+ # The node loaded here is guaranteed to be the same as the one where props are changed:
66
+ # node.version.node.object_id == node.object_id
67
+ nprop.changed?
60
68
  end
61
69
 
62
70
  private
@@ -70,6 +78,10 @@ module Zena
70
78
  @status_set = nil
71
79
  true
72
80
  end
81
+
82
+ def nprop
83
+ @nprop ||= node.prop
84
+ end
73
85
 
74
86
  end
75
87
 
@@ -208,14 +220,22 @@ module Zena
208
220
  node.can_drive? && !version.edited?
209
221
  end
210
222
 
223
+ # This is when destroy goes through version removal.
224
+ # When destroy is triggered directly, node_before_destroy is used for validation.
211
225
  add_transition(:destroy_version, :from => (-1..Zena::Status::Rep),
212
226
  :to => -1) do |node, version|
213
- if node.can_drive? && !visitor.is_anon? && (node.versions.count > 1 || node.empty?)
214
- true
227
+ if node.can_drive? && !visitor.is_anon?
228
+ if node.versions.count > 1
229
+ true
230
+ elsif !node.empty?
231
+ [false, "Cannot destroy last version: node is not empty."]
232
+ elsif !visitor.is_manager? && node.auth_users
233
+ [false, "Cannot destroy last version: node is a user."]
234
+ else
235
+ true
236
+ end
215
237
  elsif visitor.is_anon?
216
238
  [false, "Anonymous users are not allowed to destroy versions."]
217
- elsif node.versions.count > 1 || node.empty?
218
- [false, "Cannot destroy last version: node is not empty."]
219
239
  else
220
240
  false
221
241
  end
@@ -353,19 +373,6 @@ module Zena
353
373
  transition && (transition[:validate].nil? || transition[:validate].call(self, version))
354
374
  end
355
375
 
356
- #def allowed_transitions
357
- # @allowed_transitions ||= begin
358
- # prev_status = version.status_was.to_i
359
- # allowed = []
360
- # self.class.transitions.each do |t|
361
- # if t[:from].include?(prev_status)
362
- # allowed << t if transition_allowed?(t)
363
- # end
364
- # end
365
- # allowed
366
- # end
367
- #end
368
-
369
376
  # Returns false is the current visitor does not have enough rights to perform the action.
370
377
  def can_apply?(method)
371
378
  case method
@@ -375,36 +382,57 @@ module Zena
375
382
  can_drive?
376
383
  else
377
384
  # All the other actions are version transition changes
378
- transition_allowed?(method)
385
+ allowed, msg = transition_allowed?(method)
386
+ allowed
379
387
  end
380
388
  end
381
389
 
382
390
  # Gateway to all modifications of the node or it's versions.
383
391
  def apply(method, *args)
384
- res = case method
392
+ case method
385
393
  when :update_attributes
386
394
  self.attributes = args.first
387
- save
388
395
  when :propose
389
396
  # TODO: replace with version.status = ...
390
397
  self.version_attributes = {'status' => args[0] || Zena::Status::Prop}
391
- save
392
398
  when :publish
393
399
  self.version_attributes = {'status' => Zena::Status::Pub}
394
- save
395
400
  when :refuse, :redit
396
401
  self.version_attributes = {'status' => Zena::Status::Red}
397
- save
398
402
  when :unpublish, :remove
399
403
  self.version_attributes = {'status' => Zena::Status::Rem}
400
- save
401
404
  when :destroy_version
402
405
  if versions.count == 1 && empty?
403
- self.destroy # will destroy last version
406
+ return self.destroy # will destroy last version
404
407
  else
405
408
  self.version_attributes = {:__destroy => true}
409
+ end
410
+ else
411
+ return
412
+ end
413
+
414
+ if @version
415
+ # We accessed version, make sure '@node' in version is self
416
+ @version.instance_variable_set(:@node, self)
417
+ end
418
+
419
+ # Determine if we need to lock version cloning
420
+ if @no_clone_on_change || (prop.changed? && !changed_versioned_properties?)
421
+ # We only lock if properties are changed (not in case of status changes: publication, etc)
422
+ begin
423
+ Node.record_timestamps = false
424
+ Version.record_timestamps = false
425
+ version.no_clone_on_change = true
426
+ # Make sure indices are rebuilt
406
427
  save
428
+ ensure
429
+ @no_clone_on_change = nil
430
+ Node.record_timestamps = true
431
+ Version.record_timestamps = true
432
+ version.no_clone_on_change = nil
407
433
  end
434
+ else
435
+ save
408
436
  end
409
437
  end
410
438
 
@@ -487,34 +515,64 @@ module Zena
487
515
  end
488
516
 
489
517
  # Update an node's attributes or the node's version/content attributes. If the attributes contains only
490
- # :v_... or :c_... keys, then only the version will be saved. If the attributes does not contain any :v_... or :c_...
491
- # attributes, only the node is saved, without creating a new version.
518
+ # properties, then only the version will be saved. If the attributes does not contain any properties
519
+ # only the node is saved, without creating a new version.
492
520
  def update_attributes(new_attributes)
493
521
  apply(:update_attributes, new_attributes)
494
522
  end
523
+
524
+ # Used when we want to update properties *without* changing author and/or creating new versions. This
525
+ # is needed when we want to synchronise some properties with an external application.
526
+ def update_attributes_without_clone(new_attributes)
527
+ @no_clone_on_change = true
528
+ apply(:update_attributes, new_attributes)
529
+ end
530
+
531
+ # Used when we want to save changed properties *without* changing author and/or creating new versions.
532
+ # This is needed when we want to synchronise some properties with an external application.
533
+ def save_without_clone
534
+ @no_clone_on_change = true
535
+ apply(:update_attributes, {})
536
+ end
495
537
 
496
538
  private
539
+ def changed_versioned_properties?
540
+ columns = vclass.db_columns
541
+ prop.changes.keys.select do |k|
542
+ if type = columns[k]
543
+ if type.versioned?
544
+ return true
545
+ end
546
+ else
547
+ # Properties defined in the model are versioned.
548
+ return true
549
+ end
550
+ end
551
+ false
552
+ end
553
+
497
554
  def set_workflow_defaults
498
555
  version = self.version
499
-
500
- # Alter version status or set default value
501
- if version.edited? || version.new_record?
502
- if version.status_set?
503
- if version.status == Zena::Status::Pub &&
504
- version.edited? && !full_drive?
505
- # We silently revert to redaction: refuse auto_publish by setting version status.
506
- version.status = Zena::Status::Red
556
+ if !@no_clone_on_change
557
+ # Alter version status or set default value
558
+ if version.edited? || version.new_record?
559
+ if version.status_set?
560
+ if version.status == Zena::Status::Pub &&
561
+ version.edited? && !full_drive?
562
+ # We silently revert to redaction: refuse auto_publish by setting version status.
563
+ version.status = Zena::Status::Red
564
+ end
565
+ else
566
+ # Set default version status
567
+ version.status = (auto_publish? && full_drive?) ? Zena::Status::Pub : Zena::Status::Red
507
568
  end
508
569
  else
509
- # Set default version status
510
- version.status = (auto_publish? && full_drive?) ? Zena::Status::Pub : Zena::Status::Red
570
+ # keep status value set
511
571
  end
512
- else
513
- # keep status value set
514
- end
515
572
 
516
- # Set default version's publish_from date
517
- version.publish_from = version.status.to_i == Zena::Status::Pub ? (version.publish_from || Time.now) : version.publish_from
573
+ # Set default version's publish_from date
574
+ version.publish_from = version.status.to_i == Zena::Status::Pub ? (version.publish_from || Time.now) : version.publish_from
575
+ end
518
576
 
519
577
  # Store transition before any validation takes place
520
578
  set_current_transition
@@ -532,21 +590,6 @@ module Zena
532
590
  else
533
591
  errors.add(:base, message || "You do not have the rights to #{transition[:name].to_s.gsub('_', ' ')}.")
534
592
  end
535
- #unless transition_allowed?(transition)
536
- # if transition_allowed?(transition)
537
- # if [Zena::Status::Prop, Zena::Status::PropWith].include?(@original_version.status)
538
- # errors.add(:base, "You do not have the rights to change a proposition's attributes.")
539
- # else
540
- # errors.add(:base, "You do not have the rights to #{transition[:name].to_s.gsub('_', ' ')} and change attributes.")
541
- # end
542
- # elsif @original_version &&
543
- # (Zena::Status::Prop..Zena::Status::PropWith).include?(@original_version.status) &&
544
- # version.edited?
545
- # errors.add(:base, "You cannot edit while a proposition is beeing reviewed.")
546
- # else
547
- # errors.add(:base, "You do not have the rights to #{transition[:name].to_s.gsub('_', ' ')}.")
548
- # end
549
- #end
550
593
  elsif version.edited? && (Zena::Status::Prop..Zena::Status::PropWith).include?(version.status_was)
551
594
  errors.add(:base, 'You cannot edit while a proposition is beeing reviewed.')
552
595
  else
@@ -611,8 +654,11 @@ module Zena
611
654
  self.publish_from = get_publish_from(version.id)
612
655
  end
613
656
  end
614
-
615
- self.updated_at = Time.now unless changed? # force 'updated_at' sync
657
+
658
+ unless version.no_clone_on_change
659
+ # Do not force updated_at sync when using "update_attributes_without_clone"
660
+ self.updated_at = Time.now unless changed? # force 'updated_at' sync
661
+ end
616
662
  true
617
663
  end
618
664
 
@@ -1,7 +1,48 @@
1
1
  module Zena
2
2
  module Use
3
3
  module ZafuEval
4
+ module ViewMethods
5
+ def zafu_eval(node, code, opts)
6
+ # Setup macro rendering context
7
+ if opts[:template]
8
+ master_template = secure(Node) { Node.find_by_zip(opts[:template]) }
9
+ end
10
+ path = opts[:zafu_url]
11
+ parser = ::Zena::ZafuCompiler.new(code,
12
+ :helper => self,
13
+ :base_path => path,
14
+ :included_history => [path],
15
+ :root => path,
16
+ :master_template => master_template
17
+ )
18
+
19
+ # Setup starting context (note that a lot of the contextual information
20
+ # is lost: no up values).
21
+ _node = node
22
+ node_context = Zena::Use::NodeContext.new('_node', node.vclass)
23
+
24
+ erb = parser.to_erb(
25
+ :dev => false,
26
+ :node => node_context,
27
+ :master_template => master_template
28
+ )
29
+ # Geez if this works...
30
+ ERB.new(erb).result(binding)
31
+ rescue => err
32
+ err.message
33
+ end
34
+ end
35
+
4
36
  module ZafuMethods
37
+ def r_zafu_eval
38
+ return parser_error("Missing 'code' parameter.") unless code = params[:code]
39
+ return parser_error("Not a node context.") unless node.will_be?(Node)
40
+ code = RubyLess.translate(self, code)
41
+ zafu_url = @options[:root]
42
+ master = @context[:master_template]
43
+ out "<%= zafu_eval(#{node.to_s}, #{code}, :zafu_url => #{zafu_url.inspect}, :template => #{master ? master.zip : 'nil'}) %>"
44
+ end
45
+
5
46
  def r_eval
6
47
  text = @blocks.first
7
48
  if !text.kind_of?(String) || @blocks.size > 1
@@ -186,6 +186,7 @@ module Zena
186
186
 
187
187
  safe_method_for Range, :to_a => {:class => [Number]}
188
188
 
189
+ safe_method_for NilClass, :to_s => {:class => String, :pre_processor => true}
189
190
  safe_method_for NilClass, :to_f => {:class => Number, :pre_processor => true}
190
191
  safe_method_for NilClass, :to_i => {:class => Number, :pre_processor => true}
191
192
  safe_method_for NilClass, :to_json => {:class => String, :pre_processor => true}
@@ -247,14 +247,31 @@ module Zena
247
247
  # Return the path of a template for the given skin, mode and format. Compiles the zafu template if needed.
248
248
  def template_url(opts={})
249
249
  # opts[:skin] option removed
250
- @skin = get_skin
251
- mode = opts[:mode]
252
- format = opts[:format] || 'html'
253
- klass = @node.vclass
254
-
255
- # possible classes for the master template :
256
- kpaths = []
257
- klass.kpath.split(//).each_index { |i| kpaths << klass.kpath[0..i] }
250
+ if vclass = opts[:vclass]
251
+ # We know the skin title, skip 'get_skin'
252
+ @skins ||= {}
253
+
254
+ if opts[:skin].to_s =~ /^\$(.*)/
255
+ # The skin passed through the url is $brick-bar if using fs_skin and this does not work.
256
+ @skin = @skins[opts[:skin]] ||= secure(Skin) { visitor.site.root_node.find("skin where z_fs_skin = '#{$1}' in site") }
257
+ else
258
+ @skin = @skins[opts[:skin]] ||= secure(Skin) { Skin.find_by_title(opts[:skin]) }
259
+ end
260
+
261
+ # possible classes for the master template :
262
+ kpaths = [vclass.kpath]
263
+ else
264
+ @skin = get_skin
265
+ vclass = @node.vclass
266
+
267
+ # possible classes for the master template :
268
+ kpaths = []
269
+ vclass.kpath.split(//).each_index { |i| kpaths << vclass.kpath[0..i] }
270
+ end
271
+
272
+ mode = opts[:mode]
273
+ mode = nil if mode.blank?
274
+ format = opts[:format] || 'html'
258
275
 
259
276
  if @skin
260
277
  zafu_url, template = get_best_template(kpaths, format, mode, @skin)
@@ -264,11 +281,8 @@ module Zena
264
281
 
265
282
  path = SITES_ROOT + rel_path
266
283
  if !File.exists?(path) || params[:rebuild]
267
- if @node && klass = VirtualClass.find_by_kpath(template.tkpath)
268
- zafu_node('@node', klass)
269
- else
270
- nil
271
- end
284
+ # Use the template's target vclass as starting context
285
+ zafu_node('@node', VirtualClass.find_by_kpath(template.tkpath))
272
286
 
273
287
  # template is a new record when template is returned for
274
288
  # a static file.
@@ -320,7 +334,7 @@ module Zena
320
334
  end
321
335
 
322
336
  template_url = template_url.split('/')
323
- base_p = ['', current_site.host, 'zafu'] + template_url[0..-2]
337
+ base_p = [current_site.zafu_path] + template_url[0..-2]
324
338
  lang_p = [dev_mode? ? "dev_#{lang}" : lang]
325
339
  part_p = template_url[-1]
326
340
 
@@ -328,21 +342,13 @@ module Zena
328
342
  if !File.exist?(main_fullpath) && build
329
343
  skin = template_url[0]
330
344
  template_name = template_url[-2]
345
+
331
346
  if template_name =~ ::Template::MODE_FORMAT_FROM_TITLE
332
- # title changed force update
333
347
  klass = $1
334
348
  mode = $4 || ''
335
349
  format = $6 || 'html'
336
- # Template rendering node
337
- node_bak = @node
338
- # Find first node matching klass
339
- vclass = VirtualClass[klass]
340
- @node = Node.sfind("#{klass.underscore} in site", :first)
341
- if @node.skin.title != skin
342
- @node.skin = secure(Skin) { Skin.find_by_title(skin) }
343
- end
344
- template_url(:mode => mode, :format => format)
345
- @node = node_bak
350
+
351
+ template_url(:mode => mode, :format => format, :vclass => VirtualClass[klass], :skin => skin)
346
352
  end
347
353
  end
348
354
 
@@ -451,7 +457,7 @@ module Zena
451
457
  end
452
458
  end
453
459
  end
454
-
460
+
455
461
  res = ZafuCompiler.new_with_url(zafu_url, :helper => zafu_helper).to_erb(:dev => dev_mode?, :node => get_node_context, :master_template => template)
456
462
 
457
463
  unless valid_template?(res, opts)