Class: TagGroup

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/tag_group.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#permissionsObject

Returns the value of attribute permissions.



25
26
27
# File 'app/models/tag_group.rb', line 25

def permissions
  @permissions
end

Class Method Details

.find_id_by_slug(slug) ⇒ Object

TODO: long term we can cache this if TONs of tag groups exist



50
51
52
53
# File 'app/models/tag_group.rb', line 50

def self.find_id_by_slug(slug)
  self.pluck(:id, :name).each { |id, name| return id if Slug.for(name) == slug }
  nil
end

.resolve_permissions(permissions) ⇒ Object



55
56
57
58
59
60
61
# File 'app/models/tag_group.rb', line 55

def self.resolve_permissions(permissions)
  permissions.map do |group, permission|
    group_id = Group.group_id_from_param(group)
    permission = TagGroupPermission.permission_types[permission] unless permission.is_a?(Integer)
    [group_id, permission]
  end
end

.visible(guardian) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'app/models/tag_group.rb', line 86

def self.visible(guardian)
  if guardian.is_staff?
    TagGroup
  else
    # (
    #   tag group is restricted to a category you can see
    #   OR
    #   tag group is not restricted to any categories
    # )
    # AND tag group can be seen by everyone
    filter_sql = <<~SQL
      (
        id IN (SELECT tag_group_id FROM category_tag_groups WHERE category_id IN (?))
        OR
        id NOT IN (SELECT tag_group_id FROM category_tag_groups)
      )
      AND id IN (SELECT tag_group_id FROM tag_group_permissions WHERE group_id IN (?))
    SQL

    TagGroup.where(
      filter_sql,
      guardian.allowed_category_ids,
      DiscourseTagging.permitted_group_ids(guardian),
    )
  end
end

Instance Method Details

#apply_permissionsObject



72
73
74
75
76
77
78
79
80
# File 'app/models/tag_group.rb', line 72

def apply_permissions
  if @permissions
    tag_group_permissions.destroy_all
    @permissions.each do |group_id, permission_type|
      tag_group_permissions.build(group_id: group_id, permission_type: permission_type)
    end
    @permissions = nil
  end
end

#init_permissionsObject



63
64
65
66
67
68
69
70
# File 'app/models/tag_group.rb', line 63

def init_permissions
  unless tag_group_permissions.present? || @permissions
    tag_group_permissions.build(
      group_id: Group::AUTO_GROUPS[:everyone],
      permission_type: TagGroupPermission.permission_types[:full],
    )
  end
end

#parent_tag_name=(tag_names_arg) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'app/models/tag_group.rb', line 31

def parent_tag_name=(tag_names_arg)
  if tag_names_arg.empty?
    self.parent_tag = nil
  else
    if tag_name =
         DiscourseTagging.tags_for_saving(
           tag_names_arg,
           Guardian.new(Discourse.system_user),
         ).first
      self.parent_tag = Tag.find_by_name(tag_name) || Tag.create(name: tag_name)
    end
  end
end

#remove_parent_from_groupObject



82
83
84
# File 'app/models/tag_group.rb', line 82

def remove_parent_from_group
  tags.delete(parent_tag) if tags.include?(parent_tag)
end

#tag_names=(tag_names_arg) ⇒ Object



27
28
29
# File 'app/models/tag_group.rb', line 27

def tag_names=(tag_names_arg)
  DiscourseTagging.add_or_create_tags_by_name(self, tag_names_arg, unlimited: true)
end