require 'net/http' require 'uri' require 'fileutils' require 'zip/zip' class Admin::TemplateStoreController < OrbitBackendController before_filter :set_store def index @site = Site.first if @site.site_token? if @site.store_confirmation @design_ids = Design.all.map{|d| d.template_store_id} @templates = get_templates.parsed_response render :layout => false else render :partial => "admin/site_registration/not_confirmed_store" end else render :partial => "admin/site_registration/site_registration" end end def show @design_ids = Design.all.map{|d| d.template_store_id} @template = get_template(params[:id]).parsed_response rescue nil end def download_theme url = @store_url + params["url"] url_base = url.split('/')[2] url_path = '/'+url.split('/')[3..-1].join('/') Net::HTTP.start(url_base) do |http| open("public/#{params['slug']}.zip", "wb") do |file| http.get(url_path) do |str| file.write(str) end end end upload_package("#{params['slug']}.zip", params["id"]) File.delete("public/#{params['slug']}.zip") render :json => {"success"=>true,"url"=>@store_url + params["url"]}.to_json end protected def upload_package(package_name,template_store_id) temp_file = Tempfile.new("temp_file") original_file = File.open("#{Rails.root}/public/#{package_name}") temp_file.write(original_file.read.force_encoding('UTF-8')) temp_file.rewind filename = File.basename(original_file,".zip") unzip_design(temp_file, filename, template_store_id) temp_file.close end def unzip_design(file, zip_name, template_store_id) Zip::ZipFile.open(file) { |zip_file| design = Design.new.from_json(zip_file.read("#{zip_name}/info.json")) design.template_store_id = template_store_id Dir.mktmpdir('f_path') { |dir| themes_entries = [] javascripts_entries = [] images_entries = [] zip_file.entries.each do |entry| case (path = entry.to_s) when /\A(#{zip_name})\/(default\.css)\z/ #for default css design.build_css_default(:file => get_temp_file(zip_file, dir, entry)) when /\A(#{zip_name})\/(reset\.css)\z/ #for reset css design.build_css_reset(:file => get_temp_file(zip_file, dir, entry)) when /\A(#{zip_name})\/(layout\.html)\z/ #for layout html design.build_layout(:file => get_temp_file(zip_file, dir, entry)) when /\A(#{zip_name})\/(themes)\/.*(\.css)\z/ #for themes css themes_entries << entry when /\A(#{zip_name})\/(javascripts)\/.*(\.js)\z/ #for js javascripts_entries << entry when /\A(#{zip_name})\/(images)\/.*((\.jpg)|(\.png)|(\.gif))\z/ #for img images_entries << entry end end ['themes', 'javascripts', 'images'].each do |type| eval("#{type}_entries").each do |entry| eval("design.#{type}").build(:file => get_temp_file(zip_file, dir, entry)) end end } design.save } end def get_temp_file(zip_file, dir, entry) filename = File.basename(entry.to_s) temp_file = File.new(dir + '/' + filename, 'w+') temp_file.write (zip_file.read entry ).force_encoding('UTF-8') temp_file end def get_template(id) store_session.get_template(id) end def get_templates store_session.templates end def set_store @store_url = STORE_CONFIG[:store_settings]["url"] end end