2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2014-09-25 23:32:08 +08:00
|
|
|
class UserField < ActiveRecord::Base
|
2016-12-22 13:46:22 +08:00
|
|
|
include AnonCacheInvalidator
|
2024-05-23 19:18:25 +08:00
|
|
|
include HasDeprecatedColumns
|
2021-10-27 22:33:07 +08:00
|
|
|
include HasSanitizableFields
|
2016-12-22 13:46:22 +08:00
|
|
|
|
2024-11-25 11:54:43 +08:00
|
|
|
FLAG_ATTRIBUTES = %w[editable show_on_profile show_on_user_card searchable].freeze
|
|
|
|
|
2024-05-23 19:18:25 +08:00
|
|
|
deprecate_column :required, drop_from: "3.3"
|
2024-06-20 16:24:48 +08:00
|
|
|
self.ignored_columns += %i[field_type]
|
2024-05-23 19:18:25 +08:00
|
|
|
|
2024-06-12 15:30:13 +08:00
|
|
|
validates_presence_of :description
|
2019-03-14 01:40:43 +08:00
|
|
|
validates_presence_of :name, unless: -> { field_type == "confirm" }
|
2015-07-29 00:29:40 +08:00
|
|
|
has_many :user_field_options, dependent: :destroy
|
2021-06-08 01:34:01 +08:00
|
|
|
has_one :directory_column, dependent: :destroy
|
2015-07-29 00:29:40 +08:00
|
|
|
accepts_nested_attributes_for :user_field_options
|
2015-02-24 02:02:30 +08:00
|
|
|
|
2021-10-27 22:33:07 +08:00
|
|
|
before_save :sanitize_description
|
2024-06-25 19:32:18 +08:00
|
|
|
after_create :update_required_fields_version
|
|
|
|
after_update :update_required_fields_version, if: -> { saved_change_to_requirement? }
|
2021-04-27 13:52:45 +08:00
|
|
|
after_save :queue_index_search
|
|
|
|
|
2022-05-16 21:21:33 +08:00
|
|
|
scope :public_fields, -> { where(show_on_profile: true).or(where(show_on_user_card: true)) }
|
2024-06-25 19:32:18 +08:00
|
|
|
scope :required, -> { not_optional }
|
2022-05-16 21:21:33 +08:00
|
|
|
|
2024-05-23 19:18:25 +08:00
|
|
|
enum :requirement, { optional: 0, for_all_users: 1, on_signup: 2 }.freeze
|
2024-06-20 16:24:48 +08:00
|
|
|
enum :field_type_enum, { text: 0, confirm: 1, dropdown: 2, multiselect: 3 }.freeze
|
|
|
|
alias_attribute :field_type, :field_type_enum
|
2024-06-12 15:30:13 +08:00
|
|
|
|
2015-02-24 02:02:30 +08:00
|
|
|
def self.max_length
|
|
|
|
2048
|
|
|
|
end
|
2021-04-27 13:52:45 +08:00
|
|
|
|
2024-05-23 19:18:25 +08:00
|
|
|
def required?
|
|
|
|
!optional?
|
|
|
|
end
|
|
|
|
|
2021-04-27 13:52:45 +08:00
|
|
|
def queue_index_search
|
2024-04-25 20:58:34 +08:00
|
|
|
Jobs.enqueue(:index_user_fields_for_search, user_field_id: self.id)
|
2021-04-27 13:52:45 +08:00
|
|
|
end
|
2021-10-27 22:33:07 +08:00
|
|
|
|
|
|
|
private
|
|
|
|
|
2024-06-25 19:32:18 +08:00
|
|
|
def update_required_fields_version
|
|
|
|
return if !for_all_users?
|
|
|
|
|
|
|
|
UserRequiredFieldsVersion.create
|
|
|
|
Discourse.request_refresh!
|
|
|
|
end
|
|
|
|
|
2021-10-27 22:33:07 +08:00
|
|
|
def sanitize_description
|
|
|
|
if description_changed?
|
2023-01-06 21:18:35 +08:00
|
|
|
self.description = sanitize_field(self.description, additional_attributes: ["target"])
|
2021-10-27 22:33:07 +08:00
|
|
|
end
|
|
|
|
end
|
2014-09-25 23:32:08 +08:00
|
|
|
end
|
2014-11-20 11:53:15 +08:00
|
|
|
|
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: user_fields
|
|
|
|
#
|
2016-04-08 20:35:41 +08:00
|
|
|
# id :integer not null, primary key
|
2019-01-12 03:29:56 +08:00
|
|
|
# name :string not null
|
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
2016-04-08 20:35:41 +08:00
|
|
|
# editable :boolean default(FALSE), not null
|
2019-01-12 03:29:56 +08:00
|
|
|
# description :string not null
|
2016-04-08 20:35:41 +08:00
|
|
|
# required :boolean default(TRUE), not null
|
|
|
|
# show_on_profile :boolean default(FALSE), not null
|
|
|
|
# position :integer default(0)
|
2016-06-17 09:28:30 +08:00
|
|
|
# show_on_user_card :boolean default(FALSE), not null
|
2018-09-20 10:40:51 +08:00
|
|
|
# external_name :string
|
|
|
|
# external_type :string
|
2021-04-27 13:52:45 +08:00
|
|
|
# searchable :boolean default(FALSE), not null
|
2024-05-23 19:18:25 +08:00
|
|
|
# requirement :integer default("optional"), not null
|
2024-06-20 16:24:48 +08:00
|
|
|
# field_type_enum :integer not null
|
2014-11-20 11:53:15 +08:00
|
|
|
#
|