zena 0.15.2 → 0.16.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 (284) hide show
  1. data/.gitignore +20 -0
  2. data/CREDITS +27 -0
  3. data/Capfile +3 -0
  4. data/DEVELOPERS +46 -0
  5. data/History.txt +15 -0
  6. data/MIT-LICENSE +19 -0
  7. data/Rakefile +44 -0
  8. data/TODO +24 -0
  9. data/TODO_ZENA_1_0 +23 -0
  10. data/app/controllers/application_controller.rb +3 -0
  11. data/app/controllers/documents_controller.rb +22 -56
  12. data/app/controllers/nodes_controller.rb +42 -27
  13. data/app/controllers/pings_controller.rb +19 -0
  14. data/app/controllers/relations_controller.rb +5 -1
  15. data/app/controllers/sites_controller.rb +1 -46
  16. data/app/controllers/user_sessions_controller.rb +47 -0
  17. data/app/controllers/users_controller.rb +1 -0
  18. data/app/controllers/versions_controller.rb +25 -7
  19. data/app/controllers/virtual_classes_controller.rb +1 -1
  20. data/app/helpers/application_helper.rb +1 -1
  21. data/app/models/comment.rb +2 -1
  22. data/app/models/contact_content.rb +2 -2
  23. data/app/models/data_entry.rb +5 -6
  24. data/app/models/document.rb +14 -10
  25. data/app/models/document_content.rb +4 -6
  26. data/app/models/iformat.rb +2 -2
  27. data/app/models/image_content.rb +6 -9
  28. data/app/models/node.rb +106 -164
  29. data/app/models/page.rb +0 -20
  30. data/app/models/site.rb +42 -12
  31. data/app/models/template.rb +3 -8
  32. data/app/models/template_content.rb +2 -0
  33. data/app/models/text_document.rb +13 -8
  34. data/app/models/user.rb +47 -100
  35. data/app/models/user_session.rb +4 -0
  36. data/app/models/version.rb +1 -1
  37. data/app/views/comments/create.rjs +3 -3
  38. data/app/views/comments/edit.rjs +1 -1
  39. data/app/views/comments/update.rjs +1 -1
  40. data/app/views/nodes/_import_results.rhtml +1 -1
  41. data/app/views/nodes/create.rjs +3 -3
  42. data/app/views/templates/document_create_tabs/_file.rhtml +1 -2
  43. data/app/views/templates/document_create_tabs/_import.rhtml +7 -2
  44. data/app/views/templates/edit_tabs/_document.rhtml +1 -3
  45. data/app/views/templates/edit_tabs/_image.rhtml +1 -3
  46. data/app/views/versions/_tr.rhtml +1 -1
  47. data/app/views/versions/edit.rhtml +2 -26
  48. data/bin/zena +6 -1
  49. data/bricks/delayed_job/README +18 -0
  50. data/bricks/delayed_job/migrate/20091104191643_create_delayed_jobs_table.rb +19 -0
  51. data/bricks/delayed_job/misc/init.rb +8 -0
  52. data/bricks/delayed_job/misc/tasks.rb +2 -0
  53. data/bricks/math/patch/application_helper.rb +1 -1
  54. data/bricks/sphinx/MIT-LICENSE +19 -0
  55. data/bricks/sphinx/README +19 -0
  56. data/bricks/sphinx/lib/use_sphinx.rb +78 -0
  57. data/bricks/sphinx/migrate/20091102171258_add_delta_for_sphinx.rb +9 -0
  58. data/bricks/sphinx/misc/deploy.rb +20 -0
  59. data/bricks/sphinx/misc/sphinx.yml +12 -0
  60. data/bricks/sphinx/misc/tasks.rb +21 -0
  61. data/bricks/sphinx/patch/node.rb +8 -0
  62. data/bricks/tags/lib/has_tags.rb +5 -3
  63. data/bricks/tags/test/zafu/tags.yml +13 -1
  64. data/config/bricks.yml +35 -0
  65. data/config/deploy.rb +8 -1
  66. data/config/environment.rb +1 -1
  67. data/config/environments/production.rb +1 -1
  68. data/config/gems.yml +28 -5
  69. data/config/sphinx.yml +12 -0
  70. data/db/init/base/skins/default/Node-+popupLayout.zafu +1 -16
  71. data/db/migrate/20091026161708_add_persistence_token.rb +13 -0
  72. data/db/migrate/20091101184952_add_session_table.rb +16 -0
  73. data/db/migrate/20091123175137_add_single_access_token.rb +9 -0
  74. data/db/migrate/20091124161608_rebuild_fullpath.rb +11 -0
  75. data/db/schema.rb +21 -8
  76. data/doc/README_FOR_APP +24 -0
  77. data/doc/fixtures.graffle +19568 -0
  78. data/doc/fixtures.pdf +0 -0
  79. data/doc/template/LICENSE +184 -0
  80. data/doc/template/README +37 -0
  81. data/doc/template/allison.css +283 -0
  82. data/doc/template/allison.js +307 -0
  83. data/doc/template/allison.rb +260 -0
  84. data/doc/template/cache/BODY +588 -0
  85. data/doc/template/cache/CLASS_INDEX +4 -0
  86. data/doc/template/cache/CLASS_PAGE +1 -0
  87. data/doc/template/cache/FILE_INDEX +4 -0
  88. data/doc/template/cache/FILE_PAGE +1 -0
  89. data/doc/template/cache/FONTS +1 -0
  90. data/doc/template/cache/FR_INDEX_BODY +1 -0
  91. data/doc/template/cache/IMGPATH +1 -0
  92. data/doc/template/cache/INDEX +1 -0
  93. data/doc/template/cache/JAVASCRIPT +307 -0
  94. data/doc/template/cache/METHOD_INDEX +4 -0
  95. data/doc/template/cache/METHOD_LIST +1 -0
  96. data/doc/template/cache/SRC_PAGE +1 -0
  97. data/doc/template/cache/STYLE +283 -0
  98. data/doc/template/cache/URL +1 -0
  99. data/doc/zafu_changes.yml +29 -0
  100. data/lib/base_additions.rb +1 -1
  101. data/lib/bricks.rb +9 -0
  102. data/lib/bricks/loader.rb +86 -0
  103. data/lib/bricks/requirements_validation.rb +71 -0
  104. data/lib/tasks/zena.rake +42 -4
  105. data/lib/zafu/action.rb +285 -0
  106. data/lib/zafu/ajax.rb +93 -0
  107. data/lib/zafu/attributes.rb +117 -0
  108. data/lib/zafu/calendar.rb +159 -0
  109. data/lib/zafu/context.rb +330 -0
  110. data/lib/zafu/core/html.rb +102 -0
  111. data/lib/zafu/core/move_to_parser.rb +167 -0
  112. data/lib/zafu/dates.rb +58 -0
  113. data/lib/zafu/display.rb +502 -0
  114. data/lib/zafu/eval.rb +66 -0
  115. data/lib/zafu/experimental.rb +66 -0
  116. data/lib/zafu/i18n.rb +64 -0
  117. data/lib/zafu/meta.rb +25 -0
  118. data/lib/zafu/refactor.rb +73 -0
  119. data/lib/zafu/support/context.rb +265 -0
  120. data/lib/zafu/support/dom.rb +145 -0
  121. data/lib/zafu/support/erb.rb +62 -0
  122. data/lib/zafu/support/flow.rb +401 -0
  123. data/lib/zafu/support/forms.rb +461 -0
  124. data/lib/zafu/support/links.rb +306 -0
  125. data/lib/zafu_parser.rb +26 -2
  126. data/lib/zena.rb +34 -15
  127. data/lib/zena/acts/multiversion.rb +2 -2
  128. data/lib/zena/acts/secure.rb +41 -30
  129. data/lib/zena/app.rb +7 -10
  130. data/lib/zena/controller/test_case.rb +12 -7
  131. data/lib/zena/crypto_provider/initial.rb +15 -0
  132. data/lib/zena/db.rb +6 -1
  133. data/lib/zena/deploy.rb +34 -6
  134. data/lib/zena/deploy/logrotate_app.rhtml +9 -0
  135. data/lib/zena/deploy/logrotate_host.rhtml +34 -0
  136. data/lib/zena/deploy/template.rb +1 -9
  137. data/lib/zena/foxy_parser.rb +1 -1
  138. data/lib/zena/info.rb +3 -1
  139. data/lib/zena/migrator.rb +1 -1
  140. data/lib/zena/parser.rb +12 -4
  141. data/lib/zena/parser/zazen_rules.rb +6 -6
  142. data/lib/zena/parser/zena_rules.rb +1 -7
  143. data/lib/zena/routes.rb +5 -5
  144. data/lib/zena/test_controller.rb +7 -2
  145. data/lib/zena/unit/test_case.rb +6 -8
  146. data/lib/zena/use/ajax.rb +10 -10
  147. data/lib/zena/use/authlogic.rb +93 -0
  148. data/lib/zena/use/dyn_attributes.rb +5 -0
  149. data/lib/zena/use/html_tags.rb +16 -34
  150. data/lib/zena/use/i18n.rb +4 -1
  151. data/lib/zena/use/node_query_finders.rb +8 -4
  152. data/lib/zena/use/refactor.rb +8 -20
  153. data/lib/zena/use/relations.rb +1 -0
  154. data/lib/zena/use/rendering.rb +4 -2
  155. data/lib/zena/use/search.rb +52 -0
  156. data/lib/zena/use/test_helper.rb +27 -28
  157. data/lib/zena/use/upload.rb +188 -0
  158. data/lib/zena/use/urls.rb +16 -14
  159. data/lib/zena/use/zafu.rb +16 -63
  160. data/lib/zena/use/zazen.rb +8 -8
  161. data/lib/zena/view/test_case.rb +8 -4
  162. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  163. data/locale/en/zena.po +3 -3
  164. data/public/.htaccess +40 -0
  165. data/public/javascripts/upload-progress.js +17 -8
  166. data/public/javascripts/zena.js +8 -2
  167. data/public/stylesheets/popup.css +1 -0
  168. data/script/about +3 -0
  169. data/script/apache_logging +25 -0
  170. data/script/breakpointer +3 -0
  171. data/script/console +3 -0
  172. data/script/dbconsole +3 -0
  173. data/script/destroy +3 -0
  174. data/script/generate +3 -0
  175. data/script/performance/benchmarker +3 -0
  176. data/script/performance/profiler +3 -0
  177. data/script/plugin +3 -0
  178. data/script/process/inspector +3 -0
  179. data/script/process/reaper +3 -0
  180. data/script/process/spawner +3 -0
  181. data/script/runner +3 -0
  182. data/script/server +3 -0
  183. data/script/set_revision +29 -0
  184. data/spec/controllers/versions_controller_spec.rb +11 -0
  185. data/test/fixtures/files/Node-test.zafu +1 -1
  186. data/test/functional/nodes_controller_test.rb +25 -0
  187. data/test/functional/pings_controller_test.rb +8 -0
  188. data/test/functional/user_sessions_controller_test.rb +59 -0
  189. data/test/functional/users_controller_test.rb +81 -19
  190. data/test/helpers/node_query/filters.yml +5 -0
  191. data/test/helpers/node_query_test.rb +3 -3
  192. data/test/integration/multiple_hosts_test.rb +1 -1
  193. data/test/integration/navigation_test.rb +1 -1
  194. data/test/sites/complex/users.yml +1 -1
  195. data/test/sites/ocean/users.yml +3 -3
  196. data/test/sites/zena/users.yml +5 -4
  197. data/test/test_zena.rb +38 -38
  198. data/test/unit/cached_page_test.rb +2 -2
  199. data/test/unit/comment_test.rb +0 -1
  200. data/test/unit/document_test.rb +23 -11
  201. data/test/unit/helpers/ping_helper_test.rb +4 -0
  202. data/test/unit/multiversion_test.rb +24 -16
  203. data/test/unit/node_test.rb +32 -93
  204. data/test/unit/note_test.rb +9 -0
  205. data/test/unit/page_test.rb +2 -2
  206. data/test/unit/secure_test.rb +2 -12
  207. data/test/unit/site_test.rb +43 -24
  208. data/test/unit/template_test.rb +45 -3
  209. data/test/unit/text_document_test.rb +4 -3
  210. data/test/unit/user_test.rb +13 -33
  211. data/test/unit/zena/db_test.rb +8 -0
  212. data/test/unit/zena/parser/zazen.yml +4 -4
  213. data/test/unit/zena/use/dates_view_methods_test.rb +2 -1
  214. data/test/unit/zena/use/html_tags_test.rb +12 -4
  215. data/test/unit/zena/use/refactor_test.rb +4 -3
  216. data/test/unit/zena/use/rendering_test.rb +1 -0
  217. data/test/unit/zena/use/upload_test.rb +76 -0
  218. data/test/unit/zena/use/urls_test.rb +4 -0
  219. data/test/unit/zena/use/zafu_test.rb +8 -0
  220. data/test/unit/zena/workflow/status_version_test.rb +6 -0
  221. data/test/unit/zena/zena_tags/ajax.yml +4 -4
  222. data/test/unit/zena/zena_tags/basic.yml +21 -10
  223. data/test/unit/zena/zena_tags/relations.yml +0 -6
  224. data/test/unit/zena/zena_tags/rubyless.yml +35 -0
  225. data/test/unit/zena/zena_tags/zazen.yml +4 -4
  226. data/test/unit/zena/zena_tags_test.rb +36 -4
  227. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +1 -1
  228. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +2 -3
  229. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
  230. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +102 -58
  231. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
  232. data/vendor/TextMate/Zena.tmbundle/info.plist +2 -0
  233. data/zena.gemspec +2085 -0
  234. metadata +265 -90
  235. data/app/controllers/sessions_controller.rb +0 -41
  236. data/app/views/sites/zena_up.html.erb +0 -11
  237. data/config/database.yml +0 -40
  238. data/db/production.sqlite3 +0 -0
  239. data/lib/bricks/patcher.rb +0 -68
  240. data/lib/zena/parser/zena_tags.rb +0 -3562
  241. data/lib/zena/use/authentification.rb +0 -120
  242. data/public/images/ext/contact_pv.png +0 -0
  243. data/public/images/ext/other_pv.png +0 -0
  244. data/public/images/ext/page_pv.png +0 -0
  245. data/public/images/ext/page_tiny.png +0 -0
  246. data/public/images/ext/pdf_pv.png +0 -0
  247. data/public/images/ext/post_pv.png +0 -0
  248. data/public/images/ext/post_tiny.png +0 -0
  249. data/public/images/ext/project_pv.png +0 -0
  250. data/public/images/ext/project_tiny.png +0 -0
  251. data/public/images/ext/tag_pv.png +0 -0
  252. data/public/images/ext/zip_pv.png +0 -0
  253. data/tasks/ann.rake +0 -80
  254. data/tasks/bones.rake +0 -20
  255. data/tasks/gem.rake +0 -201
  256. data/tasks/git.rake +0 -40
  257. data/tasks/notes.rake +0 -27
  258. data/tasks/post_load.rake +0 -34
  259. data/tasks/rdoc.rake +0 -51
  260. data/tasks/rubyforge.rake +0 -55
  261. data/tasks/setup.rb +0 -292
  262. data/tasks/spec.rake +0 -54
  263. data/tasks/svn.rake +0 -47
  264. data/tasks/test.rake +0 -40
  265. data/tasks/zentest.rake +0 -36
  266. data/test/fixtures/comments.yml +0 -126
  267. data/test/fixtures/contact_contents.yml +0 -132
  268. data/test/fixtures/data_entries.yml +0 -65
  269. data/test/fixtures/discussions.yml +0 -48
  270. data/test/fixtures/document_contents.yml +0 -108
  271. data/test/fixtures/dyn_attributes.yml +0 -66
  272. data/test/fixtures/groups.yml +0 -86
  273. data/test/fixtures/groups_users.yml +0 -81
  274. data/test/fixtures/iformats.yml +0 -29
  275. data/test/fixtures/links.yml +0 -313
  276. data/test/fixtures/nodes.yml +0 -2592
  277. data/test/fixtures/relations.yml +0 -126
  278. data/test/fixtures/sites.yml +0 -58
  279. data/test/fixtures/template_contents.yml +0 -172
  280. data/test/fixtures/users.yml +0 -167
  281. data/test/fixtures/versions.yml +0 -1911
  282. data/test/fixtures/virtual_classes.yml +0 -87
  283. data/test/fixtures/zips.yml +0 -15
  284. data/test/functional/sessions_controller_test.rb +0 -73
