First shot at attachment import

* only images for now
* only blog posts for now
* thumbnailed images are not yet replaced in blog posts body
This commit is contained in:
Marc Remolt 2011-06-05 19:14:52 +02:00
parent 9a2b5acef6
commit 7550dfa164
3 changed files with 83 additions and 0 deletions

View File

@ -19,6 +19,7 @@ namespace :wordpress do
dump = Refinery::WordPress::Dump.new(params[:file_name]) dump = Refinery::WordPress::Dump.new(params[:file_name])
dump.authors.each(&:to_refinery) dump.authors.each(&:to_refinery)
attachments = dump.attachments.each(&:to_refinery)
only_published = ENV['ONLY_PUBLISHED'] == 'true' ? true : false only_published = ENV['ONLY_PUBLISHED'] == 'true' ? true : false
dump.posts(only_published).each(&:to_refinery) dump.posts(only_published).each(&:to_refinery)
@ -28,6 +29,12 @@ namespace :wordpress do
ENV["MODEL"] = 'BlogPost' ENV["MODEL"] = 'BlogPost'
Rake::Task["friendly_id:redo_slugs"].invoke Rake::Task["friendly_id:redo_slugs"].invoke
ENV.delete("MODEL") ENV.delete("MODEL")
# parse all created BlogPosts bodys and replace the old wordpress image uls
# with the newly created ones
attachments.each do |attachment|
attachment.replace_image_url_in_blog_posts
end
end end
desc "reset blog tables and then import blog data from a Refinery::WordPress XML dump" desc "reset blog tables and then import blog data from a Refinery::WordPress XML dump"

View File

@ -2,6 +2,7 @@ module Refinery
module WordPress module WordPress
class Attachment class Attachment
attr_reader :node attr_reader :node
attr_reader :refinery_image
def initialize(node) def initialize(node)
@node = node @node = node
@ -15,6 +16,10 @@ module Refinery
node.xpath("description").text node.xpath("description").text
end end
def file_name
url.split('/').last
end
def post_date def post_date
DateTime.parse node.xpath("wp:post_date").text DateTime.parse node.xpath("wp:post_date").text
end end
@ -22,6 +27,44 @@ module Refinery
def url def url
node.xpath("wp:attachment_url").text node.xpath("wp:attachment_url").text
end end
def image?
url.match /\.(png|jpg|jpeg|gif)$/
end
def to_refinery
if image?
to_image
else
to_file
end
end
def replace_image_url_in_blog_posts
::BlogPost.all.each do |post|
if post.body.include? url
post.body = post.body.gsub(url, refinery_image.image.url)
post.save!
end
end
end
private
def to_image
image = ::Image.new
image.created_at = post_date
image.image_url = url
image.save!
@refinery_image = image
image
end
def to_file
raise "to_file is not implemented yet, sorry!"
end
end end
end end
end end

View File

@ -6,5 +6,38 @@ describe Refinery::WordPress::Attachment, :type => :model do
specify { attachment.title.should == '200px-Tux.svg' } specify { attachment.title.should == '200px-Tux.svg' }
specify { attachment.description.should == 'Tux, the Linux mascot' } specify { attachment.description.should == 'Tux, the Linux mascot' }
specify { attachment.url.should == 'http://localhost/wordpress/wp-content/uploads/2011/05/200px-Tux.svg_.png' } specify { attachment.url.should == 'http://localhost/wordpress/wp-content/uploads/2011/05/200px-Tux.svg_.png' }
specify { attachment.file_name.should == '200px-Tux.svg_.png' }
specify { attachment.post_date.should == DateTime.new(2011, 6, 5, 15, 26, 51) } specify { attachment.post_date.should == DateTime.new(2011, 6, 5, 15, 26, 51) }
specify { attachment.should be_an_image }
describe "#to_refinery" do
before do
@image = attachment.to_refinery
end
it "should create an Image from the Attachment" do
@image.should be_a(Image)
end
it "should copy the attributes from Attachment" do
@image.created_at.should == attachment.post_date
@image.image.url.end_with?(attachment.file_name).should be_true
end
end
describe "#replace_image_url" do
before do
test_dump.authors.each(&:to_refinery)
test_dump.posts.each(&:to_refinery)
@image = attachment.to_refinery
attachment.replace_image_url_in_blog_posts
end
it "should replace attachment urls in the generated BlogPosts" do
BlogPost.first.body.should_not include(attachment.url)
BlogPost.first.body.should include(@image.image.url)
end
end
end end