Changeset 1111
- Timestamp:
- 2008-07-19 00:17:02 (6 months ago)
- Files:
-
- trunk/app/helpers/application_helper.rb (modified) (2 diffs)
- trunk/lib/node_query.rb (modified) (2 diffs)
- trunk/lib/parser/lib/rules/zena.rb (modified) (21 diffs)
- trunk/lib/query_builder/lib/query_builder.rb (modified) (2 diffs)
- trunk/test/functional/nodes_controller_test.rb (modified) (1 diff)
- trunk/test/helpers/node_query/relations.yml (modified) (1 diff)
- trunk/test/helpers/node_query_test.rb (modified) (3 diffs)
- trunk/test/helpers/zena_parser/basic.yml (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/app/helpers/application_helper.rb
r1106 r1111 5 5 module ApplicationHelper 6 6 include Zena::Acts::Secure 7 8 7 9 8 def dom_id(node) … … 721 720 else 722 721 sprintf("%i octets", size) 722 end 723 end 724 725 # main node before ajax stuff (the one in browser url) 726 def start_node 727 @start_node ||= if params[:s] 728 secure!(Node) { Node.find_by_zip(params[:s]) } 729 else 730 @node 723 731 end 724 732 end trunk/lib/node_query.rb
r1103 r1111 252 252 end 253 253 254 def class_from_table(table_name) 255 case table_name 256 when 'nodes' 257 Node 258 when 'versions' 259 Version 260 when 'comments' 261 Comment 262 when 'data_entries' 263 DataEntry 264 else 265 # ? error 266 Object 267 end 268 end 269 254 270 def parse_custom_query_argument(key, value) 255 271 return nil unless value … … 325 341 end 326 342 query = NodeQuery.new(pseudo_sql, opts.merge(:custom_query_group => visitor.site.host)) 327 [query.to_sql, query.errors, !query.uses_node_name]343 [query.to_sql, query.errors, query.uses_node_name, query.result_class] 328 344 end 329 345 end trunk/lib/parser/lib/rules/zena.rb
r1107 r1111 489 489 end 490 490 491 out "<%= form_remote_tag(:url => zafu_node_path(#{node_id}), :method => :get, :html => {:id => \"#{dom_id}_f\"}) %><div class='hidden'><input type='hidden' name='t_url' value='#{block.template_url}'/><input type='hidden' name='dom_id' value='#{block.erb_dom_id}'/> </div><div class='wrapper'>"491 out "<%= form_remote_tag(:url => zafu_node_path(#{node_id}), :method => :get, :html => {:id => \"#{dom_id}_f\"}) %><div class='hidden'><input type='hidden' name='t_url' value='#{block.template_url}'/><input type='hidden' name='dom_id' value='#{block.erb_dom_id}'/>#{start_node_input}</div><div class='wrapper'>" 492 492 if @blocks == [] 493 493 out "<input type='text' name='#{@params[:key] || 'f'}' value='<%= params[#{(@params[:key] || 'f').to_sym.inspect}] %>'/>" … … 1041 1041 else 1042 1042 # relation 1043 list_finder = build_finder_for(:all, values) 1043 list_finder, klass = build_finder_for(:all, values) 1044 return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node) 1044 1045 end 1045 1046 out "<% if (#{list_var} = #{list_finder}) && (#{list_var}_relation = #{node}.relation_proxy(#{role.inspect})) -%>" … … 1536 1537 def r_icon 1537 1538 if !@params[:in] && !@params[:where] && !@params[:from] && !@params[:find] 1538 do_var(build_finder_for(:first, 'icon', :or => 'image'), :node_class => Image) 1539 finder, klass = build_finder_for(:first, 'icon', @params.merge(:or => 'image')) 1540 return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node) 1541 do_var(finder, :node_class => klass) 1539 1542 else 1540 1543 r_unknown … … 1650 1653 if @params[:href] 1651 1654 unless lnode = find_stored(Node, @params[:href]) 1652 opts << ", :href=>#{build_finder_for(:first, @params[:href])}" 1655 finder, klass = build_finder_for(:first, @params[:href]) 1656 return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node) 1657 opts << ", :href=>#{finder}" 1653 1658 end 1654 1659 end … … 1679 1684 1680 1685 if sharp_in = @params[:in] 1681 opts << ", :sharp_in=>#{build_finder_for(:first, sharp_in, {})}" 1686 finder, klass = build_finder_for(:first, sharp_in, {}) 1687 return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node) 1688 opts << ", :sharp_in=>#{finder}" 1682 1689 end 1683 1690 … … 1723 1730 return unless node_kind_of?(Node) 1724 1731 if @params[:src] 1725 img = build_finder_for(:first, @params[:src]) 1732 finder, klass = build_finder_for(:first, @params[:src]) 1733 return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node) 1734 img = finder 1726 1735 else 1727 1736 img = node … … 1734 1743 res += ")" 1735 1744 if @params[:link] 1736 link = build_finder_for(:first, @params[:link]) 1745 link, klass = build_finder_for(:first, @params[:link]) 1746 return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node) 1737 1747 res = "node_link(:node=>#{link}, :text=>#{res})" 1738 1748 end … … 1777 1787 return parser_error("invalid type (should be 'month' or 'week')") 1778 1788 end 1779 1789 1790 finder, klass = build_finder_for(:all, finder, @params, [@date_scope]) 1791 return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node) 1780 1792 res = <<-END_TXT 1781 1793 <h3 class='title'> … … 1787 1799 <tr class='head'><%= cal_day_names(#{size.inspect}) %></tr> 1788 1800 <% start_date, end_date = cal_start_end(#{current_date}, #{type.inspect}) -%> 1789 <% cal_weeks(#{ref_date.to_sym.inspect}, #{ build_finder_for(:all, finder, @params, [@date_scope])}, start_date, end_date) do |week, cal_#{list_var}| -%>1801 <% cal_weeks(#{ref_date.to_sym.inspect}, #{finder}, start_date, end_date) do |week, cal_#{list_var}| -%> 1790 1802 <tr class='body'> 1791 1803 <% week.step(week+6,1) do |day_#{list_var}|; #{list_var} = cal_#{list_var}[day_#{list_var}.strftime('%Y-%m-%d')] -%> … … 1845 1857 # DRY ! (build_finder_for, block) 1846 1858 method = @params[:method] 1847 if (context = node_class.zafu_known_contexts[method]) && !@params[:in] && !@params[:where] && !@params[:from]1848 node_class = context[:node_class]1849 1859 context = node_class.zafu_known_contexts[method] 1860 if context && @params.keys == [:method] 1861 klass = context[:node_class] 1850 1862 # hack to store last 'Node' context until we fix node(Node) stuff: 1851 1863 previous_node = node_kind_of?(Node) ? node : @context[:previous_node] 1852 if node_class.kind_of?(Array)1864 if klass.kind_of?(Array) 1853 1865 # plural 1854 do_list( "#{node}.#{method}", context.merge(:node_class => node_class[0], :previous_node => previous_node) )1866 do_list( "#{node}.#{method}", context.merge(:node_class => klass[0], :previous_node => previous_node) ) 1855 1867 else 1856 1868 # singular … … 1860 1872 count = ['first','all'].include?(@params[:find]) ? @params[:find].to_sym : nil 1861 1873 count ||= Node.plural_relation?(method) ? :all : :first 1874 finder, klass = build_finder_for(count, method, @params) 1862 1875 if count == :all 1863 1876 # plural 1864 do_list( build_finder_for(count, method, @params))1877 do_list( finder, :node_class => klass) 1865 1878 # elsif count == :count 1866 1879 # "<%= #{build_finder_for(count, method, @params)} %>" 1867 1880 else 1868 1881 # singular 1869 do_var( build_finder_for(count, method, @params))1882 do_var( finder, :node_class => klass) 1870 1883 end 1871 1884 else … … 1899 1912 # Create an sql query to open a new context (passes its arguments to HasRelations#build_find) 1900 1913 def build_finder_for(count, rel, params=@params, raw_filters = []) 1901 if (context = node_class.zafu_known_contexts[rel]) && !params[:in] && !params[:where] && !params[:from] && raw_filters == [] 1902 node_class = context[:node_class] 1903 1904 if node_class.kind_of?(Array) && count == :all && node_class[0].ancestors.include?(Node) 1905 return "#{node}.#{rel}" 1906 elsif node_class.ancestors.include?(Node) 1907 return count == :all ? "[#{node}.#{rel}]" : "#{node}.#{rel}" 1908 else 1909 # not a Node 1910 'nil' 1914 if (context = node_class.zafu_known_contexts[rel]) && !params[:in] && !params[:where] && !params[:from] && !params[:order] && raw_filters == [] 1915 klass = context[:node_class] 1916 1917 if klass.kind_of?(Array) && count == :all 1918 return ["#{node}.#{rel}", klass[0]] 1919 else 1920 return [(count == :all ? "[#{node}.#{rel}]" : "#{node}.#{rel}"), klass] 1911 1921 end 1912 1922 end … … 1915 1925 if (count == :first) 1916 1926 if rel == 'self' 1917 return node1927 return [node, self.node_class] 1918 1928 elsif rel == 'main' 1919 return "@node"1929 return ["@node", Node] 1920 1930 elsif rel == 'root' 1921 return "(secure(Node) { Node.find(#{current_site[:root_id]})})"1931 return ["(secure(Node) { Node.find(#{current_site[:root_id]})})", Node] 1922 1932 elsif rel == 'visitor' 1923 return "visitor.contact"1933 return ["visitor.contact", Node] 1924 1934 elsif rel =~ /^\d+$/ 1925 return "(secure(Node) { Node.find_by_zip(#{rel.inspect})})"1935 return ["(secure(Node) { Node.find_by_zip(#{rel.inspect})})", Node] 1926 1936 elsif node_name = find_stored(Node, rel) 1927 return node_name1937 return [node_name, Node] 1928 1938 elsif rel[0..0] == '/' 1929 1939 rel = rel[1..-1] 1930 return "(secure(Node) { Node.find_by_path(#{rel.inspect})})"1940 return ["(secure(Node) { Node.find_by_path(#{rel.inspect})})", Node] 1931 1941 end 1932 1942 end … … 1950 1960 1951 1961 # make sure we do not use a new record in a find query: 1952 sql_query, query_errors, can_ignore_source= Node.build_find(count, pseudo_sql, :node_name => node_name, :raw_filters => raw_filters, :ref_date => "\#{#{current_date}}")1962 sql_query, query_errors, uses_node_name, klass = Node.build_find(count, pseudo_sql, :node_name => node_name, :raw_filters => raw_filters, :ref_date => "\#{#{current_date}}") 1953 1963 1954 1964 unless sql_query 1955 1965 # is 'out' here a good idea ? 1956 1966 out parser_error(query_errors.join(' '), pseudo_sql.join(', ')) 1957 return "nil"1958 end 1959 1960 res = "#{node_name}.do_find(#{count.inspect}, \"#{sql_query}\", #{ can_ignore_source})"1967 return ['nil', NilClass] 1968 end 1969 1970 res = "#{node_name}.do_find(#{count.inspect}, \"#{sql_query}\", #{!uses_node_name})" 1961 1971 if params[:else] 1962 if else_query = build_finder_for(count, params[:else], {}) 1963 "(#{res} || #{else_query})" 1964 end 1965 else 1966 res 1972 else_query, else_klass = build_finder_for(count, params[:else], {}) 1973 if else_query && (else_klass == klass || klass.ancestors.include?(else_klass) || else_klass.ancestors.include?(klass)) 1974 ["(#{res} || #{else_query})", klass] 1975 else 1976 [res, klass] 1977 end 1978 else 1979 [res, klass] 1967 1980 end 1968 1981 end … … 2153 2166 end 2154 2167 2155 def params_to_erb(params )2156 res = ""2168 def params_to_erb(params, initial_comma = true) 2169 res = initial_comma ? [""] : [] 2157 2170 params.each do |k,v| 2158 res << " ,#{k.inspect}=>#{v.inspect}"2159 end 2160 res 2171 res << "#{k.inspect}=>#{v.inspect}" 2172 end 2173 res.join(', ') 2161 2174 end 2162 2175 … … 2263 2276 def context_name 2264 2277 return (@context[:name] || 'list') if @context 2265 @name || @params[:id] || parent .context_name2278 @name || @params[:id] || parent ? parent.context_name : 'root' 2266 2279 end 2267 2280 … … 2269 2282 return @context if @context 2270 2283 # not rendered yet, find first parent with context 2271 @context = parent .context2284 @context = parent ? parent.context : {} 2272 2285 end 2273 2286 … … 2711 2724 url_params << "link_id=\#{#{node}.link_id}" if @context[:need_link_id] && node_kind_of?(Node) 2712 2725 url_params << "node[v_status]=#{Zena::Status[:pub]}" if @params[:publish] 2726 url_params << start_node_input(false) 2713 2727 2714 2728 res = '' … … 2836 2850 else 2837 2851 # relation 2838 nodes = build_finder_for(:all, nodes) 2852 nodes, klass = build_finder_for(:all, nodes) 2853 return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node) 2839 2854 end 2840 2855 set_attr = @params[:attr] || 'id' … … 2907 2922 2908 2923 def find_stored(klass, key) 2909 @context["#{klass}_#{key}"] 2924 if "#{klass}_#{key}" == "Node_start_node" 2925 # main node before ajax stuff (the one in browser url) 2926 "start_node" 2927 else 2928 @context["#{klass}_#{key}"] 2929 end 2910 2930 end 2911 2931 … … 2972 2992 end 2973 2993 return false 2994 end 2995 2996 def start_node_input(erb = true) 2997 if erb 2998 "<input type='hidden' name='s' value='<%= params[:s] || @node[:zip] %>'/>" 2999 else 3000 "&s=\#{params[:s] || @node[:zip]}" 3001 end 2974 3002 end 2975 3003 trunk/lib/query_builder/lib/query_builder.rb
r1096 r1111 152 152 end 153 153 154 def result_class 155 class_from_table(current_table) 156 end 157 154 158 protected 159 160 def current_table 161 @current_table || main_table 162 end 155 163 156 164 def main_table … … 495 503 496 504 # ******** Overwrite these ********** 505 def class_from_table(table_name) 506 Object 507 end 508 497 509 def parse_custom_query_argument(key, value) 498 510 return nil unless value trunk/test/functional/nodes_controller_test.rb
r1109 r1111 36 36 art = opening.find(:first, 'set_tag') 37 37 assert_equal 5, art.l_status 38 p ost 'update', :id => art[:zip], :node => {:l_status => 54321}, :link_id => links_id(:opening_in_art)38 put 'update', :id => art[:zip], :node => {:l_status => 54321}, :link_id => links_id(:opening_in_art) 39 39 art = assigns(:node) 40 40 assert_equal 54321, art.l_status trunk/test/helpers/node_query/relations.yml
r1074 r1111 29 29 projects_in_site: 30 30 sql: "SELECT nodes.* FROM nodes WHERE nodes.kpath LIKE 'NPP%' AND (#{@node.secure_scope('nodes')}) ORDER BY nodes.position ASC, nodes.name ASC" 31 32 #comments_order: 33 # src: "comments order by date desc" 34 # sql: "Comment: x" trunk/test/helpers/node_query_test.rb
r1103 r1111 17 17 login context[:visitor].to_sym 18 18 19 sql, errors = Node.build_find(:all,@@test_strings[file][test]['src'] || test.gsub('_',' '), context)19 sql, errors, uses_node_name, node_class = Node.build_find(:all,@@test_strings[file][test]['src'] || test.gsub('_',' '), context) 20 20 if test_err = @@test_strings[file][test]['err'] 21 21 assert_yaml_test test_err, errors.join(", ") … … 36 36 res = @node.do_find(:all, sql) 37 37 res = res ? res.map {|r| r[:name]}.join(', ') : '' 38 res = "#{node_class}: #{res}" if node_class != Node 38 39 assert_yaml_test test_res, res 39 40 else … … 56 57 login(:tiger) 57 58 assert var1_new = secure!(Node) { Node.get_class("Post").new } 58 assert_nil var1_new.do_find(:all, eval("\"#{Node.build_find(:all, 'posts in site', :node_name => 'self')}\"")) 59 sql, errors = Node.build_find(:all, 'posts in site', :node_name => 'self') 60 assert_nil var1_new.do_find(:all, eval("\"#{sql}\"")) 59 61 end 60 62 trunk/test/helpers/zena_parser/basic.yml
r1107 r1111 932 932 res: "<ul> <li><b>I agree</b> </li> <li><b>I think this is bad</b> <ul> <li><b>Why ?</b> </li></ul> </li> <li><b>OK for me</b> </li> </ul>" 933 933 934 #comments_with_params: 935 # src: "<r:comments order='date desc'><r:each join=', ' do='[title]'/></r:comments>" 936 # tem: "." 937 934 938 comments_shown_if_empty_but_can_comment: 935 939 src: "<r:comments><r:each do='[title]'/><r:add/></r:comments>"
