zena 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. data/History.txt +28 -0
  2. data/README.rdoc +6 -6
  3. data/Rakefile +3 -0
  4. data/app/controllers/users_controller.rb +4 -2
  5. data/app/models/acl.rb +6 -0
  6. data/app/models/cached_page.rb +2 -1
  7. data/app/models/document.rb +3 -4
  8. data/app/models/node.rb +8 -5
  9. data/app/models/site.rb +1 -1
  10. data/app/models/template.rb +2 -2
  11. data/app/models/user.rb +5 -3
  12. data/app/views/acls/_add.rhtml +2 -1
  13. data/app/views/acls/_form.rhtml +15 -7
  14. data/app/views/acls/_li.rhtml +2 -0
  15. data/app/views/acls/index.rhtml +3 -1
  16. data/app/views/acls/show.html.erb +1 -1
  17. data/app/views/links/destroy.rjs +16 -2
  18. data/app/views/versions/destroy.rjs +1 -1
  19. data/app/views/zafu/default/Node-admin.zafu +1 -1
  20. data/bin/zena +5 -3
  21. data/bricks/acls/lib/bricks/acls.rb +11 -4
  22. data/bricks/acls/zena/migrate/20110627193757_add_allowed_mode_and_format_to_acl.rb +11 -0
  23. data/bricks/acls/zena/test/integration/acl_integration_test.rb +42 -0
  24. data/bricks/acls/zena/test/sites/erebus/acls.yml +8 -0
  25. data/bricks/mongrel/zena/deploy.rb +19 -0
  26. data/bricks/single/lib/bricks/single.rb +15 -0
  27. data/bricks/single/zena/init.rb +1 -0
  28. data/bricks/sphinx/zena/tasks.rb +1 -1
  29. data/bricks/static/lib/bricks/static.rb +151 -0
  30. data/bricks/static/zena/init.rb +1 -0
  31. data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +12 -0
  32. data/bricks/static/zena/skins/blog/Image-edit.zafu +6 -0
  33. data/bricks/static/zena/skins/blog/Image.zafu +19 -0
  34. data/bricks/static/zena/skins/blog/Node-+index.zafu +1 -0
  35. data/bricks/static/zena/skins/blog/Node-+notFound.zafu +7 -0
  36. data/bricks/static/zena/skins/blog/Node-+search.zafu +19 -0
  37. data/bricks/static/zena/skins/blog/Node.zafu +66 -0
  38. data/bricks/static/zena/skins/blog/Post.zafu +12 -0
  39. data/bricks/static/zena/skins/blog/Project--kml.zafu +30 -0
  40. data/bricks/static/zena/skins/blog/Project.zafu +45 -0
  41. data/bricks/static/zena/skins/blog/comments.zafu +30 -0
  42. data/bricks/static/zena/skins/blog/dict.yml +11 -0
  43. data/bricks/static/zena/skins/blog/img/dateBg.jpg +0 -0
  44. data/bricks/static/zena/skins/blog/img/header.png +0 -0
  45. data/bricks/static/zena/skins/blog/img/mapPin.png +0 -0
  46. data/bricks/static/zena/skins/blog/img/menu.gif +0 -0
  47. data/bricks/static/zena/skins/blog/img/menuover.gif +0 -0
  48. data/bricks/static/zena/skins/blog/img/style.css +110 -0
  49. data/bricks/static/zena/test/integration/static_integration_test.rb +30 -0
  50. data/bricks/static/zena/test/unit/static_test.rb +33 -0
  51. data/bricks/zena/zena/migrate/01_base.rb +1 -2
  52. data/bricks/zena/zena/migrate/20110623072048_fix_cached_path_index.rb +10 -0
  53. data/bricks/zena/zena/migrate/20110710113731_remove_icon_field.rb +18 -0
  54. data/config/bricks.yml +4 -0
  55. data/config/deploy.rb +17 -2
  56. data/config/gems.yml +9 -7
  57. data/config/selenium.yml +38 -0
  58. data/lib/bricks/requirements_validation.rb +8 -2
  59. data/lib/gettext_strings.rb +2 -1
  60. data/lib/tasks/zena.rake +5 -0
  61. data/lib/zena/app.rb +12 -0
  62. data/lib/zena/console.rb +9 -1
  63. data/lib/zena/core_ext/string.rb +7 -2
  64. data/lib/zena/deploy.rb +60 -6
  65. data/lib/zena/deploy/app_init.rhtml +56 -0
  66. data/lib/zena/deploy/haproxy.cnf.rhtml +34 -0
  67. data/lib/zena/deploy/httpd.rhtml +6 -0
  68. data/lib/zena/deploy/start_stop.rhtml +35 -0
  69. data/lib/zena/info.rb +1 -1
  70. data/lib/zena/remote/connection.rb +1 -1
  71. data/lib/zena/site_worker.rb +9 -5
  72. data/lib/zena/use.rb +1 -1
  73. data/lib/zena/use/action.rb +2 -2
  74. data/lib/zena/use/ajax.rb +22 -9
  75. data/lib/zena/use/conditional.rb +5 -0
  76. data/lib/zena/use/context.rb +6 -1
  77. data/lib/zena/use/dates.rb +17 -2
  78. data/lib/zena/use/display.rb +14 -3
  79. data/lib/zena/use/forms.rb +37 -47
  80. data/lib/zena/use/html_tags.rb +3 -0
  81. data/lib/zena/use/node_context.rb +17 -17
  82. data/lib/zena/use/rendering.rb +1 -1
  83. data/lib/zena/use/urls.rb +11 -2
  84. data/lib/zena/use/zafu_attributes.rb +1 -0
  85. data/lib/zena/use/zafu_safe_definitions.rb +16 -1
  86. data/lib/zena/use/zafu_templates.rb +39 -24
  87. data/lib/zena/use/zazen.rb +1 -0
  88. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  89. data/locale/de/zena.po +105 -89
  90. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  91. data/locale/en/zena.mo +0 -0
  92. data/locale/en/zena.po +188 -253
  93. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  94. data/locale/fr/zena.mo +0 -0
  95. data/locale/fr/zena.po +200 -257
  96. data/locale/zena.pot +95 -85
  97. data/public/javascripts/zena.js +2 -2
  98. data/test/fixtures/files/{Node-test.zafu → TestNode.zafu} +206 -4
  99. data/test/functional/nodes_controller_test.rb +2 -2
  100. data/test/integration/navigation_test.rb +9 -3
  101. data/test/integration/query_node/basic.yml +4 -4
  102. data/test/integration/query_node/filters.yml +2 -2
  103. data/test/integration/zafu_compiler/ajax.yml +6 -6
  104. data/test/integration/zafu_compiler/basic.yml +1 -1
  105. data/test/integration/zafu_compiler/calendar.yml +4 -3
  106. data/test/integration/zafu_compiler/conditional.yml +3 -10
  107. data/test/integration/zafu_compiler/context.yml +1 -1
  108. data/test/integration/zafu_compiler/dates.yml +9 -1
  109. data/test/integration/zafu_compiler/display.yml +7 -1
  110. data/test/integration/zafu_compiler/eval.yml +12 -46
  111. data/test/integration/zafu_compiler/forms.yml +1 -1
  112. data/test/integration/zafu_compiler/query.yml +2 -2
  113. data/test/integration/zafu_compiler/relations.yml +19 -9
  114. data/test/integration/zafu_compiler/roles.yml +12 -0
  115. data/test/integration/zafu_compiler/safe_definitions.yml +1 -1
  116. data/test/integration/zafu_compiler/urls.yml +13 -5
  117. data/test/integration/zafu_compiler/version.yml +6 -0
  118. data/test/integration/zafu_compiler/zafu_attributes.yml +4 -4
  119. data/test/integration/zafu_compiler_test.rb +1 -1
  120. data/test/selenium.readme +8 -0
  121. data/test/selenium/Add/0setup.rsel +12 -0
  122. data/test/selenium/Add/add1.rsel +22 -0
  123. data/test/selenium/Add/add2.rsel +22 -0
  124. data/test/selenium/Add/add3.rsel +22 -0
  125. data/test/selenium/Drop/0setup.rsel +12 -0
  126. data/test/selenium/Drop/drop1.rsel +25 -0
  127. data/test/selenium/Drop/drop2.rsel +25 -0
  128. data/test/selenium/Drop/drop3.rsel +51 -0
  129. data/test/selenium/Drop/drop4.rsel +44 -0
  130. data/test/selenium/Drop/drop5.rsel +16 -0
  131. data/test/selenium/Edit/0setup.rsel +12 -0
  132. data/test/selenium/Edit/edit1.rsel +31 -0
  133. data/test/selenium/Edit/edit2.rsel +39 -0
  134. data/test/selenium/Edit/edit3.rsel +40 -0
  135. data/test/selenium/Form/0setup.rsel +12 -0
  136. data/test/selenium/Form/form1.rsel +9 -0
  137. data/test/selenium/Form/form2.rsel +9 -0
  138. data/test/selenium/Paginate/0setup.rsel +12 -0
  139. data/test/selenium/Paginate/paginate1.rsel +24 -0
  140. data/test/selenium/Toggle/0setup.rsel +12 -0
  141. data/test/selenium/Toggle/toggle1.rsel +21 -0
  142. data/test/sites/zena/nodes.yml +4 -4
  143. data/test/sites/zena/roles.yml +3 -2
  144. data/test/sites/zena/versions.yml +12 -11
  145. data/test/unit/core_ext_test.rb +23 -5
  146. data/test/unit/document_test.rb +6 -2
  147. data/test/unit/node_test.rb +2 -2
  148. data/test/unit/remote_test.rb +1 -2
  149. data/test/unit/role_test.rb +2 -2
  150. data/test/unit/user_test.rb +48 -1
  151. data/test/unit/virtual_class_test.rb +7 -7
  152. data/test/unit/zena/acts/secure_test.rb +1 -1
  153. data/test/unit/zena/use/rendering_test.rb +1 -1
  154. data/test/unit/zena/use/urls_test.rb +3 -3
  155. data/zena.gemspec +65 -101
  156. metadata +67 -103
  157. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +0 -24
  158. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +0 -58
  159. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +0 -88
  160. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +0 -27
  161. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +0 -23
  162. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +0 -19
  163. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +0 -19
  164. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +0 -16
  165. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +0 -16
  166. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +0 -16
  167. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +0 -18
  168. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +0 -18
  169. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +0 -16
  170. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +0 -18
  171. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +0 -16
  172. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +0 -16
  173. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +0 -16
  174. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +0 -16
  175. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +0 -16
  176. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +0 -16
  177. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +0 -18
  178. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +0 -16
  179. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +0 -17
  180. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +0 -17
  181. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +0 -18
  182. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +0 -22
  183. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +0 -23
  184. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +0 -25
  185. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +0 -18
  186. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +0 -18
  187. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +0 -18
  188. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +0 -16
  189. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +0 -16
  190. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +0 -20
  191. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +0 -20
  192. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +0 -16
  193. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +0 -16
  194. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +0 -16
  195. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +0 -16
  196. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +0 -16
  197. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +0 -16
  198. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +0 -16
  199. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +0 -18
  200. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +0 -16
  201. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +0 -16
  202. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +0 -16
  203. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +0 -16
  204. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +0 -16
  205. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +0 -16
  206. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +0 -16
  207. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +0 -16
  208. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +0 -16
  209. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +0 -16
  210. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +0 -16
  211. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +0 -16
  212. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +0 -16
  213. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +0 -16
  214. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +0 -16
  215. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +0 -16
  216. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +0 -16
  217. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +0 -16
  218. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +0 -16
  219. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +0 -16
  220. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +0 -16
  221. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +0 -16
  222. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +0 -16
  223. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +0 -16
  224. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +0 -16
  225. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +0 -16
  226. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +0 -16
  227. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +0 -16
  228. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +0 -16
  229. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +0 -16
  230. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +0 -16
  231. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +0 -16
  232. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  233. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +0 -104
  234. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  235. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +0 -17
  236. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +0 -13
  237. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +0 -25
  238. data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +0 -166
  239. data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +0 -304
  240. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +0 -37
  241. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +0 -52
  242. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +0 -39
  243. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +0 -118
  244. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +0 -14
  245. data/vendor/TextMate/Zena.tmbundle/info.plist +0 -17
