X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d455c8373cf39f4310d2b0e13e7a9d02aca0b2ab..70148c4918a95ee9a49a18bf5789801d02e8ef5e:/apps/workbench/app/controllers/application_controller.rb diff --git a/apps/workbench/app/controllers/application_controller.rb b/apps/workbench/app/controllers/application_controller.rb index 2fbd8c560f..72eb4df1e8 100644 --- a/apps/workbench/app/controllers/application_controller.rb +++ b/apps/workbench/app/controllers/application_controller.rb @@ -1,18 +1,17 @@ class ApplicationController < ActionController::Base + include ArvadosApiClientHelper + respond_to :html, :json, :js protect_from_forgery ERROR_ACTIONS = [:render_error, :render_not_found] around_filter :thread_clear - around_filter(:thread_with_mandatory_api_token, - except: [:index, :show] + ERROR_ACTIONS) + around_filter :thread_with_mandatory_api_token, except: ERROR_ACTIONS around_filter :thread_with_optional_api_token before_filter :check_user_agreements, except: ERROR_ACTIONS before_filter :check_user_notifications, except: ERROR_ACTIONS - around_filter :using_reader_tokens, only: [:index, :show] before_filter :find_object_by_uuid, except: [:index] + ERROR_ACTIONS - before_filter :check_my_folders, :except => ERROR_ACTIONS theme :select_theme begin @@ -64,6 +63,22 @@ class ApplicationController < ActionController::Base self.render_error status: 404 end + def render_index + respond_to do |f| + f.json { render json: @objects } + f.html { + if params['tab_pane'] + comparable = self.respond_to? :compare + render(partial: 'show_' + params['tab_pane'].downcase, + locals: { comparable: comparable, objects: @objects }) + else + render + end + } + f.js { render } + end + end + def index @limit ||= 200 if params[:limit] @@ -86,11 +101,7 @@ class ApplicationController < ActionController::Base @objects ||= model_class @objects = @objects.filter(@filters).limit(@limit).offset(@offset).all - respond_to do |f| - f.json { render json: @objects } - f.html { render } - f.js { render } - end + render_index end def show @@ -100,10 +111,16 @@ class ApplicationController < ActionController::Base respond_to do |f| f.json { render json: @object.attributes.merge(href: url_for(@object)) } f.html { - if request.method == 'GET' - render + if params['tab_pane'] + comparable = self.respond_to? :compare + render(partial: 'show_' + params['tab_pane'].downcase, + locals: { comparable: comparable, objects: @objects }) else - redirect_to params[:return_to] || @object + if request.method == 'GET' + render + else + redirect_to params[:return_to] || @object + end end } f.js { render } @@ -121,21 +138,21 @@ class ApplicationController < ActionController::Base end def update - updates = params[@object.class.to_s.underscore.singularize.to_sym] - updates.keys.each do |attr| + @updates ||= params[@object.class.to_s.underscore.singularize.to_sym] + @updates.keys.each do |attr| if @object.send(attr).is_a? Hash - if updates[attr].is_a? String - updates[attr] = Oj.load updates[attr] + if @updates[attr].is_a? String + @updates[attr] = Oj.load @updates[attr] end if params[:merge] || params["merge_#{attr}".to_sym] # Merge provided Hash with current Hash, instead of # replacing. - updates[attr] = @object.send(attr).with_indifferent_access. - deep_merge(updates[attr].with_indifferent_access) + @updates[attr] = @object.send(attr).with_indifferent_access. + deep_merge(@updates[attr].with_indifferent_access) end end end - if @object.update_attributes updates + if @object.update_attributes @updates show else self.render_error status: 422 @@ -146,9 +163,18 @@ class ApplicationController < ActionController::Base @new_resource_attrs ||= params[model_class.to_s.underscore.singularize] @new_resource_attrs ||= {} @new_resource_attrs.reject! { |k,v| k.to_s == 'uuid' } - @object ||= model_class.new @new_resource_attrs - @object.save! - show + @object ||= model_class.new @new_resource_attrs, params["options"] + if @object.save + respond_to do |f| + f.json { render json: @object.attributes.merge(href: url_for(@object)) } + f.html { + redirect_to @object + } + f.js { render } + end + else + self.render_error status: 422 + end end def destroy @@ -166,8 +192,18 @@ class ApplicationController < ActionController::Base end def current_user + return Thread.current[:user] if Thread.current[:user] + if Thread.current[:arvados_api_token] - Thread.current[:user] ||= User.current + if session[:user] + if session[:user][:is_active] != true + Thread.current[:user] = User.current + else + Thread.current[:user] = User.new(session[:user]) + end + else + Thread.current[:user] = User.current + end else logger.error "No API token in Thread" return nil @@ -198,7 +234,7 @@ class ApplicationController < ActionController::Base respond_to do |f| f.html { if request.method == 'GET' - redirect_to $arvados_api_client.arvados_login_url(return_to: request.url) + redirect_to arvados_api_client.arvados_login_url(return_to: request.url) else flash[:error] = "Either you are not logged in, or your session has timed out. I can't automatically log you in and re-attempt this request." redirect_to :back @@ -212,23 +248,6 @@ class ApplicationController < ActionController::Base false # For convenience to return from callbacks end - def using_reader_tokens(login_optional=false) - if params[:reader_tokens].is_a?(Array) and params[:reader_tokens].any? - Thread.current[:reader_tokens] = params[:reader_tokens] - end - begin - yield - rescue ArvadosApiClient::NotLoggedInException - if login_optional - raise - else - return redirect_to_login - end - ensure - Thread.current[:reader_tokens] = nil - end - end - def using_specific_api_token(api_token) start_values = {} [:arvados_api_token, :user].each do |key| @@ -278,6 +297,16 @@ class ApplicationController < ActionController::Base # call to verify its authenticity. if verify_api_token session[:arvados_api_token] = params[:api_token] + u = User.current + session[:user] = { + uuid: u.uuid, + email: u.email, + first_name: u.first_name, + last_name: u.last_name, + is_active: u.is_active, + is_admin: u.is_admin, + prefs: u.prefs + } if !request.format.json? and request.method == 'GET' # Repeat this request with api_token in the (new) session # cookie instead of the query string. This prevents API @@ -421,16 +450,9 @@ class ApplicationController < ActionController::Base } } - def check_my_folders - @my_top_level_folders = lambda do - @top_level_folders ||= Group. - filter([['group_class','=','folder'], - ['owner_uuid','=',current_user.uuid]]). - sort_by { |x| x.name || '' } - end - end - def check_user_notifications + return if params['tab_pane'] + @notification_count = 0 @notifications = [] @@ -449,4 +471,30 @@ class ApplicationController < ActionController::Base @notification_count = '' end end + + helper_method :my_folders + def my_folders + return @my_folders if @my_folders + @my_folders = [] + root_of = {} + Group.filter([['group_class','=','folder']]).each do |g| + root_of[g.uuid] = g.owner_uuid + @my_folders << g + end + done = false + while not done + done = true + root_of = root_of.each_with_object({}) do |(child, parent), h| + if root_of[parent] + h[child] = root_of[parent] + done = false + else + h[child] = parent + end + end + end + @my_folders = @my_folders.select do |g| + root_of[g.uuid] == current_user.uuid + end + end end