X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/04b9d6e93ca8bd18dca697e56689820516c8c572..5dbc1ae3d451f904654a2a61e5df620808ac175d:/services/api/app/models/arvados_model.rb diff --git a/services/api/app/models/arvados_model.rb b/services/api/app/models/arvados_model.rb index c67a3961d9..93d5b9a023 100644 --- a/services/api/app/models/arvados_model.rb +++ b/services/api/app/models/arvados_model.rb @@ -240,7 +240,7 @@ class ArvadosModel < ActiveRecord::Base end.compact.uniq end - # Return a query with read permissions restricted to the union of of the + # Return a query with read permissions restricted to the union of the # permissions of the members of users_list, i.e. if something is readable by # any user in users_list, it will be readable in the query returned by this # function. @@ -258,6 +258,7 @@ class ArvadosModel < ActiveRecord::Base # Collect the UUIDs of the authorized users. sql_table = kwargs.fetch(:table_name, table_name) include_trash = kwargs.fetch(:include_trash, false) + include_old_versions = kwargs.fetch(:include_old_versions, false) sql_conds = nil user_uuids = users_list.map { |u| u.uuid } @@ -273,9 +274,8 @@ class ArvadosModel < ActiveRecord::Base if !include_trash if sql_table != "api_client_authorizations" # Only include records where the owner is not trashed - sql_conds = "NOT EXISTS(SELECT 1 FROM #{PERMISSION_VIEW} "+ - "WHERE trashed = 1 AND "+ - "(#{sql_table}.owner_uuid = target_uuid)) #{exclude_trashed_records}" + sql_conds = "#{sql_table}.owner_uuid NOT IN (SELECT target_uuid FROM #{PERMISSION_VIEW} "+ + "WHERE trashed = 1) #{exclude_trashed_records}" end end else @@ -293,14 +293,14 @@ class ArvadosModel < ActiveRecord::Base # see issue 13208 for details. # Match a direct read permission link from the user to the record uuid - direct_check = "EXISTS(SELECT 1 FROM #{PERMISSION_VIEW} "+ - "WHERE user_uuid IN (:user_uuids) AND perm_level >= 1 #{trashed_check} AND target_uuid = #{sql_table}.uuid)" + direct_check = "#{sql_table}.uuid IN (SELECT target_uuid FROM #{PERMISSION_VIEW} "+ + "WHERE user_uuid IN (:user_uuids) AND perm_level >= 1 #{trashed_check})" # Match a read permission link from the user to the record's owner_uuid owner_check = "" if sql_table != "api_client_authorizations" and sql_table != "groups" then - owner_check = "OR EXISTS(SELECT 1 FROM #{PERMISSION_VIEW} "+ - "WHERE user_uuid IN (:user_uuids) AND perm_level >= 1 #{trashed_check} AND target_uuid = #{sql_table}.owner_uuid AND target_owner_uuid IS NOT NULL) " + owner_check = "OR #{sql_table}.owner_uuid IN (SELECT target_uuid FROM #{PERMISSION_VIEW} "+ + "WHERE user_uuid IN (:user_uuids) AND perm_level >= 1 #{trashed_check} AND target_owner_uuid IS NOT NULL) " end links_cond = "" @@ -316,6 +316,15 @@ class ArvadosModel < ActiveRecord::Base end + if !include_old_versions && sql_table == "collections" + exclude_old_versions = "#{sql_table}.uuid = #{sql_table}.current_version_uuid" + if sql_conds.nil? + sql_conds = exclude_old_versions + else + sql_conds += " AND #{exclude_old_versions}" + end + end + self.where(sql_conds, user_uuids: user_uuids, permission_link_classes: ['permission', 'resources']) @@ -363,7 +372,13 @@ class ArvadosModel < ActiveRecord::Base end self[:name] = new_name - self[:uuid] = nil if uuid_was.nil? && !uuid.nil? + if uuid_was.nil? && !uuid.nil? + self[:uuid] = nil + if self.is_a? Collection + # Reset so that is assigned to the new UUID + self[:current_version_uuid] = nil + end + end conn.exec_query 'SAVEPOINT save_with_unique_name' retry ensure @@ -387,7 +402,7 @@ class ArvadosModel < ActiveRecord::Base cast = serialized_attributes[column] ? '::text' : '' "coalesce(#{column}#{cast},'')" end - "to_tsvector('english', #{parts.join(" || ' ' || ")})" + "to_tsvector('english', substr(#{parts.join(" || ' ' || ")}, 0, 8000))" end def self.apply_filters query, filters @@ -537,12 +552,12 @@ class ArvadosModel < ActiveRecord::Base def update_modified_by_fields current_time = db_current_time - self.created_at = created_at_was || current_time + self.created_at ||= created_at_was || current_time self.updated_at = current_time self.owner_uuid ||= current_default_owner if self.respond_to? :owner_uuid= - self.modified_at = current_time if !anonymous_updater self.modified_by_user_uuid = current_user ? current_user.uuid : nil + self.modified_at = current_time end self.modified_by_client_uuid = current_api_client ? current_api_client.uuid : nil true