Refactoring: Move Ruby class definitions to dedicated files to improve orientation and expressiveness.
This commit is contained in:
parent
f0fdf7e7f3
commit
d354dee74c
16 changed files with 311 additions and 298 deletions
|
@ -225,8 +225,4 @@ returns
|
|||
# create
|
||||
History::Attribute.create!(name: name)
|
||||
end
|
||||
|
||||
class Object < ApplicationModel; end
|
||||
class Type < ApplicationModel; end
|
||||
class Attribute < ApplicationModel; end
|
||||
end
|
||||
|
|
4
app/models/history/attribute.rb
Normal file
4
app/models/history/attribute.rb
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class History::Attribute < ApplicationModel
|
||||
end
|
4
app/models/history/object.rb
Normal file
4
app/models/history/object.rb
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class History::Object < ApplicationModel
|
||||
end
|
4
app/models/history/type.rb
Normal file
4
app/models/history/type.rb
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class History::Type < ApplicationModel
|
||||
end
|
|
@ -245,11 +245,3 @@ class Link < ApplicationModel
|
|||
end
|
||||
|
||||
end
|
||||
|
||||
class Link::Type < ApplicationModel
|
||||
validates :name, presence: true
|
||||
end
|
||||
|
||||
class Link::Object < ApplicationModel
|
||||
validates :name, presence: true
|
||||
end
|
||||
|
|
5
app/models/link/object.rb
Normal file
5
app/models/link/object.rb
Normal file
|
@ -0,0 +1,5 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class Link::Object < ApplicationModel
|
||||
validates :name, presence: true
|
||||
end
|
5
app/models/link/type.rb
Normal file
5
app/models/link/type.rb
Normal file
|
@ -0,0 +1,5 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class Link::Type < ApplicationModel
|
||||
validates :name, presence: true
|
||||
end
|
|
@ -485,83 +485,4 @@ execute all pending package migrations at once
|
|||
|
||||
true
|
||||
end
|
||||
|
||||
class Migration < ApplicationModel
|
||||
|
||||
def self.linked
|
||||
szpm_files = []
|
||||
Dir.chdir(root) do
|
||||
szpm_files = Dir['*.szpm']
|
||||
end
|
||||
|
||||
szpm_files.each do |szpm_file|
|
||||
package = szpm_file.sub('.szpm', '')
|
||||
migrate(package)
|
||||
end
|
||||
end
|
||||
|
||||
def self.migrate(package, direction = 'normal')
|
||||
location = "#{root}/db/addon/#{package.underscore}"
|
||||
|
||||
return true if !File.exist?(location)
|
||||
|
||||
# get existing migrations
|
||||
migrations_existing = []
|
||||
Dir.foreach(location) do |entry|
|
||||
next if entry == '.'
|
||||
next if entry == '..'
|
||||
|
||||
migrations_existing.push entry
|
||||
end
|
||||
|
||||
# up
|
||||
migrations_existing = migrations_existing.sort
|
||||
|
||||
# down
|
||||
if direction == 'reverse'
|
||||
migrations_existing = migrations_existing.reverse
|
||||
end
|
||||
|
||||
migrations_existing.each do |migration|
|
||||
next if !migration.match?(/\.rb$/)
|
||||
|
||||
version = nil
|
||||
name = nil
|
||||
if migration =~ /^(.+?)_(.*)\.rb$/
|
||||
version = $1
|
||||
name = $2
|
||||
end
|
||||
if !version || !name
|
||||
raise "Invalid package migration '#{migration}'"
|
||||
end
|
||||
|
||||
# down
|
||||
done = Package::Migration.find_by(name: package.underscore, version: version)
|
||||
if direction == 'reverse'
|
||||
next if !done
|
||||
|
||||
logger.info "NOTICE: down package migration '#{migration}'"
|
||||
load "#{location}/#{migration}"
|
||||
classname = name.camelcase
|
||||
classname.constantize.down
|
||||
record = Package::Migration.find_by(name: package.underscore, version: version)
|
||||
record&.destroy
|
||||
|
||||
# up
|
||||
else
|
||||
next if done
|
||||
|
||||
logger.info "NOTICE: up package migration '#{migration}'"
|
||||
load "#{location}/#{migration}"
|
||||
classname = name.camelcase
|
||||
classname.constantize.up
|
||||
Package::Migration.create(name: package.underscore, version: version)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.root
|
||||
Rails.root
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
80
app/models/package/migration.rb
Normal file
80
app/models/package/migration.rb
Normal file
|
@ -0,0 +1,80 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class Package::Migration < ApplicationModel
|
||||
|
||||
def self.linked
|
||||
szpm_files = []
|
||||
Dir.chdir(root) do
|
||||
szpm_files = Dir['*.szpm']
|
||||
end
|
||||
|
||||
szpm_files.each do |szpm_file|
|
||||
package = szpm_file.sub('.szpm', '')
|
||||
migrate(package)
|
||||
end
|
||||
end
|
||||
|
||||
def self.migrate(package, direction = 'normal')
|
||||
location = "#{root}/db/addon/#{package.underscore}"
|
||||
|
||||
return true if !File.exist?(location)
|
||||
|
||||
# get existing migrations
|
||||
migrations_existing = []
|
||||
Dir.foreach(location) do |entry|
|
||||
next if entry == '.'
|
||||
next if entry == '..'
|
||||
|
||||
migrations_existing.push entry
|
||||
end
|
||||
|
||||
# up
|
||||
migrations_existing = migrations_existing.sort
|
||||
|
||||
# down
|
||||
if direction == 'reverse'
|
||||
migrations_existing = migrations_existing.reverse
|
||||
end
|
||||
|
||||
migrations_existing.each do |migration|
|
||||
next if !migration.match?(/\.rb$/)
|
||||
|
||||
version = nil
|
||||
name = nil
|
||||
if migration =~ /^(.+?)_(.*)\.rb$/
|
||||
version = $1
|
||||
name = $2
|
||||
end
|
||||
if !version || !name
|
||||
raise "Invalid package migration '#{migration}'"
|
||||
end
|
||||
|
||||
# down
|
||||
done = Package::Migration.find_by(name: package.underscore, version: version)
|
||||
if direction == 'reverse'
|
||||
next if !done
|
||||
|
||||
logger.info "NOTICE: down package migration '#{migration}'"
|
||||
load "#{location}/#{migration}"
|
||||
classname = name.camelcase
|
||||
classname.constantize.down
|
||||
record = Package::Migration.find_by(name: package.underscore, version: version)
|
||||
record&.destroy
|
||||
|
||||
# up
|
||||
else
|
||||
next if done
|
||||
|
||||
logger.info "NOTICE: up package migration '#{migration}'"
|
||||
load "#{location}/#{migration}"
|
||||
classname = name.camelcase
|
||||
classname.constantize.up
|
||||
Package::Migration.create(name: package.underscore, version: version)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.root
|
||||
Rails.root
|
||||
end
|
||||
end
|
|
@ -150,198 +150,4 @@ returns
|
|||
.order(:id)
|
||||
.pluck('tag_items.name')
|
||||
end
|
||||
|
||||
class Object < ApplicationModel
|
||||
validates :name, presence: true
|
||||
|
||||
=begin
|
||||
|
||||
lookup by name and create tag item
|
||||
|
||||
tag_object = Tag::Object.lookup_by_name_and_create('some tag')
|
||||
|
||||
=end
|
||||
|
||||
def self.lookup_by_name_and_create(name)
|
||||
name.strip!
|
||||
|
||||
tag_object = Tag::Object.lookup(name: name)
|
||||
return tag_object if tag_object
|
||||
|
||||
Tag::Object.create(name: name)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class Item < ApplicationModel
|
||||
validates :name, presence: true
|
||||
before_save :fill_namedowncase
|
||||
|
||||
=begin
|
||||
|
||||
lookup by name and create tag item
|
||||
|
||||
tag_item = Tag::Item.lookup_by_name_and_create('some tag')
|
||||
|
||||
=end
|
||||
|
||||
def self.lookup_by_name_and_create(name)
|
||||
name.strip!
|
||||
|
||||
tag_item = Tag::Item.lookup(name: name)
|
||||
return tag_item if tag_item
|
||||
|
||||
Tag::Item.create(name: name)
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
rename tag items
|
||||
|
||||
Tag::Item.rename(
|
||||
id: existing_tag_item_to_rename,
|
||||
name: 'new tag item name',
|
||||
updated_by_id: current_user.id,
|
||||
)
|
||||
|
||||
=end
|
||||
|
||||
def self.rename(data)
|
||||
|
||||
new_tag_name = data[:name].strip
|
||||
old_tag_item = Tag::Item.find(data[:id])
|
||||
already_existing_tag = Tag::Item.lookup(name: new_tag_name)
|
||||
|
||||
# check if no rename is needed
|
||||
return true if new_tag_name == old_tag_item.name
|
||||
|
||||
# merge old with new tag if already existing
|
||||
if already_existing_tag
|
||||
|
||||
# re-assign old tag to already existing tag
|
||||
Tag.where(tag_item_id: old_tag_item.id).each do |tag|
|
||||
|
||||
# check if tag already exists on object
|
||||
if Tag.find_by(tag_object_id: tag.tag_object_id, o_id: tag.o_id, tag_item_id: already_existing_tag.id)
|
||||
Tag.tag_remove(
|
||||
tag_object_id: tag.tag_object_id,
|
||||
o_id: tag.o_id,
|
||||
tag_item_id: old_tag_item.id,
|
||||
)
|
||||
next
|
||||
end
|
||||
|
||||
# re-assign
|
||||
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
|
||||
tag.tag_item_id = already_existing_tag.id
|
||||
tag.save
|
||||
|
||||
# touch reference objects
|
||||
Tag.touch_reference_by_params(
|
||||
object: tag_object.name,
|
||||
o_id: tag.o_id,
|
||||
)
|
||||
end
|
||||
|
||||
# delete not longer used tag
|
||||
old_tag_item.destroy
|
||||
return true
|
||||
end
|
||||
|
||||
update_referenced_objects(old_tag_item.name, new_tag_name)
|
||||
|
||||
# update new tag name
|
||||
old_tag_item.name = new_tag_name
|
||||
old_tag_item.save
|
||||
|
||||
# touch reference objects
|
||||
Tag.where(tag_item_id: old_tag_item.id).each do |tag|
|
||||
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
|
||||
Tag.touch_reference_by_params(
|
||||
object: tag_object.name,
|
||||
o_id: tag.o_id,
|
||||
)
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
remove tag item (destroy with reverences)
|
||||
|
||||
Tag::Item.remove(id)
|
||||
|
||||
=end
|
||||
|
||||
def self.remove(id)
|
||||
|
||||
# search for references, destroy and touch
|
||||
Tag.where(tag_item_id: id).each do |tag|
|
||||
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
|
||||
tag.destroy
|
||||
Tag.touch_reference_by_params(
|
||||
object: tag_object.name,
|
||||
o_id: tag.o_id,
|
||||
)
|
||||
end
|
||||
Tag::Item.find(id).destroy
|
||||
true
|
||||
end
|
||||
|
||||
def fill_namedowncase
|
||||
self.name_downcase = name.downcase
|
||||
true
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
Update referenced objects such as triggers, overviews, schedulers, and postmaster filters
|
||||
|
||||
Specifically, the following fields are updated:
|
||||
|
||||
Overview.condition
|
||||
Trigger.condition Trigger.perform
|
||||
Job.condition Job.perform
|
||||
PostmasterFilter.perform
|
||||
|
||||
=end
|
||||
|
||||
def self.update_referenced_objects(old_name, new_name)
|
||||
objects = Overview.all + Trigger.all + Job.all + PostmasterFilter.all
|
||||
|
||||
objects.each do |object|
|
||||
changed = false
|
||||
if object.has_attribute?(:condition)
|
||||
changed |= update_condition_hash object.condition, old_name, new_name
|
||||
end
|
||||
if object.has_attribute?(:perform)
|
||||
changed |= update_condition_hash object.perform, old_name, new_name
|
||||
end
|
||||
object.save if changed
|
||||
end
|
||||
end
|
||||
|
||||
def self.update_condition_hash(hash, old_name, new_name)
|
||||
changed = false
|
||||
hash.each do |key, condition|
|
||||
next if %w[ticket.tags x-zammad-ticket-tags].exclude? key
|
||||
next if condition[:value].split(', ').exclude? old_name
|
||||
|
||||
condition[:value] = update_name(condition[:value], old_name, new_name)
|
||||
changed = true
|
||||
end
|
||||
changed
|
||||
end
|
||||
|
||||
def self.update_name(condition, old_name, new_name)
|
||||
tags = condition.split(', ')
|
||||
return new_name if tags.size == 1
|
||||
|
||||
tags = tags.map { |t| t == old_name ? new_name : t }
|
||||
tags.join(', ')
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
|
171
app/models/tag/item.rb
Normal file
171
app/models/tag/item.rb
Normal file
|
@ -0,0 +1,171 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class Tag::Item < ApplicationModel
|
||||
validates :name, presence: true
|
||||
before_save :fill_namedowncase
|
||||
|
||||
=begin
|
||||
|
||||
lookup by name and create tag item
|
||||
|
||||
tag_item = Tag::Item.lookup_by_name_and_create('some tag')
|
||||
|
||||
=end
|
||||
|
||||
def self.lookup_by_name_and_create(name)
|
||||
name.strip!
|
||||
|
||||
tag_item = Tag::Item.lookup(name: name)
|
||||
return tag_item if tag_item
|
||||
|
||||
Tag::Item.create(name: name)
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
rename tag items
|
||||
|
||||
Tag::Item.rename(
|
||||
id: existing_tag_item_to_rename,
|
||||
name: 'new tag item name',
|
||||
updated_by_id: current_user.id,
|
||||
)
|
||||
|
||||
=end
|
||||
|
||||
def self.rename(data)
|
||||
|
||||
new_tag_name = data[:name].strip
|
||||
old_tag_item = Tag::Item.find(data[:id])
|
||||
already_existing_tag = Tag::Item.lookup(name: new_tag_name)
|
||||
|
||||
# check if no rename is needed
|
||||
return true if new_tag_name == old_tag_item.name
|
||||
|
||||
# merge old with new tag if already existing
|
||||
if already_existing_tag
|
||||
|
||||
# re-assign old tag to already existing tag
|
||||
Tag.where(tag_item_id: old_tag_item.id).each do |tag|
|
||||
|
||||
# check if tag already exists on object
|
||||
if Tag.find_by(tag_object_id: tag.tag_object_id, o_id: tag.o_id, tag_item_id: already_existing_tag.id)
|
||||
Tag.tag_remove(
|
||||
tag_object_id: tag.tag_object_id,
|
||||
o_id: tag.o_id,
|
||||
tag_item_id: old_tag_item.id,
|
||||
)
|
||||
next
|
||||
end
|
||||
|
||||
# re-assign
|
||||
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
|
||||
tag.tag_item_id = already_existing_tag.id
|
||||
tag.save
|
||||
|
||||
# touch reference objects
|
||||
Tag.touch_reference_by_params(
|
||||
object: tag_object.name,
|
||||
o_id: tag.o_id,
|
||||
)
|
||||
end
|
||||
|
||||
# delete not longer used tag
|
||||
old_tag_item.destroy
|
||||
return true
|
||||
end
|
||||
|
||||
update_referenced_objects(old_tag_item.name, new_tag_name)
|
||||
|
||||
# update new tag name
|
||||
old_tag_item.name = new_tag_name
|
||||
old_tag_item.save
|
||||
|
||||
# touch reference objects
|
||||
Tag.where(tag_item_id: old_tag_item.id).each do |tag|
|
||||
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
|
||||
Tag.touch_reference_by_params(
|
||||
object: tag_object.name,
|
||||
o_id: tag.o_id,
|
||||
)
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
remove tag item (destroy with reverences)
|
||||
|
||||
Tag::Item.remove(id)
|
||||
|
||||
=end
|
||||
|
||||
def self.remove(id)
|
||||
|
||||
# search for references, destroy and touch
|
||||
Tag.where(tag_item_id: id).each do |tag|
|
||||
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
|
||||
tag.destroy
|
||||
Tag.touch_reference_by_params(
|
||||
object: tag_object.name,
|
||||
o_id: tag.o_id,
|
||||
)
|
||||
end
|
||||
Tag::Item.find(id).destroy
|
||||
true
|
||||
end
|
||||
|
||||
def fill_namedowncase
|
||||
self.name_downcase = name.downcase
|
||||
true
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
Update referenced objects such as triggers, overviews, schedulers, and postmaster filters
|
||||
|
||||
Specifically, the following fields are updated:
|
||||
|
||||
Overview.condition
|
||||
Trigger.condition Trigger.perform
|
||||
Job.condition Job.perform
|
||||
PostmasterFilter.perform
|
||||
|
||||
=end
|
||||
|
||||
def self.update_referenced_objects(old_name, new_name)
|
||||
objects = Overview.all + Trigger.all + Job.all + PostmasterFilter.all
|
||||
|
||||
objects.each do |object|
|
||||
changed = false
|
||||
if object.has_attribute?(:condition)
|
||||
changed |= update_condition_hash object.condition, old_name, new_name
|
||||
end
|
||||
if object.has_attribute?(:perform)
|
||||
changed |= update_condition_hash object.perform, old_name, new_name
|
||||
end
|
||||
object.save if changed
|
||||
end
|
||||
end
|
||||
|
||||
def self.update_condition_hash(hash, old_name, new_name)
|
||||
changed = false
|
||||
hash.each do |key, condition|
|
||||
next if %w[ticket.tags x-zammad-ticket-tags].exclude? key
|
||||
next if condition[:value].split(', ').exclude? old_name
|
||||
|
||||
condition[:value] = update_name(condition[:value], old_name, new_name)
|
||||
changed = true
|
||||
end
|
||||
changed
|
||||
end
|
||||
|
||||
def self.update_name(condition, old_name, new_name)
|
||||
tags = condition.split(', ')
|
||||
return new_name if tags.size == 1
|
||||
|
||||
tags = tags.map { |t| t == old_name ? new_name : t }
|
||||
tags.join(', ')
|
||||
end
|
||||
end
|
22
app/models/tag/object.rb
Normal file
22
app/models/tag/object.rb
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class Tag::Object < ApplicationModel
|
||||
validates :name, presence: true
|
||||
|
||||
=begin
|
||||
|
||||
lookup by name and create tag item
|
||||
|
||||
tag_object = Tag::Object.lookup_by_name_and_create('some tag')
|
||||
|
||||
=end
|
||||
|
||||
def self.lookup_by_name_and_create(name)
|
||||
name.strip!
|
||||
|
||||
tag_object = Tag::Object.lookup(name: name)
|
||||
return tag_object if tag_object
|
||||
|
||||
Tag::Object.create(name: name)
|
||||
end
|
||||
end
|
|
@ -412,17 +412,4 @@ returns
|
|||
o_id: id,
|
||||
)
|
||||
end
|
||||
|
||||
class Flag < ApplicationModel
|
||||
end
|
||||
|
||||
class Sender < ApplicationModel
|
||||
include ChecksLatestChangeObserved
|
||||
validates :name, presence: true
|
||||
end
|
||||
|
||||
class Type < ApplicationModel
|
||||
include ChecksLatestChangeObserved
|
||||
validates :name, presence: true
|
||||
end
|
||||
end
|
||||
|
|
4
app/models/ticket/article/flag.rb
Normal file
4
app/models/ticket/article/flag.rb
Normal file
|
@ -0,0 +1,4 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class Ticket::Article::Flag < ApplicationModel
|
||||
end
|
6
app/models/ticket/article/sender.rb
Normal file
6
app/models/ticket/article/sender.rb
Normal file
|
@ -0,0 +1,6 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class Ticket::Article::Sender < ApplicationModel
|
||||
include ChecksLatestChangeObserved
|
||||
validates :name, presence: true
|
||||
end
|
6
app/models/ticket/article/type.rb
Normal file
6
app/models/ticket/article/type.rb
Normal file
|
@ -0,0 +1,6 @@
|
|||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||
|
||||
class Ticket::Article::Type < ApplicationModel
|
||||
include ChecksLatestChangeObserved
|
||||
validates :name, presence: true
|
||||
end
|
Loading…
Reference in a new issue