zena 1.2.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/History.txt +18 -0
  2. data/app/controllers/nodes_controller.rb +11 -6
  3. data/app/controllers/sites_controller.rb +3 -2
  4. data/app/controllers/user_sessions_controller.rb +1 -1
  5. data/app/controllers/virtual_classes_controller.rb +3 -2
  6. data/app/models/document.rb +2 -2
  7. data/app/models/node.rb +6 -1
  8. data/app/models/note.rb +3 -27
  9. data/app/models/role.rb +11 -5
  10. data/app/models/site.rb +140 -43
  11. data/app/models/string_hash.rb +2 -0
  12. data/app/models/user.rb +9 -4
  13. data/app/models/user_session.rb +1 -1
  14. data/app/models/virtual_class.rb +49 -18
  15. data/app/views/sites/_form.erb +7 -4
  16. data/app/views/sites/_li.erb +15 -9
  17. data/app/views/users/_li.rhtml +3 -0
  18. data/app/views/users/index.rhtml +1 -1
  19. data/app/views/virtual_classes/_form.erb +1 -1
  20. data/bricks/acls/zena/init.rb +1 -2
  21. data/bricks/acls/zena/test/sites/erebus/roles.yml +4 -0
  22. data/bricks/activity/lib/bricks/activity.rb +24 -0
  23. data/bricks/activity/zena/migrate/20130711135905_add_activity_to_user.rb +9 -0
  24. data/bricks/activity/zena/test/integration/activity_integration_test.rb +29 -0
  25. data/bricks/captcha/zena/init.rb +0 -3
  26. data/bricks/fs_skin/lib/bricks/fs_skin.rb +3 -3
  27. data/bricks/fs_skin/zena/skins/blog/Node.zafu +1 -1
  28. data/bricks/fs_skin/zena/tasks.rb +2 -2
  29. data/bricks/fs_skin/zena/test/integration/fs_skin_integration_test.rb +2 -2
  30. data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +1 -1
  31. data/bricks/math/zena/init.rb +0 -3
  32. data/bricks/pdf/zena/init.rb +1 -5
  33. data/bricks/worker/zena/init.rb +0 -2
  34. data/bricks/zena/zena/migrate/20130617164527_add_master_id_to_site.rb +13 -0
  35. data/bricks/zena/zena/migrate/20130712081512_alter_login_users.rb +9 -0
  36. data/config/bricks.yml +4 -1
  37. data/lib/bricks/loader.rb +17 -9
  38. data/lib/tasks/zena.rake +40 -5
  39. data/lib/zafu/process/ruby_less_processing.rb +3 -5
  40. data/lib/zena.rb +2 -0
  41. data/lib/zena/acts/secure.rb +11 -2
  42. data/lib/zena/console.rb +5 -4
  43. data/lib/zena/core_ext/string.rb +2 -2
  44. data/lib/zena/deploy.rb +22 -6
  45. data/lib/zena/deploy/logrotate_app.rhtml +10 -7
  46. data/lib/zena/deploy/logrotate_host.rhtml +21 -26
  47. data/lib/zena/deploy/vhost.rhtml +3 -3
  48. data/lib/zena/foxy_parser.rb +1 -1
  49. data/lib/zena/info.rb +1 -1
  50. data/lib/zena/site_worker.rb +2 -2
  51. data/lib/zena/use.rb +0 -1
  52. data/lib/zena/use/ancestry.rb +1 -1
  53. data/lib/zena/use/authlogic.rb +2 -1
  54. data/lib/zena/use/display.rb +6 -0
  55. data/lib/zena/use/query_builder.rb +1 -1
  56. data/lib/zena/use/query_node.rb +3 -3
  57. data/lib/zena/use/rendering.rb +47 -13
  58. data/lib/zena/use/test_helper.rb +1 -1
  59. data/lib/zena/use/urls.rb +6 -104
  60. data/lib/zena/use/zafu_safe_definitions.rb +9 -4
  61. data/lib/zena/use/zafu_templates.rb +1 -0
  62. data/locale/app.pot +4 -0
  63. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  64. data/locale/de/zena.po +6 -2
  65. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  66. data/locale/en/zena.po +6 -2
  67. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  68. data/locale/fr/zena.po +5 -1
  69. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  70. data/locale/it/zena.po +6 -2
  71. data/locale/zena.pot +4 -0
  72. data/test/functional/nodes_controller_test.rb +2 -133
  73. data/test/functional/sites_controller_test.rb +1 -1
  74. data/test/integration/multiple_hosts_test.rb +2 -1
  75. data/test/integration/navigation_test.rb +37 -0
  76. data/test/integration/query_node/basic.yml +1 -1
  77. data/test/integration/zafu_compiler/ajax.yml +7 -0
  78. data/test/integration/zafu_compiler/comments.yml +2 -2
  79. data/test/integration/zafu_compiler/context.yml +6 -2
  80. data/test/integration/zafu_compiler/display.yml +16 -4
  81. data/test/integration/zafu_compiler/forms.yml +1 -0
  82. data/test/integration/zafu_compiler/query.yml +7 -1
  83. data/test/integration/zafu_compiler/relations.yml +12 -7
  84. data/test/integration/zafu_compiler/roles.yml +3 -3
  85. data/test/integration/zafu_compiler/rubyless.yml +1 -2
  86. data/test/integration/zafu_compiler/safe_definitions.yml +5 -0
  87. data/test/sites/complex/roles.yml +1 -1
  88. data/test/sites/ocean/roles.yml +4 -0
  89. data/test/sites/zena/columns.yml +3 -1
  90. data/test/sites/zena/roles.yml +5 -1
  91. data/test/sites/zena/sites.yml +22 -0
  92. data/test/unit/document_test.rb +14 -0
  93. data/test/unit/node_test.rb +14 -0
  94. data/test/unit/role_test.rb +19 -4
  95. data/test/unit/site_test.rb +67 -0
  96. data/test/unit/user_test.rb +20 -0
  97. data/test/unit/virtual_class_test.rb +116 -11
  98. data/test/unit/zena/use/rendering_test.rb +1 -1
  99. data/zena.gemspec +67 -66
  100. metadata +126 -125
  101. data/bricks/fs_skin/zena/init.rb +0 -1
  102. data/bricks/grid/zena/init.rb +0 -4
  103. data/bricks/single/zena/init.rb +0 -1
  104. data/bricks/spreadsheet/zena/init.rb +0 -3
