50 lines
1.8 KiB
Ruby
50 lines
1.8 KiB
Ruby
class Fandom < Tag
|
|
|
|
NAME = ArchiveConfig.FANDOM_CATEGORY_NAME
|
|
|
|
has_many :wrangling_assignments
|
|
has_many :wranglers, through: :wrangling_assignments, source: :user
|
|
|
|
has_many :parents, through: :common_taggings, source: :filterable, source_type: 'Tag', after_remove: :check_media
|
|
has_many :medias, -> { where(type: 'Media') }, through: :common_taggings, source: :filterable, source_type: 'Tag'
|
|
has_many :characters, -> { where(type: 'Character') }, through: :child_taggings, source: :common_tag
|
|
has_many :relationships, -> { where(type: 'Relationship') }, through: :child_taggings, source: :common_tag
|
|
has_many :freeforms, -> { where(type: 'Freeform') }, through: :child_taggings, source: :common_tag
|
|
|
|
|
|
scope :by_media, lambda {|media| where(media_id: media.id)}
|
|
|
|
def unwrangled?
|
|
Media.uncategorized.fandoms.include?(self)
|
|
end
|
|
|
|
# An association callback to add the default media if all others have been removed
|
|
def check_media(media)
|
|
self.add_media_for_uncategorized
|
|
end
|
|
|
|
after_save :add_media_for_uncategorized
|
|
def add_media_for_uncategorized
|
|
if self.medias.empty? && self.type == "Fandom" # type could be something else if the tag is in the process of being re-categorised (re-sorted)
|
|
self.parents << Media.uncategorized
|
|
end
|
|
end
|
|
|
|
before_update :check_wrangling_status
|
|
def check_wrangling_status
|
|
if self.canonical_changed? && !self.canonical?
|
|
if !self.canonical? && self.merger_id
|
|
self.merger.wranglers = (self.wranglers + self.merger.wranglers).uniq
|
|
end
|
|
self.wranglers = []
|
|
end
|
|
end
|
|
|
|
# Types of tags to which a fandom tag can belong via common taggings or meta taggings
|
|
def parent_types
|
|
['Media', 'MetaTag']
|
|
end
|
|
def child_types
|
|
['Character', 'Relationship', 'Freeform', 'SubTag', 'Merger']
|
|
end
|
|
end
|