integrate dragonfly + clean code + fix a js bug when editing a custom field

This commit is contained in:
did 2011-06-20 12:05:12 -07:00
parent ecdb79bb2d
commit 87e7ced3c1
33 changed files with 452 additions and 296 deletions

View File

@ -22,6 +22,8 @@ gem 'inherited_resources', '~> 1.1.2'
gem 'rmagick', '2.12.2' gem 'rmagick', '2.12.2'
gem 'locomotive_carrierwave', '0.5.4.beta2' gem 'locomotive_carrierwave', '0.5.4.beta2'
gem 'dragonfly', '~> 0.9.1'
gem 'rack-cache', :require => 'rack/cache'
gem 'custom_fields', '1.0.0.beta.17' gem 'custom_fields', '1.0.0.beta.17'
gem 'fog', '0.8.2' gem 'fog', '0.8.2'

View File

@ -109,6 +109,8 @@ GEM
orm_adapter (~> 0.0.3) orm_adapter (~> 0.0.3)
warden (~> 1.0.3) warden (~> 1.0.3)
diff-lcs (1.1.2) diff-lcs (1.1.2)
dragonfly (0.9.4)
rack
erubis (2.6.6) erubis (2.6.6)
abstract (>= 1.0.0) abstract (>= 1.0.0)
excon (0.6.3) excon (0.6.3)
@ -191,6 +193,8 @@ GEM
polyglot (0.3.1) polyglot (0.3.1)
proxies (0.2.1) proxies (0.2.1)
rack (1.2.3) rack (1.2.3)
rack-cache (1.0.2)
rack (>= 0.4)
rack-mount (0.6.14) rack-mount (0.6.14)
rack (>= 1.0.0) rack (>= 1.0.0)
rack-test (0.5.7) rack-test (0.5.7)
@ -287,6 +291,7 @@ DEPENDENCIES
delayed_job (= 2.1.4) delayed_job (= 2.1.4)
delayed_job_mongoid (= 1.0.2) delayed_job_mongoid (= 1.0.2)
devise (= 1.3.4) devise (= 1.3.4)
dragonfly (~> 0.9.1)
factory_girl_rails factory_girl_rails
fog (= 0.8.2) fog (= 0.8.2)
formtastic (~> 1.2.3) formtastic (~> 1.2.3)
@ -305,6 +310,7 @@ DEPENDENCIES
mocha! mocha!
mongoid (~> 2.0.2) mongoid (~> 2.0.2)
pickle pickle
rack-cache
rails (>= 3.0.8) rails (>= 3.0.8)
rake (= 0.8.7) rake (= 0.8.7)
rmagick (= 2.12.2) rmagick (= 2.12.2)

View File

@ -1,25 +0,0 @@
module Admin
class AssetCollectionsController < BaseController
sections 'assets'
before_filter :set_collections
def index
if not @asset_collections.empty?
redirect_to(edit_admin_asset_collection_url(@asset_collections.first)) and return
end
end
def show
@asset_collection = current_site.asset_collections.find(params[:id])
render :action => 'edit'
end
protected
def set_collections
@asset_collections = current_site.asset_collections.not_internal.order_by([[:name, :asc]])
end
end
end

View File

@ -1,30 +1,19 @@
module Admin module Admin # TODO
class AssetsController < BaseController class AssetsController < BaseController
sections 'assets' sections 'assets'
before_filter :set_collections_and_current_collection
respond_to :json, :only => :update respond_to :json, :only => :update
def create def create
create! { edit_admin_asset_collection_url(@asset_collection) } create! { admin_assets_url }
end end
def update def update
update! { edit_admin_asset_collection_url(@asset_collection) } update! { admin_assets_url }
end end
protected protected
def begin_of_association_chain
@asset_collection
end
def set_collections_and_current_collection
@asset_collections = current_site.asset_collections.not_internal.order_by([[:name, :asc]])
@asset_collection = current_site.asset_collections.find(params[:collection_id])
end
end end
end end

View File