@@ -10,7 +10,7 @@ module Zena
10
10
  TITLE_ML_JOIN = %Q{INNER JOIN idx_nodes_ml_strings AS id1 ON id1.node_id = nodes.id AND id1.key = 'title'}
11
11
 
12
12
  # (slow). Find a node by it's path. This is used during node importation when stored as zml files or to resolve custom_base url until we have an "alias" table.
13
- def find_by_path(path, parent_id = current_site.root_id, multilingual = false)
13
+ def find_by_path(path, parent_id = current_site.orphan_id, multilingual = false)
14
14
  res = nil
15
15
  path = path.split('/') unless path.kind_of?(Array)
16
16
  last = path.size - 1
@@ -50,7 +50,8 @@ module Zena
50
50
  User.send(:with_scope, :find => {:conditions => ['site_id = ?', site.id]}) do
51
51
  if user = token_visitor || registered_visitor || anonymous_visitor(site)
52
52
  user.asset_host = @asset_host
53
- Thread.current[:visitor] = user
53
+ # Make sure we load alias site in visitor
54
+ setup_visitor(user, site)
54
55
  end
55
56
  end
56
57
  end
@@ -236,6 +236,7 @@ module Zena
236
236
  safe_method [:sprintf, String, Number] => {:class => String, :method => 'sprintf'}
237
237
  safe_method [:search_box, {:ajax => String, :type => String}] => {:class => String, :method => 'search_box', :html_safe => true}
238
238
  safe_context [:admin_links, {:list => String}] => [String]
239
+ safe_method :uuid => String
239
240
 
240
241
  # Return sprintf formated entry. Return '' for values eq to zero.
241
242
  def sprintf_unless_zero(fmt, value)
@@ -246,6 +247,11 @@ module Zena
246
247
  def search_box(opts={})
247
248
  render_to_string(:partial=>'search/form', :locals => {:ajax => opts[:ajax], :type => opts[:type]})
248
249
  end
250
+
251
+ # Return a random string that can be used as id (starts with a character)
252
+ def uuid
253
+ 'u' + UUIDTools::UUID.random_create.to_s.gsub('-','')[0..8]
254
+ end
249
255
 
250
256
  # Return the 'zip' of the node corresponding to the browser url (start node). This value is kept
251
257
  # accross all Ajax calls.
@@ -1,7 +1,7 @@
1
1
  module Zena
2
2
  module Use
3
3
  module QueryBuilder