@@ -0,0 +1,19 @@
1
+ class PingsController < ApplicationController
2
+ def show
3
+ whoami = {
4
+ 'visitor' => "#{visitor.first_name} #{visitor.name}",
5
+ 'site' => current_site.name,
6
+ 'format' => request.format.to_s
7
+ }
8
+ whoami_xml = Builder::XmlMarkup.new.ping do |p|
9
+ p.visitor(whoami['visitor'])
10
+ p.site(whoami['site'])
11
+ p.format(whoami['format'])
12
+ end
13
+ respond_to do |wants|
14
+ wants.html { render :text => whoami.inspect }
15
+ wants.xml { render :xml => whoami_xml }
16
+ end
17
+ end
18
+
19
+ end
@@ -5,7 +5,7 @@ class RelationsController < ApplicationController
5
5
  layout :admin_layout
6
6
 
7
7
  def index
8
- secure!(Relation) do
8
+ secure(Relation) do
9
9
  @relations = Relation.paginate(:all, :order => 'source_role', :per_page => 20, :page => params[:page])
10
10
  end
11
11
  @relation = Relation.new
@@ -13,6 +13,10 @@ class RelationsController < ApplicationController
13
13
  format.html # index.erb
14
14
  format.xml { render :xml => @relations }
15
15
  end
