zena 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -0,0 +1,11 @@
1
+ class AddAllowedModeAndFormatToAcl < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :acls, :mode, :string, :limit => 20
4
+ add_column :acls, :format, :string, :limit => 20
5
+ end
6
+
7
+ def self.down
8
+ remove_column :acls, :mode
9
+ remove_column :acls, :format
10
+ end
11
+ end
@@ -56,6 +56,48 @@ class AclIntegrationTest < Zena::Integration::TestCase
56
56
  assert_match %r{Persephone, Wedding organization}, response.body
57
57
  end
58
58
 
59
+ context 'with fixed mode' do
60
+ setup do
61
+ Zena::Db.execute "UPDATE acls SET mode = 'foo' WHERE id = #{acls_id(:rap)}"
62
+ login(:hades)
63
+ # Create special mode template
64
+ secure(Template) { Template.create(:parent_id => nodes_id(:sky), :title => 'Node-foo', :text => 'foo <r:title/>') }
65
+ post 'http://erebus.host/session', :login=>'demeter', :password=>'demeter'
66
+ end
67
+
68
+ should 'not allow another mode' do
69
+ get "http://erebus.host/oo/project#{nodes_zip(:queen)}.html"
70
+ assert_response :missing
71
+ end
72
+
73
+ should 'allow given mode' do
74
+ get "http://erebus.host/oo/project#{nodes_zip(:queen)}_foo.html"
75
+ assert_response :success
76
+ assert_equal 'foo My Queen', response.body
77
+ end
78
+ end # with fixed mode
79
+
80
+ context 'with fixed format' do
81
+ setup do
82
+ Zena::Db.execute "UPDATE acls SET format = 'csv' WHERE id = #{acls_id(:rap)}"
83
+ login(:hades)
84
+ # Create special mode template
85
+ secure(Template) { Template.create(:parent_id => nodes_id(:sky), :title => 'Node--csv', :text => 'foo;<r:title/>') }
86
+ post 'http://erebus.host/session', :login=>'demeter', :password=>'demeter'
87
+ end
88
+
89
+ should 'not allow another mode' do
90
+ get "http://erebus.host/oo/project#{nodes_zip(:queen)}.html"
91
+ assert_response :missing
92
+ end
93
+
94
+ should 'allow given mode' do
95
+ get "http://erebus.host/oo/project#{nodes_zip(:queen)}.csv"
96
+ assert_response :success
97
+ assert_equal 'foo;My Queen', response.body
98
+ end
99
+ end # with fixed format
100
+
59
101
  context 'using zafu ajax' do
60
102
  setup do
61
103
  @zafu_url = "http://erebus.host/nodes/#{nodes_zip(:queen)}/zafu?t_url=Sky%20view/Node/list1&dom_id=list1"
@@ -12,6 +12,10 @@ rap:
12
12
  # and viewing it through the 'sky' Skin.
13
13
  exec_skin: sky
14
14
  priority: 10
15
+ # allow any mode
16
+ mode: '*'
17
+ # allow any format
18
+ format: '*'
15
19
 
16
20
  # Read self (this never matches)
17
21
  self:
@@ -27,3 +31,7 @@ self:
27
31
  # and viewing it through the 'sky' Skin.
28
32
  exec_skin: sky
29
33
  priority: 5
34
+ # allow any mode
35
+ mode: '*'
36
+ # allow any format
37
+ format: '*'
@@ -8,7 +8,20 @@ Capistrano::Configuration.instance(:must_exist).load do
8
8
  ##############################################################################}
9
9
  else
10
10
  #========================== MONGREL ===============================#
11
+
12
+ self[:ports] = (mongrel_port.to_i...(mongrel_port.to_i + mongrel_count.to_i)).to_a
13
+
11
14
  namespace :app do