4
- DATE_FIELD_REGEXP = %r{\d+[\.-/]\d+[\.-/]\d+}
4
+ DATE_FIELD_REGEXP = %r{\d+[\.\-/]\d+[\.\-/]\d+}
5
5
  module ViewMethods
6
6
  include RubyLess
7
7
  # Pseudo string comming from params.
@@ -105,7 +105,7 @@ module Zena
105
105
  end
106
106
  end
107
107
 
108
- class Compiler < QueryBuilder::Processor
108
+ class Compiler < ::QueryBuilder::Processor
109
109
  attr_reader :context # ?
110
110
  set_main_table 'nodes'
111
111
  set_main_class 'Node'
@@ -328,7 +328,7 @@ module Zena
328
328
  if klass = Node.get_class(right[1])
329
329
  "#{field_or_attr('kpath')} #{is_not ? 'NOT ' : ''}LIKE #{quote(klass.kpath + '%')}"
330
330
  else
331
- raise QueryBuilder::QueryException.new("Unknown class #{right.last.inspect}.")
331
+ raise ::QueryBuilder::QueryException.new("Unknown class #{right.last.inspect}.")
332
332
  end
333
333
  else
334
334
  process_op(:like, left, right)
@@ -577,7 +577,7 @@ module Zena
577
577
  set_main_class(klass)
578
578
  kpath_filter = ".kpath LIKE #{quote("#{klass.kpath}%")}" unless klass.kpath == 'N'
579
579
  else
580
- raise QueryBuilder::QueryException.new("Unknown class #{klass} in scope '#{class_name}:#{scope}'.")
580
+ raise ::QueryBuilder::QueryException.new("Unknown class #{klass} in scope '#{class_name}:#{scope}'.")
581
581
  end
582
582
  else
583
583
  klass = nil
@@ -171,21 +171,28 @@ module Zena
171
171
  render :inline => result[:data]
172
172
 
173
173
  else
174
- if zafu_headers
175
- if disposition = zafu_headers.delete('Content-Disposition')
176
- result.delete(:filename) if disposition =~ /filename\s*=/
177
- result[:disposition] = disposition
178
- end
174
+
175
+ if disposition = zafu_headers.delete('Content-Disposition')
176
+ result.delete(:filename) if disposition =~ /filename\s*=/
177
+ result[:disposition] = disposition
178
+ end
179
179
 
180
- if type = zafu_headers.delete('Content-Type')
181
- result[:type] = type
182
- end
180
+ if type = zafu_headers.delete('Content-Type')
181
+ result[:type] = type
182
+ end
183
183
 
184
- if filename = zafu_headers.delete('filename')
185
- result[:filename] = filename
184
+ if filename = zafu_headers.delete('filename')
185
+ result[:filename] = filename
186
+ end
187
+
188
+ if status = zafu_headers.delete('Status')
189
+ if (status.to_i / 100) == 3
190
+ redirect_to zafu_headers.delete('Location'), :status => status.to_i
191
+ else
192
+ render :status => status.to_i
186
193
  end
187
-
188
194
  headers.merge!(zafu_headers)
195
+ return
189
196
  end
190
197
 
191
198
  if data = result.delete(:data)
@@ -195,7 +202,9 @@ module Zena
195
202
  else
196
203
  # Should never happen
197
204
  raise Exception.new("Render '#{params[:format]}' should return either :file or :data (none found).")
198
- end
205
+ end
206
+ headers.merge!(zafu_headers)
207
+
199
208
  end
200
209
 
201
210
  cache_page(:content_data => result[:data], :content_path => result[:file]) if opts[:cache]
@@ -205,7 +214,26 @@ module Zena
205
214
  render_to_string :file => template_url(opts), :layout => false
206
215
  else
207
216
  render :file => template_url(opts), :layout => false, :status => opts[:status]
217
+
218
+ if status = zafu_headers.delete('Status')
219
+ # reset rendering
220
+ response.content_type = nil
221
+ erase_render_results
222
+ reset_variables_added_to_assigns
223
+
224
+ if (status.to_i / 100) == 3
225
+ redirect_to zafu_headers.delete('Location'), :status => status.to_i
226
+ else
227
+ render :status => status.to_i
228
+ end
229
+
230
+ headers.merge!(zafu_headers)
231
+
232
+ return
233
+ end
234
+
208
235
  headers.merge!(zafu_headers)
236
+
209
237
  cache_page(:url => opts[:cache_url]) if opts[:cache]
210
238
  end
211
239
  end