16
+ rescue ActiveRecord::RecordNotFound => err
17
+ Node.logger.warn "NotFound: #{err.message}"
18
+ Node.logger.warn err.backtrace.join("\n")
19
+ raise err
16
20
  end
17
21
 
18
22
  def show
@@ -1,10 +1,8 @@
1
- require 'net/http' if ENABLE_ZENA_UP
2
1
  class SitesController < ApplicationController
3
2
  before_filter :visitor_node
4
3
  before_filter :remove_methods, :only => [:new, :create, :destroy]
5
- before_filter :find_site, :except => [:index, :create, :new, :zena_up]
4
+ before_filter :find_site, :except => [:index, :create, :new]
6
5
  before_filter :check_is_admin
7
- before_filter :check_can_zena_up, :only => [:zena_up]
8
6
  layout :admin_layout
9
7
 
10
8
  def index
@@ -17,46 +15,6 @@ class SitesController < ApplicationController
17
15
  end
18
16
  end
19
17
 
20
- # Update source code and restart application
21
- def zena_up
22
- # FIXME: this will not work when we move to git...
23
- @current_rev = Zena::REVISION.strip.to_i
24
-
25
- if params[:rev]
26
- @target_rev = params[:rev].to_i
27
- else
28
- latest = Net::HTTP.get('svn.zenadmin.org', '/zena/')
29
- if latest =~ /Revision (\d+)/
30
- @target_rev = $1.strip.to_i
31
- else
32
- # error
33
- end
34
- end
35
-
36
- if @target_rev
37
- if params[:run] == 'start'
38
- if @current_rev >= @target_rev
39
- # up to date (do nothing)
40
- else
41
- `zena_up`
42
- end
43
- return redirect_to(:action => 'zena_up', :run => 'updating', :rev => @target_rev)
44
- elsif params[:run] == 'updating' && @current_rev < @target_rev
45
- # wait to finish
46
- @state = :wait
47
- headers["REFRESH"] = 30
48
- elsif @current_rev >= @target_rev
49
- # done
50
- @state = :done
51
- return redirect_to(:action => 'zena_up', :rev => @target_rev) if params[:run]
52
- else
53
- # status page
54
- end
55
- else
56
- # error
57
- end
58
- end
59
-
60
18
  def show
