diff --git a/LICENSE b/LICENSE index 94e7d78c..3d843ebd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ == MIT License -Copyright (c) 2010, Didier Lafforgue. +Copyright (c) 2010-2012, Didier Lafforgue. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/app/assets/javascripts/locomotive/models/editable_element.js.coffee b/app/assets/javascripts/locomotive/models/editable_element.js.coffee index 8e56d350..3534ef54 100644 --- a/app/assets/javascripts/locomotive/models/editable_element.js.coffee +++ b/app/assets/javascripts/locomotive/models/editable_element.js.coffee @@ -5,6 +5,11 @@ class Locomotive.Models.EditableElement extends Backbone.Model for key, value of @.toJSON() hash[key] = value if _.include(['id', 'source', 'content', 'remove_source'], key) + if @get('type') == 'EditableFile' + delete hash['content'] + else + delete hash['source'] + class Locomotive.Models.EditableElementsCollection extends Backbone.Collection model: Locomotive.Models.EditableElement diff --git a/app/models/locomotive/editable_file.rb b/app/models/locomotive/editable_file.rb index b2eb43fd..121ec318 100644 --- a/app/models/locomotive/editable_file.rb +++ b/app/models/locomotive/editable_file.rb @@ -1,9 +1,9 @@ module Locomotive class EditableFile < EditableElement - mount_uploader :source, EditableFileUploader + mount_uploader 'source', EditableFileUploader - replace_field :source, ::String, true + replace_field 'source', ::String, true def content self.source? ? self.source.url : self.default_content diff --git a/lib/tasks/locomotive.rake b/lib/tasks/locomotive.rake index 3692a371..bcd10005 100644 --- a/lib/tasks/locomotive.rake +++ b/lib/tasks/locomotive.rake @@ -46,197 +46,18 @@ namespace :locomotive do namespace :upgrade do - desc 'Migrate from 1.0 to 2.0' - task :migration_2_0 => :environment do - db = Mongoid.config.master + desc "Fix issue with the editable file and i18n in the 2.0.0.rc" + task :fix_editable_files => :environment do + Locomotive::Page.all.each do |page| + page.editable_elements.each_with_index do |el, index| + next if el._type != 'Locomotive::EditableFile' || el.attributes['source'].is_a?(Hash) - # # assets -> locomotive_content_assets - # if collection = db.collections.detect { |c| c.name == 'assets' } - # new_collection = db.collections.detect { |c| c.name == 'locomotive_content_assets' } - # new_collection.drop if new_collection - # collection.rename 'locomotive_content_assets' - # end + value = el.attributes['source'] - # content_types -> locomotive_content_types - if collection = db.collections.detect { |c| c.name == 'content_types' } - # new_collection = db.collections.detect { |c| c.name == 'locomotive_content_types' } - # new_collection.drop if new_collection - # collection.rename 'locomotive_content_types' - - # contents_collection = db.collections.detect { |c| c.name == 'locomotive_content_entries' } - # contents_collection = db.create_collection('locomotive_content_entries') if contents_collection.nil? - - collection.update({}, { - '$rename' => { - 'api_enabled' => 'public_submission_enabled', - 'api_accounts' => 'public_submission_accounts', - 'content_custom_fields' => 'entries_custom_fields', - 'content_custom_fields_version' => 'entries_custom_fields_version', - }, - '$unset' => { - 'content_custom_fields_counter' => '1' - } - }) - - collection.update({}, { - '$rename' => { - 'entries_custom_fields._alias' => 'entries_custom_fields.name', - 'entries_custom_fields.kind' => 'entries_custom_fields.type', - 'entries_custom_fields.category_items' => 'entries_custom_fields.select_options' - } - }) - - collection.find.each do |content_type| - label_field_name = '' - operations = { '$set' => {}, '$unset' => {} } - contents = content_type['contents'] - custom_fields = content_type['entries_custom_fields'] - - custom_fields.each_with_index do |field, index| - class_name = "Locomotive::Entry#{field['target'][-24,24]}" if field['target'] - - case field['type'] - when 'category' - operations['$set'].merge!("entries_custom_fields.#{index}.type" => 'select') - when 'has_one' - operations['$set'].merge!("entries_custom_fields.#{index}.type" => 'belongs_to') - when 'has_many' - if field['reverse_lookup'] - operations['$set'].merge!("entries_custom_fields.#{index}.type" => 'has_many') - - # reverse_lookup -> inverse_of - if _content_type = collection.find('_id' => BSON::ObjectId(field['target'][-24,24]).first) - if _field = _content_type['entries_custom_fields'].detect { |f| f['_name'] == field['reverse_lookup'] } - operations['$set'].merge!("entries_custom_fields.#{index}.inverse_of" => _field['_alias']) - end - end - else - operations['$set'].merge!("entries_custom_fields.#{index}.type" => 'many_to_many') - end - end - - if %w(has_one has_many).include?(field['type']) - operations['$set'].merge!("entries_custom_fields.#{index}.class_name" => class_name) - operations['$unset'].merge!({ - "entries_custom_fields.#{index}.target" => '1', - "entries_custom_fields.#{index}.reverse_lookup" => '1' - }) - end - end - - # contents - contents.each_with_index do |content| - attributes = content.clone.keep_if { |k, v| %w(_id _slug seo_title meta_description meta_keywords _visible created_at updated_at).include?(k) } - attributes.merge!({ - 'content_type_id' => content_type['_id'], - 'site_id' => content_type['site_id'], - '_position' => content['_position_in_list'], - '_type' => "Locomotive::Entry#{content_type['_id']}", - '_label_field_name' => label_field_name - }) - - custom_fields.each do |field| - name, _name = field['name'], field['_name'] - - case field['type'] # string, text, boolean, date, file, category, has_many, has_one - when 'string', 'text', 'boolean', 'date', 'file' - attributes[name] = content[_name] - when 'category', 'has_one' - attributes["#{name}_id"] = content[_name] - when 'has_many' - if field['reverse_lookup'] - # nothing to do - else - attributes["#{name}_ids"] = content[_name] - end - end - end - - # insert document - # contents_collection.insert attributes - puts attributes.inspect - end - - # TODO: change highlighted_field_name + for each field, change category -> select - - # save content _type - # collection.update { '_id' => content_type['_id'] }, operations - - puts operations.inspect - - print "================================= END =========================" + page.collection.update({ '_id' => page._id }, { '$unset' => { "editable_elements.#{index}.content" => 1 }, '$set' => { "editable_elements.#{index}.source" => { 'en' => value } } }) end - - # collection.update({}, { - # '$unset' => { - # 'entries_custom_fields._name' => '1', - # 'contents' => '1', - # 'highlighted_field_name' => '1', - # 'group_by_field_name' => '1' - # } - # }) end - - end - - - # desc "Index page is sometimes after the 404 error page. Fix this" - # task :place_index_before_404 => :environment do - # Locomotive::Site.all.each do |site| - # site.pages.root.first.update_attribute :position, 0 - # site.pages.not_found.first.update_attribute :position, 1 - # end - # end - # - # desc "Namespace collections" - # task :namespace_collections do - # db = Mongoid.config.master['sites'].db - # db.collections.each do |collection| - # next if collection.name =~ /^locomotive_/ # already namespaced - # - # new_name = "locomotive_#{collection.name}" - # new_name = "locomotive_content_assets" if collection.name =~ /^assets/ - # - # puts "renaming #{collection.name} into #{new_name}" - # collection.rename_collection new_name - # end - # end - # - # desc "Upgrade a site to i18n. Requires SITE (name or id) and LOCALE (by default: en) as env variables" - # task :i18n => :environment do - # locale, site_name_or_id = ENV['LOCALE'] || 'en', ENV['SITE'] - # - # site = Locomotive::Site.find(site_name_or_id) || Locomotive::Site.where(:name => site_name_or_id).first - # - # raise 'Site not found' if site.nil? - # - # site.locales ||= [locale] - # - # # sites - # %w(seo_title meta_keywords meta_description).each do |attribute| - # if !site.send(:"#{attribute}_translations").respond_to?(:keys) - # site.changed_attributes.store attribute, site.attributes[attribute] - # site.attributes.store attribute, { locale => site.attributes[attribute] } - # end - # end - # site.save! - # - # Locomotive::Page.skip_callback(:validate, :before) - # Locomotive::Page.skip_callback(:save, :after) - # - # Locomotive::Page.all.each do |page| - # %w(title slug fullpath raw_template seo_title meta_keywords meta_description serialized_template template_dependencies snippet_dependencies).each do |attribute| - # if !page.send(:"#{attribute}_translations").respond_to?(:keys) - # page.changed_attributes.store attribute, page.attributes[attribute] - # page.attributes.store attribute, { locale => page.attributes[attribute] } - # end - # end - # page.save(:validate => false) - # end - # end - end - end diff --git a/script/upgrade.rb b/script/upgrade.rb index 0d78a6cb..4de49680 100755 --- a/script/upgrade.rb +++ b/script/upgrade.rb @@ -5,6 +5,17 @@ rescue LoadError puts 'You must `gem install bundler` and `bundle install` to run rake tasks' end +Locomotive::Page.each do |page| + page.editable_elements.each_with_index do |el, index| + next if el._type != 'Locomotive::EditableFile' || el.attributes['source'].is_a?(Hash) + + value = el.attributes['source'] + + page.collection.update({ '_id' => page._id }, { '$set' => { "editable_elements.#{index}.source" => { 'en' => value } } }) + end +end + + # ================ GLOBAL VARIABLES ============== $database = 'locomotive_hosting_production' diff --git a/spec/models/locomotive/editable_file_spec.rb b/spec/models/locomotive/editable_file_spec.rb new file mode 100644 index 00000000..b5bced3c --- /dev/null +++ b/spec/models/locomotive/editable_file_spec.rb @@ -0,0 +1,25 @@ +require 'spec_helper' + +describe Locomotive::EditableElement do + + before(:each) do + @site = FactoryGirl.create(:site) + @home = @site.pages.root.first + + @home.update_attributes :raw_template => "{% block body %}{% editable_file 'image' %}Lorem ipsum{% endeditable_file %}{% endblock %}" + + @home = @site.pages.root.first + end + + it 'has one editable file element' do + @home.editable_elements.size.should == 1 + @home.editable_elements.first.slug.should == 'image' + end + + it 'does not have 2 image fields' do + editable_file = @home.editable_elements.first + fields = editable_file.class.fields.keys + (fields.include?('source') && fields.include?(:source)).should be_false + end + +end