namespace :skins do def ask(message) print message STDIN.gets.chomp.strip end def replace_or_new(skin_content) skin = Skin.new if skin_content.match(/REPLACE:\s*(\d+)/) id = $1.to_i skin = Skin.where(:id => id).first unless skin puts "Couldn't find skin with id #{id} to replace" return nil end end skin end def set_parents(skin, parent_names) # clear existing ones SkinParent.where(:child_skin_id => skin.id).delete_all parent_position = 1 parents = parent_names.split(/,\s?/).map {|pn| pn.strip} parents.each do |parent_name| if parent_name.match(/^(\d+)$/) parent_skin = Skin.where("title LIKE 'Archive 2.0: (#{parent_name})%'").first elsif parent_name.blank? puts "Empty parent name for #{skin.title}" next else parent_skin = Skin.where(:title => parent_name).first end unless parent_skin puts "Couldn't find parent #{parent_name} to add, skipping" next end if (parent_skin.role == "site" || parent_skin.role == "override") && skin.role != "override" skin.role = "override" skin.save or puts "Problem updating skin #{skin.title} to be replacement skin: #{skin.errors.full_messages.join(', ')}" next end p = skin.skin_parents.build(:parent_skin => parent_skin, :position => parent_position) if p.save parent_position += 1 else puts "Skipping skin parent #{parent_name}: #{p.errors.full_messages.join(', ')}" end end end def get_user_skins dir = Skin.site_skins_dir + 'user_skins_to_load' default_preview_filename = "#{dir}/previews/default_preview.png" user_skin_files = Dir.entries(dir).select {|f| f.match(/css$/)} skins = [] user_skin_files.each do |skin_file| skins << File.read("#{dir}/#{skin_file}").split(/\/\*\s*END SKIN\s*\*\//) end skins.flatten! end desc "Purge user skins parents" task(:purge_user_skins_parents => :environment) do get_user_skins.each do |skin_content| skin = replace_or_new(skin_content) if skin.new_record? && skin_content.match(/SKIN:\s*(.*)\s*\*\//) skin = Skin.find_by_title($1.strip) end skin.skin_parents.delete_all end end desc "Load user skins" task(:load_user_skins => :environment) do replace = ask("Replace existing skins with same titles? (y/n) ") == "y" Rake::Task['skins:purge_user_skins_parents'].invoke if replace author = User.find_by_login("lim") dir = Skin.site_skins_dir + 'user_skins_to_load' skins = get_user_skins skins.each do |skin_content| next if skin_content.blank? # Determine if we're replacing or creating new next unless (skin = replace_or_new(skin_content)) # set the title and preview if skin_content.match(/SKIN:\s*(.*)\s*\*\//) title = $1.strip if (oldskin = Skin.find_by_title(title)) && oldskin.id != skin.id if replace skin = oldskin else puts "Existing skin with title #{title} - did you mean to replace? Skipping." next end end skin.title = title preview_filename = "#{dir}/previews/#{title.gsub(/[^\w\s]+/, '')}.png" unless File.exists?(preview_filename) puts "No preview filename #{preview_filename} found for #{title}" preview_filename = "#{dir}/previews/default_preview.png" end File.open(preview_filename, 'rb') {|preview_file| skin.icon = preview_file} else puts "No skin title found for skin #{skin_content}" next end # set the css and make public skin.css = skin_content skin.public = true skin.official = true skin.author = author unless skin.author if skin_content.match(/DESCRIPTION:\s*(.*?)\*\//m) skin.description = "
#{$1}"
end
if skin_content.match(/PARENT_ONLY/)
skin.unusable = true
end
# make sure we have valid skin now
if skin.save
puts "Saved skin #{skin.title}"
else
puts "Problem with skin #{skin.title}: #{skin.errors.full_messages.join(', ')}"
next
end
# recache any cached skins
if skin.cached?
skin.cache!
end
# set parents
if skin_content.match(/PARENTS:\s*(.*)\s*\*\//)
parent_string = $1
set_parents(skin, parent_string)
end
end
end
desc "Load site skins"
task(:load_site_skins => :environment) do
settings = AdminSetting.first
if settings.default_skin_id.nil?
settings.default_skin_id = Skin.default.id
settings.save(validate: false)
end
Skin.load_site_css
Skin.set_default_to_current_version
end
desc "Cache all site skins in the skin chooser"
task(cache_chooser_skins: :environment) do
# The default skin can be changed to something other than Skin.default via
# admin settings, so we want to cache that skin, not Skin.default.
skins = Skin.where(id: AdminSetting.default_skin_id).or(Skin.in_chooser)
successes = []
failures = []
skins.each do |skin|
if skin.cache!
successes << skin.title
else
failures << skin.title
end
end
puts
puts("Cached #{successes.join(',')}") if successes.any?
puts("Couldn't cache #{failures.join(',')}") if failures.any?
STDOUT.flush
end
desc "Remove all existing skins from preferences"
task(:disable_all => :environment) do
default_id = AdminSetting.default_skin_id
Preference.update_all(:skin_id => default_id)
end
desc "Unapprove all existing official skins"
task(:unapprove_all => :environment) do
default_id = AdminSetting.default_skin_id
Skin.where("id != ?", default_id).update_all(:official => false)
end
end