Global DMS view - Search by title does not work #1247

This commit is contained in:
Karel Pičman 2022-10-12 15:42:21 +02:00
parent 3dbc9e8247
commit 6e5c572532
3 changed files with 87 additions and 35 deletions

View File

@ -110,13 +110,15 @@ class DmsfFolder < ActiveRecord::Base
def self.permissions?(folder, allow_system = true)
# Administrator?
return true if (User.current.admin? || folder.nil?)
return true if (User.current&.admin? || folder.nil?)
# Permissions to the project?
return false unless User.current&.allowed_to?(:view_dmsf_folders, folder.project)
# System folder?
if folder && folder.system
return false unless allow_system || User.current.allowed_to?(:display_system_folders, folder.project)
return false if folder.issue && !folder.issue.visible?(User.current)
end
# Permissions?
# Permissions to the folder?
if folder.dmsf_folder_permissions.any?
role_ids = User.current.roles_for_project(folder.project).map{ |r| r.id }
role_permission_ids = folder.dmsf_folder_permissions.roles.map{ |p| p.object_id }

View File

@ -88,7 +88,7 @@ class DmsfQuery < Query
end
def default_sort_criteria
[['title', 'ASC']]
[%(title ASC)]
end
def base_scope
@ -101,8 +101,9 @@ class DmsfQuery < Query
# Returns the count of all items
def dmsf_count
Rails.logger.info ">>> #{base_scope.where(statement).to_sql}"
base_scope.where(statement).count
# We cannot use this due to the permissions
#base_scope.where(statement).count
dmsf_nodes.size
rescue ::ActiveRecord::StatementInvalid => e
raise StatementInvalid.new e.message
end
@ -117,7 +118,6 @@ class DmsfQuery < Query
def statement
unless @statement
@filter_dmsf_folder_id = false
filters_clauses = []
filters.each_key do |field|
v = values_for(field).clone
@ -191,7 +191,7 @@ class DmsfQuery < Query
end
end
case ActiveRecord::Base.connection.adapter_name.downcase
when 'sqlserver'
when /sqlserver/i
# This is just a workaround for #1352.
# limit and offset cause an error in case of MS SQL
items = base_scope.
@ -204,16 +204,38 @@ class DmsfQuery < Query
limit(options[:limit]).
offset(options[:offset]).to_a
end
fo = filters_on?
items.delete_if do |item|
case item.type
when 'project'
prj = Project.find_by(id: item.id)
!prj&.dmsf_available?
when 'folder'
dmsf_folder = DmsfFolder.find_by(id: item.id)
if dmsf_folder && (!DmsfFolder.permissions?(dmsf_folder, false))
true
!DmsfFolder.permissions?(dmsf_folder, false)
when 'file'
if fo
dmsf_file = DmsfFile.find_by(id: item.id)
if dmsf_file.dmsf_folder
!DmsfFolder.permissions?(dmsf_file.dmsf_folder, false)
else
!dmsf_file.project.dmsf_available?
end
else
false
end
when /link$/
if fo
dmsf_link = DmsfLink.find_by(id: item.id)
if dmsf_link.dmsf_folder
!dmsf_link.dmsf_folder.visible?
!DmsfFolder.permissions?(dmsf_link.dmsf_folder, false)
else
!dmsf_link.project.dmsf_available?
end
else
false
end
when 'project'
p = Project.find_by(id: item.id)
true unless p&.dmsf_available?
end
end
items
@ -225,9 +247,18 @@ class DmsfQuery < Query
private
def filters_on?
filters.each_key do |field|
if values_for(field).any?{ |value| value.present? }
return true
end
end
return false
end
def sub_query
case ActiveRecord::Base.connection.adapter_name.downcase
when 'sqlserver'
when /sqlserver/i
'dmsf_file_revisions.id = (SELECT TOP 1 r.id FROM dmsf_file_revisions r WHERE r.created_at = (SELECT MAX(created_at) FROM dmsf_file_revisions rr WHERE rr.dmsf_file_id = dmsf_files.id) AND r.dmsf_file_id = dmsf_files.id ORDER BY id DESC)'
else
'dmsf_file_revisions.id = (SELECT r.id FROM dmsf_file_revisions r WHERE r.created_at = (SELECT MAX(created_at) FROM dmsf_file_revisions rr WHERE rr.dmsf_file_id = dmsf_files.id) AND r.dmsf_file_id = dmsf_files.id ORDER BY id DESC LIMIT 1)'
@ -296,9 +327,13 @@ class DmsfQuery < Query
scope.none
else
scope = scope.non_templates if scope.respond_to?(:non_templates)
if project.nil? && filters_on?
scope
else
scope.where projects: { parent_id: project&.id }
end
end
end
def dmsf_folders_scope
cf_columns = +''
@ -332,7 +367,6 @@ class DmsfQuery < Query
joins('LEFT JOIN users ON dmsf_folders.user_id = users.id').
joins("LEFT JOIN dmsf_locks ON dmsf_folders.id = dmsf_locks.entity_id AND dmsf_locks.entity_type = 1 AND
(dmsf_locks.expires_at IS NULL OR dmsf_locks.expires_at > #{now})")
return scope.none unless project
if deleted
scope = scope.deleted
else
@ -341,16 +375,19 @@ class DmsfQuery < Query
if dmsf_folder_id
scope.where dmsf_folders: { dmsf_folder_id: dmsf_folder_id }
else
if statement.present? || deleted
scope.where dmsf_folders: { project_id: project.id }
if project.nil? && filters_on?
scope
else
scope.where dmsf_folders: { project_id: project.id, dmsf_folder_id: nil }
if statement.present? || deleted
scope.where dmsf_folders: { project_id: project&.id }
else
scope.where dmsf_folders: { project_id: project&.id, dmsf_folder_id: nil }
end
end
end
end
def dmsf_folder_links_scope
return nil unless project
cf_columns = +''
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
cf_columns << get_cf_query(id, 'DmsfFolder', 'dmsf_folders')
@ -391,16 +428,19 @@ class DmsfQuery < Query
if dmsf_folder_id
scope.where dmsf_links: { target_type: 'DmsfFolder', dmsf_folder_id: dmsf_folder_id}
else
if statement.present? || deleted
scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id }
if project.nil? && filters_on?
scope
else
scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id, dmsf_folder_id: nil }
if statement.present? || deleted
scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project&.id }
else
scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project&.id, dmsf_folder_id: nil }
end
end
end
end
def dmsf_files_scope
return nil unless project
cf_columns = +''
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
cf_columns << get_cf_query(id, 'DmsfFileRevision', 'dmsf_file_revisions')
@ -442,16 +482,19 @@ class DmsfQuery < Query
if dmsf_folder_id
scope.where dmsf_files: { dmsf_folder_id: dmsf_folder_id }
else
if statement.present? || deleted
scope.where dmsf_files: { project_id: project.id }
if project.nil? && filters_on?
scope
else
scope.where(dmsf_files: { project_id: project.id, dmsf_folder_id: nil })
if statement.present? || deleted
scope.where dmsf_files: { project_id: project&.id }
else
scope.where(dmsf_files: { project_id: project&.id, dmsf_folder_id: nil })
end
end
end
end
def dmsf_file_links_scope
return nil unless project
cf_columns = +''
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
cf_columns << get_cf_query(id, 'DmsfFileRevision', 'dmsf_file_revisions')
@ -494,17 +537,20 @@ class DmsfQuery < Query
if dmsf_folder_id
scope.where dmsf_links: { target_type: 'DmsfFile', dmsf_folder_id: dmsf_folder_id }
else
if statement.present? || deleted
scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id }
if project.nil? && filters_on?
scope
else
scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id, dmsf_folder_id: nil }
if statement.present? || deleted
scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project&.id }
else
scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project&.id, dmsf_folder_id: nil }
end
end
end
end
def dmsf_url_links_scope
return nil unless project
cf_columns = +''
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
cf_columns << ",NULL AS cf_#{id}"
@ -542,10 +588,14 @@ class DmsfQuery < Query
if dmsf_folder_id
scope.where dmsf_links: { target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id }
else
if statement.present? || deleted
scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id }
if project.nil? && filters_on?
scope
else
scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id, dmsf_folder_id: nil }
if statement.present? || deleted
scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project&.id }
else
scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project&.id, dmsf_folder_id: nil }
end
end
end
end

View File

@ -128,7 +128,7 @@ module RedmineDmsf
# Go recursively through the project tree until a dmsf enabled project is found
def dmsf_available?
return true if(visible? && module_enabled?(:dmsf))
return true if(visible? && module_enabled?(:dmsf) && User.current&.allowed_to?(:view_dmsf_folders, self))
children.each do |child|
return true if child.dmsf_available?
end