data/History.txt CHANGED
@@ -1,3 +1,31 @@
1
+ == 1.1.0 2011-07-11
2
+
3
+ * Major changes
4
+ * Fixed 'cached_pages' indexing.
5
+ * Added support for haproxy and init.d scripts in cap deploy rules.
6
+ * Added support for upvalues (variables defined in siblings above).
7
+ * Added mode and format filters to Acl rules.
8
+ * Added Selenium testing
9
+ ** > rake zena:test_server (cleans zafu, setup fixtures, start server)
10
+ ** > rake test:acceptance
11
+ * Using up instead of first element in list_context as 'this' (use "first" to obtain old behavior)
12
+ * Enabled specializable static skins (with proper class loading) to ease code reuse and enable filesystem based development.
13
+ * Created "Single" brick to ease deployment on shared hosting.
14
+
15
+ * Minor changes
16
+ * Fixed 'prefix' option on [url].
17
+ * Console methods now accept SQLiss.
18
+ * Admin interface top link moves to page.
19
+ * Fixed a bug in date parsing: links should use contextual timezone.
20
+ * Added 'versions' safe method to return list of versions for a node.
21
+ * Fixed bricks requirements when database.yml is not present.
22
+ * Fixed [input type='id'] when used on new records.
23
+ * Fixed bugs in [edit] forms and Ajax [add].
24
+ * Fixed bugs in [edit] when used with a table.
25
+ * Fixed initial migration bug when using MySQL.
26
+ * Fixed loading on shared hosts without rmagick (or with an old version).
27
+ * Fixed Role icon (sometimes there is a legacy 'icon' column).
28
+
1
29
  == 1.0.0 2011-06-15
