first and unfinished draft of the import tool

This commit is contained in:
dinedine 2010-09-23 00:59:30 +02:00
parent 1e1c3bd97b
commit 39886427e0
10 changed files with 150 additions and 111 deletions

1
.gitignore vendored
View File

@ -25,3 +25,4 @@ tmp/*
Capfile Capfile
config/deploy.rb config/deploy.rb
perf/test.rb perf/test.rb
sites

39
Gemfile
View File

@ -26,6 +26,7 @@ gem 'custom_fields', :git => 'git://github.com/locomotivecms/custom_fields.git'
gem 'jeweler' gem 'jeweler'
gem 'delayed_job', '2.1.0.pre2' gem 'delayed_job', '2.1.0.pre2'
gem 'delayed_job_mongoid', '1.0.0.rc' gem 'delayed_job_mongoid', '1.0.0.rc'
gem 'rubyzip'
# Development environment # Development environment
group :development do group :development do
@ -39,22 +40,22 @@ group :test, :development do
gem 'ruby-debug' gem 'ruby-debug'
end end
group :test do # group :test do
gem 'autotest' # gem 'autotest'
gem 'growl-glue' # gem 'growl-glue'
gem 'rspec-rails', '2.0.0.beta.19' # gem 'rspec-rails', '2.0.0.beta.19'
gem 'factory_girl_rails' # gem 'factory_girl_rails'
gem 'pickle', :git => 'http://github.com/ianwhite/pickle.git' # gem 'pickle', :git => 'http://github.com/ianwhite/pickle.git'
gem 'pickle-mongoid' # gem 'pickle-mongoid'
gem 'capybara' # gem 'capybara'
#
# would be nice.. # # would be nice..
# gem 'capybara-envjs' # # gem 'capybara-envjs'
#
gem 'database_cleaner' # gem 'database_cleaner'
gem 'cucumber' # gem 'cucumber'
gem 'cucumber-rails' # gem 'cucumber-rails'
gem 'spork' # gem 'spork'
gem 'launchy' # gem 'launchy'
gem 'mocha', :git => 'git://github.com/floehopper/mocha.git' # gem 'mocha', :git => 'git://github.com/floehopper/mocha.git'
end # end

View File

@ -1,10 +1,3 @@
GIT
remote: git://github.com/floehopper/mocha.git
revision: e0a00a7
specs:
mocha (0.9.8.20100819090654)
rake
GIT GIT
remote: git://github.com/locomotivecms/custom_fields.git remote: git://github.com/locomotivecms/custom_fields.git
revision: 89c4d7d revision: 89c4d7d
@ -18,16 +11,6 @@ GIT
specs: specs:
liquid (2.1.3) liquid (2.1.3)
GIT
remote: http://github.com/ianwhite/pickle.git
revision: 65ba8b7
specs:
pickle (0.4.2)
cucumber (>= 0.8)
rake
rspec (>= 1.3)
yard
GEM GEM
remote: http://rubygems.org/ remote: http://rubygems.org/
specs: specs:
@ -62,7 +45,6 @@ GEM
activesupport (3.0.0) activesupport (3.0.0)
arel (1.0.1) arel (1.0.1)
activesupport (~> 3.0.0) activesupport (~> 3.0.0)
autotest (4.3.2)
aws (2.3.21) aws (2.3.21)
http_connection http_connection
uuidtools uuidtools
@ -71,30 +53,13 @@ GEM
bson (1.0.4) bson (1.0.4)
bson_ext (1.0.4) bson_ext (1.0.4)
builder (2.1.2) builder (2.1.2)
capybara (0.3.9)
culerity (>= 0.2.4)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
selenium-webdriver (>= 0.0.3)
carrierwave (0.5.0.beta2) carrierwave (0.5.0.beta2)
activesupport (>= 3.0.0.beta4) activesupport (>= 3.0.0.beta4)
cgi_multipart_eof_fix (2.5.0) cgi_multipart_eof_fix (2.5.0)
columnize (0.3.1) columnize (0.3.1)
configuration (1.1.0) configuration (1.1.0)
crack (0.1.8) crack (0.1.8)
cucumber (0.9.0)
builder (~> 2.1.2)
diff-lcs (~> 1.1.2)
gherkin (~> 2.2.2)
json (~> 1.4.6)
term-ansicolor (~> 1.0.5)
cucumber-rails (0.3.2)
cucumber (>= 0.8.0)
culerity (0.2.12)
daemons (1.1.0) daemons (1.1.0)
database_cleaner (0.5.2)
delayed_job (2.1.0.pre2) delayed_job (2.1.0.pre2)
activesupport (~> 3.0) activesupport (~> 3.0)
daemons daemons
@ -104,27 +69,15 @@ GEM
devise (1.1.2) devise (1.1.2)
bcrypt-ruby (~> 2.1.2) bcrypt-ruby (~> 2.1.2)
warden (~> 0.10.7) warden (~> 0.10.7)
diff-lcs (1.1.2)
erubis (2.6.6) erubis (2.6.6)
abstract (>= 1.0.0) abstract (>= 1.0.0)
factory_girl (1.3.2)
factory_girl_rails (1.0)
factory_girl (~> 1.3)
rails (>= 3.0.0.beta4)
fastthread (1.0.7) fastthread (1.0.7)
ffi (0.6.3)
rake (>= 0.8.7)
formtastic-rails3 (1.0.0.beta3) formtastic-rails3 (1.0.0.beta3)
actionpack (>= 3.0.0beta3) actionpack (>= 3.0.0beta3)
activesupport (>= 3.0.0beta3) activesupport (>= 3.0.0beta3)
gem_plugin (0.2.3) gem_plugin (0.2.3)
gemcutter (0.6.1) gemcutter (0.6.1)
gherkin (2.2.3)
json (~> 1.4.6)
term-ansicolor (~> 1.0.5)
trollop (~> 1.16.2)
git (1.2.5) git (1.2.5)
growl-glue (1.0.7)
haml (3.0.18) haml (3.0.18)
has_scope (0.5.0) has_scope (0.5.0)
heroku (1.10.5) heroku (1.10.5)
@ -142,7 +95,6 @@ GEM
gemcutter (>= 0.1.0) gemcutter (>= 0.1.0)
git (>= 1.2.5) git (>= 1.2.5)
rubyforge (>= 2.0.0) rubyforge (>= 2.0.0)
json (1.4.6)
json_pure (1.4.6) json_pure (1.4.6)
launchy (0.3.7) launchy (0.3.7)
configuration (>= 0.0.5) configuration (>= 0.0.5)
@ -172,10 +124,6 @@ GEM
daemons (>= 1.0.3) daemons (>= 1.0.3)
fastthread (>= 1.0.1) fastthread (>= 1.0.1)
gem_plugin (>= 0.2.3) gem_plugin (>= 0.2.3)
nokogiri (1.4.3.1)
pickle-mongoid (0.1.6)
mongoid (>= 2.0.0.beta.7)
pickle (>= 0.3.0)
polyglot (0.3.1) polyglot (0.3.1)
rack (1.2.1) rack (1.2.1)
rack-mount (0.6.13) rack-mount (0.6.13)
@ -200,17 +148,6 @@ GEM
rest-client (1.4.2) rest-client (1.4.2)
mime-types (>= 1.16) mime-types (>= 1.16)
rmagick (2.12.2) rmagick (2.12.2)
rspec (2.0.0.beta.19)
rspec-core (= 2.0.0.beta.19)
rspec-expectations (= 2.0.0.beta.19)
rspec-mocks (= 2.0.0.beta.19)
rspec-core (2.0.0.beta.19)
rspec-expectations (2.0.0.beta.19)
diff-lcs (>= 1.1.2)
rspec-mocks (2.0.0.beta.19)
rspec-rails (2.0.0.beta.19)
rspec (= 2.0.0.beta.19)
webrat (>= 0.7.2.beta.1)
ruby-debug (0.10.3) ruby-debug (0.10.3)
columnize (>= 0.1) columnize (>= 0.1)
ruby-debug-base (~> 0.10.3.0) ruby-debug-base (~> 0.10.3.0)
@ -219,27 +156,15 @@ GEM
rubyforge (2.0.4) rubyforge (2.0.4)
json_pure (>= 1.1.7) json_pure (>= 1.1.7)
rubyzip (0.9.4) rubyzip (0.9.4)
selenium-webdriver (0.0.28)
ffi (>= 0.6.1)
json_pure
rubyzip
spork (0.8.4)
term-ansicolor (1.0.5)
thor (0.14.1) thor (0.14.1)
treetop (1.4.8) treetop (1.4.8)
polyglot (>= 0.3.1) polyglot (>= 0.3.1)
trollop (1.16.2)
tzinfo (0.3.23) tzinfo (0.3.23)
uuidtools (2.1.1) uuidtools (2.1.1)
warden (0.10.7) warden (0.10.7)
rack (>= 1.0.0) rack (>= 1.0.0)
webrat (0.7.2.beta.1)
nokogiri (>= 1.2.0)
rack (>= 1.0)
rack-test (>= 0.5.3)
will_paginate (3.0.pre2) will_paginate (3.0.pre2)
xml-simple (1.0.12) xml-simple (1.0.12)
yard (0.6.1)
PLATFORMS PLATFORMS
ruby ruby
@ -247,41 +172,29 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
RedCloth RedCloth
actionmailer-with-request actionmailer-with-request
autotest
aws aws
bson_ext (= 1.0.4) bson_ext (= 1.0.4)
capybara
carrierwave (= 0.5.0.beta2) carrierwave (= 0.5.0.beta2)
cgi_multipart_eof_fix cgi_multipart_eof_fix
cucumber
cucumber-rails
custom_fields! custom_fields!
database_cleaner
delayed_job (= 2.1.0.pre2) delayed_job (= 2.1.0.pre2)
delayed_job_mongoid (= 1.0.0.rc) delayed_job_mongoid (= 1.0.0.rc)
devise (= 1.1.2) devise (= 1.1.2)
factory_girl_rails
fastthread fastthread
formtastic-rails3 (= 1.0.0.beta3) formtastic-rails3 (= 1.0.0.beta3)
growl-glue
haml (= 3.0.18) haml (= 3.0.18)
heroku heroku
httparty (= 0.6.1) httparty (= 0.6.1)
inherited_resources (= 1.1.2) inherited_resources (= 1.1.2)
jeweler jeweler
launchy
liquid! liquid!
mimetype-fu mimetype-fu
mocha!
mongo_session_store (= 2.0.0.pre) mongo_session_store (= 2.0.0.pre)
mongoid (= 2.0.0.beta.17) mongoid (= 2.0.0.beta.17)
mongoid_acts_as_tree (= 0.1.5) mongoid_acts_as_tree (= 0.1.5)
mongrel mongrel
pickle!
pickle-mongoid
rails (= 3.0.0) rails (= 3.0.0)
rmagick (= 2.12.2) rmagick (= 2.12.2)
rspec-rails (= 2.0.0.beta.19)
ruby-debug ruby-debug
spork rubyzip
warden warden

View File

@ -8,7 +8,7 @@ If we have to give only 5 main features to describe our application, there will
* nice looking UI (see http://www.locomotiveapp.org for some screenshots) * nice looking UI (see http://www.locomotiveapp.org for some screenshots)
* flexible content types * flexible content types
* playing smoothly with Heroku and MongoHQ * playing smoothly with Heroku and MongoHQ
* inline editing (coming soon) * inline editing (beta)
h2. Strategy / Development status h2. Strategy / Development status
@ -19,12 +19,13 @@ h2. Gems
Here is a short list of main gems used in the application. Here is a short list of main gems used in the application.
* Rails 3 RC * Rails 3.0
* Mongoid 2.0.0.beta 16 (with MongoDB 1.6) * Mongoid 2.0.0.beta 17 (with MongoDB 1.6)
* Liquid * Liquid
* Devise * Devise
* Carrierwave * Carrierwave
* Haml * Haml
* Delayed job
h2. Installation h2. Installation

View File

@ -18,10 +18,11 @@ BOARD:
- edit images (upload new ones, ...etc) => wait for aloha or send them an email ? - edit images (upload new ones, ...etc) => wait for aloha or send them an email ?
x customize tinyMCE: no html popup => div popup, nice icons x customize tinyMCE: no html popup => div popup, nice icons
x add images / files inside long text element (back-office side at first ?) x add images / files inside long text element (back-office side at first ?)
x create a repo for a tool "a la" vision
- global regions: keyword in editable element (http://www.mongodb.org/display/DOCS/Updating) - global regions: keyword in editable element (http://www.mongodb.org/display/DOCS/Updating)
- create a repo for a tool "a la" vision
- write my first tutorial about locomotive - write my first tutorial about locomotive
- asset collections => liquid - asset collections => liquid
- apply http://github.com/flori/json/commit/2c0f8d2c9b15a33b8d10ffcb1959aef54d320b57
- refactor slugify method (use parameterize + create a module) - refactor slugify method (use parameterize + create a module)
- [content types] the "display column" selector should not include file types - [content types] the "display column" selector should not include file types

View File

@ -12,6 +12,7 @@ require 'locomotive/admin_responder'
require 'locomotive/routing' require 'locomotive/routing'
require 'locomotive/regexps' require 'locomotive/regexps'
require 'locomotive/render' require 'locomotive/render'
require 'locomotive/import'
require 'mongo_session_store/mongoid' require 'mongo_session_store/mongoid'

3
lib/locomotive/import.rb Normal file
View File

@ -0,0 +1,3 @@
require 'locomotive/import/job'
require 'locomotive/import/site'
require 'locomotive/import/content_types'

View File

@ -0,0 +1,47 @@
module Locomotive
module Import
module ContentTypes
def self.process(database, site, theme_path)
content_types = database['site']['content_types']
return if content_types.nil?
content_types.each do |name, attributes|
content_type = site.content_types.where(:slug => attributes['slug']).first
content_type ||= self.create_content_type(site, attributes.merge(:name => name))
self.add_or_update_fields(content_type, attributes['fields'])
content_type.save
puts "content_type = #{content_type.inspect}"
site.reload
end
end
def self.create_content_type(site, data)
attributes = { :order_by => 'manually' }.merge(data)
attributes.delete_if { |name, value| %w{fields contents}.include?(name) }
site.content_types.build(attributes)
end
def self.add_or_update_fields(content_type, fields)
fields.each do |name, data|
attributes = { :_name => name, :kind => 'String' }.merge(data).symbolize_keys
field = content_type.content_custom_fields.detect { |f| f._name == attributes[:_name] }
field ||= content_type.content_custom_fields.build(attributes)
field.attributes = attributes
end
end
end
end
end

View File

@ -0,0 +1,54 @@
require 'zip/zipfilesystem'
module Locomotive
module Import
class Job
def initialize(theme_file, site = nil, options = {})
raise "Theme zipfile not found" unless File.exists?(theme_file)
@theme_file = theme_file
@site = site
@options = Hash.new(true).merge(options)
end
def perform
self.unzip!
raise "No database.yml found in the theme zipfile" if @database.nil?
Locomotive::Import::Site.process(@database, @site, @theme_path)
Locomotive::Import::ContentTypes.process(@database, @site, @theme_path)
end
protected
def unzip!
Zip::ZipFile.open(@theme_file) do |zipfile|
destination_path = File.join(Rails.root, 'tmp', 'themes', @site.id.to_s)
zipfile.each do |entry|
next if entry.name =~ /__MACOSX/
if entry.name =~ /database.yml$/
@database = YAML.load(zipfile.read(entry.name))
@theme_path= File.join(destination_path, entry.name.gsub('database.yml', ''))
next
end
puts entry.name
#
# FileUtils.mkdir_p(File.dirname(File.join(destination_path, entry.name)))
#
# zipfile.extract(entry, File.join(destination_path, entry.name))
end
end
end
end
end
end

View File

@ -0,0 +1,17 @@
module Locomotive
module Import
module Site
def self.process(database, site, theme_path)
attributes = database['site'].clone.delete_if { |name, value| %w{pages content_types asset_collections}.include?(name) }
site.attributes = attributes
site.save!
puts "site errors = #{site.errors.inspect}"
end
end
end
end