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.
- data/.gitignore +20 -0
- data/CREDITS +27 -0
- data/Capfile +3 -0
- data/DEVELOPERS +46 -0
- data/History.txt +15 -0
- data/MIT-LICENSE +19 -0
- data/Rakefile +44 -0
- data/TODO +24 -0
- data/TODO_ZENA_1_0 +23 -0
- data/app/controllers/application_controller.rb +3 -0
- data/app/controllers/documents_controller.rb +22 -56
- data/app/controllers/nodes_controller.rb +42 -27
- data/app/controllers/pings_controller.rb +19 -0
- data/app/controllers/relations_controller.rb +5 -1
- data/app/controllers/sites_controller.rb +1 -46
- data/app/controllers/user_sessions_controller.rb +47 -0
- data/app/controllers/users_controller.rb +1 -0
- data/app/controllers/versions_controller.rb +25 -7
- data/app/controllers/virtual_classes_controller.rb +1 -1
- data/app/helpers/application_helper.rb +1 -1
- data/app/models/comment.rb +2 -1
- data/app/models/contact_content.rb +2 -2
- data/app/models/data_entry.rb +5 -6
- data/app/models/document.rb +14 -10
- data/app/models/document_content.rb +4 -6
- data/app/models/iformat.rb +2 -2
- data/app/models/image_content.rb +6 -9
- data/app/models/node.rb +106 -164
- data/app/models/page.rb +0 -20
- data/app/models/site.rb +42 -12
- data/app/models/template.rb +3 -8
- data/app/models/template_content.rb +2 -0
- data/app/models/text_document.rb +13 -8
- data/app/models/user.rb +47 -100
- data/app/models/user_session.rb +4 -0
- data/app/models/version.rb +1 -1
- data/app/views/comments/create.rjs +3 -3
- data/app/views/comments/edit.rjs +1 -1
- data/app/views/comments/update.rjs +1 -1
- data/app/views/nodes/_import_results.rhtml +1 -1
- data/app/views/nodes/create.rjs +3 -3
- data/app/views/templates/document_create_tabs/_file.rhtml +1 -2
- data/app/views/templates/document_create_tabs/_import.rhtml +7 -2
- data/app/views/templates/edit_tabs/_document.rhtml +1 -3
- data/app/views/templates/edit_tabs/_image.rhtml +1 -3
- data/app/views/versions/_tr.rhtml +1 -1
- data/app/views/versions/edit.rhtml +2 -26
- data/bin/zena +6 -1
- data/bricks/delayed_job/README +18 -0
- data/bricks/delayed_job/migrate/20091104191643_create_delayed_jobs_table.rb +19 -0
- data/bricks/delayed_job/misc/init.rb +8 -0
- data/bricks/delayed_job/misc/tasks.rb +2 -0
- data/bricks/math/patch/application_helper.rb +1 -1
- data/bricks/sphinx/MIT-LICENSE +19 -0
- data/bricks/sphinx/README +19 -0
- data/bricks/sphinx/lib/use_sphinx.rb +78 -0
- data/bricks/sphinx/migrate/20091102171258_add_delta_for_sphinx.rb +9 -0
- data/bricks/sphinx/misc/deploy.rb +20 -0
- data/bricks/sphinx/misc/sphinx.yml +12 -0
- data/bricks/sphinx/misc/tasks.rb +21 -0
- data/bricks/sphinx/patch/node.rb +8 -0
- data/bricks/tags/lib/has_tags.rb +5 -3
- data/bricks/tags/test/zafu/tags.yml +13 -1
- data/config/bricks.yml +35 -0
- data/config/deploy.rb +8 -1
- data/config/environment.rb +1 -1
- data/config/environments/production.rb +1 -1
- data/config/gems.yml +28 -5
- data/config/sphinx.yml +12 -0
- data/db/init/base/skins/default/Node-+popupLayout.zafu +1 -16
- data/db/migrate/20091026161708_add_persistence_token.rb +13 -0
- data/db/migrate/20091101184952_add_session_table.rb +16 -0
- data/db/migrate/20091123175137_add_single_access_token.rb +9 -0
- data/db/migrate/20091124161608_rebuild_fullpath.rb +11 -0
- data/db/schema.rb +21 -8
- data/doc/README_FOR_APP +24 -0
- data/doc/fixtures.graffle +19568 -0
- data/doc/fixtures.pdf +0 -0
- data/doc/template/LICENSE +184 -0
- data/doc/template/README +37 -0
- data/doc/template/allison.css +283 -0
- data/doc/template/allison.js +307 -0
- data/doc/template/allison.rb +260 -0
- data/doc/template/cache/BODY +588 -0
- data/doc/template/cache/CLASS_INDEX +4 -0
- data/doc/template/cache/CLASS_PAGE +1 -0
- data/doc/template/cache/FILE_INDEX +4 -0
- data/doc/template/cache/FILE_PAGE +1 -0
- data/doc/template/cache/FONTS +1 -0
- data/doc/template/cache/FR_INDEX_BODY +1 -0
- data/doc/template/cache/IMGPATH +1 -0
- data/doc/template/cache/INDEX +1 -0
- data/doc/template/cache/JAVASCRIPT +307 -0
- data/doc/template/cache/METHOD_INDEX +4 -0
- data/doc/template/cache/METHOD_LIST +1 -0
- data/doc/template/cache/SRC_PAGE +1 -0
- data/doc/template/cache/STYLE +283 -0
- data/doc/template/cache/URL +1 -0
- data/doc/zafu_changes.yml +29 -0
- data/lib/base_additions.rb +1 -1
- data/lib/bricks.rb +9 -0
- data/lib/bricks/loader.rb +86 -0
- data/lib/bricks/requirements_validation.rb +71 -0
- data/lib/tasks/zena.rake +42 -4
- data/lib/zafu/action.rb +285 -0
- data/lib/zafu/ajax.rb +93 -0
- data/lib/zafu/attributes.rb +117 -0
- data/lib/zafu/calendar.rb +159 -0
- data/lib/zafu/context.rb +330 -0
- data/lib/zafu/core/html.rb +102 -0
- data/lib/zafu/core/move_to_parser.rb +167 -0
- data/lib/zafu/dates.rb +58 -0
- data/lib/zafu/display.rb +502 -0
- data/lib/zafu/eval.rb +66 -0
- data/lib/zafu/experimental.rb +66 -0
- data/lib/zafu/i18n.rb +64 -0
- data/lib/zafu/meta.rb +25 -0
- data/lib/zafu/refactor.rb +73 -0
- data/lib/zafu/support/context.rb +265 -0
- data/lib/zafu/support/dom.rb +145 -0
- data/lib/zafu/support/erb.rb +62 -0
- data/lib/zafu/support/flow.rb +401 -0
- data/lib/zafu/support/forms.rb +461 -0
- data/lib/zafu/support/links.rb +306 -0
- data/lib/zafu_parser.rb +26 -2
- data/lib/zena.rb +34 -15
- data/lib/zena/acts/multiversion.rb +2 -2
- data/lib/zena/acts/secure.rb +41 -30
- data/lib/zena/app.rb +7 -10
- data/lib/zena/controller/test_case.rb +12 -7
- data/lib/zena/crypto_provider/initial.rb +15 -0
- data/lib/zena/db.rb +6 -1
- data/lib/zena/deploy.rb +34 -6
- data/lib/zena/deploy/logrotate_app.rhtml +9 -0
- data/lib/zena/deploy/logrotate_host.rhtml +34 -0
- data/lib/zena/deploy/template.rb +1 -9
- data/lib/zena/foxy_parser.rb +1 -1
- data/lib/zena/info.rb +3 -1
- data/lib/zena/migrator.rb +1 -1
- data/lib/zena/parser.rb +12 -4
- data/lib/zena/parser/zazen_rules.rb +6 -6
- data/lib/zena/parser/zena_rules.rb +1 -7
- data/lib/zena/routes.rb +5 -5
- data/lib/zena/test_controller.rb +7 -2
- data/lib/zena/unit/test_case.rb +6 -8
- data/lib/zena/use/ajax.rb +10 -10
- data/lib/zena/use/authlogic.rb +93 -0
- data/lib/zena/use/dyn_attributes.rb +5 -0
- data/lib/zena/use/html_tags.rb +16 -34
- data/lib/zena/use/i18n.rb +4 -1
- data/lib/zena/use/node_query_finders.rb +8 -4
- data/lib/zena/use/refactor.rb +8 -20
- data/lib/zena/use/relations.rb +1 -0
- data/lib/zena/use/rendering.rb +4 -2
- data/lib/zena/use/search.rb +52 -0
- data/lib/zena/use/test_helper.rb +27 -28
- data/lib/zena/use/upload.rb +188 -0
- data/lib/zena/use/urls.rb +16 -14
- data/lib/zena/use/zafu.rb +16 -63
- data/lib/zena/use/zazen.rb +8 -8
- data/lib/zena/view/test_case.rb +8 -4
- data/locale/en/LC_MESSAGES/zena.mo +0 -0
- data/locale/en/zena.po +3 -3
- data/public/.htaccess +40 -0
- data/public/javascripts/upload-progress.js +17 -8
- data/public/javascripts/zena.js +8 -2
- data/public/stylesheets/popup.css +1 -0
- data/script/about +3 -0
- data/script/apache_logging +25 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/dbconsole +3 -0
- data/script/destroy +3 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/plugin +3 -0
- data/script/process/inspector +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/script/set_revision +29 -0
- data/spec/controllers/versions_controller_spec.rb +11 -0
- data/test/fixtures/files/Node-test.zafu +1 -1
- data/test/functional/nodes_controller_test.rb +25 -0
- data/test/functional/pings_controller_test.rb +8 -0
- data/test/functional/user_sessions_controller_test.rb +59 -0
- data/test/functional/users_controller_test.rb +81 -19
- data/test/helpers/node_query/filters.yml +5 -0
- data/test/helpers/node_query_test.rb +3 -3
- data/test/integration/multiple_hosts_test.rb +1 -1
- data/test/integration/navigation_test.rb +1 -1
- data/test/sites/complex/users.yml +1 -1
- data/test/sites/ocean/users.yml +3 -3
- data/test/sites/zena/users.yml +5 -4
- data/test/test_zena.rb +38 -38
- data/test/unit/cached_page_test.rb +2 -2
- data/test/unit/comment_test.rb +0 -1
- data/test/unit/document_test.rb +23 -11
- data/test/unit/helpers/ping_helper_test.rb +4 -0
- data/test/unit/multiversion_test.rb +24 -16
- data/test/unit/node_test.rb +32 -93
- data/test/unit/note_test.rb +9 -0
- data/test/unit/page_test.rb +2 -2
- data/test/unit/secure_test.rb +2 -12
- data/test/unit/site_test.rb +43 -24
- data/test/unit/template_test.rb +45 -3
- data/test/unit/text_document_test.rb +4 -3
- data/test/unit/user_test.rb +13 -33
- data/test/unit/zena/db_test.rb +8 -0
- data/test/unit/zena/parser/zazen.yml +4 -4
- data/test/unit/zena/use/dates_view_methods_test.rb +2 -1
- data/test/unit/zena/use/html_tags_test.rb +12 -4
- data/test/unit/zena/use/refactor_test.rb +4 -3
- data/test/unit/zena/use/rendering_test.rb +1 -0
- data/test/unit/zena/use/upload_test.rb +76 -0
- data/test/unit/zena/use/urls_test.rb +4 -0
- data/test/unit/zena/use/zafu_test.rb +8 -0
- data/test/unit/zena/workflow/status_version_test.rb +6 -0
- data/test/unit/zena/zena_tags/ajax.yml +4 -4
- data/test/unit/zena/zena_tags/basic.yml +21 -10
- data/test/unit/zena/zena_tags/relations.yml +0 -6
- data/test/unit/zena/zena_tags/rubyless.yml +35 -0
- data/test/unit/zena/zena_tags/zazen.yml +4 -4
- data/test/unit/zena/zena_tags_test.rb +36 -4
- data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +1 -1
- data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +2 -3
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +102 -58
- data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
- data/vendor/TextMate/Zena.tmbundle/info.plist +2 -0
- data/zena.gemspec +2085 -0
- metadata +265 -90
- data/app/controllers/sessions_controller.rb +0 -41
- data/app/views/sites/zena_up.html.erb +0 -11
- data/config/database.yml +0 -40
- data/db/production.sqlite3 +0 -0
- data/lib/bricks/patcher.rb +0 -68
- data/lib/zena/parser/zena_tags.rb +0 -3562
- data/lib/zena/use/authentification.rb +0 -120
- data/public/images/ext/contact_pv.png +0 -0
- data/public/images/ext/other_pv.png +0 -0
- data/public/images/ext/page_pv.png +0 -0
- data/public/images/ext/page_tiny.png +0 -0
- data/public/images/ext/pdf_pv.png +0 -0
- data/public/images/ext/post_pv.png +0 -0
- data/public/images/ext/post_tiny.png +0 -0
- data/public/images/ext/project_pv.png +0 -0
- data/public/images/ext/project_tiny.png +0 -0
- data/public/images/ext/tag_pv.png +0 -0
- data/public/images/ext/zip_pv.png +0 -0
- data/tasks/ann.rake +0 -80
- data/tasks/bones.rake +0 -20
- data/tasks/gem.rake +0 -201
- data/tasks/git.rake +0 -40
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -51
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -292
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- data/tasks/zentest.rake +0 -36
- data/test/fixtures/comments.yml +0 -126
- data/test/fixtures/contact_contents.yml +0 -132
- data/test/fixtures/data_entries.yml +0 -65
- data/test/fixtures/discussions.yml +0 -48
- data/test/fixtures/document_contents.yml +0 -108
- data/test/fixtures/dyn_attributes.yml +0 -66
- data/test/fixtures/groups.yml +0 -86
- data/test/fixtures/groups_users.yml +0 -81
- data/test/fixtures/iformats.yml +0 -29
- data/test/fixtures/links.yml +0 -313
- data/test/fixtures/nodes.yml +0 -2592
- data/test/fixtures/relations.yml +0 -126
- data/test/fixtures/sites.yml +0 -58
- data/test/fixtures/template_contents.yml +0 -172
- data/test/fixtures/users.yml +0 -167
- data/test/fixtures/versions.yml +0 -1911
- data/test/fixtures/virtual_classes.yml +0 -87
- data/test/fixtures/zips.yml +0 -15
- 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
|
|
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
|
|
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
|
|
@@ -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.
|
|
27
|
-
return redirect_to(params.merge(:format => @node.
|
|
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.
|
|
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.
|
|
37
|
+
data = StringIO.new(@node.version.text)
|
|
38
38
|
content_path = nil
|
|
39
39
|
disposition = 'attachment'
|
|
40
40
|
|
|
41
41
|
else
|
|
42
|
-
data = @node.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
data/app/models/comment.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
data/app/models/data_entry.rb
CHANGED
|
@@ -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
|
-
|
|
19
|
-
:node_a_zip =>
|
|
20
|
-
:
|
|
21
|
-
:
|
|
22
|
-
:
|
|
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]
|
data/app/models/document.rb
CHANGED
|
@@ -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
|
-
|
|
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%'",
|
|
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
|
-
|
|
137
|
-
if taken_name =
|
|
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
|
-
#
|
|
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'
|
data/app/models/iformat.rb
CHANGED
|
@@ -9,12 +9,12 @@ class Iformat < ActiveRecord::Base
|
|
|
9
9
|
|
|
10
10
|
class << self
|
|
11
11
|
def [](fmt)
|
|
12
|
-
Thread.current
|
|
12
|
+
Thread.current[:visitor].site.iformats[fmt]
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def list
|
|
16
16
|
res = []
|
|
17
|
-
Thread.current
|
|
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
|
data/app/models/image_content.rb
CHANGED
|
@@ -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
|
-
(
|
|
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.
|