2
30
 
3
31
  * Major changes
data/README.rdoc CHANGED
@@ -8,9 +8,9 @@ licence: MIT
8
8
  = Getting started
9
9
 
10
10
  # sudo gem install zena
11
- # zena myapp
11
+ # zena new myapp
12
12
  # cd myapp
13
- # rake zena:init RAILS_ENV=production
13
+ # zena init
14
14
 
15
15
  You can now visit http://localhost:3000 (user = admin, password = admin)
16
16
 
@@ -21,11 +21,11 @@ These commands do the following:
21
21
  3. ...
22
22
  4. Create the database, migrate, create the 'localhost' website in 'production' environment and start server.
23
23
 
24
- The 'zena:init' rake task does the following:
24
+ The 'zena init' task does the following:
25
25
 
26
26
  # rake db:create RAILS_ENV=production
27
- # rake zena:migrate
28
- # rake zena:mksite LANG=en RAILS_ENV=production PASSWORD=admin HOST=localhost
27
+ # zena migrate
28
+ # zena mksite LANG=en RAILS_ENV=production PASSWORD=admin HOST=localhost
29
29
  # script/server -e production
30
30
 
31
31
  Read more: http://zenadmin.org/documentation
@@ -41,7 +41,7 @@ http://github.com/zena/zena/blob/master/config/zena.rb
41
41
  You should use capistrano to ease deployment. See 'config/delploy.rb'.
