Merge branch 'master' into 3177-collection-choose-files
[arvados.git] / apps / workbench / app / controllers / application_controller.rb
index 1b87ceaa42261fe236018ed8b0f2406c451caedc..5cd11c1d9835abd55d89bf369dba0884f58e8271 100644 (file)
@@ -118,8 +118,14 @@ class ApplicationController < ActionController::Base
   def load_filters_and_paging_params
     if params[:order].blank?
       @order = 'created_at desc'
-    elsif !params[:order].is_a? Array
-      @order = params[:order].split(',')
+    elsif params[:order].is_a? Array
+      @order = params[:order]
+    else
+      begin
+        @order = JSON.load(params[:order])
+      rescue
+        @order = params[:order].split(',')
+      end
     end
     @order = [@order] unless @order.is_a? Array
 
@@ -251,6 +257,7 @@ class ApplicationController < ActionController::Base
       if params[:partial]
         f.json {
           find_objects_for_index if !@objects
+          @objects.fetch_multiple_pages(false)
           render json: {
             content: render_to_string(partial: "choose_rows.html",
                                       formats: [:html]),
@@ -393,12 +400,17 @@ class ApplicationController < ActionController::Base
     false  # For convenience to return from callbacks
   end
 
-  def using_specific_api_token(api_token)
+  def using_specific_api_token(api_token, opts={})
     start_values = {}
     [:arvados_api_token, :user].each do |key|
       start_values[key] = Thread.current[key]
     end
-    load_api_token(api_token)
+    if opts.fetch(:load_user, true)
+      load_api_token(api_token)
+    else
+      Thread.current[:arvados_api_token] = api_token
+      Thread.current[:user] = nil
+    end
     begin
       yield
     ensure
@@ -824,6 +836,12 @@ class ApplicationController < ActionController::Base
     crumbs = []
     current = @name_link || @object
     while current
+      # Halt if a group ownership loop is detected. API should refuse
+      # to produce this state, but it could still arise from a race
+      # condition when group ownership changes between our find()
+      # queries.
+      break if crumbs.collect(&:uuid).include? current.uuid
+
       if current.is_a?(Group) and current.group_class == 'project'
         crumbs.prepend current
       end