@ -34,11 +34,7 @@ module Admin
protected protected
def collection def collection
@assets ||= begin_of_association_chain.assets @assets ||= begin_of_association_chain.assets.only_image
end
def begin_of_association_chain
@asset_collection ||= AssetCollection.find_or_create_internal(current_site)
end end
def image_to_json(image) def image_to_json(image)

View File

@ -3,6 +3,10 @@ class Asset
include Mongoid::Document include Mongoid::Document
include Mongoid::Timestamps include Mongoid::Timestamps
## extensions ##
include Extensions::Asset::Types
include Extensions::Asset::Vignette
## fields ## ## fields ##
field :content_type, :type => String field :content_type, :type => String
field :width, :type => Integer field :width, :type => Integer
@ -21,12 +25,6 @@ class Asset
## methods ## ## methods ##
%w{image stylesheet javascript pdf media}.each do |type|
define_method("#{type}?") do
self.content_type.to_s == type
end
end
def extname def extname
return nil unless self.source? return nil unless self.source?
File.extname(self.source_filename).gsub(/^\./, '') File.extname(self.source_filename).gsub(/^\./, '')

View File

@ -0,0 +1,19 @@
module Extensions
module Asset
module Types
extend ActiveSupport::Concern
included do
%w{media image stylesheet javascript font pdf}.each do |type|
scope :"only_#{type}", where(:content_type => type)
define_method("#{type}?") do
self.content_type.to_s == type
end
end
end
end
end
end

View File

@ -7,7 +7,7 @@ module Extensions
if self.width < 80 && self.height < 80 if self.width < 80 && self.height < 80
self.source.url self.source.url
else else
self.source.url(:medium) Locomotive::Dragonfly.resize_url(self.source, '80x80#')
end end
end end
end end

View File

@ -42,14 +42,6 @@ module Extensions
@item_parsing_errors.try(:each) { |msg| self.errors.add :item_template, msg } @item_parsing_errors.try(:each) { |msg| self.errors.add :item_template, msg }
end end
# def item_template
# self.read_attribute(:default_item_template) || self.default_item_template
# end
#
# def default_item_template
# '{{ content.highlighted_field_value }}'
# end
end end
end end

View File

@ -2,6 +2,9 @@ class ThemeAsset
include Locomotive::Mongoid::Document include Locomotive::Mongoid::Document
## extensions ##
include Extensions::Asset::Types
## fields ## ## fields ##
field :local_path field :local_path
field :content_type field :content_type
@ -39,12 +42,6 @@ class ThemeAsset
## methods ## ## methods ##
%w{media image stylesheet javascript font}.each do |type|
define_method("#{type}?") do
self.content_type.to_s == type
end
end
def stylesheet_or_javascript? def stylesheet_or_javascript?
self.stylesheet? || self.javascript? self.stylesheet? || self.javascript?
end end

View File

@ -1,5 +1,4 @@
%ul#menu %ul#menu
= admin_menu_item('contents', admin_pages_url) = admin_menu_item('contents', admin_pages_url)
= admin_menu_item('assets', admin_asset_collections_url)
= admin_menu_item('settings', edit_admin_current_site_url) = admin_menu_item('settings', edit_admin_current_site_url)
%li.clear %li.clear

View File

@ -1,3 +0,0 @@
- @asset_collections.each do |c|
%li
= link_to content_tag(:span, truncate(c.name, :length => 20)), edit_admin_asset_collection_url(c), :class => "#{'on' if @asset_collection.id == c.id}"

View File

@ -4,7 +4,7 @@ Locomotive::Application.configure do
# In the development environment your application's code is reloaded on # In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development # every request. This slows down response time but is perfect for development
# since you don't have to restart the webserver when you make code changes. # since you don't have to restart the webserver when you make code changes.
config.cache_classes = true config.cache_classes = false
# Log error messages when you accidentally call methods on nil. # Log error messages when you accidentally call methods on nil.
config.whiny_nils = true config.whiny_nils = true

View File