42
42
 
43
43
  === Create a new site
44
- # rake zena:mksite HOST=example.com PASSWORD=secret RAILS_ENV=production
44
+ # zena mksite HOST=example.com PASSWORD=secret RAILS_ENV=production
45
45
 
46
46
  === Start
47
47
  # ruby lib/upload_progress_server.rb start
data/Rakefile CHANGED
@@ -27,6 +27,9 @@ begin
27
27
  gemspec.rubyforge_project = 'zena'
28
28
 
29
29
  gemspec.files.exclude 'config/routes.rb'
30
+ gemspec.files.exclude 'vendor/plugins/selenium-on-rails'
31
+ gemspec.files.exclude 'vendor/TextMate'
32
+
30
33
 
31
34
  # Gem dependecies
32
35
  Zena.gem_configuration.each do |gem_name, gem_config|
@@ -63,8 +63,6 @@ class UsersController < ApplicationController
63
63
 
64
64
  get_groups_list
65
65
 
66
- params[:user][:node_attributes] = params[:node]
67
-
68
66
  @user = secure(User) { User.create(params[:user]) }
69
67
  end
70
68
 
@@ -145,7 +143,11 @@ class UsersController < ApplicationController
145
143
  def restrict_access
146
144
  if visitor.is_admin?
147
145
  @admin = true
146
+ if params[:user] && params[:node]
147
+ params[:user][:node_attributes] = params[:node]
148
+ end
148
149
  elsif @user[:id] == visitor[:id]
150
+ # Cannot change linked node
149
151
  if params[:user]
150
152
  # visitor changing his/her own info : restrict fields
151
153
  params[:user].keys.each do |k|
data/app/models/acl.rb CHANGED
@@ -5,6 +5,7 @@ class Acl < ActiveRecord::Base
5
5
  ACTIONS = %w{read update create delete}
6
6
  ACTION_FROM_METHOD = Hash[:get,'read',:put,'update',:post,'create',:delete,'delete']
7
7
 
8
+ before_validation :set_defaults
8
9
  before_save :set_visitor_id, :set_site_id
9
10
  belongs_to :exec_group, :class_name => 'Group', :foreign_key => 'exec_group_id'
10
11
  belongs_to :group
@@ -43,6 +44,11 @@ class Acl < ActiveRecord::Base
43
44
  end
44
45
 
45
46
  protected
47
+ def set_defaults
48
+ self.format = 'html' if format.blank?
49
+ self.mode = '' if mode.nil?
50
+ end
51
+
46
52
  def set_visitor_id
