zena 1.2.1 → 1.2.2
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/History.txt +38 -1
- data/app/controllers/documents_controller.rb +7 -5
- data/app/controllers/nodes_controller.rb +47 -6
- data/app/controllers/user_sessions_controller.rb +12 -3
- data/app/controllers/virtual_classes_controller.rb +8 -2
- data/app/models/acl.rb +5 -2
- data/app/models/cached_page.rb +5 -5
- data/app/models/column.rb +27 -4
- data/app/models/group.rb +1 -1
- data/app/models/node.rb +106 -24
- data/app/models/note.rb +2 -1
- data/app/models/relation.rb +9 -4
- data/app/models/relation_proxy.rb +2 -2
- data/app/models/role.rb +12 -5
- data/app/models/site.rb +10 -9
- data/app/models/skin.rb +8 -0
- data/app/models/string_hash.rb +65 -0
- data/app/models/text_document.rb +1 -1
- data/app/models/user.rb +2 -0
- data/app/models/virtual_class.rb +43 -10
- data/app/views/comments/create.rjs +1 -32
- data/app/views/comments/edit.rjs +1 -1
- data/app/views/comments/update.rjs +1 -1
- data/app/views/documents/show.rhtml +1 -1
- data/app/views/groups/_form.rhtml +7 -0
- data/app/views/groups/_li.rhtml +1 -1
- data/app/views/nodes/500.html +2 -1
- data/app/views/nodes/destroy.rjs +2 -0
- data/app/views/sites/jobs.erb +2 -3
- data/app/views/templates/document_create_tabs/_file.rhtml +1 -1
- data/app/views/templates/document_create_tabs/_import.rhtml +4 -1
- data/app/views/templates/document_create_tabs/_template.rhtml +3 -0
- data/app/views/templates/document_create_tabs/_text_document.rhtml +3 -0
- data/app/views/versions/custom_tab.rhtml +1 -1
- data/app/views/versions/edit.rhtml +1 -1
- data/bricks/acls/lib/bricks/acls.rb +3 -3
- data/bricks/acls/zena/test/unit/acl_test.rb +15 -0
- data/bricks/fs_skin/lib/bricks/fs_skin.rb +190 -0
- data/bricks/fs_skin/zena/init.rb +1 -0
- data/bricks/fs_skin/zena/migrate/20110702010330_add_fs_skin_to_idx_templates.rb +12 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Image-edit.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Image.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Node-+index.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Node-+notFound.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Node-+search.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Node.zafu +1 -1
- data/bricks/{static → fs_skin}/zena/skins/blog/Post.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Project--kml.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/Project.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/comments.zafu +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/dict.yml +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/dateBg.jpg +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/header.png +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/mapPin.png +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/menu.gif +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/menuover.gif +0 -0
- data/bricks/{static → fs_skin}/zena/skins/blog/img/style.css +0 -0
- data/bricks/fs_skin/zena/tasks.rb +26 -0
- data/bricks/{static/zena/test/integration/static_integration_test.rb → fs_skin/zena/test/integration/fs_skin_integration_test.rb} +6 -6
- data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +33 -0
- data/bricks/grid/lib/bricks/grid.rb +4 -3
- data/bricks/tags/lib/bricks/tags.rb +1 -7
- data/bricks/zena/zena/migrate/20120605091558_add_ssl_login_to_site.rb +7 -0
- data/bricks/zena/zena/migrate/20120630123551_add_auto_publish_to_group.rb +9 -0
- data/config/bricks.yml +3 -3
- data/config/gems.yml +2 -3
- data/lib/tasks/zena.rake +7 -3
- data/lib/zafu.rb +7 -0
- data/lib/zafu/all.rb +21 -0
- data/lib/zafu/compiler.rb +7 -0
- data/lib/zafu/controller_methods.rb +58 -0
- data/lib/zafu/handler.rb +57 -0
- data/lib/zafu/info.rb +4 -0
- data/lib/zafu/markup.rb +309 -0
- data/lib/zafu/mock_helper.rb +42 -0
- data/lib/zafu/node_context.rb +203 -0
- data/lib/zafu/ordered_hash.rb +53 -0
- data/lib/zafu/parser.rb +676 -0
- data/lib/zafu/parsing_rules.rb +382 -0
- data/lib/zafu/process/ajax.rb +530 -0
- data/lib/zafu/process/conditional.rb +92 -0
- data/lib/zafu/process/context.rb +186 -0
- data/lib/zafu/process/forms.rb +143 -0
- data/lib/zafu/process/html.rb +186 -0
- data/lib/zafu/process/ruby_less_processing.rb +321 -0
- data/lib/zafu/security.rb +15 -0
- data/lib/zafu/template.rb +25 -0
- data/lib/zafu/test_helper.rb +19 -0
- data/lib/zafu/view_methods.rb +6 -0
- data/lib/zena.rb +1 -1
- data/lib/zena/acts/enrollable.rb +1 -1
- data/lib/zena/app.rb +4 -17
- data/lib/zena/console.rb +18 -1
- data/lib/zena/core_ext/file_utils.rb +13 -1
- data/lib/zena/core_ext/fixnum.rb +4 -0
- data/lib/zena/core_ext/float.rb +7 -0
- data/lib/zena/deploy.rb +4 -2
- data/lib/zena/deploy/app_init.rhtml +2 -1
- data/lib/zena/deploy/database.rhtml +1 -1
- data/lib/zena/info.rb +1 -1
- data/lib/zena/parser/zazen_rules.rb +4 -4
- data/lib/zena/routes.rb +1 -1
- data/lib/zena/test_controller.rb +1 -1
- data/lib/zena/use.rb +14 -1
- data/lib/zena/use/action.rb +4 -2
- data/lib/zena/use/ajax.rb +86 -38
- data/lib/zena/use/authlogic.rb +16 -1
- data/lib/zena/use/calendar.rb +37 -17
- data/lib/zena/use/conditional.rb +2 -2
- data/lib/zena/use/context.rb +30 -9
- data/lib/zena/use/dates.rb +39 -3
- data/lib/zena/use/display.rb +6 -19
- data/lib/zena/use/forms.rb +100 -79
- data/lib/zena/use/i18n.rb +40 -16
- data/lib/zena/use/query_builder.rb +0 -6
- data/lib/zena/use/query_node.rb +17 -4
- data/lib/zena/use/relations.rb +1 -3
- data/lib/zena/use/rendering.rb +10 -8
- data/lib/zena/use/scope_index.rb +5 -1
- data/lib/zena/use/search.rb +2 -1
- data/lib/zena/use/urls.rb +82 -77
- data/lib/zena/use/workflow.rb +12 -4
- data/lib/zena/use/zafu_safe_definitions.rb +37 -9
- data/lib/zena/use/zafu_templates.rb +49 -20
- data/lib/zena/use/zazen.rb +6 -2
- data/locale/it/LC_MESSAGES/zena.mo +0 -0
- data/locale/it/zena.mo +0 -0
- data/locale/it/zena.po +1982 -0
- data/public/images/arrow_back.png +0 -0
- data/public/images/remove_tag.png +0 -0
- data/public/javascripts/grid.js +800 -199
- data/public/javascripts/window.js +1 -1
- data/public/javascripts/zena.js +130 -21
- data/public/stylesheets/grid.css +11 -2
- data/public/stylesheets/zena.css +2 -1
- data/test/custom_queries/complex.host.yml +5 -0
- data/test/fixtures/files/TestNode.zafu +36 -0
- data/test/functional/nodes_controller_test.rb +18 -1
- data/test/integration/zafu_compiler/action.yml +2 -2
- data/test/integration/zafu_compiler/ajax.yml +44 -26
- data/test/integration/zafu_compiler/asset.yml +12 -2
- data/test/integration/zafu_compiler/basic.yml +0 -16
- data/test/integration/zafu_compiler/calendar.yml +6 -6
- data/test/integration/zafu_compiler/complex_ok.yml +23 -1
- data/test/integration/zafu_compiler/conditional.yml +5 -5
- data/test/integration/zafu_compiler/context.yml +6 -5
- data/test/integration/zafu_compiler/dates.yml +23 -2
- data/test/integration/zafu_compiler/display.yml +46 -2
- data/test/integration/zafu_compiler/errors.yml +2 -2
- data/test/integration/zafu_compiler/eval.yml +35 -7
- data/test/integration/zafu_compiler/forms.yml +47 -13
- data/test/integration/zafu_compiler/i18n.yml +2 -2
- data/test/integration/zafu_compiler/meta.yml +35 -1
- data/test/integration/zafu_compiler/query.yml +23 -4
- data/test/integration/zafu_compiler/relations.yml +10 -6
- data/test/integration/zafu_compiler/roles.yml +4 -4
- data/test/integration/zafu_compiler/rubyless.yml +11 -1
- data/test/integration/zafu_compiler/safe_definitions.yml +23 -5
- data/test/integration/zafu_compiler/security.yml +10 -6
- data/test/integration/zafu_compiler/urls.yml +23 -6
- data/test/integration/zafu_compiler/zafu_attributes.yml +1 -1
- data/test/integration/zafu_compiler/zazen.yml +14 -0
- data/test/selenium/Add/add3.rsel +8 -8
- data/test/selenium/Destroy/0setup.rsel +12 -0
- data/test/selenium/Destroy/destroy1.rsel +16 -0
- data/test/selenium/Edit/edit2.rsel +9 -9
- data/test/selenium/Edit/edit5.rsel +9 -9
- data/test/selenium/Edit/edit6.rsel +9 -9
- data/test/selenium/Form/form4.rsel +17 -0
- data/test/selenium/Toggle/toggle1.rsel +2 -0
- data/test/selenium/Toggle/toggle2.rsel +18 -0
- data/test/sites/zena/columns.yml +3 -0
- data/test/sites/zena/versions.yml +7 -0
- data/test/unit/cached_page_test.rb +13 -13
- data/test/unit/column_test.rb +26 -0
- data/test/unit/node_test.rb +16 -1
- data/test/unit/project_test.rb +6 -1
- data/test/unit/relation_test.rb +1 -1
- data/test/unit/role_test.rb +1 -1
- data/test/unit/string_hash_test.rb +30 -0
- data/test/unit/virtual_class_test.rb +31 -17
- data/test/unit/zafu_markup_test.rb +414 -0
- data/test/unit/zafu_node_context_test.rb +375 -0
- data/test/unit/zafu_ordered_hash_test.rb +69 -0
- data/test/unit/zena/acts/enrollable_test.rb +1 -1
- data/test/unit/zena/parser/zafu_asset.yml +0 -10
- data/test/unit/zena/parser/zazen.yml +1 -1
- data/test/unit/zena/parser_test.rb +1 -72
- data/test/unit/zena/use/dates_test.rb +1 -1
- data/test/unit/zena/use/rendering_test.rb +24 -7
- data/test/unit/zena/use/scope_index_test.rb +17 -0
- data/test/unit/zena/use/zazen_test.rb +2 -1
- data/zena.gemspec +71 -37
- metadata +104 -83
- data/app/views/nodes/destroy.erb +0 -0
- data/bricks/static/lib/bricks/static.rb +0 -151
- data/bricks/static/zena/init.rb +0 -1
- data/bricks/static/zena/migrate/20110702010330_add_static_to_idx_templates.rb +0 -12
- data/bricks/static/zena/test/unit/static_test.rb +0 -33
- data/lib/zena/parser/zafu_rules.rb +0 -244
- data/lib/zena/parser/zafu_tags.rb +0 -198
- data/lib/zena/parser/zena_rules.rb +0 -23
data/app/models/note.rb
CHANGED
|
@@ -42,7 +42,8 @@ class Note < Node
|
|
|
42
42
|
|
|
43
43
|
def export_keys
|
|
44
44
|
h = super
|
|
45
|
-
h[:dates].merge!('log_at' => log_at
|
|
45
|
+
h[:dates].merge!('log_at' => log_at) unless log_at.blank?
|
|
46
|
+
h[:dates].merge!('event_at' => event_at) unless event_at.blank?
|
|
46
47
|
h
|
|
47
48
|
end
|
|
48
49
|
|
data/app/models/relation.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
class Relation < ActiveRecord::Base
|
|
2
|
-
EXPORT_FIELDS = %w{
|
|
2
|
+
EXPORT_FIELDS = %w{target_name target_icon target_unique source_role source_icon source_unique rel_group}
|
|
3
3
|
|
|
4
4
|
before_validation :singularize_roles
|
|
5
5
|
validate :valid_relation
|
|
@@ -21,11 +21,16 @@ class Relation < ActiveRecord::Base
|
|
|
21
21
|
def export
|
|
22
22
|
res = Zafu::OrderedHash.new
|
|
23
23
|
EXPORT_FIELDS.each do |key|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
if key == 'target_name'
|
|
25
|
+
res[key] = VirtualClass.find_by_kpath(self['target_kpath']).name
|
|
26
|
+
else
|
|
27
|
+
value = self[key]
|
|
28
|
+
if !value.blank?
|
|
29
|
+
res[key] = value
|
|
30
|
+
end
|
|
27
31
|
end
|
|
28
32
|
end
|
|
33
|
+
|
|
29
34
|
res
|
|
30
35
|
end
|
|
31
36
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# This is a mess and would need a rewrite...
|
|
1
2
|
class RelationProxy < Relation
|
|
2
3
|
include RubyLess
|
|
3
4
|
|
|
@@ -35,8 +36,7 @@ class RelationProxy < Relation
|
|
|
35
36
|
# Find a relation proxy for a role through a given node.
|
|
36
37
|
# The finder makes sure the class path is compatible with the node's class/virtual_class given as parameter.
|
|
37
38
|
def get_proxy(node, role)
|
|
38
|
-
|
|
39
|
-
rel = find_by_role(role)
|
|
39
|
+
rel = find_by_role(role, node.new_record? ? nil : node.kpath)
|
|
40
40
|
if rel && (node.new_record? || node.kpath =~ /\A#{rel.this_kpath}/)
|
|
41
41
|
rel.start = node
|
|
42
42
|
rel
|
data/app/models/role.rb
CHANGED
|
@@ -51,7 +51,7 @@ class Role < ActiveRecord::Base
|
|
|
51
51
|
raise Exception.new("Importation needs to start with a real class: '#{name}' is not a real class.")
|
|
52
52
|
else
|
|
53
53
|
# start importing
|
|
54
|
-
res +=
|
|
54
|
+
res += import_vclass(nil, name, definition, post_import)
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
57
|
|
|
@@ -119,7 +119,7 @@ class Role < ActiveRecord::Base
|
|
|
119
119
|
|
|
120
120
|
def import_vclass(superclass, name, definition, post_import)
|
|
121
121
|
res = []
|
|
122
|
-
vclass =
|
|
122
|
+
vclass = VirtualClass[name]
|
|
123
123
|
if vclass && vclass.class != VirtualClass
|
|
124
124
|
# Change from role to vclass ?
|
|
125
125
|
# Reject
|
|
@@ -129,7 +129,7 @@ class Role < ActiveRecord::Base
|
|
|
129
129
|
vclass = VirtualClass.new(:name => name, :superclass => superclass)
|
|
130
130
|
vclass.save!
|
|
131
131
|
end
|
|
132
|
-
|
|
132
|
+
|
|
133
133
|
res << vclass
|
|
134
134
|
|
|
135
135
|
# 2. create or update columns (never delete)
|
|
@@ -153,7 +153,8 @@ class Role < ActiveRecord::Base
|
|
|
153
153
|
# We do not clear attributes (import is ADD/UPDATE only).
|
|
154
154
|
end
|
|
155
155
|
end
|
|
156
|
-
|
|
156
|
+
|
|
157
|
+
vclass.save! unless vclass.real_class?
|
|
157
158
|
|
|
158
159
|
# 5. create or update sub-classes
|
|
159
160
|
res += import_all(vclass, definition, post_import)
|
|
@@ -248,7 +249,13 @@ class Role < ActiveRecord::Base
|
|
|
248
249
|
end
|
|
249
250
|
Relation::EXPORT_FIELDS.each do |key|
|
|
250
251
|
value = definition[key]
|
|
251
|
-
if !value.blank?
|
|
252
|
+
if key == 'target_name' && !value.blank?
|
|
253
|
+
if target = VirtualClass[value]
|
|
254
|
+
relation['target_kpath'] = target.kpath
|
|
255
|
+
else
|
|
256
|
+
raise Exception.new("Could not find a target named '#{value}' to create relation '#{name}'.")
|
|
257
|
+
end
|
|
258
|
+
elsif !value.blank?
|
|
252
259
|
relation[key] = value
|
|
253
260
|
end
|
|
254
261
|
end
|
data/app/models/site.rb
CHANGED
|
@@ -56,7 +56,7 @@ class Site < ActiveRecord::Base
|
|
|
56
56
|
|
|
57
57
|
validate :valid_site
|
|
58
58
|
validates_uniqueness_of :host
|
|
59
|
-
attr_accessible :name, :languages, :default_lang, :authentication, :http_auth, :auto_publish, :redit_time, :api_group_id
|
|
59
|
+
attr_accessible :name, :languages, :default_lang, :authentication, :http_auth, :ssl_on_auth, :auto_publish, :redit_time, :api_group_id
|
|
60
60
|
has_many :groups, :order => "name"
|
|
61
61
|
has_many :nodes
|
|
62
62
|
has_many :users
|
|
@@ -70,7 +70,7 @@ class Site < ActiveRecord::Base
|
|
|
70
70
|
include Zena::Use::MLIndex::SiteMethods
|
|
71
71
|
|
|
72
72
|
@@attributes_for_form = {
|
|
73
|
-
:bool => %w{authentication http_auth auto_publish},
|
|
73
|
+
:bool => %w{authentication http_auth auto_publish ssl_on_auth},
|
|
74
74
|
:text => %w{name languages default_lang},
|
|
75
75
|
}
|
|
76
76
|
|
|
@@ -118,8 +118,8 @@ class Site < ActiveRecord::Base
|
|
|
118
118
|
|
|
119
119
|
unless admin_user.save
|
|
120
120
|
# rollback
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
Zena::Db.execute "DELETE FROM #{Site.table_name} WHERE id = #{site.id}"
|
|
122
|
+
Zena::Db.execute "DELETE FROM zips WHERE site_id = #{site.id}"
|
|
123
123
|
raise Exception.new("Could not create admin user for site [#{host}] (site#{site[:id]})\n#{admin_user.errors.map{|k,v| "[#{k}] #{v}"}.join("\n")}")
|
|
124
124
|
end
|
|
125
125
|
|
|
@@ -221,6 +221,7 @@ class Site < ActiveRecord::Base
|
|
|
221
221
|
|
|
222
222
|
property.string 'usr_prototype_attributes'
|
|
223
223
|
property.boolean 'expire_in_dev'
|
|
224
|
+
property.boolean 'ssl_on_auth'
|
|
224
225
|
|
|
225
226
|
Site.attributes_for_form[:text] << 'usr_prototype_attributes'
|
|
226
227
|
Site.attributes_for_form[:bool] << 'expire_in_dev'
|
|
@@ -348,7 +349,7 @@ class Site < ActiveRecord::Base
|
|
|
348
349
|
end
|
|
349
350
|
|
|
350
351
|
def iformats_updated!
|
|
351
|
-
|
|
352
|
+
Zena::Db.execute "UPDATE sites SET formats_updated_at = (SELECT updated_at FROM iformats WHERE site_id = #{self[:id]} ORDER BY iformats.updated_at DESC LIMIT 1) WHERE id = #{self[:id]}"
|
|
352
353
|
if $iformats
|
|
353
354
|
$iformats[self[:id]] = @iformats = nil
|
|
354
355
|
end
|
|
@@ -366,7 +367,7 @@ class Site < ActiveRecord::Base
|
|
|
366
367
|
end
|
|
367
368
|
|
|
368
369
|
def iformats_updated!
|
|
369
|
-
|
|
370
|
+
Zena::Db.execute "UPDATE sites SET formats_updated_at = (SELECT updated_at FROM iformats WHERE site_id = #{self[:id]} ORDER BY iformats.updated_at DESC LIMIT 1) WHERE id = #{self[:id]}"
|
|
370
371
|
if $iformats
|
|
371
372
|
$iformats[self[:id]] = @iformats = nil
|
|
372
373
|
end
|
|
@@ -382,9 +383,9 @@ class Site < ActiveRecord::Base
|
|
|
382
383
|
FileUtils.rmtree(File.join(path, elem))
|
|
383
384
|
end
|
|
384
385
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
386
|
+
Zena::Db.execute "DELETE FROM caches WHERE site_id = #{self[:id]}"
|
|
387
|
+
Zena::Db.execute "DELETE FROM cached_pages_nodes WHERE cached_pages_nodes.node_id IN (SELECT nodes.id FROM nodes WHERE nodes.site_id = #{self[:id]})"
|
|
388
|
+
Zena::Db.execute "DELETE FROM cached_pages WHERE site_id = #{self[:id]}"
|
|
388
389
|
end
|
|
389
390
|
|
|
390
391
|
if clear_zafu
|
data/app/models/skin.rb
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
# A skin is a container for templates and css to render a full site or sectioon
|
|
2
2
|
# of a site.
|
|
3
3
|
class Skin < Section
|
|
4
|
+
def skin_name
|
|
5
|
+
title.to_filename
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.text_from_fs_skin(brick_name, skin_name, path, opts)
|
|
9
|
+
# dummy implementation
|
|
10
|
+
nil
|
|
11
|
+
end
|
|
4
12
|
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
class StringHash < Hash
|
|
2
|
+
include RubyLess
|
|
3
|
+
|
|
4
|
+
def self.from_string(str)
|
|
5
|
+
from_hash(JSON.parse(str))
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.from_hash(hash)
|
|
9
|
+
obj = new
|
|
10
|
+
hash.each do |k,v|
|
|
11
|
+
obj[k.to_s] = v.to_s
|
|
12
|
+
end
|
|
13
|
+
obj
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.[](value)
|
|
17
|
+
from_hash(value)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Deserialization used by Property
|
|
21
|
+
def self.json_create(serialized)
|
|
22
|
+
if data = serialized['data']
|
|
23
|
+
StringHash[data]
|
|
24
|
+
else
|
|
25
|
+
nil
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def []=(k, v)
|
|
30
|
+
if v.blank?
|
|
31
|
+
delete(k.to_s)
|
|
32
|
+
else
|
|
33
|
+
super(k.to_s, v.to_s)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def merge!(value)
|
|
38
|
+
value.each do |k,v|
|
|
39
|
+
self[k] = v
|
|
40
|
+
end
|
|
41
|
+
self
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def merge(value)
|
|
45
|
+
obj = dup
|
|
46
|
+
value.each do |k,v|
|
|
47
|
+
obj[k] = v
|
|
48
|
+
end
|
|
49
|
+
obj
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Serialization used by Property
|
|
53
|
+
def to_json(*args)
|
|
54
|
+
{ 'json_class' => 'StringHash', 'data' => Hash[self] }.to_json
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# This is used in case we show a form with the StringHash so that the value
|
|
58
|
+
# is not serialized to junk. This is the other side of "from_string".
|
|
59
|
+
def to_s
|
|
60
|
+
Hash[self].to_json
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
safe_context [:[], String] => String
|
|
64
|
+
safe_method :keys => [String]
|
|
65
|
+
end
|
data/app/models/text_document.rb
CHANGED
|
@@ -15,7 +15,7 @@ class TextDocument < Document
|
|
|
15
15
|
class << self
|
|
16
16
|
# Return true if a new text document can be created with the content_type. Used by the superclass Document to choose the corret subclass when creating a new object.
|
|
17
17
|
def accept_content_type?(content_type)
|
|
18
|
-
(content_type =~
|
|
18
|
+
(content_type =~ /(^text|^image\/svg\+xml|x-javascript)/) &&
|
|
19
19
|
(Zena::TYPE_TO_EXT[content_type.chomp] != ['rtf'])
|
|
20
20
|
end
|
|
21
21
|
|
data/app/models/user.rb
CHANGED
|
@@ -24,6 +24,8 @@ things they can/cannot do :
|
|
|
24
24
|
TODO: when a user is 'destroyed', pass everything he owns to another user or just mark the user as 'deleted'...
|
|
25
25
|
=end
|
|
26
26
|
class User < ActiveRecord::Base
|
|
27
|
+
attr_accessor :zafu_cache
|
|
28
|
+
|
|
27
29
|
include Property
|
|
28
30
|
RESCUE_SKIN_ID = -1
|
|
29
31
|
ANY_SKIN_ID = 0
|
data/app/models/virtual_class.rb
CHANGED
|
@@ -58,8 +58,16 @@ class VirtualClass < Role
|
|
|
58
58
|
safe_method [:relations, String] => {:class => ['RelationProxy'], :method => 'filtered_relations'}
|
|
59
59
|
# All columns defined for a VirtualClass (kpath based).
|
|
60
60
|
safe_method :all_columns => {:class => ['Column'], :method => 'safe_columns'}
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
|
|
62
|
+
# Methods on VirtualClass['Post'] instances, not nodes.
|
|
63
|
+
def self.safe_method_type(signature, receiver)
|
|
64
|
+
if signature.first == 'new'
|
|
65
|
+
{:method => 'zafu_new', :class => receiver.literal}
|
|
66
|
+
else
|
|
67
|
+
super
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
63
71
|
class Cache
|
|
64
72
|
def initialize
|
|
65
73
|
clear_cache!
|
|
@@ -343,7 +351,16 @@ class VirtualClass < Role
|
|
|
343
351
|
|
|
344
352
|
# In order to use types other then String, we use the overwritten property's
|
|
345
353
|
# type.
|
|
346
|
-
if
|
|
354
|
+
if type_name = query.types[method]
|
|
355
|
+
klass = Node.cast_to_class(type_name)
|
|
356
|
+
if klass == String
|
|
357
|
+
return {:method => "attributes[#{method.inspect}]", :nil => true, :class => klass}
|
|
358
|
+
elsif klass
|
|
359
|
+
return {:method => "rcast(#{method.inspect}, #{type_name.inspect})", :nil => true, :class => klass}
|
|
360
|
+
else
|
|
361
|
+
return nil
|
|
362
|
+
end
|
|
363
|
+
elsif type = safe_column_types[method]
|
|
347
364
|
return type.merge(:method => "attributes[#{method.inspect}]", :nil => true)
|
|
348
365
|
elsif type = real_class.safe_method_type(signature)
|
|
349
366
|
return type.merge(:nil => true)
|
|
@@ -474,6 +491,11 @@ class VirtualClass < Role
|
|
|
474
491
|
def new_instance(hash={})
|
|
475
492
|
real_class.new(hash, self)
|
|
476
493
|
end
|
|
494
|
+
|
|
495
|
+
# Build new nodes instances of this VirtualClass from zafu.
|
|
496
|
+
def zafu_new(hash={})
|
|
497
|
+
real_class.new(Node.transform_attributes(hash.stringify_keys), self)
|
|
498
|
+
end
|
|
477
499
|
|
|
478
500
|
# Create new nodes instances of this VirtualClass
|
|
479
501
|
def create_instance(*args)
|
|
@@ -509,8 +531,9 @@ class VirtualClass < Role
|
|
|
509
531
|
def rebuild_kpath(superclass)
|
|
510
532
|
index = 0
|
|
511
533
|
kpath = nil
|
|
512
|
-
|
|
513
|
-
|
|
534
|
+
try_keys = "#{name}ABCDEFGHIJKLMNOPQRSTUCWXYZ1234567890"
|
|
535
|
+
while index < try_keys.length
|
|
536
|
+
try_kpath = superclass.kpath + try_keys[index..index].upcase
|
|
514
537
|
if found = VirtualClass.find_by_kpath(try_kpath)
|
|
515
538
|
if found.id && found.id == self[:id]
|
|
516
539
|
kpath = try_kpath
|
|
@@ -568,10 +591,11 @@ class VirtualClass < Role
|
|
|
568
591
|
|
|
569
592
|
def propagate_kpath_change
|
|
570
593
|
if kpath_changed?
|
|
594
|
+
new_kpath = self.kpath
|
|
571
595
|
old_kpath = kpath_was
|
|
572
|
-
Zena::Db.execute "UPDATE nodes SET kpath = '#{
|
|
573
|
-
Zena::Db.execute "UPDATE roles SET kpath = '#{
|
|
574
|
-
#
|
|
596
|
+
Zena::Db.execute "UPDATE nodes SET kpath = '#{new_kpath}' WHERE vclass_id = #{self.id} AND site_id = #{current_site.id}"
|
|
597
|
+
Zena::Db.execute "UPDATE roles SET kpath = '#{new_kpath}' WHERE kpath = '#{old_kpath}' AND site_id = #{current_site.id} AND (type = 'Role' or type IS NULL)"
|
|
598
|
+
# ========================================= Update templates
|
|
575
599
|
idx_templates = IdxTemplate.all(
|
|
576
600
|
:conditions => ['tkpath = ? AND site_id = ?', old_kpath, site_id]
|
|
577
601
|
)
|
|
@@ -591,8 +615,17 @@ class VirtualClass < Role
|
|
|
591
615
|
end
|
|
592
616
|
end
|
|
593
617
|
end
|
|
594
|
-
|
|
595
|
-
#
|
|
618
|
+
|
|
619
|
+
# ========================================= Update relations
|
|
620
|
+
Relation.all(
|
|
621
|
+
:conditions => ['source_kpath = ? or target_kpath = ?', old_kpath, old_kpath]
|
|
622
|
+
).each do |rel|
|
|
623
|
+
rel.source_kpath = new_kpath if rel.source_kpath == old_kpath
|
|
624
|
+
rel.target_kpath = new_kpath if rel.target_kpath == old_kpath
|
|
625
|
+
rel.save!
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
# ========================================= Update sub-classes
|
|
596
629
|
if sub_classes = secure(VirtualClass) { VirtualClass.all(
|
|
597
630
|
:conditions => ['kpath LIKE ?', "#{old_kpath}_"]
|
|
598
631
|
)}
|
|
@@ -1,32 +1 @@
|
|
|
1
|
-
|
|
2
|
-
# page.replace_html 'comment_errors', :inline => render_errors
|
|
3
|
-
#elsif @comment.new_record?
|
|
4
|
-
# page.replace_html "add_comment_form#{@comment.reply_to || ''}", :partial=>'comments/form'
|
|
5
|
-
# page.replace_html "comment_errors#{@comment.reply_to || ''}", :inline=>error_messages_for(:comment, :object => @comment)
|
|
6
|
-
#else
|
|
7
|
-
# if @comment.reply_to
|
|
8
|
-
# page.remove "add_comment_form#{@comment.reply_to}"
|
|
9
|
-
# page.insert_html :bottom, "replies_to#{@comment.reply_to}", :partial=>'comments/li', :collection=>[@comment]
|
|
10
|
-
# else
|
|
11
|
-
# page.insert_html :before, "add_comment#{@node.zip}", :partial=>'comments/li', :collection=>[@comment]
|
|
12
|
-
# page.toggle "add_comment#{@node.zip}", "add_comment_form#{@node.zip}"
|
|
13
|
-
# end
|
|
14
|
-
# page.visual_effect :highlight, "comment#{@comment[:id]}", :duration => 0.3
|
|
15
|
-
#end
|
|
16
|
-
update_page_content(page, @comment)
|
|
17
|
-
=begin
|
|
18
|
-
if @comment.new_record?
|
|
19
|
-
page.replace "#{params[:dom_id]}_form", :file => template_path_from_template_url + "_form.erb"
|
|
20
|
-
else
|
|
21
|
-
pos = params[:position] || :before
|
|
22
|
-
ref = params[:reference] || "#{params[:dom_id]}_add"
|
|
23
|
-
page.insert_html pos.to_sym, ref, :file => template_path_from_template_url + ".erb"
|
|
24
|
-
@comment = Comment.new
|
|
25
|
-
page.replace "#{params[:dom_id]}_form", :file => template_path_from_template_url + "_form.erb"
|
|
26
|
-
if params[:done]
|
|
27
|
-
page << params[:done]
|
|
28
|
-
else
|
|
29
|
-
page.toggle "#{params[:dom_id]}_form", "#{params[:dom_id]}_add"
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
=end
|
|
1
|
+
update_page_content(page, @comment)
|
data/app/views/comments/edit.rjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
page.replace "#{params[:dom_id]}_#{@comment.zip}", :file => template_path_from_template_url
|
|
1
|
+
page.replace "#{params[:dom_id]}_#{@comment.zip}", :file => template_path_from_template_url('_form')
|
|
2
2
|
page << "$('#{params[:dom_id]}_form_t').focusFirstElement();"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
page.replace "#{params[:dom_id]}.#{@comment.zip}", :file => template_path_from_template_url
|
|
1
|
+
page.replace "#{params[:dom_id]}.#{@comment.zip}", :file => template_path_from_template_url
|
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
<td class='preview'><p><%= img_tag(@node, :mode=>'pv') %></p><p class='size'><%= fsize(@node.size) %></p></td>
|
|
13
13
|
<td class='description'><h3 class='title s<%= @node.version.status %>'><span class='doc_id'><%= @node[:zip] %></span> <%= @node.title %> <%= node_actions(@node, :actions => :all) %></h3><p class='summary'><%= zazen(@node.summary) %></p></td></tr>
|
|
14
14
|
</table>
|
|
15
|
-
<p class='btn_validate'><%= link_to _("upload more"), new_document_path(:parent_id => @node.parent_zip) %> // <%= link_to_function _('close'), "Zena.
|
|
15
|
+
<p class='btn_validate'><%= link_to _("upload more"), new_document_path(:parent_id => @node.parent_zip, :js => params[:js], :reload => params[:reload]) %> // <%= link_to_function _('close'), "Zena.t().Windows.close(#{win_id(@node.parent_zip, 'add_doc').inspect});" %></p>
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
@@ -32,6 +32,13 @@
|
|
|
32
32
|
<% if !@group.new_record? -%>
|
|
33
33
|
<tr><td class='label'><%= _('replace by') %></td><td><%= select('group', 'replace_by', @groups.map{|g| [g[:name], g[:id]]} , {:include_blank => true}) %></td></tr>
|
|
34
34
|
<% end -%>
|
|
35
|
+
<tr>
|
|
36
|
+
<td class='label'><%= _('auto_publish') %></td>
|
|
37
|
+
<td>
|
|
38
|
+
<input type='hidden' name='group[auto_publish]' value=''/>
|
|
39
|
+
<input type='checkbox' name='group[auto_publish]' value='1'<%= @group.auto_publish? ? " checked='checked'" : '' %>/> <%= _('auto_publish') %>
|
|
40
|
+
</td>
|
|
41
|
+
</tr>
|
|
35
42
|
<tr><td colspan='2'><input type='submit' class='btn_validate' value='<%= _('validate') %>'/></td></tr>
|
|
36
43
|
</table>
|
|
37
44
|
</form>
|
data/app/views/groups/_li.rhtml
CHANGED
|
@@ -8,6 +8,6 @@ else
|
|
|
8
8
|
end %>
|
|
9
9
|
<tr id='group<%= li[:id] %>'>
|
|
10
10
|
<td class="adm_icon"><%= link_to_remote( _("img_#{icon}"), :update=>"group#{li[:id]}", :url=>edit_group_path(li), :method=>:get) %></td>
|
|
11
|
-
<td class="name"><%= li.name %></td>
|
|
11
|
+
<td class="name"><%= li.name %><%= li.auto_publish? ? '*' : '' %></td>
|
|
12
12
|
<td class="users"><%= li.active_users.map {|u| (u.login || 'anon') }.join(', ') %></td>
|
|
13
13
|
</tr>
|
data/app/views/nodes/500.html
CHANGED
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
</head>
|
|
8
8
|
|
|
9
9
|
<body style='font-family:Helvetica, Arial, sans-serif;'>
|
|
10
|
-
|
|
10
|
+
<!-- The zena_error500 is used we running automated tests. Do not change -->
|
|
11
|
+
<div id='zena_error500' style='display:table; margin:50px auto; background:#aaa; height:200px; width:600px; border:1px solid black;'>
|
|
11
12
|
<h2 style='font-size:18px; text-align:center; margin-top:20px; border:1px solid red; border-width:1px 0; background:#faa; padding:10px;'>Sorry... An error prevented the requested page from rendering</h2>
|
|
12
13
|
<p style='text-align:center; text-style:italic;'>This problem has been logged and will be acted upon.</p>
|
|
13
14
|
</div>
|