@ -0,0 +1,47 @@
require 'locomotive'
unless Locomotive.engine?
require 'dragonfly'
require 'uri'
## initialize Dragonfly ##
app = Dragonfly[:images]
app.configure_with(:rails)
app.configure_with(:imagemagick)
## insert the middleware ##
Rails.application.middleware.insert 0, 'Dragonfly::Middleware', :images
## configure it ##
Dragonfly[:images].configure do |c|
# Convert absolute location needs to be specified
# to avoid issues with Phusion Passenger not using $PATH
convert = `which convert`.strip.presence || "/usr/local/bin/convert"
c.convert_command = convert
c.identify_command = convert
c.allow_fetch_url = true
c.allow_fetch_file = true
end
## disable rack-cache for heroku and enable it for the other platforms ##
unless Locomotive.heroku? # has already a reverse-proxy caching system with Varnish
begin
require 'rack/cache'
Rails.application.middleware.insert_before 'Dragonfly::Middleware', 'Rack::Cache', {
:verbose => true,
:metastore => URI.encode("file:#{Rails.root}/tmp/dragonfly/cache/meta"), # URI encoded in case of spaces
:entitystore => URI.encode("file:#{Rails.root}/tmp/dragonfly/cache/body")
}
rescue LoadError => e
app.log.warn("Warning: couldn't find rack-cache for caching dragonfly content")
end
end
end

View File

@ -33,9 +33,7 @@ Rails.application.routes.draw do
get :all, :action => 'index', :on => :collection, :defaults => { :all => true } get :all, :action => 'index', :on => :collection, :defaults => { :all => true }
end end
resources :asset_collections resources :assets # TODO
resources :assets, :path => 'asset_collections/:collection_id/assets'
resources :images resources :images

View File

@ -20,6 +20,8 @@ module Locomotive
template 'locomotive.rb', 'config/initializers/locomotive.rb' template 'locomotive.rb', 'config/initializers/locomotive.rb'
template 'carrierwave.rb', 'config/initializers/carrierwave.rb' template 'carrierwave.rb', 'config/initializers/carrierwave.rb'
template 'dragonfly.rb', 'config/initializers/dragonfly.rb'
end end
def remove_index_html def remove_index_html

View File

@ -6,6 +6,7 @@ The Locomotive Engine has been correctly installed in your Rails application.
- config/initializers/locomotive.rb - config/initializers/locomotive.rb
- config/initializers/carrierwave.rb - config/initializers/carrierwave.rb
- config/initializers/dragonfly.rb
- config/mongoid.yml - config/mongoid.yml
2. Launch the server 2. Launch the server

View File

@ -0,0 +1,40 @@
require 'dragonfly'
require 'uri'
## initialize Dragonfly ##
app = Dragonfly[:images]
app.configure_with(:rails)
app.configure_with(:imagemagick)
## insert the middleware ##
Rails.application.middleware.insert 0, 'Dragonfly::Middleware', :images
## configure it ##
Dragonfly[:images].configure do |c|
# Convert absolute location needs to be specified
# to avoid issues with Phusion Passenger not using $PATH
convert = `which convert`.strip.presence || "/usr/local/bin/convert"
c.convert_command = convert
c.identify_command = convert
c.allow_fetch_url = true
c.allow_fetch_file = true
end
## disable rack-cache for heroku and enable it for the other platforms ##
require 'locomotive'
unless Locomotive.heroku? # has already a reverse-proxy caching system with Varnish
begin
require 'rack/cache'
Rails.application.middleware.insert_before 'Dragonfly::Middleware', 'Rack::Cache', {
:verbose => true,
:metastore => URI.encode("file:#{Rails.root}/tmp/dragonfly/cache/meta"), # URI encoded in case of spaces
:entitystore => URI.encode("file:#{Rails.root}/tmp/dragonfly/cache/body")
}
rescue LoadError => e
app.log.warn("Warning: couldn't find rack-cache for caching dragonfly content")
end
end

View File