@@ -239,7 +267,13 @@ module Zena
239
267
  :content_data => response.body,
240
268
  :node_id => @node[:id]
241
269
  }.merge(opts)
242
- secure!(CachedPage) { CachedPage.create(opts) }
270
+ if secure!(CachedPage) { CachedPage.create(opts) }
271
+ true
272
+ else
273
+ false
274
+ end
275
+ else
276
+ false
243
277
  end
244
278
  end
245
279
 
@@ -9,7 +9,7 @@ module Zena
9
9
  # Set visitor for unit testing
10
10
  def login(fixture)
11
11
  user = users(fixture)
12
- Thread.current[:visitor] = user
12
+ setup_visitor(user, user.site)
13
13
  user.ip = '10.0.0.44'
14
14
  $_test_site = user.site.name
15
15
  ::I18n.locale = user.lang
@@ -93,7 +93,7 @@ module Zena
93
93
  if ep.delete('mode')
94
94
  mode ||= params[:mode]
95
95
  end
96
- opts['encode_params'] = ep
96
+ opts[:encode_params] = ep
97
97
  end
98
98
 
99
99
  if host = opts.delete(:host)
@@ -155,6 +155,7 @@ module Zena
155
155
  end
156
156
 
157
157
  def append_query_params(path, opts)
158
+
158
159
  if opts == {}
159
160
  path
160
161
  else
@@ -162,7 +163,9 @@ module Zena
162
163
  list = opts.keys.map do |k|
163
164
  # FIXME: DOC
164
165
  if k.to_s == 'encode_params'
165
- opts[k].map do |key|
166
+ list = opts[k]
167
+ list = list.split(',').map(&:strip) unless list.kind_of?(Array)
168
+ list.map do |key|
166
169
  value = params[key]
167
170
  if value.kind_of?(Hash)
168
171
  {key => value}.to_query
@@ -277,7 +280,7 @@ module Zena
277
280
  def host_with_port
278
281
  @host_with_port ||= begin
279
282
  port = request.port
280
- if port.blank? || port.to_s == '80'
283
+ if port.blank? || port.to_s == '80' || port.to_s == '443'
281
284
  current_site.host
282
285
  else
283
286
  "#{current_site.host}:#{port}"
@@ -502,107 +505,6 @@ module Zena
502
505
  # We wrap without callbacks (before_wrap, after_wrap) so that the link
503
506
  # is used as raw text in these callbacks.
504
507
  markup.wrap(text)
