Global DMS view - Search by title does not work #1247
This commit is contained in:
parent
3dbc9e8247
commit
6e5c572532
@ -110,13 +110,15 @@ class DmsfFolder < ActiveRecord::Base
|
|||||||
|
|
||||||
def self.permissions?(folder, allow_system = true)
|
def self.permissions?(folder, allow_system = true)
|
||||||
# Administrator?
|
# 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?
|
# System folder?
|
||||||
if folder && folder.system
|
if folder && folder.system
|
||||||
return false unless allow_system || User.current.allowed_to?(:display_system_folders, folder.project)
|
return false unless allow_system || User.current.allowed_to?(:display_system_folders, folder.project)
|
||||||
return false if folder.issue && !folder.issue.visible?(User.current)
|
return false if folder.issue && !folder.issue.visible?(User.current)
|
||||||
end
|
end
|
||||||
# Permissions?
|
# Permissions to the folder?
|
||||||
if folder.dmsf_folder_permissions.any?
|
if folder.dmsf_folder_permissions.any?
|
||||||
role_ids = User.current.roles_for_project(folder.project).map{ |r| r.id }
|
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 }
|
role_permission_ids = folder.dmsf_folder_permissions.roles.map{ |p| p.object_id }
|
||||||
|
|||||||
@ -88,7 +88,7 @@ class DmsfQuery < Query
|
|||||||
end
|
end
|
||||||
|
|
||||||
def default_sort_criteria
|
def default_sort_criteria
|
||||||
[['title', 'ASC']]
|
[%(title ASC)]
|
||||||
end
|
end
|
||||||
|
|
||||||
def base_scope
|
def base_scope
|
||||||
@ -101,8 +101,9 @@ class DmsfQuery < Query
|
|||||||
|
|
||||||
# Returns the count of all items
|
# Returns the count of all items
|
||||||
def dmsf_count
|
def dmsf_count
|
||||||
Rails.logger.info ">>> #{base_scope.where(statement).to_sql}"
|
# We cannot use this due to the permissions
|
||||||
base_scope.where(statement).count
|
#base_scope.where(statement).count
|
||||||
|
dmsf_nodes.size
|
||||||
rescue ::ActiveRecord::StatementInvalid => e
|
rescue ::ActiveRecord::StatementInvalid => e
|
||||||
raise StatementInvalid.new e.message
|
raise StatementInvalid.new e.message
|
||||||
end
|
end
|
||||||
@ -117,7 +118,6 @@ class DmsfQuery < Query
|
|||||||
|
|
||||||
def statement
|
def statement
|
||||||
unless @statement
|
unless @statement
|
||||||
@filter_dmsf_folder_id = false
|
|
||||||
filters_clauses = []
|
filters_clauses = []
|
||||||
filters.each_key do |field|
|
filters.each_key do |field|
|
||||||
v = values_for(field).clone
|
v = values_for(field).clone
|
||||||
@ -191,7 +191,7 @@ class DmsfQuery < Query
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
case ActiveRecord::Base.connection.adapter_name.downcase
|
case ActiveRecord::Base.connection.adapter_name.downcase
|
||||||
when 'sqlserver'
|
when /sqlserver/i
|
||||||
# This is just a workaround for #1352.
|
# This is just a workaround for #1352.
|
||||||
# limit and offset cause an error in case of MS SQL
|
# limit and offset cause an error in case of MS SQL
|
||||||
items = base_scope.
|
items = base_scope.
|
||||||
@ -204,16 +204,38 @@ class DmsfQuery < Query
|
|||||||
limit(options[:limit]).
|
limit(options[:limit]).
|
||||||
offset(options[:offset]).to_a
|
offset(options[:offset]).to_a
|
||||||
end
|
end
|
||||||
|
fo = filters_on?
|
||||||
items.delete_if do |item|
|
items.delete_if do |item|
|
||||||
case item.type
|
case item.type
|
||||||
|
when 'project'
|
||||||
|
prj = Project.find_by(id: item.id)
|
||||||
|
!prj&.dmsf_available?
|
||||||
when 'folder'
|
when 'folder'
|
||||||
dmsf_folder = DmsfFolder.find_by(id: item.id)
|
dmsf_folder = DmsfFolder.find_by(id: item.id)
|
||||||
if dmsf_folder && (!DmsfFolder.permissions?(dmsf_folder, false))
|
!DmsfFolder.permissions?(dmsf_folder, false)
|
||||||
true
|
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
|
end
|
||||||
when 'project'
|
|
||||||
p = Project.find_by(id: item.id)
|
|
||||||
true unless p&.dmsf_available?
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
items
|
items
|
||||||
@ -225,9 +247,18 @@ class DmsfQuery < Query
|
|||||||
|
|
||||||
private
|
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
|
def sub_query
|
||||||
case ActiveRecord::Base.connection.adapter_name.downcase
|
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)'
|
'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
|
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)'
|
'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,7 +327,11 @@ class DmsfQuery < Query
|
|||||||
scope.none
|
scope.none
|
||||||
else
|
else
|
||||||
scope = scope.non_templates if scope.respond_to?(:non_templates)
|
scope = scope.non_templates if scope.respond_to?(:non_templates)
|
||||||
scope.where projects: { parent_id: project&.id }
|
if project.nil? && filters_on?
|
||||||
|
scope
|
||||||
|
else
|
||||||
|
scope.where projects: { parent_id: project&.id }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -332,7 +367,6 @@ class DmsfQuery < Query
|
|||||||
joins('LEFT JOIN users ON dmsf_folders.user_id = users.id').
|
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
|
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})")
|
(dmsf_locks.expires_at IS NULL OR dmsf_locks.expires_at > #{now})")
|
||||||
return scope.none unless project
|
|
||||||
if deleted
|
if deleted
|
||||||
scope = scope.deleted
|
scope = scope.deleted
|
||||||
else
|
else
|
||||||
@ -341,16 +375,19 @@ class DmsfQuery < Query
|
|||||||
if dmsf_folder_id
|
if dmsf_folder_id
|
||||||
scope.where dmsf_folders: { dmsf_folder_id: dmsf_folder_id }
|
scope.where dmsf_folders: { dmsf_folder_id: dmsf_folder_id }
|
||||||
else
|
else
|
||||||
if statement.present? || deleted
|
if project.nil? && filters_on?
|
||||||
scope.where dmsf_folders: { project_id: project.id }
|
scope
|
||||||
else
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def dmsf_folder_links_scope
|
def dmsf_folder_links_scope
|
||||||
return nil unless project
|
|
||||||
cf_columns = +''
|
cf_columns = +''
|
||||||
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
|
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
|
||||||
cf_columns << get_cf_query(id, 'DmsfFolder', 'dmsf_folders')
|
cf_columns << get_cf_query(id, 'DmsfFolder', 'dmsf_folders')
|
||||||
@ -391,16 +428,19 @@ class DmsfQuery < Query
|
|||||||
if dmsf_folder_id
|
if dmsf_folder_id
|
||||||
scope.where dmsf_links: { target_type: 'DmsfFolder', dmsf_folder_id: dmsf_folder_id}
|
scope.where dmsf_links: { target_type: 'DmsfFolder', dmsf_folder_id: dmsf_folder_id}
|
||||||
else
|
else
|
||||||
if statement.present? || deleted
|
if project.nil? && filters_on?
|
||||||
scope.where dmsf_links: { target_type: 'DmsfFolder', project_id: project.id }
|
scope
|
||||||
else
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def dmsf_files_scope
|
def dmsf_files_scope
|
||||||
return nil unless project
|
|
||||||
cf_columns = +''
|
cf_columns = +''
|
||||||
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
|
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
|
||||||
cf_columns << get_cf_query(id, 'DmsfFileRevision', 'dmsf_file_revisions')
|
cf_columns << get_cf_query(id, 'DmsfFileRevision', 'dmsf_file_revisions')
|
||||||
@ -442,16 +482,19 @@ class DmsfQuery < Query
|
|||||||
if dmsf_folder_id
|
if dmsf_folder_id
|
||||||
scope.where dmsf_files: { dmsf_folder_id: dmsf_folder_id }
|
scope.where dmsf_files: { dmsf_folder_id: dmsf_folder_id }
|
||||||
else
|
else
|
||||||
if statement.present? || deleted
|
if project.nil? && filters_on?
|
||||||
scope.where dmsf_files: { project_id: project.id }
|
scope
|
||||||
else
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def dmsf_file_links_scope
|
def dmsf_file_links_scope
|
||||||
return nil unless project
|
|
||||||
cf_columns = +''
|
cf_columns = +''
|
||||||
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
|
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
|
||||||
cf_columns << get_cf_query(id, 'DmsfFileRevision', 'dmsf_file_revisions')
|
cf_columns << get_cf_query(id, 'DmsfFileRevision', 'dmsf_file_revisions')
|
||||||
@ -494,17 +537,20 @@ class DmsfQuery < Query
|
|||||||
if dmsf_folder_id
|
if dmsf_folder_id
|
||||||
scope.where dmsf_links: { target_type: 'DmsfFile', dmsf_folder_id: dmsf_folder_id }
|
scope.where dmsf_links: { target_type: 'DmsfFile', dmsf_folder_id: dmsf_folder_id }
|
||||||
else
|
else
|
||||||
if statement.present? || deleted
|
if project.nil? && filters_on?
|
||||||
scope.where dmsf_links: { target_type: 'DmsfFile', project_id: project.id }
|
scope
|
||||||
else
|
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
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def dmsf_url_links_scope
|
def dmsf_url_links_scope
|
||||||
return nil unless project
|
|
||||||
cf_columns = +''
|
cf_columns = +''
|
||||||
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
|
DmsfFileRevisionCustomField.visible.order(:position).pluck(:id).each do |id|
|
||||||
cf_columns << ",NULL AS cf_#{id}"
|
cf_columns << ",NULL AS cf_#{id}"
|
||||||
@ -542,10 +588,14 @@ class DmsfQuery < Query
|
|||||||
if dmsf_folder_id
|
if dmsf_folder_id
|
||||||
scope.where dmsf_links: { target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id }
|
scope.where dmsf_links: { target_type: 'DmsfUrl', dmsf_folder_id: dmsf_folder_id }
|
||||||
else
|
else
|
||||||
if statement.present? || deleted
|
if project.nil? && filters_on?
|
||||||
scope.where dmsf_links: { target_type: 'DmsfUrl', project_id: project.id }
|
scope
|
||||||
else
|
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
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -128,7 +128,7 @@ module RedmineDmsf
|
|||||||
|
|
||||||
# Go recursively through the project tree until a dmsf enabled project is found
|
# Go recursively through the project tree until a dmsf enabled project is found
|
||||||
def dmsf_available?
|
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|
|
children.each do |child|
|
||||||
return true if child.dmsf_available?
|
return true if child.dmsf_available?
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user