@ -5,6 +5,7 @@ require 'locomotive/version'
require 'locomotive/core_ext' require 'locomotive/core_ext'
require 'locomotive/configuration' require 'locomotive/configuration'
require 'locomotive/logger' require 'locomotive/logger'
require 'locomotive/dragonfly'
require 'locomotive/liquid' require 'locomotive/liquid'
require 'locomotive/mongoid' require 'locomotive/mongoid'
require 'locomotive/carrierwave' require 'locomotive/carrierwave'
@ -23,8 +24,9 @@ require 'locomotive/hosting'
module Locomotive module Locomotive
include Locomotive::Hosting::Heroku extend Locomotive::Hosting::Heroku
include Locomotive::Hosting::Bushido extend Locomotive::Hosting::Bushido
extend Locomotive::Hosting::Default
class << self class << self
attr_accessor :config attr_accessor :config
@ -76,7 +78,6 @@ module Locomotive
# Load all the dynamic classes (custom fields) # Load all the dynamic classes (custom fields)
begin begin
ContentType.all.collect(&:fetch_content_klass) ContentType.all.collect(&:fetch_content_klass)
# AssetCollection.all.collect(&:fetch_asset_klass)
rescue ::Mongoid::Errors::InvalidDatabase => e rescue ::Mongoid::Errors::InvalidDatabase => e
# let assume it's because of the first install (meaning no config.yml file) # let assume it's because of the first install (meaning no config.yml file)
end end

View File

@ -0,0 +1,32 @@
module Locomotive
module Dragonfly
def self.resize_url(source, resize_string)
file = nil
if source.is_a?(String) # simple string
if source =~ /^http/
file = self.app.fetch_url(source)
else
file = self.app.fetch_file(File.join('public', source))
end
elsif source.respond_to?(:url) # carrierwave uploader
if source.file.respond_to?(:url)
file = self.app.fetch_url(source.url) # amazon s3, cloud files, ...etc
else
file = self.app.fetch_file(source.path)
end
else
Locomotive.logger.warning "Unable to resize on the fly: #{source.inspect}"
return
end
file.process(:thumb, resize_string).url
end
def self.app
::Dragonfly[:images]
end
end
end

View File

@ -0,0 +1,7 @@
module Locomotive
module Hosting
class Base
end
end
end

View File

@ -1,110 +1,20 @@
require 'bushido' require 'locomotive/hosting/bushido/enabler'
require 'locomotive/hosting/bushido/custom_domain'
require 'locomotive/hosting/bushido/first_installation'
require 'locomotive/hosting/bushido/account_ext'
require 'locomotive/hosting/bushido/middleware'
require 'locomotive/hosting/bushido/devise'
module Locomotive module Locomotive
module Hosting module Hosting
module Bushido module Bushido
extend ActiveSupport::Concern def bushido?
self.config.hosting == :bushido ||
included do (self.config.hosting == :auto && ENV['APP_TLD'] == 'bushi.do')
class << self
attr_accessor :bushido_domains
attr_accessor :bushido_subdomain
end
end end
module ClassMethods def enable_bushido
Locomotive.send(:include, Locomotive::Hosting::Bushido::Enabler)
def bushido?
self.config.hosting == :bushido ||
(self.config.hosting == :auto && ENV['APP_TLD'] == 'bushi.do')
end
def bushido_app_claimed?
ENV['BUSHIDO_CLAIMED'].present? && ENV['BUSHIDO_CLAIMED'].to_s.downcase == 'true'
end
def enable_bushido
self.config.domain = ENV['APP_TLD'] unless self.config.multi_sites?
self.enhance_models_with_bushido
self.disable_authentication_for_not_claimed_app
self.setup_smtp_settings
self.add_middleware
self.config.delayed_job = true # force to use delayed_job
self.bushido_domains = ::Bushido::App.domains
self.bushido_subdomain = ::Bushido::App.subdomain
end
def enhance_models_with_bushido
Site.send :include, Locomotive::Hosting::Bushido::CustomDomain
Site.send :include, Locomotive::Hosting::Bushido::FirstInstallation
Account.send :include, Locomotive::Hosting::Bushido::AccountExt
end
def disable_authentication_for_not_claimed_app
Admin::BaseController.send :include, Locomotive::Hosting::Bushido::Devise
end
def setup_smtp_settings
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:authentication => ENV['SMTP_AUTHENTICATION'],
:address => ENV['SMTP_SERVER'],
:port => ENV['SMTP_PORT'],
:domain => ENV['SMTP_DOMAIN'],
:user_name => ENV['SMTP_USER'],
:password => ENV['SMTP_PASSWORD'],
:enable_starttls_auto => ENV['SMTP_TLS'].to_s == 'true'
}
end
def add_middleware
::Locomotive::Application.configure do |config|
config.middleware.use '::Locomotive::Hosting::Bushido::Middleware'
end
end
# manage domains
def add_bushido_domain(name)
Locomotive.logger "[add bushido domain] #{name}"
::Bushido::App.add_domain(name)
if ::Bushido::Command.last_command_successful?
self.bushido_domains << name
end
end
def remove_bushido_domain(name)
Locomotive.logger "[remove bushido domain] #{name}"
::Bushido::App.remove_domain(name)
if ::Bushido::Command.last_command_successful?
self.bushido_domains.delete(name)
end
end
def set_bushido_subdomain(name)
Locomotive.logger "[set bushido subdomain] #{name}.bushi.do"
::Bushido::App.set_subdomain(name)
if ::Bushido::Command.last_command_successful?
self.bushido_subdomain = name
end
end
self.enable_bushido!
end end
end end
end end
end end