505
- =begin
506
- query_params = options[:query_params] || {}
507
- default_text = options[:default_text]
508
- params = {}
509
- (options[:params] || @params).each do |k,v|
510
- next if v.nil?
511
- params[k] = v
512
- end
513
-
514
- opts = {}
515
-
516
- if href = params.delete(:href)
517
- if lnode = get_context_var('set_var', value) && stored.klass <= Node
518
- # using stored node
519
- else
520
- lnode, klass = build_finder(:first, href, {})
521
- return unless lnode
522
- return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node)
523
- end
524
- else
525
- # obj
526
- if node_class == Version
527
- lnode = "#{node}.node"
528
- opts[:lang] = "#{node}.lang"
529
- elsif node.will_be?(Node)
530
- lnode = node
531
- else
532
- lnode = @context[:previous_node]
533
- end
534
- end
535
-
536
- if fmt = params.delete(:format)
537
- if fmt == 'data'
538
- opts[:format] = "#{node}.ext"
539
- else
540
- opts[:format] = fmt.inspect
541
- end
542
- end
543
-
544
- if mode = params.delete(:mode)
545
- opts[:mode] = mode.inspect
546
- end
547
-
548
- if anchor = params.delete(:anchor)
549
- opts[:anchor] = anchor.inspect
550
- end
551
-
552
- if anchor_in = params.delete(:in)
553
- finder, klass = build_finder(:first, anchor_in, {})
554
- return unless finder
555
- return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node)
556
- opts[:anchor_in] = finder
557
- end
558
-
559
- if @html_tag && @html_tag != 'a'
560
- # FIXME: can we remove this ?
561
- # html attributes do not belong to anchor
562
- pre_space = ''
563
- html_params = {}
564
- else
565
- html_params = get_html_params(params.merge(@html_tag_params), :link)
566
- pre_space = @space_before || ''
567
- @html_tag_done = true
568
- end
569
-
570
- (params.keys - [:style, :class, :id, :rel, :name, :anchor, :attr, :tattr, :trans, :text]).each do |k|
571
- next if k.to_s =~ /if_|set_|\A_/
572
- query_params[k] = params[k]
573
- end
574
-
575
- # TODO: merge these two query_params cleanup things into something cleaner.
576
- else
577
- # direct link
578
- query_params.each do |k,v|
579
- if k == :date
580
- if v == 'current_date'
581
- query_params[k] = current_date
582
- elsif v =~ /\A\d/
583
- query_params[k] = v.inspect
584
- elsif v =~ /\[/
585
- attribute, static = parse_attributes_in_value(v.gsub('"',''), :erb => false)
586
- query_params[k] = "\"#{attribute}\""
587
- else
588
- query_params[k] = node_attribute(v)
589
- end
590
- else
591
- attribute, static = parse_attributes_in_value(v.gsub('"',''), :erb => false)
592
- query_params[k] = "\"#{attribute}\""
593
- end
594
- end
595
-
596
- query_params.merge!(opts)
597
-
598
- opts_str = ''
599
- query_params.keys.sort {|a,b| a.to_s <=> b.to_s }.each do |k|
600
- opts_str << ",:#{k.to_s.gsub(/[^a-z_A-Z_]/,'')}=>#{query_params[k]}"
601
- end
602
-
603
- pre_space + "<a#{params_to_html(html_params)} href='<%= zen_path(#{lnode}#{opts_str}) %>'>#{text_for_link(default_text)}</a>"
604
- end
605
- =end
606
508
  end
607
509
 
608
510
 
@@ -117,7 +117,9 @@ module Zena
117
117
  def self.first_proc
118
118
  @@first_proc ||= Proc.new do |receiver, method|
119
119
  if elem = receiver.opts[:elem] || receiver.klass.first
120
- RubyLess::TypedString.new("#{receiver.raw}.first", :class => elem, :nil => true)
120
+ # All query contexts are only opened if they are not empty.
121
+ could_be_nil = !receiver.opts[:query]
122
+ RubyLess::TypedString.new("#{receiver.raw}.first", :class => elem, :nil => could_be_nil, :query => receiver.opts[:query])
121
123
  else
122
124
  # should never happen
123
125
  raise RubyLess::NoMethodError.new(receiver.raw, receiver.klass, ['first'])
@@ -157,7 +159,8 @@ module Zena
157
159
 
158
160
  safe_method :now => {:method => 'Time.now', :class => Time}
159
161
  safe_method :string_hash => {:method => 'StringHash.new', :class => StringHash}
160
- safe_method [:string_hash, Hash] => {:method => 'StringHash.from_hash', :class => StringHash}
162
+ safe_method [:string_hash, Hash] => {:method => 'StringHash.from_hash', :class => StringHash}
163
+ safe_method [:string_hash, String] => {:method => 'StringHash.from_string', :class => StringHash}
161
164
  safe_method [:h, String] => {:class => String, :accept_nil => true}
162
165
  safe_method_for String, [:gsub, Regexp, String] => {:class => String, :pre_processor => true}
163
166
  safe_method_for String, :upcase => {:class => String, :pre_processor => true}
@@ -166,8 +169,10 @@ module Zena
166
169
  safe_method_for String, :url_name => {:class => String, :pre_processor => true, :method => :url_name}
167
170
  safe_method_for String, :to_i => {:class => Number, :pre_processor => true}
168
171
  safe_method_for String, :to_s => {:class => String, :pre_processor => true}
169
- safe_method_for String, [:limit, Number] => {:class => String, :pre_processor => true, :html_safe => true}
170
- safe_method_for String, [:limit, Number, String] => {:class => String, :pre_processor => true, :html_safe => true}
172
+ safe_method_for String, :size => {:class => Number, :pre_processor => true}
173
+ safe_method_for String, [:limit, Number] => {:class => String, :pre_processor => true}
174
+ safe_method_for String, [:limit, Number, String] => {:class => Number, :pre_processor => true}
175
+
171
176
  safe_method_for String, :to_f => {:class => Number, :pre_processor => true}
172
177
  safe_method_for String, :to_json => {:class => String, :pre_processor => true}
173
178
  safe_method_for String, [:split, String] => {:class => [String], :pre_processor => true}
@@ -261,6 +261,7 @@ module Zena
261
261
  return default_template_url(opts) unless zafu_url
262
262
 
263
263
  rel_path = current_site.zafu_path + "/#{zafu_url}/#{lang_path}/_main.erb"
264
+
264
265
  path = SITES_ROOT + rel_path
265
266
  if !File.exists?(path) || params[:rebuild]
266
267
  if @node && klass = VirtualClass.find_by_kpath(template.tkpath)
@@ -407,6 +407,10 @@ msgstr ""
407
407
  msgid "site_img"
408
408
  msgstr ""
409
409
 
410
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
411
+ msgid "alias_img"
412
+ msgstr ""
413
+
410
414
  #: app/views/sites/_li.erb:11
411
415
  msgid "no API"
412
416
  msgstr ""
@@ -1612,11 +1612,15 @@ msgstr "%H:%M"
1612
1612
  #: app/views/sites/_form.erb:22 lib/gettext_strings.rb:38
1613
1613
  #, fuzzy
1614
1614
  msgid "site group"
1615
- msgstr "<img src='/images/group.png' title='group'/>"
1615
+ msgstr "<img src='/images/group.png' alt='group' title='group'/>"
1616
1616
 
1617
1617
  #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1618
1618
  msgid "site_img"
1619
- msgstr "<img src='/images/world.png' title='site'/>"
1619
+ msgstr "<img src='/images/world.png' alt='site' title='site'/>"
1620
+
1621
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1622
+ msgid "alias_img"
1623
+ msgstr "<img src='/images/world_link.png' alt='alias' title='alias'/>"
1620
1624
 
1621
1625
  #: app/views/sites/index.erb:1 lib/zena/use/display.rb:279
1622
1626
  msgid "sites"
@@ -480,7 +480,7 @@ msgstr "Acl with highest priority is tested first."
480
480
  #: app/views/acls/_form.rhtml:47
481
481
  msgid "acl_query_help"
482
482
  msgstr ""
483
- "SQLiss query to fetch all the nodes for which this acl authorizes access."
483
+ "SQLiss query to fetch all the nodes for which this acl authorizes access (Ruby)."
484
484
 
485
485
  #: lib/zena/use/display.rb:282
486
486
  msgid "acls"
@@ -1595,7 +1595,11 @@ msgstr "<img src='/images/group.png' alt='group'/>"
1595
1595
 
1596
1596
  #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1597
1597
  msgid "site_img"
1598
- msgstr "<img src='/images/world.png' alt='site'/>"
1598
+ msgstr "<img src='/images/world.png' alt='site' title='site'/>"
1599
+
1600
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1601
+ msgid "alias_img"
1602
+ msgstr "<img src='/images/world_link.png' alt='alias' title='alias'/>"
1599
1603
 
1600
1604
  #: app/views/sites/index.erb:1 lib/zena/use/display.rb:279
1601
1605
  msgid "sites"
@@ -1545,7 +1545,11 @@ msgstr "groupe de site"
1545
1545
 
1546
1546
  #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1547
1547
  msgid "site_img"
1548
- msgstr "<img src='/images/world.png' alt='site'/>"
1548
+ msgstr "<img src='/images/world.png' alt='site' title='site'/>"
1549
+
1550
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1551
+ msgid "alias_img"
1552
+ msgstr "<img src='/images/world_link.png' alt='alias' title='alias'/>"
1549
1553
 
1550
1554
  #: app/views/sites/index.erb:1 lib/zena/use/display.rb:279
1551
1555
  msgid "sites"
@@ -480,7 +480,7 @@ msgstr "Acl with highest priority is tested first."
480
480
 
481
481
  #: app/views/acls/_form.rhtml:47
482
482
  msgid "acl_query_help"
483
- msgstr "SQLiss query to fetch all the nodes for which this acl authorizes access."
483
+ msgstr "SQLiss query to fetch all the nodes for which this acl authorizes access (Ruby)."
484
484
 
485
485
  #: lib/zena/use/display.rb:282
486
486
  msgid "acls"
@@ -1658,7 +1658,11 @@ msgstr "<img src='/images/group.png' alt='group'/>"
1658
1658
  #: app/views/sites/_li.erb:2
1659
1659
  #: lib/gettext_strings.rb:34
1660
1660
  msgid "site_img"
1661
- msgstr "<img src='/images/world.png' alt='site'/>"
1661
+ msgstr "<img src='/images/world.png' alt='site' title='site'/>"
1662
+
1663
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1664
+ msgid "alias_img"
1665
+ msgstr "<img src='/images/world_link.png' alt='alias' title='alias'/>"
1662
1666
 
1663
1667
  #: app/views/sites/index.erb:1
1664
1668
  #: lib/zena/use/display.rb:279