This commit is contained in:
Didier Lafforgue 2012-03-08 02:32:59 +01:00
parent 37042eaa03
commit 0c65516807
6 changed files with 51 additions and 189 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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