View File

@ -0,0 +1,107 @@
require 'bushido'
require 'locomotive/hosting/bushido/custom_domain'
require 'locomotive/hosting/bushido/first_installation'
require 'locomotive/hosting/bushido/account_ext'
require 'locomotive/hosting/bushido/middleware'
require 'locomotive/hosting/bushido/devise'
module Locomotive
module Hosting
module Bushido
module Enabler
extend ActiveSupport::Concern
included do
class << self
attr_accessor :bushido_domains
attr_accessor :bushido_subdomain
end
end
module ClassMethods
def bushido_app_claimed?
ENV['BUSHIDO_CLAIMED'].present? && ENV['BUSHIDO_CLAIMED'].to_s.downcase == 'true'
end
def enable_bushido!
self.config.domain = ENV['APP_TLD'] unless self.config.multi_sites?
self.enhance_models
self.disable_authentication_for_not_claimed_app
self.setup_smtp_settings
self.add_middlewares
self.config.delayed_job = true # force to use delayed_job
self.bushido_domains = ::Bushido::App.domains
self.bushido_subdomain = ::Bushido::App.subdomain
end
def enhance_models
Site.send :include, Locomotive::Hosting::Bushido::CustomDomain
Site.send :include, Locomotive::Hosting::Bushido::FirstInstallation
Account.send :include, Locomotive::Hosting::Bushido::AccountExt
end
def disable_authentication_for_not_claimed_app
Admin::BaseController.send :include, Locomotive::Hosting::Bushido::Devise
end
def setup_smtp_settings
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:authentication => ENV['SMTP_AUTHENTICATION'],
:address => ENV['SMTP_SERVER'],
:port => ENV['SMTP_PORT'],
:domain => ENV['SMTP_DOMAIN'],
:user_name => ENV['SMTP_USER'],
:password => ENV['SMTP_PASSWORD'],
:enable_starttls_auto => ENV['SMTP_TLS'].to_s == 'true'
}
end
def add_middlewares
Rails.application.configure do |config|
config.middleware.use '::Locomotive::Hosting::Bushido::Middleware'
end
end
# manage domains
def add_bushido_domain(name)
Locomotive.logger "[add bushido domain] #{name}"
::Bushido::App.add_domain(name)
if ::Bushido::Command.last_command_successful?
self.bushido_domains << name
end
end
def remove_bushido_domain(name)
Locomotive.logger "[remove bushido domain] #{name}"
::Bushido::App.remove_domain(name)
if ::Bushido::Command.last_command_successful?
self.bushido_domains.delete(name)
end
end
def set_bushido_subdomain(name)
Locomotive.logger "[set bushido subdomain] #{name}.bushi.do"
::Bushido::App.set_subdomain(name)
if ::Bushido::Command.last_command_successful?
self.bushido_subdomain = name
end
end
end
end
end
end
end

View File