61
19
  respond_to do |format|
62
20
  format.html
@@ -106,7 +64,4 @@ class SitesController < ApplicationController
106
64
  @site = secure!(Site) { Site.find(params[:id])}
107
65
  end
108
66
 
109
- def check_can_zena_up
110
- ENABLE_ZENA_UP && visitor.is_admin?
111
- end
112
67
  end
@@ -0,0 +1,47 @@
1
+
2
+ =begin rdoc
3
+ Create, destroy sessions by letting users login and logout. When the user does not login, he/she is considered to be the anonymous user.
4
+ =end
5
+ class UserSessionsController < ApplicationController
6
+ skip_before_filter :set_after_login, :force_authentication?
7
+
8
+ def new
9
+ @node = visitor.site.root_node
10
+ render_and_cache :mode => '+login'
11
+ end
12
+
13
+ def create
14
+ User.send(:with_scope, :find => {:conditions => ['site_id = ?', visitor.site.id]}) do
15
+ @user_session = UserSession.new(:login=>params[:login], :password=>params[:password])
16
+ if @user_session.save
17
+ flash[:notice] = "Successfully logged in."
18
+ redirect_to Thread.current[:after_login_url] || nodes_path
19
+ else
20
+ flash[:notice] = "Invalid login or password."
21
+ redirect_to login_url
22
+ end
23
+ end
24
+ end
25
+
26
+ def destroy
27
+ if @user_session = UserSession.find
28
+ @user_session.destroy
29
+ reset_session
30
+ flash[:notice] = "Successfully logged out."
31
+ redirect_to session[:after_login_url] || nodes_path
32
+ else
33
+ redirect_to session[:after_login_url] || nodes_path
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ # Our own version of set_visitor: always load the anonymous user.
40
+ def set_visitor
41
+ unless site = Site.find_by_host(request.host)
42
+ raise ActiveRecord::RecordNotFound.new("host not found #{request.host}")
43
+ end
44
+
45
+ Thread.current[:visitor] = anonymous_visitor(site)
46
+ end
47
+ end
@@ -16,6 +16,7 @@ class UsersController < ApplicationController
16
16
  secure!(User) do
