diff --git a/Gemfile b/Gemfile index 74ad22d06c..f6eb508dbf 100644 --- a/Gemfile +++ b/Gemfile @@ -9,6 +9,9 @@ path "./" do gem "refinerycms-resources" end +# TODO: Remove this before merging this PR +gem 'refinerycms-i18n', git: 'https://github.com/refinery/refinerycms-i18n', branch: 'feature/mobility' + gem 'spring' gem 'spring-commands-rspec' gem 'poltergeist', '>= 1.8.1' @@ -28,7 +31,7 @@ end if !ENV['TRAVIS'] || ENV['DB'] == 'mysql' group :mysql do gem 'activerecord-jdbcmysql-adapter', '>= 1.3.0.rc1', platform: :jruby - gem 'mysql2', '~> 0.3.18', :platform => :ruby + gem 'mysql2', '~> 0.4.10', :platform => :ruby end end diff --git a/core/lib/generators/refinery/engine/templates/Gemfile b/core/lib/generators/refinery/engine/templates/Gemfile index f443da549f..cf6921bd72 100644 --- a/core/lib/generators/refinery/engine/templates/Gemfile +++ b/core/lib/generators/refinery/engine/templates/Gemfile @@ -20,7 +20,7 @@ end platforms :ruby do gem 'sqlite3' - gem 'mysql2' + gem 'mysql2', '~> 0.4.10' gem 'pg' end diff --git a/core/lib/generators/refinery/engine/templates/app/models/refinery/namespace/singular_name.rb.erb b/core/lib/generators/refinery/engine/templates/app/models/refinery/namespace/singular_name.rb.erb index 1d000fd766..7973c1a79c 100644 --- a/core/lib/generators/refinery/engine/templates/app/models/refinery/namespace/singular_name.rb.erb +++ b/core/lib/generators/refinery/engine/templates/app/models/refinery/namespace/singular_name.rb.erb @@ -6,6 +6,7 @@ module Refinery <% end %> <% if localized? -%> + extend Mobility translates <%= localized_attributes.map { |a| ":#{a.name}" }.join(', ') %> <% end -%> <% if string_attributes.any? -%> diff --git a/core/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_form.html.erb b/core/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_form.html.erb index 5ca1367bf6..b3811d6fe2 100644 --- a/core/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_form.html.erb +++ b/core/lib/generators/refinery/engine/templates/app/views/refinery/namespace/admin/plural_name/_form.html.erb @@ -9,7 +9,7 @@ <% if localized? -%> <%%= render '/refinery/admin/locale_picker', - :current_locale => Globalize.locale %> + :current_locale => Mobility.locale %> <% end -%> <% attributes.each_with_index do |attribute, index| -%> <% if attribute.refinery_type == :image -%> diff --git a/core/lib/generators/refinery/engine/templates/db/migrate/1_create_namespace_plural_name.rb.erb b/core/lib/generators/refinery/engine/templates/db/migrate/1_create_namespace_plural_name.rb.erb index df0a8c5610..7175280d8d 100644 --- a/core/lib/generators/refinery/engine/templates/db/migrate/1_create_namespace_plural_name.rb.erb +++ b/core/lib/generators/refinery/engine/templates/db/migrate/1_create_namespace_plural_name.rb.erb @@ -2,18 +2,30 @@ class Create<%= namespacing %><%= class_name.pluralize %> < ActiveRecord::Migrat def up create_table :refinery_<%= "#{namespacing.underscore}_" if table_name != namespacing.underscore.pluralize -%><%= table_name %> do |t| -<% attributes.each do |attribute| -%> +<% (attributes - localized_attributes).each do |attribute| -%> t.<%= attribute.type %> :<%= attribute.column_name %> <% end -%> t.integer :position t.timestamps end + <% if localized? %> - Refinery::<%= namespacing %>::<%= class_name %>.create_translation_table! <%= attributes_for_translation_table %> + create_table :<%= localized_table_name %> do |t| +<% localized_attributes.each do |attribute| -%> + t.<%= attribute.type %> :<%= attribute.column_name %> +<% end -%> + t.string :locale, null: false + t.integer :refinery_<%= singular_table_name %>_id, null: false + t.timestamps + end + + add_index :<%= localized_table_name %>, :locale, name: :index_<%= localized_table_name %>_on_locale + add_index :<%= localized_table_name %>, [:refinery_<%= singular_table_name %>_id, :locale], name: :index_<%= Digest::SHA1.hexdigest(localized_table_name) %>, unique: true <% end %> end + def down if defined?(::Refinery::UserPlugin) ::Refinery::UserPlugin.destroy_all({:name => "refinerycms-<%= namespacing.underscore %>"}) @@ -25,8 +37,7 @@ class Create<%= namespacing %><%= class_name.pluralize %> < ActiveRecord::Migrat <% end %> drop_table :refinery_<%= "#{namespacing.underscore}_" if table_name != namespacing.underscore.pluralize -%><%= table_name %> <% if localized? %> - Refinery::<%= namespacing %>::<%= class_name %>.drop_translation_table! + drop_table :<%= localized_table_name %> <% end %> end - end diff --git a/core/lib/refinery/core/engine.rb b/core/lib/refinery/core/engine.rb index 0475b3f100..ae0b04c84b 100644 --- a/core/lib/refinery/core/engine.rb +++ b/core/lib/refinery/core/engine.rb @@ -44,6 +44,15 @@ def refinery_inclusion! WillPaginate.per_page = 20 end + initializer "refinery.mobility" do + Mobility.configure do |config| + config.default_backend = :table + config.accessor_method = :translates + config.query_method = :i18n + config.default_options[:dirty] = true + end + end + before_inclusion do Refinery::Plugin.register do |plugin| plugin.pathname = root diff --git a/core/lib/refinery/extension_generation.rb b/core/lib/refinery/extension_generation.rb index c7b6207571..9c5c78cfa3 100644 --- a/core/lib/refinery/extension_generation.rb +++ b/core/lib/refinery/extension_generation.rb @@ -68,6 +68,13 @@ def localized_attributes @localized_attributes ||= attributes.select{ |a| options[:i18n].include?(a.name)} end + def localized_table_name + localized_table_name = [ 'refinery'] + localized_table_name << namespacing.underscore if table_name != namespacing.underscore.pluralize + localized_table_name << [ singular_table_name, 'translations'] + localized_table_name.join('_') + end + def attributes_for_translation_table localized_attributes.inject([]) { |memo, attr| memo << ":#{attr.name} => :#{attr.type}"}.join(', ') end diff --git a/core/refinerycms-core.gemspec b/core/refinerycms-core.gemspec index 9bc9c1c220..090f413ead 100644 --- a/core/refinerycms-core.gemspec +++ b/core/refinerycms-core.gemspec @@ -22,8 +22,7 @@ Gem::Specification.new do |s| s.required_ruby_version = Refinery::Version.required_ruby_version - s.add_dependency 'refinerycms-i18n', ['~> 4.0', '>= 4.0.0'] - s.add_dependency 'awesome_nested_set', ['~> 3.0', '>= 3.0.0'] + s.add_dependency 'refinerycms-i18n', ['~> 5.0', '>= 5.0.0'] s.add_dependency 'railties', rails_version s.add_dependency 'activerecord', rails_version s.add_dependency 'actionpack', rails_version diff --git a/core/spec/helpers/refinery/translation_helper_spec.rb b/core/spec/helpers/refinery/translation_helper_spec.rb index 1132274a22..10bbde9634 100644 --- a/core/spec/helpers/refinery/translation_helper_spec.rb +++ b/core/spec/helpers/refinery/translation_helper_spec.rb @@ -14,12 +14,12 @@ module Refinery let(:page) { FactoryBot.build(:page) } before do - Globalize.with_locale(:en) do + Mobility.with_locale(:en) do page.title = "draft" page.save! end - Globalize.with_locale(:lv) do + Mobility.with_locale(:lv) do page.title = "melnraksts" page.save! end @@ -33,7 +33,7 @@ module Refinery context "when title for current locale isn't available" do it "returns existing title from translations" do - Page.translation_class.where(locale: :en).first.destroy + Page::Translation.where(locale: :en).first.destroy expect(helper.translated_field(page, :title)).to eq("melnraksts") end end diff --git a/core/spec/presenters/refinery/translated_field_presenter_spec.rb b/core/spec/presenters/refinery/translated_field_presenter_spec.rb index c0e6132c90..bad639bee2 100644 --- a/core/spec/presenters/refinery/translated_field_presenter_spec.rb +++ b/core/spec/presenters/refinery/translated_field_presenter_spec.rb @@ -5,12 +5,12 @@ module Refinery let(:page) { FactoryBot.build(:page) } before do - Globalize.with_locale(:en) do + Mobility.with_locale(:en) do page.title = "draft" page.save! end - Globalize.with_locale(:lv) do + Mobility.with_locale(:lv) do page.title = "melnraksts" page.save! end @@ -25,7 +25,7 @@ module Refinery context "when title for current locale isn't available" do it "returns existing title from translations" do - Page.translation_class.where(locale: :en).first.destroy + Page::Translation.where(locale: :en).first.destroy expect(TranslatedFieldPresenter.new(page).call(:title)).to eq("melnraksts") end end diff --git a/images/app/models/refinery/image.rb b/images/app/models/refinery/image.rb index 0ddbb6c157..257f19e927 100644 --- a/images/app/models/refinery/image.rb +++ b/images/app/models/refinery/image.rb @@ -2,11 +2,9 @@ module Refinery class Image < Refinery::Core::BaseModel + extend Mobility translates :image_title, :image_alt - attribute :image_title - attribute :image_alt - dragonfly_accessor :image, :app => :refinery_images include Images::Validators diff --git a/images/app/views/refinery/admin/images/_form.html.erb b/images/app/views/refinery/admin/images/_form.html.erb index 41fbd27621..162f72876a 100644 --- a/images/app/views/refinery/admin/images/_form.html.erb +++ b/images/app/views/refinery/admin/images/_form.html.erb @@ -5,7 +5,7 @@ object: @image, include_object_name: false %> - <%= render '/refinery/admin/locale_picker', :current_locale => Globalize.locale if @image.persisted? %> + <%= render '/refinery/admin/locale_picker', :current_locale => Mobility.locale if @image.persisted? %>
<% if action_name =~ /(edit)|(update)/ %> diff --git a/images/db/migrate/20150430171341_translate_refinery_images.rb b/images/db/migrate/20150430171341_translate_refinery_images.rb index a55a279d4a..57e3e4181e 100644 --- a/images/db/migrate/20150430171341_translate_refinery_images.rb +++ b/images/db/migrate/20150430171341_translate_refinery_images.rb @@ -1,22 +1,18 @@ class TranslateRefineryImages < ActiveRecord::Migration[4.2] - def self.up - begin - ::Refinery::Image.create_translation_table!({ - image_alt: :string, - image_title: :string - }, { - :migrate_data => true - }) - rescue NameError - warn "Refinery::Image was not defined!" - end - end + def change + create_table :refinery_image_translations do |t| + + # Translated attribute(s) + t.string :image_alt + t.string :image_title - def self.down - begin - Refinery::Image.drop_translation_table! migrate_data: true - rescue NameError - warn "Refinery::Image was not defined!" + t.string :locale, null: false + t.integer :refinery_image_id, null: false + + t.timestamps null: false end + + add_index :refinery_image_translations, :locale, name: :index_refinery_image_translations_on_locale + add_index :refinery_image_translations, [:refinery_image_id, :locale], name: :index_2f245f0c60154d35c851e1df2ffc4c86571726f0, unique: true end end \ No newline at end of file diff --git a/images/lib/refinery/images.rb b/images/lib/refinery/images.rb index 6b3bb2fc22..8f89d89cb1 100644 --- a/images/lib/refinery/images.rb +++ b/images/lib/refinery/images.rb @@ -24,5 +24,5 @@ def factory_paths end ActiveSupport.on_load(:active_record) do - require 'globalize' + require 'mobility' end diff --git a/images/refinerycms-images.gemspec b/images/refinerycms-images.gemspec index 754579a0e1..12f22488eb 100644 --- a/images/refinerycms-images.gemspec +++ b/images/refinerycms-images.gemspec @@ -19,10 +19,8 @@ Gem::Specification.new do |s| s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- spec/*`.split("\n") - s.add_dependency 'refinerycms-dragonfly', '~> 1.0' - s.add_dependency 'globalize', ['>= 5.1.0.beta1', '< 5.2'] - s.add_dependency 'activemodel-serializers-xml', '~> 1.0', '>= 1.0.1' - s.add_dependency 'refinerycms-core', version + s.add_dependency 'refinerycms-core', version + s.add_dependency 'refinerycms-dragonfly', '~> 1.0' s.required_ruby_version = Refinery::Version.required_ruby_version diff --git a/images/spec/support/shared_examples/image_translator.rb b/images/spec/support/shared_examples/image_translator.rb index bf2a6df59a..8341544fd5 100644 --- a/images/spec/support/shared_examples/image_translator.rb +++ b/images/spec/support/shared_examples/image_translator.rb @@ -25,7 +25,7 @@ click_button "Save" expect(page).to have_content("'Titre de la première image' was successfully updated.") - expect(Refinery::Image.translation_class.count).to eq(1) + expect(Refinery::Image::Translation.count).to eq(1) end end end diff --git a/pages/app/controllers/refinery/admin/page_parts_controller.rb b/pages/app/controllers/refinery/admin/page_parts_controller.rb index 69cf21a9d8..c8fbfef091 100644 --- a/pages/app/controllers/refinery/admin/page_parts_controller.rb +++ b/pages/app/controllers/refinery/admin/page_parts_controller.rb @@ -28,7 +28,7 @@ def new_page_part_params private def permitted_new_page_part_params - [:title, :slug, :body, :locale] + [:title, :slug, :body] end end end diff --git a/pages/app/controllers/refinery/admin/pages_controller.rb b/pages/app/controllers/refinery/admin/pages_controller.rb index 36fc71fe52..7951f1e3e8 100644 --- a/pages/app/controllers/refinery/admin/pages_controller.rb +++ b/pages/app/controllers/refinery/admin/pages_controller.rb @@ -67,14 +67,14 @@ def find_page # We can safely assume ::Refinery::I18n is defined because this method only gets # Invoked when the before_action from the plugin is run. - def globalize! + def mobility! return super unless action_name.to_s == 'index' # Always display the tree of pages from the default frontend locale. if Refinery::I18n.built_in_locales.keys.map(&:to_s).include?(params[:switch_locale]) - Globalize.locale = params[:switch_locale].try(:to_sym) + Mobility.locale = params[:switch_locale].try(:to_sym) else - Globalize.locale = Refinery::I18n.default_frontend_locale + Mobility.locale = Refinery::I18n.default_frontend_locale end end diff --git a/pages/app/controllers/refinery/admin/pages_dialogs_controller.rb b/pages/app/controllers/refinery/admin/pages_dialogs_controller.rb index 112c211732..7a13d5eb62 100644 --- a/pages/app/controllers/refinery/admin/pages_dialogs_controller.rb +++ b/pages/app/controllers/refinery/admin/pages_dialogs_controller.rb @@ -6,16 +6,16 @@ class PagesDialogsController < ::Refinery::Admin::DialogsController def link_to # Get the switch_local variable to determine the locale we're currently editing - # Set up Globalize with our current locale - Globalize.locale = if params[:switch_locale].present? && Refinery::I18n.built_in_locales.keys.map(&:to_s).include?(params[:switch_locale]) - Globalize.locale = params[:switch_locale] + # Set up Mobility with our current locale + Mobility.locale = if params[:switch_locale].present? && Refinery::I18n.built_in_locales.keys.map(&:to_s).include?(params[:switch_locale]) + Mobility.locale = params[:switch_locale] else Refinery::I18n.default_locale end @pages = ::Refinery::Page.roots.paginate(:page => params[:page], :per_page => ::Refinery::Page.per_page(true)) - @pages = @pages.with_globalize + @pages = @pages.with_mobility if ::Refinery::Plugins.registered.names.include?('refinery_files') @resources = Resource.paginate(:page => params[:resource_page], :per_page => Resource.per_page(true)). diff --git a/pages/app/models/refinery/page.rb b/pages/app/models/refinery/page.rb index c70f898f81..29b64538b0 100644 --- a/pages/app/models/refinery/page.rb +++ b/pages/app/models/refinery/page.rb @@ -1,74 +1,62 @@ # Encoding: utf-8 require 'friendly_id' +require 'friendly_id/mobility' require 'refinery/core/base_model' require 'refinery/pages/url' require 'refinery/pages/finder' module Refinery class Page < Core::BaseModel - extend FriendlyId - - translates :title, :menu_title, :custom_slug, :slug, :include => :seo_meta - - attribute :title - attribute :menu_title - attribute :custom_slug - attribute :slug + extend Mobility + translates :title, :menu_title, :custom_slug, :slug, :browser_title, :meta_description - after_save { translations.collect(&:save) } + after_save { translations.in_locale(Mobility.locale).seo_meta.save! } class Translation is_seo_meta - - def self.seo_fields - ::SeoMeta.attributes.keys.map{ |a| [a, :"#{a}="]}.flatten - end end + has_many :parts, -> { + scope = ::Refinery::PagePart.respond_to?(:mobility) ? i18n.includes(:translations) : all + scope = scope.order('position ASC') + scope + }, :foreign_key => :refinery_page_id, + :class_name => '::Refinery::PagePart', + :inverse_of => :page, + :dependent => :destroy + + accepts_nested_attributes_for :parts, :allow_destroy => true + + # Docs for acts_as_nested_set https://github.com/collectiveidea/awesome_nested_set + # rather than :delete_all we want :destroy + acts_as_nested_set :dependent => :destroy + class FriendlyIdOptions def self.options # Docs for friendly_id https://github.com/norman/friendly_id friendly_id_options = { - use: [:reserved], + use: [:mobility, :reserved], reserved_words: Refinery::Pages.friendly_id_reserved_words } if ::Refinery::Pages.scope_slug_by_parent friendly_id_options[:use] << :scoped friendly_id_options.merge!(scope: :parent) end - friendly_id_options[:use] << :globalize + friendly_id_options end end + extend FriendlyId + friendly_id :custom_slug_or_title, FriendlyIdOptions.options + # If title changes tell friendly_id to regenerate slug when saving record def should_generate_new_friendly_id? - changes.keys.include?("title") || changes.keys.include?("custom_slug") + title_changed? || custom_slug_changed? end - # Delegate SEO Attributes to globalize translation - delegate(*(Translation.seo_fields << {:to => :translation})) - - validates :title, :presence => true - - validates :custom_slug, :uniqueness => true, :allow_blank => true - - # Docs for acts_as_nested_set https://github.com/collectiveidea/awesome_nested_set - # rather than :delete_all we want :destroy - acts_as_nested_set counter_cache: :children_count, dependent: :destroy, touch: true - - friendly_id :custom_slug_or_title, FriendlyIdOptions.options - - has_many :parts, -> { - scope = order('position ASC') - scope = scope.includes(:translations) if ::Refinery::PagePart.respond_to?(:translation_class) - scope - }, :foreign_key => :refinery_page_id, - :class_name => '::Refinery::PagePart', - :inverse_of => :page, - :dependent => :destroy - - accepts_nested_attributes_for :parts, :allow_destroy => true + validates :title, presence: true + validates :custom_slug, uniqueness: true, allow_blank: true before_destroy :deletable? after_save :reposition_parts! @@ -103,7 +91,7 @@ def find_by_path_or_id(path, id) def find_by_path_or_id!(path, id) page = find_by_path_or_id(path, id) - raise ActiveRecord::RecordNotFound unless page + raise ::ActiveRecord::RecordNotFound unless page page end @@ -129,7 +117,7 @@ def by_slug(slug, conditions = {}) # This works using a query against the translated content first and then # using all of the page_ids we further filter against this model's table. def in_menu - where(:show_in_menu => true).with_globalize + where(show_in_menu: true).with_mobility end # An optimised scope containing only live pages ordered for display in a menu. @@ -138,8 +126,8 @@ def fast_menu end # Wrap up the logic of finding the pages based on the translations table. - def with_globalize(conditions = {}) - Pages::Finder.with_globalize(conditions) + def with_mobility(conditions = {}) + Pages::Finder.with_mobility(conditions) end # Returns how many pages per page should there be when paginating pages @@ -155,7 +143,7 @@ def rebuild! protected def nullify_duplicate_slugs_under_the_same_parent! - t_slug = translation_class.arel_table[:slug] + t_slug = Translation.arel_table[:slug] joins(:translations).group(:locale, :parent_id, t_slug).having(t_slug.count.gt(1)).count. each do |(locale, parent_id, slug), count| by_slug(slug, :locale => locale).where(:parent_id => parent_id).drop(1).each do |page| @@ -167,20 +155,20 @@ def nullify_duplicate_slugs_under_the_same_parent! end def translated_to_default_locale? - persisted? && translations.any?{ |t| t.locale == Refinery::I18n.default_frontend_locale} + persisted? && translations.any?{ |t| t.locale.to_sym == Refinery::I18n.default_frontend_locale} end # The canonical page for this particular page. # Consists of: # * The current locale's translated slug def canonical - Globalize.with_locale(::Refinery::I18n.current_frontend_locale) { url } + Mobility.with_locale(::Refinery::I18n.current_frontend_locale) { url } end # The canonical slug for this particular page. # This is the slug for the current frontend locale. def canonical_slug - Globalize.with_locale(::Refinery::I18n.current_frontend_locale) { slug } + Mobility.with_locale(::Refinery::I18n.current_frontend_locale) { slug } end # Returns in cascading order: custom_slug or menu_title or title depending on @@ -237,7 +225,7 @@ def url end def nested_url - Globalize.with_locale(slug_locale) do + Mobility.with_locale(slug_locale) do if ::Refinery::Pages.scope_slug_by_parent && !root? self_and_ancestors.includes(:translations).map(&:to_param) else @@ -379,9 +367,9 @@ def puts_destroy_help end def slug_locale - return Globalize.locale if translation_for(Globalize.locale, false).try(:slug).present? + return Mobility.locale if slug - if translations.empty? || translation_for(Refinery::I18n.default_frontend_locale, false).try(:slug).present? + if translations.empty? || slug(locale: Refinery::I18n.default_frontend_locale) Refinery::I18n.default_frontend_locale else translations.first.locale diff --git a/pages/app/models/refinery/page_part.rb b/pages/app/models/refinery/page_part.rb index 5294246d85..37dba13469 100644 --- a/pages/app/models/refinery/page_part.rb +++ b/pages/app/models/refinery/page_part.rb @@ -9,16 +9,15 @@ class PagePart < Refinery::Core::BaseModel validates :slug, :presence => true, :uniqueness => {:scope => :refinery_page_id} alias_attribute :content, :body + extend Mobility translates :body - attribute :body - def to_param "page_part_#{slug.downcase.gsub(/\W/, '_')}" end def body=(value) - write_attribute(:body, value) + super normalise_text_fields end @@ -33,8 +32,8 @@ def slug_matches?(other_slug) protected def normalise_text_fields - if read_attribute(:body).present? && read_attribute(:body) !~ %r{^<} - write_attribute(:body, "