47
53
  self.user_id = visitor.id
48
54
  end
@@ -126,7 +126,8 @@ class CachedPage < ActiveRecord::Base
126
126
 
127
127
  # When destroying a cache record, remove the related cached file.
128
128
  def cached_page_on_destroy
129
- filepath = "#{SITES_ROOT}#{path.gsub('..','')}" # just in case...
129
+ # allow ../public for single site mode
130
+ filepath = "#{SITES_ROOT}#{path.gsub(%r{\.\./(?!public)},'NO/')}" # just in case...
130
131
  CachedPage.logger.info "remove #{filepath}"
131
132
  # if symlink points to a dead file, exist? returns false...
132
133
  FileUtils.rm(filepath) if File.exist?(filepath) || File.symlink?(filepath)
@@ -72,7 +72,7 @@ class Document < Node
72
72
  elsif attrs['title'] =~ /^.*\.(\w+)$/ && types = Zena::EXT_TO_TYPE[$1.downcase]
73
73
  content_type = types[0]
74
74
  end
75
-
75
+
76
76
  real_class = document_class_from_content_type(content_type)
77
77
 
78
78
  unless vclass && vclass.kpath =~ /\A#{real_class.kpath}/
@@ -91,7 +91,7 @@ class Document < Node
91
91
 
92
92
  # Compatibility with VirtualClass
93
93
  alias new_instance new
94
-
94
+
95
95
  # Class list to which this class can change to
96
96
  def change_to_classes_for_form
97
97
  classes_for_form(:class => 'Document', :without => 'Image')
@@ -148,9 +148,8 @@ class Document < Node
148
148
  end
149
149
 
150
150
  # Get the document's public filename using the name and the file extension.
151
- # FIXME: shouldn't we use title here ?
152
151
  def filename
153
- version.attachment.filename
152
+ "#{title}.#{ext}"
154
153
  end
155
154
 
156
155
  # Get the file path defined in attachment.
data/app/models/node.rb CHANGED
@@ -238,12 +238,14 @@ class Node < ActiveRecord::Base
238
238
  :visitor => 'User', [:is_ancestor?, Node] => Boolean,
239
239
  :comments_count => Number,
240
240
  :v => {:class => 'Version', :method => 'version'},
241
+ :versions => {:class => ['Version'], :method => 'zafu_versions'},
241
242
  :version => 'Version', :v_status => Number, :v_lang => String,
242
243
  :v_publish_from => Time, :v_backup => Boolean,
243
244
  :zip => Number, :parent_id => {:class => Number, :nil => true, :method => 'parent_zip'},
244
245
  :user => 'User',
245
246
  :author => author_proc,
246
- :vclass => {:class => 'VirtualClass', :method => 'virtual_class'}
247
+ :vclass => {:class => 'VirtualClass', :method => 'virtual_class'},
248
+ :new_record? => Boolean
247
249
 
248
250
  # This is needed so that we can use secure_scope and secure in search.
249
251
  extend Zena::Acts::Secure
@@ -888,10 +890,8 @@ class Node < ActiveRecord::Base
888
890
  res["#{$1}_zip"] = value
889
891
  elsif key =~ /^(\w+)_ids$/
890
892
  res["#{$1}_zips"] = value.kind_of?(Array) ? value : value.split(',')
891
- elsif key == 'file'
892
- unless value.blank?
893
- res[key] = value
894
- end
893
+ elsif key == 'v_status' || key == 'file'
894
+ res[key] = value unless value.blank?
895
895
  elsif value.kind_of?(Hash)
896
896
  res[key] = transform_attributes(value, base_node, change_timezone, %w{link rel rel_attributes}.include?(key) || is_link)
897
897
  else
@@ -933,6 +933,9 @@ class Node < ActiveRecord::Base
933
933
  end
934
934
  end
935
935
 
936
+ def zafu_versions
937
+ versions.all(:order => 'number desc')
938
+ end
936
939
  # Remove loaded version and properties on reload.
937
940
  def reload
938
941
  @version = nil
data/app/models/site.rb CHANGED
@@ -421,7 +421,7 @@ class Site < ActiveRecord::Base
421
421
  # The visitor used during index rebuild should be an admin user (to index
422
422
  # unpublished templates).
423
423
  def rebuild_index(nodes = nil, page = nil, page_count = nil)
424
- if !nodes
424
+ if !page
425
425
  Site.logger.error("\n----------------- REBUILD INDEX FOR SITE #{host} -----------------\n")