17
17
  @users = User.paginate(:all, :order => 'status DESC, login ASC', :page => params[:page], :per_page => 20)
18
18
  end
19
+
19
20
  get_groups_list
20
21
  @user = User.new
21
22
  respond_to do |format|
@@ -23,29 +23,29 @@ class VersionsController < ApplicationController
23
23
 
24
24
  format.all do
25
25
  # Get document data (inline if possible)
26
- if params[:format] != @node.c_ext
27
- return redirect_to(params.merge(:format => @node.c_ext))
26
+ if params[:format] != @node.safe_content_read('ext')
27
+ return redirect_to(params.merge(:format => (@node.safe_content_read('ext') || 'html')))
28
28
  end
29
29
 
30
30
  if @node.kind_of?(Image) && !ImageBuilder.dummy?
31
31
  img_format = Iformat[params[:mode]]
32
- data = @node.c_file(img_format)
32
+ data = @node.version.content.file(img_format)
33
33
  content_path = @node.version.content.filepath(img_format)
34
34
  disposition = 'inline'
35
35
 
36
36
  elsif @node.kind_of?(TextDocument)
37
- data = StringIO.new(@node.v_text)
37
+ data = StringIO.new(@node.version.text)
38
38
  content_path = nil
39
39
  disposition = 'attachment'