@ -18,30 +18,34 @@ module Locomotive
end end
def call(env) def call(env)
status, headers, response = @app.call(env) if Locomotive.bushido?
status, headers, response = @app.call(env)
content = "" content = ""
response.each { |part| content += part } response.each { |part| content += part }
# "claiming" bar + stats ? # "claiming" bar + stats ?
content.gsub!(/<\/body>/i, <<-STR content.gsub!(/<\/body>/i, <<-STR
<script type="text/javascript"> <script type="text/javascript">
var _bushido_app = '#{@bushido_app_name}'; var _bushido_app = '#{@bushido_app_name}';
var _bushido_claimed = #{@bushido_claimed.to_s}; var _bushido_claimed = #{@bushido_claimed.to_s};
var _bushido_metrics_token = '#{@bushido_metrics_token}'; var _bushido_metrics_token = '#{@bushido_metrics_token}';
(function() { (function() {
var bushido = document.createElement('script'); bushido.type = 'text/javascript'; bushido.async = true; var bushido = document.createElement('script'); bushido.type = 'text/javascript'; bushido.async = true;
bushido.src = '#{BUSHIDO_JS_URL}?#{::Bushido::VERSION.gsub('.', '')}'; bushido.src = '#{BUSHIDO_JS_URL}?#{::Bushido::VERSION.gsub('.', '')}';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(bushido, s); var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(bushido, s);
})(); })();
</script> </script>
</body> </body>
STR STR
) )
headers['content-length'] = bytesize(content).to_s headers['content-length'] = bytesize(content).to_s
[status, headers, [content]] [status, headers, [content]]
else
@app.call(env)
end
end end
end end

View File

@ -0,0 +1,11 @@
module Locomotive
module Hosting
module Default
def default_hosting?
true
end
end
end
end

View File

@ -1,80 +1,18 @@
require 'heroku' require 'locomotive/hosting/heroku/enabler'
require 'heroku/client'
require 'locomotive/hosting/heroku/custom_domain'
require 'locomotive/hosting/heroku/first_installation'
module Locomotive module Locomotive
module Hosting module Hosting
module Heroku module Heroku
extend ActiveSupport::Concern def heroku?
self.config.hosting == :heroku ||
included do (self.config.hosting == :auto && ENV['HEROKU_SLUG'].present?)
class << self
attr_accessor :heroku_connection
attr_accessor :heroku_domains
end
end end
module ClassMethods def enable_heroku
Locomotive.send(:include, Locomotive::Hosting::Heroku::Enabler)
def heroku?
self.config.hosting == :heroku ||
(self.config.hosting == :auto && ENV['HEROKU_SLUG'].present?)
end
def enable_heroku
self.config.domain = 'heroku.com' unless self.config.multi_sites?
self.config.heroku ||= {}
self.config.heroku[:name] = ENV['APP_NAME']
raise 'Heroku application name is mandatory' if self.config.heroku[:name].blank?
self.open_heroku_connection
self.enhance_site_model_with_heroku
self.apply_patches
# "cache" domains for better performance
self.heroku_domains = self.heroku_connection.list_domains(self.config.heroku[:name]).collect { |h| h[:domain] }
end
def open_heroku_connection
login = self.config.heroku[:login] || ENV['HEROKU_LOGIN']
password = self.config.heroku[:password] || ENV['HEROKU_PASSWORD']
self.heroku_connection = ::Heroku::Client.new(login, password)
end
def enhance_site_model_with_heroku
Site.send :include, Locomotive::Hosting::Heroku::CustomDomain
Site.send :include, Locomotive::Hosting::Heroku::FirstInstallation
end
def apply_patches
# for various reasons, Heroku can modify the behaviour of an application by changing the gem versions (json/pure for instance)
# so the purpose of this method is to correct those potential differences.
# http://blog.ethanvizitei.com/2010/11/json-pure-ruins-my-morning.html
Fixnum.class_eval { def to_json(options = nil); to_s; end }
end
# manage domains
def add_heroku_domain(name)
Locomotive.logger "[add heroku domain] #{name}"
self.heroku_connection.add_domain(self.config.heroku[:name], name)
self.heroku_domains << name
end
def remove_heroku_domain(name)
Locomotive.logger "[remove heroku domain] #{name}"
self.heroku_connection.remove_domain(self.config.heroku[:name], name)
self.heroku_domains.delete(name)
end
self.enable_heroku!
end end
end end