426
426
  Zena::SiteWorker.perform(self, :rebuild_index)
427
427
  else
@@ -14,7 +14,7 @@ Other templates have a title built from the given name, just like any other node
14
14
 
15
15
  =end
16
16
  class Template < TextDocument
17
-
17
+ MODE_FORMAT_FROM_TITLE = /^([A-Z][a-zA-Z]+?)(-(([a-zA-Z_\+]*)(-([a-zA-Z_]+)|))|)(\.|\Z)/
18
18
  property do |p|
19
19
  p.string 'target_klass'
20
20
  p.string 'format'
@@ -82,7 +82,7 @@ class Template < TextDocument
82
82
  self.content_type = 'text/zafu'
83
83
 
84
84
  if prop.title_changed?
85
- if title =~ /^([A-Z][a-zA-Z]+?)(-(([a-zA-Z_\+]*)(-([a-zA-Z_]+)|))|)(\.|\Z)/
85
+ if title =~ MODE_FORMAT_FROM_TITLE
86
86
  # title changed force update
87
87
  self.target_klass = $1 unless prop.target_klass_changed?
88
88
  self.mode = ($4 || '') unless prop.mode_changed?
data/app/models/user.rb CHANGED
@@ -186,10 +186,12 @@ class User < ActiveRecord::Base
186
186
  end
187
187
 
188
188
  def node_attributes=(node_attrs)
189
- if self[:node_id]
189
+ node_attrs.stringify_keys!
190
+ if !node_attrs['id'].blank?
191
+ @node = secure!(Node) { Node.find_node_by_pseudo(node_attrs.delete('id')) }
192
+ self[:node_id] = @node.id
193
+ elsif self[:node_id]
190
194
  @node = secure!(Node) { node_without_secure }
191
- elsif !node_attrs[:id].blank?
192
- @node = secure!(Node) { Node.find_node_by_pseudo(node_attrs.delete(:id)) }
193
195
  else
194
196
  @node = secure(Node) { Node.new_node(prototype_attributes) }
195
197
  end
@@ -1,5 +1,6 @@
1
1
  <tr id='add_acl' class='btn_add'>
2
- <td class='add'><%= link_to_function _('btn_acl_add'), "['add_acl', 'add_acl_form'].each(Element.toggle); " %></td><td colspan='6' class='add_user'></td>
2
+ <td class='add'><%= link_to_function _('btn_acl_add'), "['add_acl', 'add_acl_form'].each(Element.toggle); " %></td>
3
+ <td colspan='8' class='add_user'></td>
3
4
  </tr>
4
5
  <tr id='add_acl_form' style='display:none;'>
5
6
  <%= render :partial=>'acls/form' %>
@@ -5,7 +5,7 @@
5
5
  link_to_function _('btn_x'), "['add_acl', 'add_acl_form'].each(Element.toggle);"
6
6
  end %>
7
7
  </td>
8
- <td class='add' colspan='6'>
8
+ <td class='add' colspan='8'>
9
9
  <div class='errors'><%= error_messages_for(:acl, :object => @acl) %></div>
10
10
  <% if @acl[:id] %>
11
11
  <%= form_remote_tag(:url=> acl_path(@acl)) %>
@@ -16,35 +16,43 @@
16
16
  <% end %>
17
17
  <table cellspacing='0'>
18
18
  <tr>
19
- <td class='label'><%= _('group')%> <%= help('acl_group_help') %></td>
19
+ <td class='label'><%= _('group')%> <%= help(_('acl_group_help')) %></td>
20
20
  <td><%= select('acl', 'group_id', visitor.all_groups.map{|g| [g.name, g.id]}) %></td>
21
21
  </tr>
22
22
  <tr>
23
- <td class='label'><%= _('action')%> <%= help('acl_action_help') %></td>
23
+ <td class='label'><%= _('action')%> <%= help(_('acl_action_help')) %></td>
24
24
  <td><%= select('acl', 'action', Acl::ACTIONS ) %></td>
25
25
  </tr>
26
26
  <tr class='priority'>
27
- <td class='label'><%= _('priority')%> <%= help('acl_priority_help') %></td>
27
+ <td class='label'><%= _('priority')%> <%= help(_('acl_priority_help')) %></td>
28
28
  <td><%= text_field('acl', 'priority', :size => 4 ) %></td>
29
29
  </tr>
30
30
  <tr>
31
31
  <td class='label'><%= _('name')%></td>
32
32
  <td><%= text_field('acl', 'name', :size=>15 ) %></td>
33
33
  </tr>
