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
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <kml xmlns="http://earth.google.com/kml/2.2">
3
+ <Document do='default' host='#{site.host}' do='images' in='project' order='created_at asc'>
4
+ <r:each do='if' test='gps_latitude'>
5
+ <Placemark>
6
+ <name do='title'>Le désert</name>
7
+ <description>
8
+ <![CDATA[
9
+ <r:img mode='med'/><br/>
10
+ <h3 do='parent' do='link'/>
11
+ ]]>
12
+ </description>
13
+ <Point>
14
+ <coordinates><r:show attr='gps_longitude'/>,<r:show attr='gps_latitude'/></coordinates>
15
+ </Point>
16
+ </Placemark>
17
+ </r:each>
18
+ <Placemark>
19
+ <name>Route</name>
20
+ <LineString>
21
+ <extrude>1</extrude>
22
+ <tessellate>1</tessellate>
23
+ <coordinates>
24
+ <r:each><r:if test='gps_latitude'><r:show attr='gps_longitude'/>,<r:show attr='gps_latitude'/>
25
+ </r:if></r:each>
26
+ </coordinates>
27
+ </LineString>
28
+ </Placemark>
29
+ </Document>
30
+ </kml>
@@ -0,0 +1,45 @@
1
+ <r:include template='Node'>
2
+ <r:with part='main'>
3
+ <ul id='main_content' do='posts in site' order='date desc'>
4
+ <li do='add' after='self' klass='Post'/>
5
+ <li do='form'><b>titre</b> <r:input name='title'/> <b>date</b> <r:input name='date' type='date'/> <r:input type='submit'/></li>
6
+ <li class='post' do='each' do='void' name='post'>
7
+ <p class='post_date' do='show' attr='date' format='%b %d'/>
8
+ <p class='icon' do='link' do='image' do='img' mode='post'/>
9
+ <h1 do='title' actions='all'>Donec mauris metus, venenatis vitae</h1>
10
+ <r:void name='text'>
11
+ <r:zazen eval='summary || text' limit='1'/>
12
+ <p class='comments'><r:link do='t'>Lire la suite... </r:link> <r:tags> - mots clés: <r:each join=', ' do='link' href='main' tagged='#{name}'/></r:tags> - <r:link href='this' anchor='comments'>commentaires (<r:show attr='comments_count'/>)</r:link></p>
13
+ </r:void>
14
+ </li>
15
+ </ul>
16
+ </r:with>
17
+
18
+ <div id='lcomments' do='with' part='latest_comments'>
19
+ <h2>commentaires</h2>
20
+ <ul do='comments where status = 50 from nodes in site order by created_at desc limit 9' do='group' by='discussion_id'>
21
+ <li do='each_group'>
22
+ <r:node do='link' class='post' anchor='comments'/>
23
+ <ul>
24
+ <li do='each' class='comment'><span class='date' do='show' attr='created_at' format='%d %b %Hh'/> <r:show attr='author_name'/></li>
25
+ </ul>
26
+ </li>
27
+ </ul>
28
+ </div>
29
+
30
+ <r:with part='pages' do='if' test='can_write?' do='pages'>
31
+ <h2>pages</h2>
32
+ <ul>
33
+ <li do='each' do='link'/>
34
+ <li do='add' klass='Page'/>
35
+ </ul>
36
+ </r:with>
37
+
38
+ <r:with part='photos' do='images in section order by created_at desc limit 15'>
39
+ <h2>photos</h2>
40
+ <p class='map'><a target='_blank' href='http://maps.google.com?q=http://#{site.host}/#{visitor.lang}/project#{main.id}.kml&amp;t=p'>le parcours !</a></p>
41
+ <ul>
42
+ <li do='each' do='img' mode='pv'/>
43
+ </ul>
44
+ </r:with>
45
+ </r:include>
@@ -0,0 +1,30 @@
1
+ <div id='comments' do='discussion' do='comments'>
2
+ <h3 do='t'>comments</h3>
3
+ <ol>
4
+ <li class='comment' alt_class='alt' do='each' name='com'>
5
+ <div class='header'>
6
+ <p class='prop' do='if' test='status < 50'><r:t>Your message has been received and is waiting approval for publication.</r:t></p>
7
+ <span class='date' do='created_at' tformat='comment_date'/>
8
+ <span class='sign' do='show' attr='author_name' sanitize='true'/>
9
+ </div>
10
+ <div class='body'>
11
+ <div class='zazen'>
12
+ <r:if test='text' do='zazen' attr='text' filter='css,html'/>
13
+ </div>
14
+ </div>
15
+ </li>
16
+ <li class='form' do='form'>
17
+ <ol>
18
+ <li do='cancel'/>
19
+ <li class='author' do='if' test='visitor.is_anon?'><b do='t'>author</b> <r:input name='author_name'/></li>
20
+ <li class='text'>
21
+ <b do='t'>message</b>
22
+ <r:textarea name='text'/>
23
+ </li>
24
+ <li class='captcha' do='captcha' theme='white'/>
25
+ <li class='validate'><r:input type='submit'/></li>
26
+ </ol>
27
+ </li>
28
+ <li do='add'><img src='/img/add.png'/> <r:t>leave a comment</r:t></li>
29
+ </ol>
30
+ </div>
@@ -0,0 +1,11 @@
1
+ translations:
2
+ 'new project': nouveau projet
3
+ 'upcoming dates': prochaines dates
4
+ 'project dates': dates du projet
5
+ project: projet
6
+ title: titre
7
+ comments: commentaires
8
+ 'leave a comment': ajouter un commentaire
9
+ 'Your message has been received and is waiting approval for publication.': Votre message nous est bien parvenu et est en attente de validation.
10
+ post_date: %A, %d %B %Y
11
+ comment_date: %A, %d %B %Y %Hh%M
@@ -0,0 +1,110 @@
1
+ * {padding:0; margin:0; }
2
+
3
+ body {margin:0; padding:0; background:#111; color:#666; font:12px Verdana, Arial, Tahoma, sans-serif; line-height:20px; }
4
+
5
+ img {border:none; }
6
+ a{ color:#0F61B4; text-decoration:none; }
7
+ a:hover { color:#000; }
8
+ form .date_box { float:none;}
9
+
10
+ #content {width:760px; margin:20px auto; background:#ccad7f; }
11
+
12
+ #header {background:#000 url('/fr/image22.png') no-repeat; height:80px; padding-top:10px;}
13
+ #header a { display:block; height:50px; margin:0px; width:300px;}
14
+
15
+ #navigation {background:#111 url('/fr/image23.gif') repeat-x; height:30px; line-height:30px; margin:0; }
16
+ #navigation ul {list-style-type:none;}
17
+ #navigation li {float:left; border-right:1px solid #444; }
18
+ #navigation li a {display:block; padding:0 20px; text-decoration:none; color:#fff; letter-spacing:1px; }
19
+ #navigation li a:hover {background:#333 url('/fr/image24.gif') repeat-x; color:#fff; text-decoration:none; }
20
+ #navigation .visitor { float:right; border:0;}
21
+ #navigation .visitor a { color:#999; display:inline; padding:5px; font-size:10px;}
22
+ #navigation #search { float:right;}
23
+
24
+ #main {float:left; width:530px; padding:10px; margin-left:50px; line-height:14px; }
25
+ #right h2 {margin-top:10px; font:bold 12px Verdana, 'Trebuchet MS', Sans-serif; padding:5px 0 5px 5px; border-bottom:1px dotted #999; }
26
+ #right ul {color:#999; text-align:left; margin:3px 0 8px 0; padding-left:20px; text-decoration:none; list-style-type:square; }
27
+ #right ul li {padding:2px 0 2px 0px; margin:0 2px; }
28
+ #right ul a {font-weight:600; color:#173D7F; }
29
+ #right ul a:hover { color :#333; }
30
+
31
+ #right { clear:right; float:right; width:130px; padding:5px; margin-right:20px; }
32
+ #right h2 {padding:2px 0 5px 0px; font:bold 14px Verdana, 'Trebuchet MS', Sans-serif; color:#444; border-bottom:1px dotted #999; margin-bottom:5px; margin-top:10px; }
33
+ #right div { clear:both;}
34
+
35
+ #lcomments li,#lcomments ul { list-style-type:none; margin:0;padding:0; color:#444;}
36
+ #lcomments .post { font-size:11px; font-weight:normal; display:block;}
37
+ #lcomments .date { color:#666;}
38
+
39
+ #footer { background:#222; color:#aaa; margin-top:20px; height:30px; line-height:30px; text-align:center; font-size:11px;}
40
+ #footer a { color:inherit; text-decoration:none; }
41
+ #footer a:hover { color:orange; }
42
+
43
+ #main_content { background:white; padding:15px; padding-right:20px; border:1px solid #aaa;}
44
+ ul#main_content { list-style-type:none; }
45
+ #main_content li { position:relative; padding-bottom:3em;}
46
+ #main_content li.btn_add { padding-bottom:0;}
47
+ img.post { border:4px solid #ddd; }
48
+ .post_date { position:absolute; left:-56px; top:0; height:30px; width:30px; background:url('img/dateBg.jpg') no-repeat ;
49
+ font-family:Georgia,"Times New Roman",Times,serif; text-transform:uppercase; font-size:16px;
50
+ padding:5px;}
51
+ .comments { border-bottom:1px solid #ccc; background:#FFE; padding:2px; text-align:right;
52
+ font-size:90%;}
53
+ #main_content h1 { margin:1em 0 1em 10px; font-family:Georgia,"Times New Roman",Times,serif; font-variant:small-caps;}
54
+ #main_content h1 a { color:inherit;}
55
+ #main_content .zazen { margin-left:10px;}
56
+ .zazen { line-height:18px; font-size:12px; margin-bottom:1em; }
57
+ .zazen .img_title { font-size:80%; margin-bottom:2em; font-style:italic;}
58
+ .zazen p, .zazen h3 { margin-bottom:1em;}
59
+ .zazen img { border:1px solid #333;}
60
+ #main_content .zazen ul {list-style-type:disc;}
61
+ #main_content .zazen li {padding-bottom:0; margin-left:2em;}
62
+
63
+ #photos ul {list-style-type:none;}
64
+ #photos li { float:left; padding:0; margin:2px; line-height:10px;}
65
+ #photos { list-style-type:none; padding:0;}
66
+ #photos img { border:1px solid #777;}
67
+ #photos .btn_add img { border:0;}
68
+
69
+ #pages li.btn_add { list-style-type:none;}
70
+
71
+ #comments ol { margin-top:8px; list-style-type:none;}
72
+ #comments_add, #comments .form { margin-top:18px;}
73
+ #comments .form .btn_x { margin:0;}
74
+ #comments .form ol, #comments .btn_add a { visibility:visible; background:#eee; display:table; padding:9px 9px 8px; margin-top:18px; border:1px solid grey;}
75
+ #comments .btn_add img { float:left; margin-right:4px;}
76
+ #comments .form b { display:block; float:left; width:65px;}
77
+ #comments .form li { clear:both; margin-top:5px;}
78
+ #comments .form .title input, #comments .form .author input { width:360px;}
79
+ #comments .form textarea { width:360px; height:8em;}
80
+
81
+ #main_content li.comment { padding:8px; border-bottom:1px solid #ccc;}
82
+ .alt { background:#eee;}
83
+ .comment .sign { color:#a88; font-size:16px; font-family:Georgia,serif;}
84
+ .comment .date { float:right; color:#a88; font-size:10px;}
85
+ .comment .prop { border:1px solid #055; padding:5px; background:#cee; color:black; font-weight:bold;}
86
+ .comment .body { padding:8px 0; }
87
+
88
+ .captcha { padding: 5px 0 0 63px; height:135px;}
89
+
90
+ #search_results { margin-top:2em;}
91
+ #search_box { width:100%; font-size:0.8em;}
92
+ #search_box input { border:1px inset #444; width:146px; padding:1px; margin:0; font-size:10px;}
93
+ #search_results { width:100%; }
94
+ #search_results p { margin:0;}
95
+ .results, #search_loader { border:1px solid #444; margin:3px 0 0; padding:2px; text-align:left; background:#97A97F; }
96
+ .result_entry { list-style:none; padding:5px 0; border-top:1px solid #647D35;}
97
+ .result_entry:first-child { border-top-width:0;}
98
+ .result_entry img { float:left; margin-right:3px; }
99
+ .result_entry img.mini { border:1px solid grey; float:left; margin:0 2px 0 0;}
100
+
101
+ .result_entry { position:relative;}
102
+ .result_id {color:#5C2200; font-weight:bold; float:left; padding-right:3px; }
103
+ .result_name { font-weight:bold; }
104
+ .result_name em { color:#333; font-size:90%; font-weight:normal;}
105
+ .result_path { color:#bbb;}
106
+
107
+ #location { margin-left:15px; margin-bottom:1em;}
108
+
109
+ /* old browsers hack */
110
+ #main .s50 .actions, .li_s50 .actions, #main .btn_add a { visibility:visible; }
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/../../../../../test/test_helper'
2
+
3
+ class StaticIntegrationTest < Zena::Integration::TestCase
4
+
5
+ context 'A page using a static Skin' do
6
+ subject do
7
+ secure(Node) { nodes(:wiki) }
8
+ end
9
+
10
+ setup do
11
+ $_test_site = 'zena'
12
+ login(:lion)
13
+ skin = secure(Skin) { Skin.create(:title => 'foo', :z_static => 'static-blog', :parent_id => nodes_id(:skins), :v_status => Zena::Status::Pub)}
14
+ subject.skin_id = skin.id
15
+ assert subject.save
16
+ end
17
+
18
+ context 'on zafu rebuild' do
19
+ setup do
20
+ FileUtils.rmtree("#{SITES_ROOT}/test.host/zafu")
21
+ end
22
+
23
+ should 'use static template' do
24
+ get "http://test.host/en/blog#{subject.zip}.html"
25
+ assert_response :success
26
+ assert_match %r{Copyright <a href="#">Static blog</a>}, response.body
27
+ end
28
+ end # with normal access
29
+ end # A page using a static Skin
30
+ end
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + '/../../../../../test/test_helper'
2
+
3
+ class StaticTest < Zena::Unit::TestCase
4
+
5
+ context 'A Skin' do
6
+ setup do
7
+ login(:lion)
8
+ end
9
+
10
+ subject do
11
+ secure(Node) { nodes(:wikiSkin) }
12
+ end
13
+
14
+ should 'have z_static prop' do
15
+ subject.z_static = 'foo'
16
+ assert_equal 'foo', subject.prop['z_static']
17
+ end
18
+
19
+ should 'allow brick-skin values' do
20
+ assert subject.update_attributes(:z_static => 'static-blog')
21
+ end
22
+
23
+ should 'allow nil values' do
24
+ assert subject.update_attributes(:z_static => 'static-blog')
25
+ assert subject.update_attributes(:z_static => nil)
26
+ end
27
+
28
+ should 'not allow any value' do
29
+ assert !subject.update_attributes(:z_static => '../foo-/bar/..')
30
+ assert_equal 'invalid', subject.errors[:z_static]
31
+ end
32
+ end # A Skin
33
+ end
@@ -16,7 +16,7 @@ class Base < ActiveRecord::Migration
16
16
  end
17
17
 
18
18
  create_table "cached_pages", :options => table_options, :force => true do |t|
19
- t.text "path"
19
+ t.string "path"
20
20
  t.datetime "expire_after"
21
21
  t.datetime "created_at"
22
22
  t.integer "node_id"
@@ -320,7 +320,6 @@ class Base < ActiveRecord::Migration
320
320
  t.string "name"
321
321
  t.string "kpath", :limit => 16
322
322
  t.string "real_class", :limit => 16
323
- t.string "icon", :limit => 200
324
323
  t.integer "create_group_id"
325
324
  t.integer "site_id", :null => false
326
325
  t.boolean "auto_create_discussion"
@@ -0,0 +1,10 @@
1
+ class FixCachedPathIndex < ActiveRecord::Migration
2
+ def self.up
3
+ remove_index "cached_pages", :name => "index_cached_pages_on_path_and_site_id" rescue nil
4
+ change_column :cached_pages, :path, :string
5
+ add_index "cached_pages", ["path", "site_id"], :name => "index_cached_pages_on_path_and_site_id"
6
+ end
7
+
8
+ def self.down
9
+ end
10
+ end
@@ -0,0 +1,18 @@
1
+ class RemoveIconField < ActiveRecord::Migration
2
+ def self.up
3
+ if Role.column_names.include?('icon')
4
+ native_key = :icon
5
+ prop_key = 'icon'
6
+ Role.all.each do |rec|
7
+ next unless value = rec[native_key]
8
+ prop = rec.prop
9
+ prop[prop_key] = value
10
+ Zena::Db.execute "UPDATE #{rec.class.table_name} SET properties=#{Zena::Db.quote(rec.class.encode_properties(prop))} WHERE id=#{rec[:id]}"
11
+ end
12
+ remove_column :roles, :icon
13
+ end
14
+ end
15
+
16
+ def self.down
17
+ end
18
+ end
data/config/bricks.yml CHANGED
@@ -4,6 +4,7 @@ test:
4
4
  tags: ON
5
5
  captcha: ON
6
6
  acls: ON
7
+ static: OFF
7
8
  sphinx: OFF
8
9
  worker: OFF
9
10
  uv: OFF
@@ -27,6 +28,7 @@ development:
27
28
  tags: ON
28
29
  captcha: ON
29
30
  acls: ON
31
+ static: OFF
30
32
  sphinx:
31
33
  switch: OFF
32
34
  activate_if:
@@ -58,6 +60,8 @@ production:
58
60
  tags: ON
59
61
  captcha: ON
60
62
  acls: ON
63
+ static: OFF
64
+ single: OFF
61
65
  sphinx:
62
66
  switch: OFF
63
67
  activate_if:
data/config/deploy.rb CHANGED
@@ -1,13 +1,20 @@
1
1
  set :db_name, "zena" # If you change this: no dots in this name !
2
- set :server_ip, nil # FIXME: set this to your remote server IP in the form: "215.0.0.1"
3
- set :app_type, :passenger
2
+ set :server_ip, 'nil' # FIXME: set this to your remote server IP in the form: "215.0.0.1"
4
3
  set :db_password, nil # FIXME: set password (can be anything).
4
+ set :app_type, :mongrel
5
+ set :mongrel_port, 8000
6
+ set :mongrel_count, 3
7
+ set :haproxy_port, 9000
8
+ set :haproxy_password, nil # If you set this, you can view stats on /_haproxy
5
9
 
6
10
  # You need to give the public key from the server to the git repository if the application is not public
7
11
  set :scm, 'git'
8
12
  set :repository, 'git@github.com:YOUR_PROJECT/APPLICATION.git'
9
13
  set :branch, 'master'
10
14
 
15
+ # Uncomment if you are using rvm on the remote server
16
+ # set :rvm_ruby_string, '1.8.7'
17
+
11
18
  if self[:server_ip]
12
19
  #================= ADVANCED SETTINGS =============#
13
20
 
@@ -27,6 +34,14 @@ if self[:server_ip]
27
34
  role :app, "#{ssh_user}@#{server_ip}"
28
35
  role :db, "#{ssh_user}@#{server_ip}", :primary => true
29
36
 
37
+ # Set to 'true' if you use rvm on the remote server
38
+ if self[:rvm_ruby_string]
39
+ $:.unshift(File.expand_path('./lib', ENV['rvm_path'])) # Add RVM's lib directory to the load path.
40
+ require "rvm/capistrano" # Load RVM's capistrano plugin.
41
+ # Uncomment if you are not using a System wide install of rvm
42
+ # set :rvm_type, :user
43
+ end
44
+
30
45
  #================= END ADVANCED SETTINGS ==========#
31
46
  # We need to set RAILS_ROOT and RAILS_ENV to know which bricks we need to load, activate
32
47
  if !defined?(::RAILS_ROOT)
data/config/gems.yml CHANGED
@@ -13,12 +13,12 @@ differ: '= 0.1.2'
13
13
  shoulda: '= 2.10.3'
14
14
  httparty: '= 0.7.8'
15
15
 
16
- querybuilder: '= 1.0.0'
16
+ querybuilder: '= 1.0.1'
17
17
  yamltest: '= 0.7.0'
18
- rubyless: '= 0.8.4'
18
+ rubyless: '= 0.8.5'
19
19
  property: '= 2.2.0'
20
20
  versions: '= 0.3.1'
21
- zafu: '= 0.8.0'
21
+ zafu: '= 0.8.2'
22
22
 
23
23
  jeweler:
24
24
 
@@ -26,10 +26,12 @@ RedCloth:
26
26
  lib: 'redcloth'
27
27
  version: '= 3.0.4'
28
28
 
29
- rmagick:
30
- optional: yes
31
- lib: 'RMagick'
32
- version: '= 2.13.1'
29
+ # Cannot do "gem 'rmagick', '= 1.3.14'" on some hosts. Leave this alone and
30
+ # let 'require' pick whatever it can.
31
+ # rmagick:
32
+ # optional: yes
33
+ # lib: 'RMagick'
34
+ # version: '= 2.13.1'
33
35
 
34
36
  thinking-sphinx:
35
37
  optional: yes