diff options
author | Sean McGivern <sean@mcgivern.me.uk> | 2017-01-12 13:22:30 +0300 |
---|---|---|
committer | Sean McGivern <sean@mcgivern.me.uk> | 2017-01-12 13:22:30 +0300 |
commit | e4cde4281c45ceef49f89370724453a0bb6f15cc (patch) | |
tree | a3a730a3b4a614ee7f23663997c16fe629c43977 /app | |
parent | 826adaaff876d2b6b5886e6d8133b0d0c2cd4a2d (diff) | |
parent | d3cfa39e3cb7a4a04f3f42d00c4740d317690bbc (diff) |
Merge branch 'fix/project-delete-tooltip' into 'master'
Fix project queued for deletion re-creation tooltip
Closes #17235
See merge request !5393
Diffstat (limited to 'app')
-rw-r--r-- | app/models/concerns/valid_attribute.rb | 10 | ||||
-rw-r--r-- | app/models/project.rb | 20 |
2 files changed, 30 insertions, 0 deletions
diff --git a/app/models/concerns/valid_attribute.rb b/app/models/concerns/valid_attribute.rb new file mode 100644 index 00000000000..8c35cea8d58 --- /dev/null +++ b/app/models/concerns/valid_attribute.rb @@ -0,0 +1,10 @@ +module ValidAttribute + extend ActiveSupport::Concern + + # Checks whether an attribute has failed validation or not + # + # +attribute+ The symbolised name of the attribute i.e :name + def valid_attribute?(attribute) + self.errors.empty? || self.errors.messages[attribute].nil? + end +end diff --git a/app/models/project.rb b/app/models/project.rb index 94a6f3ba799..c22386c84e9 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -12,6 +12,7 @@ class Project < ActiveRecord::Base include AfterCommitQueue include CaseSensitivity include TokenAuthenticatable + include ValidAttribute include ProjectFeaturesCompatibility include SelectForProjectAuthorization include Routable @@ -65,6 +66,8 @@ class Project < ActiveRecord::Base end end + after_validation :check_pending_delete + ActsAsTaggableOn.strict_case_match = true acts_as_taggable_on :tags @@ -1320,4 +1323,21 @@ class Project < ActiveRecord::Base stats = statistics || build_statistics stats.update(namespace_id: namespace_id) end + + def check_pending_delete + return if valid_attribute?(:name) && valid_attribute?(:path) + return unless pending_delete_twin + + %i[route route.path name path].each do |error| + errors.delete(error) + end + + errors.add(:base, "The project is still being deleted. Please try again later.") + end + + def pending_delete_twin + return false unless path + + Project.unscoped.where(pending_delete: true).find_with_namespace(path_with_namespace) + end end |