myexperiment-hackers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myexperiment-hackers] [2157] trunk: various changes to support more tag


From: noreply
Subject: [myexperiment-hackers] [2157] trunk: various changes to support more tagging queries
Date: Mon, 6 Apr 2009 11:10:29 -0400 (EDT)

Revision
2157
Author
dgc
Date
2009-04-06 11:10:28 -0400 (Mon, 06 Apr 2009)

Log Message

various changes to support more tagging queries

Modified Paths

Diff

Modified: trunk/config/tables.xml


(Binary files differ)

Modified: trunk/lib/rest.rb (2156 => 2157)


--- trunk/lib/rest.rb	2009-04-02 15:40:06 UTC (rev 2156)
+++ trunk/lib/rest.rb	2009-04-06 15:10:28 UTC (rev 2157)
@@ -18,7 +18,7 @@
                                'Foreign Accessor',
                                'List Element Name', 'List Element Accessor',
                                'Example', 'Versioned', 'Key type',
-                               'Limited to user', 'Permission' ] },
+                               'Limited to user', 'Permission', 'Index filter' ] },
                 
     'REST'  => { :indices => [ 'URI', 'Method' ] }
   } )
@@ -134,7 +134,7 @@
 
     case model_data['Encoding'][i]
 
-      when 'list'
+      when 'list', 'item as list'
 
         list_element = XML::Node.new(model_data['REST Attribute'][i])
 
@@ -144,6 +144,8 @@
 
         collection = eval("ob.#{model_data['Accessor'][i]}")
 
+        collection = [collection] if model_data['Encoding'][i] == 'item as list'
+
         # filter out things that the user cannot see
         collection = collection.select do |c|
           not c.respond_to?('contribution') or Authorization.is_authorized?("view", nil, c, user)
@@ -292,9 +294,9 @@
   rest_get_request(ob, params[:uri], user, eval("rest_resource_uri(ob)"), rest_name, query)
 end
 
-def find_all_paginated_auth(model, find_args, num, page, user)
+def find_all_paginated_auth(model, find_args, num, page, filters, user)
 
-  def aux(model, find_args, num, page, user)
+  def aux(model, find_args, num, page, filters, user)
 
     find_args = find_args.clone
     find_args[:page] = { :size => num, :current => page }
@@ -304,7 +306,15 @@
     return nil if results.page > results.page_count
 
     results.select do |result|
-      Authorization.is_authorized?('view', nil, result, user)
+      selected = Authorization.is_authorized?('view', nil, result, user)
+
+      if selected
+        filters.each do |attribute,value|
+          selected = false unless result.send(attribute).downcase == value.downcase
+        end
+      end
+
+      selected
     end
   end
 
@@ -319,13 +329,13 @@
   # up to possibly fulfil the request
 
   if (page > 1)
-    results = aux(model, find_args, upto, 1, user)
+    results = aux(model, find_args, upto, 1, filters, user)
     current_page = page + 1
   end
 
   while (results.length < upto)
 
-    results_page = aux(model, find_args, num, current_page, user)
+    results_page = aux(model, find_args, num, current_page, filters, user)
 
     if results_page.nil?
       break
@@ -359,6 +369,20 @@
 
   page = 1 if page < 1
 
+  model = TABLES["Model"][:data][TABLES["REST"][:data][req_uri]["GET"]["REST Entity"]]
+
+  # detect filters
+
+  filters = {}
+
+  (0..model["REST Attribute"].length - 1).each do |i|
+    filter_name = model["Index filter"][i]
+
+    if !filter_name.nil? && !query[filter_name].nil?
+      filters[filter_name] = query[filter_name]
+    end
+  end
+
   if query['tag']
     tag = Tag.find_by_name(query['tag'])
 
@@ -386,7 +410,7 @@
 
     find_args[:conditions] = conditions if conditions
 
-    obs = find_all_paginated_auth(model_name.camelize, find_args, limit, page, user)
+    obs = find_all_paginated_auth(model_name.camelize, find_args, limit, page, filters, user)
   end
 
   produce_rest_list(req_uri, rules, query, obs, rest_name.pluralize, user)
@@ -443,6 +467,7 @@
     when 'User';                   return user_url(ob)
     when 'Review';                 return workflow_review_url(ob.reviewable, ob)
     when 'Comment';                return "#{rest_resource_uri(ob.commentable)}/comments/#{ob.id}"
+    when 'Bookmark';               return nil
     when 'Blog';                   return blog_url(ob)
     when 'BlogPost';               return blog_post_url(ob.blog, ob)
     when 'Rating';                 return "#{rest_resource_uri(ob.rateable)}/ratings/#{ob.id}"
@@ -479,6 +504,7 @@
     when 'User';                   return "#{base}/user.xml?id=#{ob.id}"
     when 'Review';                 return "#{base}/review.xml?id=#{ob.id}"
     when 'Comment';                return "#{base}/comment.xml?id=#{ob.id}"
+    when 'Bookmark';               return "#{base}/favourite.xml?id=#{ob.id}"
     when 'Blog';                   return "#{base}/blog.xml?id=#{ob.id}"
     when 'BlogPost';               return "#{base}/blog-post.xml?id=#{ob.id}"
     when 'Rating';                 return "#{base}/rating.xml?id=#{ob.id}"
@@ -524,6 +550,8 @@
     when 'PackContributableEntry'; return rest_object_tag_text(ob.contributable)
     when 'PackRemoteEntry';        return 'external'
     when 'Workflow::Version';      return 'workflow'
+    when 'Comment';                return 'comment'
+    when 'Bookmark';               return 'favourite'
   end
 
   return 'object'

reply via email to

[Prev in Thread] Current Thread [Next in Thread]