View File

@ -0,0 +1,79 @@
require 'heroku'
require 'heroku/client'
require 'locomotive/hosting/heroku/custom_domain'
require 'locomotive/hosting/heroku/first_installation'
module Locomotive
module Hosting
module Heroku
module Enabler
extend ActiveSupport::Concern
included do
class << self
attr_accessor :heroku_connection
attr_accessor :heroku_domains
end
end
module ClassMethods
def enable_heroku!
self.config.domain = 'heroku.com' unless self.config.multi_sites?
self.config.heroku ||= {}
self.config.heroku[:name] = ENV['APP_NAME']
raise 'Heroku application name is mandatory' if self.config.heroku[:name].blank?
self.open_heroku_connection
self.enhance_site_model
self.apply_patches
# "cache" domains for better performance
self.heroku_domains = self.heroku_connection.list_domains(self.config.heroku[:name]).collect { |h| h[:domain] }
end
def open_heroku_connection
login = self.config.heroku[:login] || ENV['HEROKU_LOGIN']
password = self.config.heroku[:password] || ENV['HEROKU_PASSWORD']
self.heroku_connection = ::Heroku::Client.new(login, password)
end
def enhance_site_model
Site.send :include, Locomotive::Hosting::Heroku::CustomDomain
Site.send :include, Locomotive::Hosting::Heroku::FirstInstallation
end
def apply_patches
# for various reasons, Heroku can modify the behaviour of an application by changing the gem versions (json/pure for instance)
# so the purpose of this method is to correct those potential differences.
# http://blog.ethanvizitei.com/2010/11/json-pure-ruins-my-morning.html
Fixnum.class_eval { def to_json(options = nil); to_s; end }
end
# manage domains
def add_heroku_domain(name)
Locomotive.logger "[add heroku domain] #{name}"
self.heroku_connection.add_domain(self.config.heroku[:name], name)
self.heroku_domains << name
end
def remove_heroku_domain(name)
Locomotive.logger "[remove heroku domain] #{name}"
self.heroku_connection.remove_domain(self.config.heroku[:name], name)
self.heroku_domains.delete(name)
end
end
end
end
end
end

View File

@ -0,0 +1,16 @@
module Locomotive
module Liquid
module Filters
module Resize
def resize(input, resize_string)
Locomotive::Dragonfly.resize_url(input, resize_string)
end
end
::Liquid::Template.register_filter(Resize)
end
end
end

View File

@ -107,7 +107,7 @@ module Locomotive
end end
def page_status def page_status
@page == not_found_page ? :not_found : :ok @page.not_found? ? :not_found : :ok
end end
end end

View File