15
+ desc "create haproxy config"
16
+ task :haproxy_setup, :roles => :app do
17
+ unless debian_host
18
+ puts "skipping 'logrotate' (debian specific)"
19
+ else
20
+ # Create config/haproxy.cnf
21
+ haproxy_cnf = render("#{templates}/haproxy.cnf.rhtml", :config => self)
22
+ put(haproxy_cnf, "#{deploy_to}/current/config/haproxy.cnf")
23
+ end
24
+ end
12
25
 
13
26
  desc "configure mongrel"
14
27
  task :configure, :roles => :app do
@@ -28,6 +41,12 @@ Capistrano::Configuration.instance(:must_exist).load do
28
41
 
29
42
  run "#{in_current} mongrel_rails cluster::configure -e production -p #{mongrel_port} -N #{mongrel_count} -c #{deploy_to}/current -P log/mongrel.pid -l log/mongrel.log -a 127.0.0.1 --user www-data --group www-data"
30
43
  run "#{in_current} echo 'config_script: config/mongrel_upload_progress.conf' >> config/mongrel_cluster.yml"
44
+
45
+ if self[:haproxy_port]
46
+ # Setup haproxy
47
+ haproxy_setup
48
+ end
49
+
31
50
  end
32
51
 
33
52
  desc "Stop the drb upload_progress server"
@@ -0,0 +1,15 @@
1
+ module Bricks
2
+ module Single
3
+ module SiteMethods
4
+ def self.included(base)
5
+ base.class_eval do
6
+ alias_method_chain :public_path, :single
7
+ end
8
+ end
9
+
10
+ def public_path_with_single
11
+ "/../public"
12
+ end
13
+ end # SiteMethods
14
+ end # Single
15
+ end # Bricks
@@ -0,0 +1 @@
1
+ Zena.use Bricks::Single
@@ -68,7 +68,7 @@ namespace :sphinx do
68
68
  config = YAML.load_file(File.join(RAILS_ROOT, 'config', 'sphinx.yml'))[RAILS_ENV]
69
69
  every = config['run_indexer_at'] || '10,40'
70
70
  res = `crontab -l 2>&1`
71
- if $? != 0 || res =~ /crontab/
71
+ if $? != 0 || res =~ /\Acrontab/
72
72
  puts "Sphinx indexer: could not access crontab (#{res.chomp})"
73
73
  else
74
74
  crontab = res.chomp.split("\n")
