X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c0c1111f322159333fdf14e3d3e8ce0c00662734..66d12ae6dc72d45cc3cb3fcc007cb41371371616:/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 aa87a60384..41d5566885 100644 --- a/apps/workbench/app/controllers/application_controller.rb +++ b/apps/workbench/app/controllers/application_controller.rb @@ -2,7 +2,8 @@ class ApplicationController < ActionController::Base respond_to :html, :json, :js protect_from_forgery around_filter :thread_clear - around_filter :thread_with_api_token, :except => [:render_exception, :render_not_found] + around_filter :thread_with_mandatory_api_token, :except => [:render_exception, :render_not_found] + around_filter :thread_with_optional_api_token before_filter :find_object_by_uuid, :except => [:index, :render_exception, :render_not_found] before_filter :check_user_agreements, :except => [:render_exception, :render_not_found] before_filter :check_user_notifications, :except => [:render_exception, :render_not_found] @@ -23,11 +24,13 @@ class ApplicationController < ActionController::Base def unprocessable(message=nil) @errors ||= [] + @errors << message if message render_error status: 422 end def render_error(opts) + opts = {status: 500}.merge opts respond_to do |f| # json must come before html here, so it gets used as the # default format when js is requested by the client. This lets @@ -56,7 +59,19 @@ class ApplicationController < ActionController::Base end def index - @objects ||= model_class.limit(1000).all + if params[:limit] + limit = params[:limit].to_i + else + limit = 200 + end + + if params[:offset] + offset = params[:offset].to_i + else + offset = 0 + end + + @objects ||= model_class.limit(limit).offset(offset).all respond_to do |f| f.json { render json: @objects } f.html { render } @@ -94,8 +109,16 @@ class ApplicationController < ActionController::Base def update updates = params[@object.class.to_s.underscore.singularize.to_sym] updates.keys.each do |attr| - if @object.send(attr).is_a? Hash and updates[attr].is_a? String - updates[attr] = Oj.load updates[attr] + if @object.send(attr).is_a? Hash + 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) + end end end if @object.update_attributes updates @@ -106,14 +129,22 @@ class ApplicationController < ActionController::Base end def create - @object ||= model_class.new params[model_class.to_s.singularize.to_sym] + @object ||= model_class.new params[model_class.to_s.underscore.singularize] @object.save! - redirect_to(params[:return_to] || @object) + + respond_to do |f| + f.json { render json: @object } + f.html { + redirect_to(params[:return_to] || @object) + } + f.js { render } + end end def destroy if @object.destroy respond_to do |f| + f.json { render json: @object } f.html { redirect_to(params[:return_to] || :back) } @@ -139,7 +170,16 @@ class ApplicationController < ActionController::Base def breadcrumb_page_name (@breadcrumb_page_name || - (@object.friendly_link_name if @object.respond_to? :friendly_link_name)) + (@object.friendly_link_name if @object.respond_to? :friendly_link_name) || + action_name) + end + + def index_pane_list + %w(Recent) + end + + def show_pane_list + %w(Attributes Metadata JSON API) end protected @@ -228,9 +268,22 @@ class ApplicationController < ActionController::Base end end - def thread_with_optional_api_token - thread_with_api_token(true) do + def thread_with_mandatory_api_token + thread_with_api_token do + yield + end + end + + # This runs after thread_with_mandatory_api_token in the filter chain. + def thread_with_optional_api_token + if Thread.current[:arvados_api_token] + # We are already inside thread_with_mandatory_api_token. yield + else + # We skipped thread_with_mandatory_api_token. Use the optional version. + thread_with_api_token(true) do + yield + end end end @@ -289,26 +342,17 @@ class ApplicationController < ActionController::Base } } - @@notification_tests.push lambda { |controller, current_user| - AuthorizedKey.limit(1).where(authorized_user_uuid: current_user.uuid).each do - return nil - end - return lambda { |view| - view.render partial: 'notifications/jobs_notification' - } - } + #@@notification_tests.push lambda { |controller, current_user| + # Job.limit(1).where(created_by: current_user.uuid).each do + # return nil + # end + # return lambda { |view| + # view.render partial: 'notifications/jobs_notification' + # } + #} @@notification_tests.push lambda { |controller, current_user| - Job.limit(1).where(created_by: current_user.uuid).each do - return nil - end - return lambda { |view| - view.render partial: 'notifications/jobs_notification' - } - } - - @@notification_tests.push lambda { |controller, current_user| - Collection.limit(1).where(created_by: current_user.uuid).each do + Collection.limit(1).where(created_by: current_user.uuid).each do return nil end return lambda { |view| @@ -317,7 +361,7 @@ class ApplicationController < ActionController::Base } @@notification_tests.push lambda { |controller, current_user| - PipelineInstance.limit(1).where(created_by: current_user.uuid).each do + PipelineInstance.limit(1).where(created_by: current_user.uuid).each do return nil end return lambda { |view| @@ -343,34 +387,5 @@ class ApplicationController < ActionController::Base if @notification_count == 0 @notification_count = '' end - - # @my_ssh_keys = AuthorizedKey.where(authorized_user_uuid: current_user.uuid) - # @my_vm_perms = Link.where(tail_uuid: current_user.uuid, head_kind: 'arvados#virtual_machine', link_class: 'permission', name: 'can_login') - # @my_repo_perms = Link.where(tail_uuid: current_user.uuid, head_kind: 'arvados#repository', link_class: 'permission', name: 'can_write') - - # @my_tag_links = {} - - # @my_jobs = Job. - # limit(10). - # order('created_at desc'). - # where(created_by: current_user.uuid) - - # @my_collections = Collection. - # limit(10). - # order('created_at desc'). - # where(created_by: current_user.uuid) - - # Link.limit(1000).where(head_uuid: @my_collections.collect(&:uuid), - # link_class: 'tag').each do |link| - # (@my_tag_links[link.head_uuid] ||= []) << link - # end - - # @my_pipelines = PipelineInstance. - # limit(10). - # order('created_at desc'). - # where(created_by: current_user.uuid) - - - end end