#{read_attribute(:body).gsub("\r\n\r\n", "

").gsub("\r\n", "
")}

") + if body? && body !~ %r{^<} + self.body = "

#{body.gsub("\r\n\r\n", "

").gsub("\r\n", "
")}

" end end diff --git a/pages/app/views/refinery/admin/pages/_form.html.erb b/pages/app/views/refinery/admin/pages/_form.html.erb index 8076e12653..ca2562046c 100644 --- a/pages/app/views/refinery/admin/pages/_form.html.erb +++ b/pages/app/views/refinery/admin/pages/_form.html.erb @@ -3,7 +3,7 @@ <%= render '/refinery/admin/error_messages', :object => @page, :include_object_name => true %> - <%= render '/refinery/admin/locale_picker', :current_locale => Globalize.locale %> + <%= render '/refinery/admin/locale_picker', :current_locale => Mobility.locale %>
<%= f.label :title %> diff --git a/pages/app/views/refinery/admin/pages_dialogs/_page_link.html.erb b/pages/app/views/refinery/admin/pages_dialogs/_page_link.html.erb index 37381370d4..e6362b9b8d 100644 --- a/pages/app/views/refinery/admin/pages_dialogs/_page_link.html.erb +++ b/pages/app/views/refinery/admin/pages_dialogs/_page_link.html.erb @@ -1,6 +1,6 @@ <% link_args = defined?(link_to_arguments) ? link_to_arguments : {} - page_link_url = Globalize.with_locale(params[:switch_locale]) { refinery.url_for(page_link.url) } + page_link_url = Mobility.with_locale(params[:switch_locale]) { refinery.url_for(page_link.url) } # current_link is relative so check against the relative url portion before conditionally making it absolute linked = params[:current_link].present? && page_link_url == params[:current_link] page_link_url = "#{[request.protocol, request.host_with_port].join}#{page_link_url}" if Refinery::Pages.absolute_page_links diff --git a/pages/db/migrate/20100913234708_create_refinerycms_pages_schema.rb b/pages/db/migrate/20100913234708_create_refinerycms_pages_schema.rb index 0bdd262a0b..8ba729f153 100644 --- a/pages/db/migrate/20100913234708_create_refinerycms_pages_schema.rb +++ b/pages/db/migrate/20100913234708_create_refinerycms_pages_schema.rb @@ -1,5 +1,5 @@ class CreateRefinerycmsPagesSchema < ActiveRecord::Migration[4.2] - def up + def change create_table :refinery_page_parts do |t| t.integer :refinery_page_id t.string :title @@ -38,38 +38,35 @@ def up add_index :refinery_pages, :parent_id add_index :refinery_pages, :rgt - begin - ::Refinery::PagePart.create_translation_table!({ - :body => :text - }) - rescue NameError - warn "Refinery::PagePart was not defined!" - end + create_table :refinery_page_part_translations do |t| - begin - ::Refinery::Page.create_translation_table!({ - :title => :string, - :custom_slug => :string, - :menu_title => :string, - :slug => :string - }) - rescue NameError - warn "Refinery::Page was not defined!" - end - end + # Translated attribute(s) + t.text :body - def down - drop_table :refinery_page_parts - drop_table :refinery_pages - begin - ::Refinery::PagePart.drop_translation_table! - rescue NameError - warn "Refinery::PagePart was not defined!" + t.string :locale, null: false + t.integer :refinery_page_part_id, null: false + + t.timestamps null: false end - begin - ::Refinery::Page.drop_translation_table! if defined?(::Refinery::Page) - rescue NameError - warn "Refinery::Page was not defined!" + + add_index :refinery_page_part_translations, :locale, name: :index_refinery_page_part_translations_on_locale + add_index :refinery_page_part_translations, [:refinery_page_part_id, :locale], name: :index_93b7363baf444ecab114aab0bbdedc79d0ec4f4b, unique: true + + create_table :refinery_page_translations do |t| + + # Translated attribute(s) + t.string :title + t.string :custom_slug + t.string :menu_title + t.string :slug + + t.string :locale, null: false + t.integer :refinery_page_id, null: false + + t.timestamps null: false end + + add_index :refinery_page_translations, :locale, name: :index_refinery_page_translations_on_locale + add_index :refinery_page_translations, [:refinery_page_id, :locale], name: :index_refinery_page_t10s_on_refinery_page_id_and_locale, unique: true end end diff --git a/pages/lib/refinery/pages.rb b/pages/lib/refinery/pages.rb index 210228ffed..4a1f24f853 100644 --- a/pages/lib/refinery/pages.rb +++ b/pages/lib/refinery/pages.rb @@ -1,5 +1,5 @@ require 'refinerycms-core' -require 'globalize' +require 'mobility' module Refinery autoload :PagesGenerator, 'generators/refinery/pages/pages_generator' diff --git a/pages/lib/refinery/pages/finder.rb b/pages/lib/refinery/pages/finder.rb index ec4085d284..fa030d7d96 100644 --- a/pages/lib/refinery/pages/finder.rb +++ b/pages/lib/refinery/pages/finder.rb @@ -17,7 +17,7 @@ def self.by_slug(slug, conditions = {}) FinderBySlug.new(slug, conditions).find end - def self.with_globalize(conditions = {}) + def self.with_mobility(conditions = {}) Finder.new(conditions).find end @@ -26,15 +26,15 @@ def initialize(conditions) end def find - with_globalize + with_mobility end - def with_globalize - globalized_conditions = {:locale => ::Globalize.locale.to_s}.merge(conditions) - translations_conditions = translations_conditions(globalized_conditions) + def with_mobility + mobility_conditions = {:locale => ::Mobility.locale.to_s}.merge(conditions) + translations_conditions = translations_conditions(mobility_conditions) # A join implies readonly which we don't really want. - Page.where(globalized_conditions). + Page.i18n.where(mobility_conditions). joins(:translations). where(translations_conditions). readonly(false) @@ -51,7 +51,7 @@ def translations_conditions(original_conditions) translations_conditions = {} original_conditions.keys.each do |key| if translated_attributes.include? key.to_s - translations_conditions["#{Page.translation_class.table_name}.#{key}"] = original_conditions.delete(key) + translations_conditions["#{Page::Translation.table_name}.#{key}"] = original_conditions.delete(key) end end translations_conditions diff --git a/pages/refinerycms-pages.gemspec b/pages/refinerycms-pages.gemspec index 1c5bcada09..13bfcb61eb 100644 --- a/pages/refinerycms-pages.gemspec +++ b/pages/refinerycms-pages.gemspec @@ -19,13 +19,12 @@ Gem::Specification.new do |s| s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- spec/*`.split("\n") + s.add_dependency 'refinerycms-core', version s.add_dependency 'friendly_id', ['>= 5.1.0', '< 5.3'] - s.add_dependency 'globalize', ['>= 5.1.0.beta1', '< 5.2'] - s.add_dependency 'activemodel-serializers-xml', '~> 1.0', '>= 1.0.1' + s.add_dependency 'friendly_id-mobility', '~> 0.5' s.add_dependency 'awesome_nested_set', '~> 3.1', '>= 3.1.0' s.add_dependency 'seo_meta', '~> 3.0', '>= 3.0.0' - s.add_dependency 'refinerycms-core', version - s.add_dependency 'babosa', '!= 0.3.6' + s.add_dependency 'babosa', '~> 1.0' s.add_dependency 'speakingurl-rails', '~> 8.0', '>= 8.0.0' s.add_dependency 'diffy', '~> 3.1', '>= 3.1.0' diff --git a/pages/spec/features/refinery/admin/pages_spec.rb b/pages/spec/features/refinery/admin/pages_spec.rb index 724b189b77..ae65e02747 100644 --- a/pages/spec/features/refinery/admin/pages_spec.rb +++ b/pages/spec/features/refinery/admin/pages_spec.rb @@ -451,13 +451,13 @@ module Admin allow(Refinery::I18n).to receive(:frontend_locales).and_return([:en, :ru]) # Create a home page in both locales (needed to test menus) - home_page = Globalize.with_locale(:en) do + home_page = Mobility.with_locale(:en) do Page.create :title => 'Home', :link_url => '/', :menu_match => "^/$" end - Globalize.with_locale(:ru) do + Mobility.with_locale(:ru) do home_page.title = 'Домашняя страница' home_page.save end @@ -520,10 +520,10 @@ module Admin let!(:news_page) do allow(Refinery::I18n).to receive(:frontend_locales).and_return([:en, :ru]) - _page = Globalize.with_locale(:en) { + _page = Mobility.with_locale(:en) { Page.create :title => en_page_title } - Globalize.with_locale(:ru) do + Mobility.with_locale(:ru) do _page.title = ru_page_title _page.save end @@ -599,7 +599,7 @@ module Admin describe "add a page with title only for secondary locale", js:true do let(:ru_page) { - Globalize.with_locale(:ru) { + Mobility.with_locale(:ru) { Page.create :title => ru_page_title } } @@ -670,7 +670,7 @@ module Admin it 'succeeds' do ru_page.destroy! parent_page = Page.create(:title => "Parent page") - sub_page = Globalize.with_locale(:ru) { + sub_page = Mobility.with_locale(:ru) { Page.create :title => ru_page_title, :parent_id => parent_page.id } expect(sub_page.parent).to eq(parent_page) @@ -807,7 +807,7 @@ module Admin end describe "TranslatePages", :type => :feature do - before { Globalize.locale = :en } + before { Mobility.locale = :en } refinery_login describe "a page with a single locale" do @@ -833,11 +833,11 @@ module Admin allow(Refinery::I18n).to receive(:frontend_locales).and_return [:en, :ru] # Create a page in both locales - about_page = Globalize.with_locale(:en) do + about_page = Mobility.with_locale(:en) do Page.create :title => 'About' end - Globalize.with_locale(:ru) do + Mobility.with_locale(:ru) do about_page.title = 'About Ru' about_page.save end diff --git a/pages/spec/features/refinery/pages_spec.rb b/pages/spec/features/refinery/pages_spec.rb index e628c54da6..60303ebc18 100644 --- a/pages/spec/features/refinery/pages_spec.rb +++ b/pages/spec/features/refinery/pages_spec.rb @@ -8,7 +8,7 @@ module Refinery let(:draft_page) { Page.create :title => 'Draft', :draft => true } before do # Stub the menu pages we're expecting - ::I18n.default_locale = Globalize.locale = :en + ::I18n.default_locale = Mobility.locale = :en allow(Page).to receive(:fast_menu).and_return([home_page, about_page]) end @@ -370,8 +370,8 @@ def standard_page_menu_items_exist? let(:ru_page_title) { 'Новости' } let(:ru_page_slug_encoded) { '%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8' } let!(:news_page) do - @page = Globalize.with_locale(:en) { Page.create title: en_page_title } - Globalize.with_locale(:ru) do + @page = Mobility.with_locale(:en) { Page.create title: en_page_title } + Mobility.with_locale(:ru) do @page.title = ru_page_title @page.save end @@ -425,12 +425,12 @@ def standard_page_menu_items_exist? let(:nested_page_slug) { 'nested_page' } let!(:nested_page) do - Globalize.fallbacks = [:ru] - _page = Globalize.with_locale(:en) { + ::I18n.fallbacks[:ru] + _page = Mobility.with_locale(:en) { news_page.children.create :title => nested_page_title } - Globalize.with_locale(:ru) do + Mobility.with_locale(:ru) do _page.title = nested_page_title _page.save end diff --git a/pages/spec/models/refinery/page_menu_spec.rb b/pages/spec/models/refinery/page_menu_spec.rb index 3621d3a732..e1f917465f 100644 --- a/pages/spec/models/refinery/page_menu_spec.rb +++ b/pages/spec/models/refinery/page_menu_spec.rb @@ -42,7 +42,7 @@ module Refinery context "with #menu_title" do before do - page[:menu_title] = "Menu Title" + page.menu_title = "Menu Title" end it_should_behave_like "Refinery menu item hash" @@ -54,7 +54,7 @@ module Refinery context "with #title" do before do - page[:title] = "Title" + page.title = "Title" end it_should_behave_like "Refinery menu item hash" diff --git a/pages/spec/models/refinery/page_url_spec.rb b/pages/spec/models/refinery/page_url_spec.rb index 0b770e9c24..b712b18edc 100644 --- a/pages/spec/models/refinery/page_url_spec.rb +++ b/pages/spec/models/refinery/page_url_spec.rb @@ -105,7 +105,7 @@ def turn_off_custom_slugs describe '#canonical' do let!(:default_canonical) { - Globalize.with_locale(Refinery::I18n.default_frontend_locale) { + Mobility.with_locale(Refinery::I18n.default_frontend_locale) { page.canonical } } @@ -121,7 +121,7 @@ def turn_off_custom_slugs specify "translated page returns its pages's canonical" do allow(Refinery::I18n).to receive(:current_frontend_locale).and_return(:ru) - Globalize.with_locale(:ru) do + Mobility.with_locale(:ru) do page.title = ru_page_title page.save @@ -133,7 +133,7 @@ def turn_off_custom_slugs describe '#canonical_slug' do let!(:default_canonical_slug) { - Globalize.with_locale(Refinery::I18n.default_frontend_locale) { + Mobility.with_locale(Refinery::I18n.default_frontend_locale) { page.canonical_slug } } @@ -148,7 +148,7 @@ def turn_off_custom_slugs specify "translated page returns its page's canonical slug'" do allow(Refinery::I18n).to receive(:current_frontend_locale).and_return(:ru) - Globalize.with_locale(:ru) do + Mobility.with_locale(:ru) do page.title = ru_page_title page.save diff --git a/resources/app/models/refinery/resource.rb b/resources/app/models/refinery/resource.rb index 97b893bf3f..05defeaf8e 100644 --- a/resources/app/models/refinery/resource.rb +++ b/resources/app/models/refinery/resource.rb @@ -4,10 +4,9 @@ module Refinery class Resource < Refinery::Core::BaseModel include Resources::Validators + extend Mobility translates :resource_title - attribute :resource_title - dragonfly_accessor :file, :app => :refinery_resources validates :file, :presence => true diff --git a/resources/app/views/refinery/admin/resources/_form.html.erb b/resources/app/views/refinery/admin/resources/_form.html.erb index 50adcecbce..806d634727 100644 --- a/resources/app/views/refinery/admin/resources/_form.html.erb +++ b/resources/app/views/refinery/admin/resources/_form.html.erb @@ -6,7 +6,7 @@ :object => @resource, :include_object_name => false %> - <%= render '/refinery/admin/locale_picker', :current_locale => Globalize.locale if @resource.persisted? %> + <%= render '/refinery/admin/locale_picker', :current_locale => Mobility.locale if @resource.persisted? %>
diff --git a/resources/db/migrate/20150430180959_add_translated_title_to_refinery_resources.rb b/resources/db/migrate/20150430180959_add_translated_title_to_refinery_resources.rb index 532374b2d8..600c7a3ad9 100644 --- a/resources/db/migrate/20150430180959_add_translated_title_to_refinery_resources.rb +++ b/resources/db/migrate/20150430180959_add_translated_title_to_refinery_resources.rb @@ -1,11 +1,17 @@ class AddTranslatedTitleToRefineryResources < ActiveRecord::Migration[4.2] - def self.up - Refinery::Resource.create_translation_table!({ - resource_title: :string - }) - end + def change + create_table :refinery_resource_translations do |t| + + # Translated attribute(s) + t.string :resource_title + + t.string :locale, null: false + t.integer :refinery_resource_id, null: false + + t.timestamps null: false + end - def self.down - Refinery::Resource.drop_translation_table! + add_index :refinery_resource_translations, :locale, name: :index_refinery_resource_translations_on_locale + add_index :refinery_resource_translations, [:refinery_resource_id, :locale], name: :index_35a57b749803d8437ea64c64da3fb2cb0fbf457a, unique: true end end \ No newline at end of file diff --git a/resources/lib/refinery/resources.rb b/resources/lib/refinery/resources.rb index ed786ffbc1..200c1f8399 100644 --- a/resources/lib/refinery/resources.rb +++ b/resources/lib/refinery/resources.rb @@ -24,5 +24,5 @@ def factory_paths end ActiveSupport.on_load(:active_record) do - require 'globalize' + require 'mobility' end diff --git a/resources/refinerycms-resources.gemspec b/resources/refinerycms-resources.gemspec index 1640ae02fd..ebd7b22ea7 100644 --- a/resources/refinerycms-resources.gemspec +++ b/resources/refinerycms-resources.gemspec @@ -19,12 +19,8 @@ Gem::Specification.new do |s| s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- spec/*`.split("\n") - s.add_dependency 'acts_as_indexed', '~> 0.8.0' - s.add_dependency 'dragonfly', '~> 1.1', '>= 1.1.0' - s.add_dependency 'globalize', ['>= 5.1.0.beta1', '< 5.2'] - s.add_dependency 'activemodel-serializers-xml', '~> 1.0', '>= 1.0.1' - s.add_dependency 'refinerycms-core', version - s.add_dependency 'refinerycms-dragonfly', '~> 1.0' + s.add_dependency 'refinerycms-core', version + s.add_dependency 'refinerycms-dragonfly', '~> 1.0' s.required_ruby_version = Refinery::Version.required_ruby_version diff --git a/resources/spec/features/refinery/admin/resources_spec.rb b/resources/spec/features/refinery/admin/resources_spec.rb index b28f92ebab..1be532ca88 100644 --- a/resources/spec/features/refinery/admin/resources_spec.rb +++ b/resources/spec/features/refinery/admin/resources_spec.rb @@ -113,7 +113,7 @@ module Admin click_button "Save" expect(page).to have_content("'Premier fichier' was successfully updated.") - expect(Resource.translation_class.count).to eq(1) + expect(Resource::Translation.count).to eq(1) end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 5fbe47b97a..94027a612d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -40,7 +40,7 @@ config.infer_spec_type_from_file_location! config.before(:each) do - ::I18n.default_locale = I18n.locale = Globalize.locale = :en + ::I18n.default_locale = I18n.locale = Mobility.locale = :en end unless ENV['FULL_BACKTRACE']