40
40
 
41
41
  else
42
- data = @node.c_file
42
+ data = @node.version.content.file
43
43
  content_path = @node.version.content.filepath
44
44
  disposition = 'inline'
45
45
  end
46
46
  raise ActiveRecord::RecordNotFound unless data
47
47
 
48
- send_data( data.read , :filename=>@node.filename, :type=>@node.c_content_type, :disposition=>disposition)
48
+ send_data( data.read , :filename=>@node.filename, :type=>@node.version.content.content_type, :disposition=>disposition)
49
49
  data.close
50
50
 
51
51
  # should we cache the page ?
@@ -78,6 +78,24 @@ class VersionsController < ApplicationController
78
78
  @edit = true
79
79
  end
80
80
  end
81
+ if params[:close] == 'true'
82
+ js_data << "Zena.reloadAndClose();"
83
+ else
84
+ js_data << <<-END_TXT
85
+ var current_sel = $('text_sel');
86
+ var current_tab = $('text_tab');
87
+
88
+ Event.observe(window, 'resize', function() { Zena.resizeElement('node_v_text'); } );
89
+ Event.observe(window, 'resize', function() { Zena.resizeElement('node_v_text'); } );
90
+ Zena.resizeElement('node_v_text');
91
+
92
+ $('node_form').getElements().each(function(input, index) {
93
+ new Form.Element.Observer(input, 3, function(element, value) {
94
+ opener.Zena.editor_preview('#{preview_node_version_path(:node_id=>@node[:zip], :id=>(@node.v_number || 0), :escape => false)}',element,value);
95
+ });
96
+ });
97
+ END_TXT
98
+ end
81
99
  end
82
100
 
83
101
  def custom_tab
@@ -131,7 +149,7 @@ class VersionsController < ApplicationController
131
149
  # elsif @node.kind_of?(Image)
132
150
  # # view image version
133
151
  # # TODO: how to show the image data of a version ? 'nodes/3/versions/4.jpg' ?
134
- # @node.version.text = "<img src='#{url_for(:controller=>'versions', :node_id=>@node[:zip], :id=>@node.v_number, :format=>@node.c_ext)}'/>"
152
+ # @node.version.text = "<img src='#{url_for(:controller=>'versions', :node_id=>@node[:zip], :id=>@node.v_number, :format=>@node.version.content.ext)}'/>"
135
153
  # elsif @node.kind_of?(TextDocument)
136
154
  # lang = @node.content_lang
137
155
  # lang = lang ? " lang='#{lang}'" : ""
@@ -5,7 +5,7 @@ class VirtualClassesController < ApplicationController
5
5
  layout :admin_layout
6
6
 
7
7
  def index
8
- secure!(VirtualClass) do
8
+ secure(VirtualClass) do
9
9
  @virtual_classes = VirtualClass.paginate(:all, :order => 'name', :per_page => 20, :page => params[:page])
10
10
  end
11
11
  @virtual_class = VirtualClass.new
@@ -1,4 +1,4 @@
1
1
  module ApplicationHelper
2
2
  end
3
3
 
4
- Bricks::Patcher.apply_patches
4
+ Bricks.apply_patches
@@ -12,7 +12,8 @@ class Comment < ActiveRecord::Base
12
12
  safe_method :text => String, :author_name => {:class => String, :nil => true},
13
13
  :discussion_zip => Number
14
14
 
15
- zafu_context :replies => ["Comment"], :node => "Node"
15
+ safe_context :replies => ['Comment'], :node => 'Node'
16
+
16
17
  attr_accessible :title, :text, :author_name, :discussion_id, :reply_to, :status
17
18
 
18
19
  belongs_to :discussion
@@ -18,8 +18,8 @@ birthday:: birthday (date)
18
18
  class ContactContent < ActiveRecord::Base
19
19
  include RubyLess::SafeClass
20
20
  safe_method :created_at => Time, :updated_at => Time, :fullname => String, :initials => String,
21
- :address => String, :zip => {:class => Number, :method => 'id'}
22
- safe_attribute :name, :first_name, :city, :country, :telephone, :mobile, :email
21
+ :address => String
22
+ safe_attribute :name, :first_name, :city, :country, :telephone, :mobile, :email, :zip
23
23
 
24
24
  attr_protected :site_id
25
25
 
@@ -15,15 +15,14 @@ A visitor can edit a data entry if he/she has write access to the reference node
15
15
  class DataEntry < ActiveRecord::Base
16
16
  include RubyLess::SafeClass
