zena 1.2.7 → 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
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)