@@ -0,0 +1,151 @@
1
+ module Bricks
2
+ module Static
3
+ ELEM = "([a-zA-Z_]+)"
4
+ ELEM_REGEXP = %r{^#{ELEM}$}
5
+ SECURE_PATH_REGEXP = %r{^[a-zA-Z_/]+$}
6
+ STATIC_SKIN_REGEXP = %r{^#{ELEM}-#{ELEM}$}
7
+ ZAFU_URL_REGEXP = %r{^\$#{ELEM}-#{ELEM}/(.+)$}
8
+ BRICK_NAME_REGEXP = %r{^#{RAILS_ROOT}/bricks/#{ELEM}/zena/skins$}
9
+
10
+ module ControllerMethods
11
+ def self.included(base)
12
+ base.alias_method_chain :get_template_text, :static
13
+ base.alias_method_chain :template_url_for_asset, :static
14
+ base.alias_method_chain :get_best_template, :static
15
+ end
16
+
17
+ def get_template_text_with_static(path, section_id = nil)
18
+ if path =~ ZAFU_URL_REGEXP
19
+ brick_name, skin_name, path = $1, $2, $3
20
+ text_from_static(brick_name, skin_name, path)
21
+ elsif section_id.nil? && @static_brick_name && @static_skin_name
22
+ text_from_static(@static_brick_name, @static_skin_name, path)
23
+ else
24
+ get_template_text_without_static(path, section_id)
25
+ end
26
+ end
27
+
28
+ def template_url_for_asset_with_static(opts)
29
+ # TODO
30
+ template_url_for_asset_without_static(opts)
31
+ end
32
+
33
+ def get_best_template_with_static(kpaths, format, mode, skin)
34
+ return get_best_template_without_static(kpaths, format, mode, skin) unless static = skin.z_static
35
+ if idx_template = IdxTemplate.first(
36
+ :conditions => ["tkpath IN (?) AND format = ? AND mode #{mode ? '=' : 'IS'} ? AND (skin_id = ? OR static = ?) AND site_id = ?",
37
+ kpaths, format, mode, skin.id, static, skin.site_id],
38
+ :order => "length(tkpath) DESC, skin_id DESC"
39
+ )
40
+ if idx_template.path.nil?
41
+ template = secure(Template) { Template.find(idx_template.node_id) }
42
+ get_best_template_without_static(kpaths, format, mode, skin, template)
43
+ elsif static =~ STATIC_SKIN_REGEXP
44
+ @static_brick_name, @static_skin_name = $1, $2
45
+ if idx_template.path =~ SECURE_PATH_REGEXP
46
+ zafu_url = "$#{@static_brick_name}-#{@static_skin_name}/#{idx_template.path}"
47
+ template = Template.new
48
+ template.tkpath = idx_template.tkpath
49
+ [zafu_url, template]
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ # TODO
56
+ # Asset resolution: route = /static/static-blog/img/style.css
57
+ # ===> static brick ==> brick path
58
+ # ===> blog/img/style.css ==> brick path/zena/skins/ blog/img/style.css
59
+ # Cache in public directory
60
+ # FIXME: clear_cache should erase /home/static
61
+
62
+ private
63
+ def text_from_static(brick_name, skin_name, path)
64
+ if path =~ SECURE_PATH_REGEXP
65
+ abs_path = File.join(
66
+ RAILS_ROOT, 'bricks', brick_name,
67
+ 'zena', 'skins', skin_name, path + '.zafu')
68
+ File.exist?(abs_path) ? File.read(abs_path) : nil
69
+ end
70
+ end
71
+ end # ControllerMethods
72
+
73
+ module SkinMethods
74
+ def self.included(base)
75
+ base.property do |p|
76
+ p.string 'z_static'
77
+ end
78
+
79
+ base.validate :validate_z_static
80
+ end
81
+
82
+ private
83
+ def validate_z_static
84
+ if !(z_static.nil? || z_static =~ STATIC_SKIN_REGEXP)
85
+ errors.add(:z_static, _('invalid'))
86
+ end
87
+ true
88
+ end
89
+ end # SkinMethods
90
+
91
+ module SiteMethods
92
+ def self.included(base)
93
+ base.alias_method_chain :rebuild_index, :static
94
+ end
95
+
96
+ def rebuild_index_with_static(nodes = nil, page = nil, page_count = nil) if !page
97
+ Zena::SiteWorker.perform(self, :rebuild_static_index, nil)
98
+ end
99
+ rebuild_index_without_static(nodes, page, page_count)
100
+ end
101
+
102
+ def rebuild_static_index
103
+ Zena::Db.execute "DELETE FROM idx_templates WHERE node_id IS NULL AND site_id = #{id}"
104
+ Bricks.paths_for('zena/skins').each do |p|
105
+ if p =~ BRICK_NAME_REGEXP
106
+ brick_name = $1
107
+ list = []
108
+ Dir.foreach(p) do |skin_name|
109
+ if skin_name =~ ELEM_REGEXP
110
+ build_static_index(brick_name, skin_name, "#{p}/#{skin_name}")
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ private
118
+ def build_static_index(brick_name, skin_name, path)
119
+ # path = absolute path
120
+ # 1. Find all templates
121
+ Dir.foreach(path) do |elem|
122
+ next if elem =~ /^\./
123
+ elem_path = File.join(path, elem)
124
+ if File.directory?(elem_path)
125
+ build_static_index(brick_name, skin_name, elem_path)
126
+ elsif elem =~ Template::MODE_FORMAT_FROM_TITLE
127
+ # 2. Get klass, mode, format
128
+ klass = $1
129
+ mode = $4.blank? ? nil : $4
130
+ format = $6 || 'html'
131
+ idx_path = elem_path[%r{^#{RAILS_ROOT}/bricks/#{brick_name}/zena/skins/#{skin_name}/(.+)\.zafu$}, 1]
132
+ # 3. Get kpath
133
+ if idx_path && vclass = VirtualClass[klass]
134
+ tkpath = vclass.kpath
135
+
136
+ # 4. insert idx_template entry (kpath, site_id, mode, format, path relative to bricks/brick/zena/skins/skin_name)
137
+ IdxTemplate.create(
138
+ :tkpath => tkpath,
139
+ :mode => mode,
140
+ :format => format,
141
+ :site_id => id,
142
+ :static => "#{brick_name}-#{skin_name}",
143
+ :path => idx_path
144
+ )
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end # SiteMethods
150
+ end # Static
151
+ end # Bricks
@@ -0,0 +1 @@
1
+ Zena.use Bricks::Static
@@ -0,0 +1,12 @@
1
+ class AddStaticToIdxTemplates < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :idx_templates, :static, :string, :limit => 30
4
+ add_column :idx_templates, :path, :string, :limit => 300
5
+ add_index :idx_templates, [:static], :name => "index_idx_templates_on_static"
6
+ end
7
+
8
+ def self.down
9
+ remove_index :idx_templates, :name => "index_idx_templates_on_static"
10
+ remove_column :idx_templates, :static
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ <r:include template='Image'>
2
+ <r:with part='location' do='form'>
3
+ <r:input type='hidden' name='v_status' value='50'/>
4
+ <a href='http://maps.google.com' target='_blank'>google maps</a>: lat <r:input name='d_gps_latitude'/> lon <r:input name='d_gps_longitude'/><r:input type='submit' value='valider'/>
5
+ </r:with>
6
+ </r:include>
@@ -0,0 +1,19 @@
1
+ <r:include template='Node'>
2
+ <r:with part='title'>
3
+ <h1 do='title' actions='all'/>
4
+ <div id='location'>
5
+ <r:case>
6
+ <r:when test='gps_latitude'>
7
+ <!-- iframe width="200" height="200" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" style='float:left;' do='void' set_src="http://maps.google.com/maps?q=[d_gps_latitude],[d_gps_longitude]&amp;ie=UTF8&amp;t=h&amp;ll=[d_gps]&amp;z=7&amp;iwloc=A&amp;output=embed"></iframe -->
8
+ <p>
9
+ <a target='_blank' do='void' set_href="http://maps.google.com/maps?q=#{gps_latitude},#{gps_longitude}&amp;ie=UTF8&amp;t=h&amp;hq=&amp;ll=#{gps_latitude},#{gps_longitude}&amp;z=7&amp;iwloc=A&amp;source=embed"><r:img src='find(97)'/> voir sur la carte</a> <r:if test='can_write?'>(<r:link mode='edit' do='t'>modifier</r:link>)</r:if>
10
+ </p>
11
+ <p class='clear'>&nbsp;</p>
12
+ </r:when>
13
+ <r:when can='write'>
14
+ <r:link mode='edit' do='t'><r:img src='97'/> ajouter la position gps</r:link>
15
+ </r:when>
16
+ </r:case>
17
+ </div>
18
+ </r:with>
19
+ </r:include>
@@ -0,0 +1 @@
1
+ <r:include template='Project'/>
@@ -0,0 +1,7 @@
1
+ <r:include template='Project'>
2
+ <r:with part='main_content'>
3
+ <div id="not_found">
4
+ <p><b><r:trans>La page demandée n'a pas pu être trouvée...</r:trans></b></p>
5
+ </div>
6
+ </r:with>
7
+ </r:include>
@@ -0,0 +1,19 @@
1
+ <r:include template='Node'>
2
+ <r:with part='main_content'>
3
+
4
+ <h2 do='t'>search results</h2>
5
+
6
+ <ul id='search_results' do='search_results'>
7
+ <li class='result_entry' do='each'>
8
+ <p class='result_image' do='if' kind_of='Document'> <r:link format='data' do='img' alt_src='icon' mode='pv'/><r:else do='img' alt_src='icon' mode='pv' link='self'/></p>
9
+ <p class='result_name'><r:link/></p>
10
+ <p class='result_path'><r:show attr='rootpath'/></p>
11
+ <r:summary/>
12
+ <div class='clear'></div>
13
+ </li>
14
+ <r:else>
15
+ <p do='trans'>no result found</p>
16
+ </r:else>
17
+ </ul>
18
+ </r:with>
19
+ </r:include>
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" do='load' dictionary='dict'>
3
+ <head>
4
+ <title do='root' do='title'>Website Title</title>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <link rel="stylesheet" type="text/css" href="style.css" media="screen" />
7
+ <r:void name='stylesheets' do='stylesheets'/>
8
+ <r:javascripts/>
9
+ <r:uses_datebox/>
10
+ </head>
11
+ <body>
12
+
13
+ <div id="content">
14
+ <r:root>
15
+ <div id="header">
16
+ <p id='logo' do='link' do='t'>&nbsp;</p>
17
+ </div>
18
+ <div id="navigation">
19
+ <ul>
20
+ <li do='link' do='t'>Home</li>
21
+ <li do='menus' do='each' do='link'/>
22
+ <li id='search' do='search_box'/>
23
+ <li class='visitor' do='if' test='can_write?'><r:visitor_link/> - <r:login_link/></li>
24
+ </ul>
25
+ </div>
26
+ </r:root>
27
+ <div id="right">
28
+ <div id='photos' do='images'>
29
+ <h2>photos</h2>
30
+ <ul>
31
+ <li do='each' do='if' test='can_write?'><r:link do='img' mode='pve'/><r:else do='img' mode='pv'/></li>
32
+ <li do='add_document'/>
33
+ </ul>
34
+ </div>
35
+ <r:void name='latest_comments'/>
36
+ <div id='pages' do='nodes'>
37
+ <h2>pages</h2>
38
+ <ul>
39
+ <li do='each' do='link'/>
40
+ <li do='add' klass='Page'/>
41
+ </ul>
42
+ </div>
43
+ <div id='documents' do='Skin?' do='documents'>
44
+ <h2>documents</h2>
45
+ <ul>
46
+ <li do='each' do='link'/>
47
+ <li do='add_document'/>
48
+ </ul>
49
+ </div>
50
+ </div>
51
+
52
+ <div id="main">
53
+ <div id='main_content'>
54
+ <r:void name='title'><h1 do='title' actions='all'/></r:void>
55
+ <r:Image? do='if' test='exif.gps_latitude'><a href='http://maps.google.com?ll=#{exif.gps_latitude},#{exif.gps_longitude}&amp;z=11' do='title'/></r:Image?>
56
+ <r:zazen attr='text' code='#{content_lang}' else='summary'/>
57
+ </div>
58
+ </div>
59
+ <div style="clear: both;"> </div>
60
+
61
+ <div id="footer">
62
+ &copy; Copyright <a href="#">Static blog</a> | <r:zena type='made'/> | <r:login_link/>
63
+ </div>
64
+ </div>
65
+ </body>
66
+ </html>
@@ -0,0 +1,12 @@
1
+ <r:include template='Node'>
2
+ <r:with part='main'>
3
+ <ul id='main_content'>
4
+ <li do='include' template='Project' part='post'>
5
+ <r:with part='text'>
6
+ <r:zazen attr='text' live='true'/>
7
+ <r:include template='comments'/>
8
+ </r:with>
9
+ </r:include>
10
+ </ul>
11
+ </r:with>
12
+ </r:include>