@ -17,34 +17,31 @@ namespace :locomotive do
task :remove_asset_collections => :environment do task :remove_asset_collections => :environment do
puts "Processing #{AssetCollection.count} asset collection(s)..." puts "Processing #{AssetCollection.count} asset collection(s)..."
Asset.destroy_all # TODO
AssetCollection.all.each do |collection| AssetCollection.all.each do |collection|
site = Site.find(collection.attributes['site_id']) site = Site.find(collection.attributes['site_id'])
if collection.internal? if collection.internal?
# internal collection => create simple assets without associated to a collection # internal collection => create simple assets without associated to a collection
# collection.assets.each do |tmp_asset| collection.assets.each do |tmp_asset|
# puts "tmp asset = #{tmp_asset.inspect} / #{tmp_asset.source.url.inspect}" # puts "tmp asset = #{tmp_asset.inspect} / #{tmp_asset.source.url.inspect}" TODO
#
# sanitized_attributes = tmp_asset.attributes.dup sanitized_attributes = tmp_asset.attributes.dup
# # sanitized_attributes.delete_if { |k, v| [:name, :source_filename].include?(k) } sanitized_attributes[:_id] = tmp_asset._id
# sanitized_attributes[:_id] = tmp_asset._id
# asset = site.assets.build(sanitized_attributes)
# asset = site.assets.build(sanitized_attributes)
# asset.save(:validate => false)
# # asset.source = tmp_asset.source.file
# # puts "asset = #{asset.inspect} / #{asset.source.url.inspect}" TODO
# asset.save! end
#
# puts "asset = #{asset.inspect} / #{asset.source.url.inspect}"
#
# # asset.destroy
# end
else else
collection.fetch_asset_klass.class_eval { def self.model_name; 'Asset'; end } collection.fetch_asset_klass.class_eval { def self.model_name; 'Asset'; end }
# create content_types reflection of an asset collection # create content_types reflection of an asset collection
ContentType.where(:slug => collection.slug).all.collect(&:destroy) ContentType.where(:slug => collection.slug).all.collect(&:destroy) # TODO
content_type = site.content_types.build({ content_type = site.content_types.build({
:name => collection.name, :name => collection.name,
@ -72,9 +69,6 @@ namespace :locomotive do
content_type.highlighted_field_name = field._name content_type.highlighted_field_name = field._name
content_type.save content_type.save
# puts "new content_type = #{content_type.inspect} /\n\n #{content_type.content_custom_fields.inspect}\n\n"
# puts "collection asset name = #{collection.fetch_asset_klass.inspect}"
# insert data # insert data
collection.ordered_assets.each do |asset| collection.ordered_assets.each do |asset|
attributes = (if asset.custom_fields.blank? attributes = (if asset.custom_fields.blank?
@ -93,8 +87,6 @@ namespace :locomotive do
attributes.merge!(:name => asset.name, :_position_in_list => asset.position) attributes.merge!(:name => asset.name, :_position_in_list => asset.position)
# puts "attributes = #{attributes.inspect}"
content = content_type.contents.build(attributes) content = content_type.contents.build(attributes)
content._id = asset._id content._id = asset._id
@ -102,13 +94,10 @@ namespace :locomotive do
content.source = asset.source.file content.source = asset.source.file
content.save(:validate => false) content.save(:validate => false)
# puts "content = #{content.inspect} / #{content.source.url} / #{asset.source.url}"
# puts "source (large) #{content.custom_field_9?} / #{content.custom_field_9.url} / #{asset.source.url}"
# puts "custom_field_4 (thumb) #{content.custom_field_4?} / #{content.custom_field_4.url} / #{asset.custom_field_4.url}"
# puts "====="
end end
end end
puts "...the collection named '#{collection.slug}' for the '#{site.name}' site has been migrated with success !"
end end
end end

View File

@ -37,6 +37,8 @@ Gem::Specification.new do |s|
s.add_dependency "rmagick", "2.12.2" s.add_dependency "rmagick", "2.12.2"
s.add_dependency "locomotive_carrierwave", "0.5.4.beta2" s.add_dependency "locomotive_carrierwave", "0.5.4.beta2"
s.add_dependency "dragonfly", "~> 0.9.1"
s.add_dependency "rack-cache"
s.add_dependency "custom_fields", "1.0.0.beta.17" s.add_dependency "custom_fields", "1.0.0.beta.17"
s.add_dependency "fog", "0.8.2" s.add_dependency "fog", "0.8.2"

View File

@ -59,8 +59,10 @@ $(document).ready(function() {
onComplete: function() { onComplete: function() {
$('#fancybox-wrap .popup-actions button[type=submit]').click(function(e) { $('#fancybox-wrap .popup-actions button[type=submit]').click(function(e) {
$.each(attributes, function(index, name) { $.each(attributes, function(index, name) {
var val = domBoxAttrVal(name).trim(); try {
if (val != '') domFieldVal(domField, name, val); var val = domBoxAttrVal(name).trim();
if (val != '') domFieldVal(domField, name, val);
} catch(e) {}
}); });
domBoxAttr('text_formatting').parent().hide(); domBoxAttr('text_formatting').parent().hide();

View File

@ -40,7 +40,7 @@
<h4><a href="#">NoName</a></h4> <h4><a href="#">NoName</a></h4>
<div class="image"> <div class="image">
<div class="inside"> <div class="inside">
<img src="/images/admin/icons/filetype/medium/CSS.png"> <img />
</div> </div>
</div> </div>
<div class="actions"> <div class="actions">