34
+ <tr>
35
+ <td class='label'><%= _('mode')%> <%= help(_('acl_mode_help')) %></td>
36
+ <td><%= text_field('acl', 'mode', :size=>15 ) %></td>
37
+ </tr>
38
+ <tr>
39
+ <td class='label'><%= _('format')%> <%= help(_('acl_format_help')) %></td>
40
+ <td><%= text_field('acl', 'format', :size=>15 ) %></td>
41
+ </tr>
34
42
  <tr>
35
43
  <td class='label'><%= _('description')%></td>
36
44
  <td><%= text_area('acl', 'description', :rows => 2, :cols => 40) %></td>
37
45
  </tr>
38
46
  <tr>
39
- <td class='label'><%= _('query')%> <%= help('acl_query_help') %></td>
47
+ <td class='label'><%= _('query')%> <%= help(_('acl_query_help')) %></td>
40
48
  <td><%= text_area('acl', 'query', :rows => 4, :cols => 40) %></td>
41
49
  </tr>
42
50
  <tr class='exec'>
43
- <td class='label'><%= _('exec group')%> <%= help('acl_exec_group_help') %></td>
51
+ <td class='label'><%= _('exec group')%> <%= help(_('acl_exec_group_help')) %></td>
44
52
  <td><%= select('acl', 'exec_group_id', visitor.all_groups.map{|g| [g.name, g.id]}, :include_blank => true) %></td>
45
53
  </tr>
46
54
  <tr class='exec'>
47
- <td class='label'><%= _('exec skin')%> <%= help('acl_exec_skin_help') %></td>
55
+ <td class='label'><%= _('exec skin')%> <%= help(_('acl_exec_skin_help')) %></td>
48
56
  <td><%= select('acl', 'exec_skin_id', form_skins, {:include_blank => true, :selected => @acl.exec_skin_zip}) %></td>
49
57
  </tr>
50
58
  <tr>
@@ -3,6 +3,8 @@
3
3
  <td class='group'><%= li.group.name %></td>
4
4
  <td class='act'><%= li.action %></td>
5
5
  <td class='name'><%= li.name %></td>
6
+ <td class='mode'><%= li.mode %></td>
7
+ <td class='format'><%= li.format %></td>
6
8
  <td class='query'><%= li.query %></td>
7
9
  <td class='exec group'><%= li.exec_group_id ? li.exec_group.name : '' %></td>
8
10
  <td class='exec skin'><%= li.exec_skin ? li.exec_skin.title : '' %></td>
@@ -1,11 +1,13 @@
1
1
  <h2 class='title'><%= _('access controls') %></h2>
2
2
  <table class="admin" cellspacing="0">
3
- <tr><th class='nav' colspan='7'><%= will_paginate @acls %></th></tr>
3
+ <tr><th class='nav' colspan='9'><%= will_paginate @acls %></th></tr>
4
4
  <tr>
5
5
  <th>&nbsp;</th>
6
6
  <th><%= _('group') %></th>
7
7
  <th><%= _('action') %></th>
8
8
  <th><%= _('name') %></th>
9
+ <th><%= _('mode') %></th>
10
+ <th><%= _('format') %></th>
9
11
  <th><%= _('query') %></th>
10
12
  <th><%= _('exec group') %></th>
11
13
  <th><%= _('exec skin') %></th>
@@ -1,5 +1,5 @@
1
1
  <h3><%= _('access controls') %></h3>
2
2
  <table class="admin" cellspacing="0">
3
- <tr><th class='nav' colspan='7'>&nbsp;</th></tr>
3
+ <tr><th class='nav' colspan='9'>&nbsp;</th></tr>
4
4
  <%= render :partial=>'acls/li', :collection=>[@acl] %>
5
5
  </table>
@@ -4,8 +4,22 @@ else
4
4
  if @errors || !@node.errors.empty?
5
5
  page.replace_html 'link_errors', :inline=> @errors ? render_errors : error_messages_for(:node, :object => @node)
6
6
  else
7
+ dom_id = "link#{@link[:id]}"
7
8
  page.replace_html 'link_errors', :inline=>''
8
- page.visual_effect :highlight, "link#{@link[:id]}", :duration => 0.3
9
- page.visual_effect :fade, "link#{@link[:id]}", :duration => 0.5
9
+ page << %Q{
10
+ new Effect.Highlight(
11
+ '#{dom_id}', {
12
+ duration: 0.3,
13
+ afterFinish: function() {
14
+ new Effect.Fade('#{dom_id}', {
15
+ duration: 0.5,
16
+ afterFinish: function() {
17
+ $('#{dom_id}').remove();
18
+ }
19
+ });
20
+
21
+ }
22
+ });
23
+ }
10
24
  end
