Merge branch 'master' into 2871-preload-objects
authorradhika <radhika@curoverse.com>
Fri, 6 Jun 2014 19:57:19 +0000 (15:57 -0400)
committerradhika <radhika@curoverse.com>
Fri, 6 Jun 2014 19:57:19 +0000 (15:57 -0400)
1  2 
apps/workbench/app/controllers/application_controller.rb

index 99bb2ca866e415a414f442ef973e9740c6e04d0c,7d49f55e33625c4eaa477762ba7652192b58e924..c9a761fe232d2a73a3a0a729f288eb4e63c056fa
@@@ -145,9 -145,18 +145,18 @@@ class ApplicationController < ActionCon
      @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
        root_of[g.uuid] == current_user.uuid
      end
    end
 +
 +  # helper method to get links for given object or uuid
 +  helper_method :links_for_object
 +  def links_for_object object_or_uuid
 +    uuid = object_or_uuid.is_a?(String) ? object_or_uuid : object_or_uuid.uuid
 +    preload_links_for_objects([object_or_uuid])
 +    @all_links_for[uuid]
 +  end
 +
 +  # helper method to preload links for given objects and uuids
 +  helper_method :preload_links_for_objects
 +  def preload_links_for_objects objects_and_uuids
 +    uuids = objects_and_uuids.collect { |x| x.is_a?(String) ? x : x.uuid }
 +    @all_links_for ||= {}
 +
 +    # if already preloaded for all of these uuids, return
 +    if not uuids.select { |x| @all_links_for[x].nil? }.any?
 +      return
 +    end
 +
 +    uuids.each do |x|
 +      @all_links_for[x] = []
 +    end
 +    # TODO: make sure we get every page of results from API server
 +    Link.filter([['head_uuid','in',uuids]]).each do |link|
 +      @all_links_for[link.head_uuid] << link
 +    end
 +  end
 +
 +  # helper method to get a certain number of objects of a specific type
 +  # this can be used to replace any uses of: "dataclass.limit(n)"
 +  helper_method :get_n_objects_of_class
 +  def get_n_objects_of_class dataclass, size
 +    # if the objects_map_for has a value for this dataclass, and the size used
 +    # to retrieve those objects is greater than or equal to size, return it
 +    size_key = "#{dataclass}_size"
 +    if @objects_map_for && @objects_map_for[dataclass] && @objects_map_for[size_key] &&
 +        (@objects_map_for[size_key] >= size)
 +      return @objects_map_for[dataclass]
 +    end
 +
 +    @objects_map_for = {}
 +    @objects_map_for[dataclass] = dataclass.limit(size)
 +    @objects_map_for[size_key] = size
 +
 +    return @objects_map_for[dataclass]
 +  end
 +
 +  # helper method to get collections for the given uuid
 +  helper_method :collections_for_object
 +  def collections_for_object uuid
 +    preload_collections_for_objects([uuid])
 +    @all_collections_for[uuid]
 +  end
 +
 +  # helper method to preload collections for the given uuids
 +  helper_method :preload_collections_for_objects
 +  def preload_collections_for_objects uuids
 +    @all_collections_for ||= {}
 +
 +    # if already preloaded for all of these uuids, return
 +    if not uuids.select { |x| @all_collections_for[x].nil? }.any?
 +      return
 +    end
 +
 +    uuids.each do |x|
 +      @all_collections_for[x] = []
 +    end
 +
 +    # TODO: make sure we get every page of results from API server
 +    Collection.where(uuid: uuids).each do |collection|
 +      @all_collections_for[collection.uuid] << collection
 +    end
 +  end
 +
 +  # helper method to get log collections for the given log
 +  helper_method :log_collections_for_object
 +  def log_collections_for_object log
 +    fixup = /([a-f0-9]{32}\+\d+)(\+?.*)/.match(log)
 +    uuid = fixup[1]
 +    preload_log_collections_for_objects([uuid])
 +    @all_log_collections_for[uuid]
 +  end
 +
 +  # helper method to preload collections for the given uuids
 +  helper_method :preload_log_collections_for_objects
 +  def preload_log_collections_for_objects logs
 +    uuids = []
 +    logs.each do |log|
 +      fixup = /([a-f0-9]{32}\+\d+)(\+?.*)/.match(log)
 +      uuids << fixup[1]
 +    end
 +
 +    # if already preloaded for all of these uuids, return
 +    @all_log_collections_for ||= {}
 +    if not uuids.select { |x| @all_log_collections_for[x].nil? }.any?
 +      return
 +    end
 +
 +    uuids.each do |x|
 +      @all_log_collections_for[x] = []
 +    end
 +
 +    # TODO: make sure we get every page of results from API server
 +    Collection.where(uuid: uuids).each do |collection|
 +      @all_log_collections_for[collection.uuid] << collection
 +    end
 +  end
 +
 +  # helper method to get object of a given dataclass and uuid
 +  helper_method :object_for_dataclass
 +  def object_for_dataclass dataclass, uuid
 +    preload_objects_for_dataclass(dataclass, [uuid])
 +    @objects_for[uuid]
 +  end
 +
 +  # helper method to preload objects for given dataclass and uuids
 +  helper_method :preload_objects_for_dataclass
 +  def preload_objects_for_dataclass dataclass, uuids
 +    @objects_for ||= {}
 +
 +    # if already preloaded for all of these uuids, return
 +    if not uuids.select { |x| @objects_for[x].nil? }.any?
 +      return
 +    end
 +
 +    dataclass.where(uuid: uuids).each do |obj|
 +      @objects_for[obj.uuid] = obj
 +    end
 +  end
 +
  end