17
17
  safe_attribute :created_at, :updated_at, :date, :text, :value_a, :value_b
18
- safe_method :value => {:class => Number, :nil => true, :method => 'value_a'},
19
- :node_a_zip => {:class => Number, :nil => true},
20
- :node_b_zip => {:class => Number, :nil => true},
21
- :node_c_zip => {:class => Number, :nil => true},
22
- :node_d_zip => {:class => Number, :nil => true}
18
+ safe_context :value => {:class => Number, :method => 'value_a'},
19
+ :node_a_zip => Number, :node_b_zip => Number,
20
+ :node_c_zip => Number, :node_d_zip => Number,
21
+ :node_a => 'Node', :node_b => 'Node', :node_c => 'Node',
22
+ :node_d => 'Node', :nodes => ['Node'], :author => 'Contact', :user => 'User'
23
23
 
24
24
  attr_protected :site_id
25
25
 
26
- zafu_context :node_a => "Node", :node_b => "Node", :node_c => "Node", :node_d => "Node", :nodes => ["Node"], :author => "Contact", :user => "User"
27
26
 
28
27
  NodeLinkSymbols = [:node_a, :node_b, :node_c, :node_d]
29
28
  NodeLinkSymbolsId = [:node_a_id, :node_b_id, :node_c_id, :node_d_id]
@@ -35,8 +35,6 @@ c_content_type:: file content-type
35
35
  class Document < Node
36
36
  safe_method :filename => String
37
37
 
38
- before_validation :document_before_validation
39
-
40
38
  class << self
41
39
 
42
40
  def version_class
@@ -56,7 +54,7 @@ class Document < Node
56
54
  content_type = file.content_type
57
55
  elsif ct = attrs['c_content_type'] || ((attrs['version_attributes'] || {})['content_attributes'] || {})['content_type']
58
56
  content_type = ct
59
- elsif attrs['name'] =~ /^.*\.(\w+)$/ && types = EXT_TO_TYPE[$1.downcase]
57
+ elsif attrs['name'] =~ /^.*\.(\w+)$/ && types = Zena::EXT_TO_TYPE[$1.downcase]
60
58
  content_type = types[0]
61
59
  end
62
60
 
@@ -104,10 +102,8 @@ class Document < Node
104
102
  end
105
103
 
106
104
  private
107
-
108
- # Make sure name is unique
109
- def document_before_validation
110
- base = self[:name]
105
+ def set_defaults
106
+ base = name
111
107
  base = version.title if base.blank?
112
108
  if base.blank? && file = version.content.file
113
109
  base = file.original_filename
@@ -124,23 +120,31 @@ class Document < Node
124
120
  version.title = $1
125
121
  end
126
122
  end
123
+ super
124
+ end
127
125
 
126
+ # Make sure name is unique
127
+ def node_before_validation
128
128
  # we are in a scope, we cannot just use the normal validates_...
129
129
  # FIXME: remove 'with_exclusive_scope' once scopes are clarified and removed from 'secure'
130
130
  Node.send(:with_exclusive_scope) do
131
131
  if new_record?
132
- cond = ["name = ? AND parent_id = ? AND kpath LIKE 'ND%'", self[:name], self[:parent_id]]
132
+ cond = ["name = ? AND parent_id = ? AND kpath LIKE 'ND%'", self[:name], self[:parent_id]]
133
133
  else
134
134
  cond = ["name = ? AND parent_id = ? AND kpath LIKE 'ND%' AND id != ? ", self[:name], self[:parent_id], self[:id]]
135
135
  end
136
- taken_name = Node.find(:all, :conditions=>cond, :order=>"LENGTH(name) DESC", :limit => 1)
137
- if taken_name = taken_name[0]
136
+
137
+ if taken_name = Node.find(:first, :select => 'name', :conditions => cond, :order => "LENGTH(name) DESC")
138
138
  if taken_name =~ /^#{self[:name]}-(\d)/
139
139
  self[:name] = "#{self[:name]}-#{$1.to_i + 1}"
140
+ i = $1.to_i + 1
140
141
  else
141
142
  self[:name] = "#{self[:name]}-1"
143
+ i = 1
142
144
  end
145
+ version.title = "#{version.title}-#{i}" unless version.title.blank?
143
146
  end
144
147
  end
148
+ super
145
149
  end
146
150
  end
@@ -13,7 +13,6 @@ content_type:: file content_type
13
13
  class DocumentContent < ActiveRecord::Base
14
14
 
15
15
  # readable
16
-
17
16
  include RubyLess::SafeClass
18
17
  safe_method :size => Number, :name => String, :content_type => String, :ext => String, :file => File
19
18
 
@@ -79,8 +78,7 @@ class DocumentContent < ActiveRecord::Base
79
78
  digest = Digest::SHA1.hexdigest(self[:id].to_s)