11
25
  end
@@ -1,6 +1,6 @@
1
1
  # only called when the last version is destroyed in 'drive' popup
2
2
  page.replace 'flash_messages', :inline => flash_messages(:page => page)
3
- page.replace 'versions', :partial => 'list'
3
+ page.remove 'versions'
4
4
  page.delay(0.3) do
5
5
  page << " if (parent != window) {
6
6
  parent.Zena.version_preview('#{zen_path(@node.parent)}');
@@ -15,7 +15,7 @@
15
15
  <r:uses_datebox/>
16
16
  </head>
17
17
  <body>
18
- <h1 id='logo' do='link' href='root' mode='admin' do='t'>admin_interface</h1>
18
+ <h1 id='logo' do='link'>admin_interface</h1>
19
19
  <div id='container'>
20
20
  <div id='navigation'>
21
21
  <ul id='menu' do='admin_links'>
data/bin/zena CHANGED
@@ -7,8 +7,10 @@ if %w(--version -v).include? ARGV.first
7
7
  exit(0)
8
8
  end
9
9
 
10
- if ARGV.first == 'init'
11
- exec "rake zena:init RAILS_ENV=#{ARGV[1] || 'production'}"
10
+ ENV['RAILS_ENV'] ||= 'production'
11
+
12
+ unless ARGV.first == 'new'
13
+ exec "rake zena:#{ARGV.join(' ')}"
12
14
  end
13
15
 
14
16
  require 'rails/version'
@@ -16,7 +18,7 @@ require 'rails_generator'
16
18
  require 'rails_generator/scripts/generate'
17
19
  template_path = File.join(Zena::ROOT, 'lib', 'zena', 'deploy', 'template.rb')
18
20
  args = ["-m", template_path]
19
- args << ARGV.first
21
+ args << ARGV[1]
20
22
 
21
23
  puts "Generating zena application from template #{template_path}"
22
24
  Rails::Generator::Base.use_application_sources!
@@ -8,8 +8,10 @@ module Bricks
8
8
  # directory to avoid letting the user render with any zafu template.
9
9
  def template_path_from_template_url_with_acls(template_url=params[:t_url])
10
10
  if visitor.exec_acl && skin = visitor.exec_acl.exec_skin
11
+ # Make sure t_url is using templates in the allowed Skin
11
12
  skin_name = skin.title.to_filename
12
13
  unless template_url[0..skin_name.size] == skin_name + '/'
14
+ # Wrong Skin !
13
15
  Node.logger.warn "Bad t_url used in ACL context (#{template_url}). Visitor = #{visitor.id} // #{visitor.login}"
14
16
  # We do not raise AccessViolation to not give hints.
15
17
  raise ActiveRecord::RecordNotFound
@@ -32,7 +34,7 @@ module Bricks
32
34
  def acl_authorized?(action, params, base_node = nil)
33
35
  node = nil
34
36
  group_ids_bak = group_ids.dup
35
- acls(action).each do |acl|
37
+ acls(action, params[:mode], params[:format]).each do |acl|
36
38
  # Load exec_group to execute query
37
39
  if acl.exec_group_id
38
40
  @group_ids = group_ids_bak + [acl.exec_group_id]
@@ -55,9 +57,14 @@ module Bricks
55
57
  # Find all acls for the visitor for a given action. The action should
56
58
  # be one of the following: 'create', 'read', 'update', 'delete'. See
57
59
  # Acl::ACTIONS.
58
- def acls(action)
60
+ def acls(action, mode, format)
61
+ mode = '' if mode.blank?
62
+ # Can the format be blank ?
63
+ format = 'html' if format.blank?
59
64
  secure(Acl) { Acl.find(:all,
60
- :conditions => ['group_id IN (?) and action = ?', group_ids, action],
65
+ :conditions => [
66
+ 'group_id IN (?) AND action = ? AND (mode = ? OR mode = ?) AND (format = ? OR format = ?)',
67
+ group_ids, action, '*', mode, '*', format],
61
68
  :order => 'priority DESC'
62
69
  )} || []
63
70
  end
@@ -79,7 +86,7 @@ module Bricks
79
86
  else
80
87
  acl_params[:id] = zip
81
88
  end
82
-
89
+
83
90
  visitor.acl_authorized?(::Acl::ACTION_FROM_METHOD[method], acl_params)
84
91
  end
85
92
  end # UserMethods