From 589531d9fa507e4d31b98783170348ad8e031fb1 Mon Sep 17 00:00:00 2001 From: "karel.picman@lbcfree.net" Date: Wed, 5 May 2021 13:50:48 +0200 Subject: [PATCH] Files remain locked after content editing --- app/views/dmsf_context_menus/_file.html.erb | 2 +- lib/redmine_dmsf/lockable.rb | 32 +++++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/app/views/dmsf_context_menus/_file.html.erb b/app/views/dmsf_context_menus/_file.html.erb index eff1c647..263a910a 100644 --- a/app/views/dmsf_context_menus/_file.html.erb +++ b/app/views/dmsf_context_menus/_file.html.erb @@ -40,7 +40,7 @@ <% if locked %> <%= context_menu_link l(:button_unlock), unlock_dmsf_files_path(id: dmsf_file), class: 'icon icon-unlock', title: l(:title_locked_by_user, user: dmsf_file.locked_by), - disabled: !allowed || !unlockable %> + disabled: !unlockable %> <% else %> <%= context_menu_link l(:button_lock), lock_dmsf_files_path(id: dmsf_file), class: 'icon icon-lock', disabled: !allowed %> diff --git a/lib/redmine_dmsf/lockable.rb b/lib/redmine_dmsf/lockable.rb index c3187fd0..16e18a6c 100644 --- a/lib/redmine_dmsf/lockable.rb +++ b/lib/redmine_dmsf/lockable.rb @@ -90,23 +90,25 @@ module RedmineDmsf # By using the path upwards, surely this would be quicker? def locked_for_user?(args = nil) return false unless locked? - b_shared = nil + shared = nil self.dmsf_path.each do |entity| locks = entity.locks || entity.lock(false) next if locks.empty? locks.each do |lock| next if lock.expired? # In case we're in between updates + owner = args[:owner] if args + owner ||= User.current&.login if lock.lock_scope == :scope_exclusive - return true if (lock.user&.id != User.current.id) || ((lock.owner != (args ? args[:owner] : nil))) + return true if (lock.user&.id != User.current.id) || (lock.owner && (lock.owner != owner)) else - b_shared = true if b_shared.nil? - if b_shared && (lock.user&.id == User.current.id) && (lock.owner == (args ? args[:owner] : nil)) || + shared = true if shared.nil? + if shared && (lock.user&.id == User.current.id) && (!lock.owner || (lock.owner == owner)) || (args && (args[:scope] == 'shared')) - b_shared = false + shared = false end end end - return true if b_shared + return true if shared end false end @@ -114,6 +116,7 @@ module RedmineDmsf def unlock!(force_file_unlock_allowed = false, owner = nil) raise DmsfLockError.new(l(:warning_file_not_locked)) unless self.locked? existing = self.lock(true) + destroyed = false # If its empty its a folder that's locked (not root) if existing.empty? || (!self.dmsf_folder.nil? && self.dmsf_folder.locked?) raise DmsfLockError.new(l(:error_unlock_parent_locked)) @@ -125,26 +128,31 @@ module RedmineDmsf # Now we need to determine lock type and do the needful if (existing.count == 1) && (existing[0].lock_scope == :exclusive) existing[0].destroy + destroyed = true else - b_destroyed = false existing.each do |lock| + owner = User.current&.login if lock.owner && owner.nil? if ((lock.user&.id == User.current.id) && (lock.owner == owner)) || User.current.admin? lock.destroy - b_destroyed = true + destroyed = true break end end # At first it was going to be allowed for someone with force_file_unlock to delete all shared by default # Instead, they by default remove themselves from shared lock, and everyone from shared lock if they're not # on said lock - if !b_destroyed && (User.current.allowed_to?(:force_file_unlock, self.project) || force_file_unlock_allowed) + if !destroyed && (User.current.allowed_to?(:force_file_unlock, self.project) || force_file_unlock_allowed) locks.delete_all + destroyed = true end end end - reload - locks.reload + if destroyed + reload + locks.reload + end + destroyed end - true + end end