# TODO: Need to check the impact on plugins. Disable for now.
- 'lib/redmine/preparation.rb'
+Rails/ApplicationRecord:
+ Exclude:
+ - 'db/migrate/0*.rb'
+
Rails/BulkChangeTable:
Exclude:
- 'db/migrate/20120714122200_add_workflows_rule_fields.rb'
- 'app/models/mail_handler.rb'
- 'app/models/mailer.rb'
-# This cop supports unsafe autocorrection (--autocorrect-all).
-Rails/ApplicationRecord:
- Enabled: false
-
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Include.
# Include: **/test/**/*
nil
end
return unless klass && Class === klass # rubocop:disable Style/CaseEquality
- return unless klass < ActiveRecord::Base
+ return unless klass < ApplicationRecord
return unless klass < Redmine::Acts::Watchable::InstanceMethods
scope = klass.where(:id => Array.wrap(params[:object_id]))
--- /dev/null
+# frozen_string_literal: true
+# Redmine - project management software
+# Copyright (C) 2006-2023 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+class ApplicationRecord < ActiveRecord::Base
+ self.abstract_class = true
+
+ # Translate attribute names for validation errors display
+ def self.human_attribute_name(attr, options = {})
+ prepared_attr = attr.to_s.sub(/_id$/, '').sub(/^.+\./, '')
+ class_prefix = name.underscore.tr('/', '_')
+ redmine_default = [
+ :"field_#{class_prefix}_#{prepared_attr}",
+ :"field_#{prepared_attr}"
+ ]
+ options[:default] = redmine_default + Array(options[:default])
+ super
+ end
+end
require "fileutils"
require "zip"
-class Attachment < ActiveRecord::Base
+class Attachment < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :container, :polymorphic => true
belongs_to :author, :class_name => "User"
class AuthSourceException < StandardError; end
class AuthSourceTimeoutException < AuthSourceException; end
-class AuthSource < ActiveRecord::Base
+class AuthSource < ApplicationRecord
include Redmine::SafeAttributes
include Redmine::SubclassFactory
include Redmine::Ciphering
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Board < ActiveRecord::Base
+class Board < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
has_many :messages, lambda {order("#{Message.table_name}.created_on DESC")}, :dependent => :destroy
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Change < ActiveRecord::Base
+class Change < ApplicationRecord
belongs_to :changeset
validates_presence_of :changeset_id, :action, :path
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Changeset < ActiveRecord::Base
+class Changeset < ApplicationRecord
belongs_to :repository
belongs_to :user
has_many :filechanges, :class_name => 'Change', :dependent => :delete_all
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Comment < ActiveRecord::Base
+class Comment < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :commented, :polymorphic => true, :counter_cache => true
belongs_to :author, :class_name => 'User'
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class CustomField < ActiveRecord::Base
+class CustomField < ApplicationRecord
include Redmine::SafeAttributes
include Redmine::SubclassFactory
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class CustomFieldEnumeration < ActiveRecord::Base
+class CustomFieldEnumeration < ApplicationRecord
belongs_to :custom_field
validates_presence_of :name, :position, :custom_field_id
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class CustomValue < ActiveRecord::Base
+class CustomValue < ApplicationRecord
belongs_to :custom_field
belongs_to :customized, :polymorphic => true
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Document < ActiveRecord::Base
+class Document < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
belongs_to :category, :class_name => "DocumentCategory"
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class EmailAddress < ActiveRecord::Base
+class EmailAddress < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :user
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class EnabledModule < ActiveRecord::Base
+class EnabledModule < ApplicationRecord
belongs_to :project
acts_as_watchable
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Enumeration < ActiveRecord::Base
+class Enumeration < ApplicationRecord
include Redmine::SubclassFactory
default_scope lambda {order(:position)}
require 'csv'
-class Import < ActiveRecord::Base
+class Import < ApplicationRecord
has_many :items, :class_name => 'ImportItem', :dependent => :delete_all
belongs_to :user
serialize :settings
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class ImportItem < ActiveRecord::Base
+class ImportItem < ApplicationRecord
belongs_to :import
validates_presence_of :import_id, :position
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Issue < ActiveRecord::Base
+class Issue < ApplicationRecord
include Redmine::SafeAttributes
include Redmine::Utils::DateCalculation
include Redmine::I18n
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class IssueCategory < ActiveRecord::Base
+class IssueCategory < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
belongs_to :assigned_to, :class_name => 'Principal'
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class IssueRelation < ActiveRecord::Base
+class IssueRelation < ApplicationRecord
# Class used to represent the relations of an issue
class Relations < Array
include Redmine::I18n
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class IssueStatus < ActiveRecord::Base
+class IssueStatus < ApplicationRecord
include Redmine::SafeAttributes
before_destroy :check_integrity
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Journal < ActiveRecord::Base
+class Journal < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :journalized, :polymorphic => true
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class JournalDetail < ActiveRecord::Base
+class JournalDetail < ApplicationRecord
belongs_to :journal
def custom_field
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Member < ActiveRecord::Base
+class Member < ApplicationRecord
belongs_to :user
belongs_to :principal, :foreign_key => 'user_id'
has_many :member_roles, :dependent => :destroy
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class MemberRole < ActiveRecord::Base
+class MemberRole < ApplicationRecord
belongs_to :member
belongs_to :role
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Message < ActiveRecord::Base
+class Message < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :board
belongs_to :author, :class_name => 'User'
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class News < ActiveRecord::Base
+class News < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
belongs_to :author, :class_name => 'User'
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Principal < ActiveRecord::Base
+class Principal < ApplicationRecord
self.table_name = "#{table_name_prefix}users#{table_name_suffix}"
# Account statuses
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Project < ActiveRecord::Base
+class Project < ApplicationRecord
include Redmine::SafeAttributes
include Redmine::NestedSet::ProjectNestedSet
end
end
-class Query < ActiveRecord::Base
+class Query < ApplicationRecord
class StatementInvalid < ::ActiveRecord::StatementInvalid
end
class ScmFetchError < StandardError; end
-class Repository < ActiveRecord::Base
+class Repository < ApplicationRecord
include Redmine::Ciphering
include Redmine::SafeAttributes
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Role < ActiveRecord::Base
+class Role < ApplicationRecord
include Redmine::SafeAttributes
# Custom coder for the permissions attribute that should be an
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Setting < ActiveRecord::Base
+class Setting < ApplicationRecord
PASSWORD_CHAR_CLASSES = {
'uppercase' => /[A-Z]/,
'lowercase' => /[a-z]/,
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class TimeEntry < ActiveRecord::Base
+class TimeEntry < ApplicationRecord
include Redmine::SafeAttributes
# could have used polymorphic association
# project association here allows easy loading of time entries at project level with one database trip
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Token < ActiveRecord::Base
+class Token < ApplicationRecord
belongs_to :user
validates_uniqueness_of :value, :case_sensitive => true
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Tracker < ActiveRecord::Base
+class Tracker < ApplicationRecord
include Redmine::SafeAttributes
CORE_FIELDS_UNDISABLABLE = %w(project_id tracker_id subject is_private).freeze
require 'redmine/my_page'
-class UserPreference < ActiveRecord::Base
+class UserPreference < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :user
end
end
-class Version < ActiveRecord::Base
+class Version < ApplicationRecord
include Redmine::SafeAttributes
after_update :update_issues_from_sharing_change
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Watcher < ActiveRecord::Base
+class Watcher < ApplicationRecord
belongs_to :watchable, :polymorphic => true
belongs_to :user, :class_name => 'Principal'
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class Wiki < ActiveRecord::Base
+class Wiki < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
has_many :pages, lambda {order(Arel.sql('LOWER(title)').asc)}, :class_name => 'WikiPage', :dependent => :destroy
require 'zlib'
-class WikiContent < ActiveRecord::Base
+class WikiContent < ApplicationRecord
self.locking_column = 'version'
belongs_to :page, :class_name => 'WikiPage'
belongs_to :author, :class_name => 'User'
require 'zlib'
-class WikiContentVersion < ActiveRecord::Base
+class WikiContentVersion < ApplicationRecord
belongs_to :page, :class_name => 'WikiPage'
belongs_to :author, :class_name => 'User'
require 'redmine/string_array_diff/diff'
-class WikiPage < ActiveRecord::Base
+class WikiPage < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :wiki
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class WikiRedirect < ActiveRecord::Base
+class WikiRedirect < ApplicationRecord
belongs_to :wiki
validates_presence_of :wiki_id, :title, :redirects_to
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-class WorkflowRule < ActiveRecord::Base
+class WorkflowRule < ApplicationRecord
self.table_name = "#{table_name_prefix}workflows#{table_name_suffix}"
belongs_to :role
# frozen_string_literal: true
module ActiveRecord
- class Base
- # Translate attribute names for validation errors display
- def self.human_attribute_name(attr, options = {})
- prepared_attr = attr.to_s.delete_suffix('_id').sub(/^.+\./, '')
- class_prefix = name.underscore.tr('/', '_')
-
- redmine_default = [
- :"field_#{class_prefix}_#{prepared_attr}",
- :"field_#{prepared_attr}"
- ]
-
- options[:default] = redmine_default + Array(options[:default])
-
- super
- end
- end
# Undefines private Kernel#open method to allow using `open` scopes in models.
# See Defect #11545 (http://www.redmine.org/issues/11545) for details.
-class Meeting < ActiveRecord::Base
+class Meeting < ApplicationRecord
belongs_to :project
acts_as_event :title => Proc.new {|o| "#{o.scheduled_on} Meeting"},
end
def parent_class_name
- options[:parent] || "ActiveRecord::Base"
+ options[:parent] || "ApplicationRecord"
end
end
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_activity_provider'
-ActiveRecord::Base.send(:include, Redmine::Acts::ActivityProvider)
+Rails.application.reloader.to_prepare do
+ ApplicationRecord.send(:include, Redmine::Acts::ActivityProvider)
+end
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_attachable'
-ActiveRecord::Base.send(:include, Redmine::Acts::Attachable)
+Rails.application.reloader.to_prepare do
+ ApplicationRecord.send(:include, Redmine::Acts::Attachable)
+end
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_customizable'
-ActiveRecord::Base.send(:include, Redmine::Acts::Customizable)
+Rails.application.reloader.to_prepare do
+ ApplicationRecord.send(:include, Redmine::Acts::Customizable)
+end
\ No newline at end of file
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_event'
-ActiveRecord::Base.send(:include, Redmine::Acts::Event)
+Rails.application.reloader.to_prepare do
+ ApplicationRecord.send(:include, Redmine::Acts::Event)
+end
\ No newline at end of file
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_searchable'
-ActiveRecord::Base.send(:include, Redmine::Acts::Searchable)
+Rails.application.reloader.to_prepare do
+ ApplicationRecord.send(:include, Redmine::Acts::Searchable)
+end
Specify this +acts_as+ extension if you want to model a tree structure by providing a parent association and a children
association. This requires that you have a foreign key column, which by default is called +parent_id+.
- class Category < ActiveRecord::Base
+ class Category < ApplicationRecord
acts_as_tree :order => "name"
end
# frozen_string_literal: true
require_relative 'lib/active_record/acts/tree'
-ActiveRecord::Base.send :include, ActiveRecord::Acts::Tree
+Rails.application.reloader.to_prepare do
+ ApplicationRecord.send :include, ActiveRecord::Acts::Tree
+end
# Specify this +acts_as+ extension if you want to model a tree structure by providing a parent association and a children
# association. This requires that you have a foreign key column, which by default is called +parent_id+.
#
- # class Category < ActiveRecord::Base
+ # class Category < ApplicationRecord
# acts_as_tree :order => "name"
# end
#
end
end
-class Mixin < ActiveRecord::Base
+class Mixin < ApplicationRecord
end
class TreeMixin < Mixin
# Include hook code here
require_relative 'lib/acts_as_watchable'
-ActiveRecord::Base.send(:include, Redmine::Acts::Watchable)
+Rails.application.reloader.to_prepare do
+ ApplicationRecord.send(:include, Redmine::Acts::Watchable)
+end
# frozen_string_literal: true
require_relative 'lib/gravatar'
-ActionView::Base.send :include, GravatarHelper::PublicMethods
+Rails.application.reloader.to_prepare do
+ ApplicationRecord.send :include, GravatarHelper::PublicMethods
+end
module Redmine
module Preparation
def self.prepare
- ActiveRecord::Base.include Redmine::Acts::Positioned
- ActiveRecord::Base.include Redmine::Acts::Mentionable
- ActiveRecord::Base.include Redmine::I18n
+ ApplicationRecord.include Redmine::Acts::Positioned
+ ApplicationRecord.include Redmine::Acts::Mentionable
+ ApplicationRecord.include Redmine::I18n
Scm::Base.add "Subversion"
Scm::Base.add "Mercurial"
Setting.default_language = 'en'
end
- test "ActiveRecord::Base.human_attribute_name should transform name to field_name" do
- assert_equal l('field_last_login_on'), ActiveRecord::Base.human_attribute_name('last_login_on')
+ test "ApplicationRecord.human_attribute_name should transform name to field_name" do
+ assert_equal l('field_last_login_on'), ApplicationRecord.human_attribute_name('last_login_on')
end
- test "ActiveRecord::Base.human_attribute_name should cut extra _id suffix for better validation" do
- assert_equal l('field_last_login_on'), ActiveRecord::Base.human_attribute_name('last_login_on_id')
+ test "ApplicationRecord.human_attribute_name should cut extra _id suffix for better validation" do
+ assert_equal l('field_last_login_on'), ApplicationRecord.human_attribute_name('last_login_on_id')
end
- test "ActiveRecord::Base.human_attribute_name should default to humanized value if no translation has been found (useful for custom fields)" do
- assert_equal 'Patch name', ActiveRecord::Base.human_attribute_name('Patch name')
+ test "ApplicationRecord.human_attribute_name should default to humanized value if no translation has been found (useful for custom fields)" do
+ assert_equal 'Patch name', ApplicationRecord.human_attribute_name('Patch name')
end
test 'ActionView::Helpers::FormHelper.date_field should add max=9999-12-31 to limit year value to 4 digits by default' do