80
79
  # make sure name is not corrupted
81
80
  fname = name.gsub(/[^a-zA-Z\-_0-9]/,'')
82
- # TODO: could we replace site by current_site ?
83
- "#{SITES_ROOT}#{site.data_path}/#{mode}/#{digest[0..0]}/#{digest[1..1]}/#{digest[2..2]}/#{fname}"
81
+ "#{SITES_ROOT}#{current_site.data_path}/#{mode}/#{digest[0..0]}/#{digest[1..1]}/#{digest[2..2]}/#{fname}"
84
82
  end
85
83
 
86
84
  # Return true if this content is not used by any version.
@@ -120,15 +118,15 @@ class DocumentContent < ActiveRecord::Base
120
118
  self[:size] = @new_file.stat.size
121
119
  end
122
120
 
123
- if EXT_TO_TYPE[self.ext].nil? || !EXT_TO_TYPE[self.ext].include?(self.content_type)
121
+ if Zena::EXT_TO_TYPE[self.ext].nil? || !Zena::EXT_TO_TYPE[self.ext].include?(self.content_type)
124
122
  self.ext = @new_file.original_filename.split('.').last
125
123
  end
126
124
  end
127
125
 
128
126
  # is this extension valid ?
129
- extensions = TYPE_TO_EXT[content_type]
127
+ extensions = Zena::TYPE_TO_EXT[content_type]
130
128
  if extensions && content_type != 'application/octet-stream' # use 'bin' extension only if we do not have any other ext.
131
- self[:ext] = extensions.include?(self.ext.downcase) ? self.ext.downcase : extensions[0]
129
+ self[:ext] = (self.ext && extensions.include?(self.ext.downcase)) ? self.ext.downcase : extensions[0]
132
130
  else
133
131
  # unknown content_type or 'application/octet-stream' , just keep the extension we have
134
132
  self[:ext] ||= 'bin'
@@ -9,12 +9,12 @@ class Iformat < ActiveRecord::Base
9
9
 
10
10
  class << self
11
11
  def [](fmt)
12
- Thread.current.visitor.site.iformats[fmt]
12
+ Thread.current[:visitor].site.iformats[fmt]
13
13
  end
14
14
 
15
15
  def list
16
16
  res = []
17
- Thread.current.visitor.site.iformats.merge(formats_for_site(visitor.site.id, false)).each do |k,v|
17
+ Thread.current[:visitor].site.iformats.merge(formats_for_site(visitor.site.id, false)).each do |k,v|
18
18
  next if k == :updated_at || k.nil?
19
19
  if v.kind_of?(Iformat)
20
20
  res << v
@@ -14,6 +14,8 @@ height(format):: image height in pixel using the given format
14
14
  ImageContent also provides a +crop+ pseudo attribute to crop an image. See crop=.
15
15
  =end
16
16
  class ImageContent < DocumentContent
17
+ include Zena::Use::Upload::UploadedFile
18
+
17
19
  safe_method :width => Number, :height => Number, :exif => 'ExifData'
18
20
  attr_accessible :content_type, :file, :crop
19
21
 
@@ -49,7 +51,7 @@ class ImageContent < DocumentContent
49
51
  def cropped_file(format)
50
52
  original = format['original'] || @loaded_file || self.file
51
53
  x, y, w, h = format['x'].to_f, format['y'].to_f, format['w'].to_f, format['h'].to_f
52
- new_type = format['format'] ? EXT_TO_TYPE[format['format'].downcase][0] : nil
54
+ new_type = format['format'] ? Zena::EXT_TO_TYPE[format['format'].downcase][0] : nil
53
55
  max = format['max_value'].to_f * (format['max_unit'] == 'Mb' ? 1024 : 1) * 1024
54
56
 
55
57
  # crop image
@@ -61,14 +63,9 @@ class ImageContent < DocumentContent
61
63
  file = Tempfile.new(name)
62
64
  File.open(file.path, "wb") { |f| f.syswrite(img.read) }
63
65
 
64
- ctype = EXT_TO_TYPE[img.format.downcase][0]
65
- fname = "#{name}.#{TYPE_TO_EXT[ctype][0]}"
66
- (class << file; self; end;).class_eval do
67
- alias local_path path if defined?(:path)
68
- define_method(:original_filename) { fname }
69
- define_method(:content_type) { ctype }
70
- end
71
- file
66
+ ctype = Zena::EXT_TO_TYPE[img.format.downcase][0]
67
+ fname = "#{name}.#{Zena::TYPE_TO_EXT[ctype][0]}"
68
+ uploaded_file(file, fname, ctype)
72
69
  end
73
70
 
74
71
  # Set content file, will refuse to accept the file if it is not an image.