#encoding: utf-8 class ActionPrinter < ActionView::Base include Exceptions attr_accessor :printer, :paper def initialize(printer,paper) @printer=printer @paper=paper super(Rails.configuration.paths['app/views']) end def command @printer.command end def command=val @printer.command=val end # # the default rendering is from a string of chars to an html file - statically placed # for who ever knows the exact path to the file, to see # def do_render(print_job,*args) path = print_job.view_template_path # TODO vi får en fejl her når vi begynder at mixe modellerne f.eks. Employee.find_by_sql('select * from products') rc = print_job.printing_class.constantize coll = rc.find_by_sql( print_job.print_sql) locals = { resource_class: rc, collection: coll, resource: coll.first, resources: coll } # # TODO args must be mergeable ;) # if args.flatten.compact.any? # locals.merge! args # end # # this is WorkInProgress # if (path =~/^---/) # this will return falsy if found of = html_file render_string_in path.gsub( /^---/, ''), locals else of = html_file render( file: path, formats: [:html], handlers: [:haml,:erb], locals: locals) end # # logit :info, "created a html file: #{of.path}" of.path end # the default print is sending a link to the user who ordered the print # def do_print print_job, args result = nil prn = printer if prn.nil? or prn.command.blank? or prn.command=="email" mail_print print_job, args else print_print prn, print_job, args end rescue => e logit :error, "Printing failed! The error was #{e.message}" false end # # this is WorkInProgress !! # def render_string_in content, locals render body: Haml::Engine.new( ERB.new(content).result ).render end # # build a temp file with the HTML string rendered and provided as argument str def html_file str, type='html' f = Tempfile.new(['print', ".#{type}"]) f.puts str f.close Rails.logger.info "oxen: wrote #{f.path}" f end def text_file str html_file str, 'label' end def file_path raise "must be implemented on the driver!!" end def label_file_path @label_file_path ||= `mktemp -t lblXXXX`[0..-2] end def pdf_file_path @pdf_file_path ||= `mktemp -t pdfXXXX`[0..-2] end def get_file_type raise "you must implement this on the driver!!" end def send_print_file context context.send_file pdf_file_path, filename: 'oxen_file', type: get_file_type, disposition: "attachment" # send_file path, type: asset_content_type, disposition: 'inline', filename: filename # context.cookies['fileDownload'] = 'true' # File.open(pdf_file_path, 'r') do |fp| # context.send_data fp.read.force_encoding('BINARY'), filename: 'oxen_file', type: "application/pdf", disposition: "attachment" # end end def mail_print print_job, args # move pdf_file_path to a static place where it will not be accidentally deleted from # static_path = File.join(Rails.root,'public','files','1.pdf') # var = %x[ mv #{pdf_file_path} #{static_path} 2>&1 ] # send email to usr with link # raise MovingFileFailedError.new(var) unless var.blank? msg = args[:message] || "Der er ikke defineret nogen printere til dette job, for dig - så jeg er nødt til at sende dig filen vedhæftet denne email! ;)Du bør kontakte din system administrator og bede om at der bliver oprettet en printer definition til denne printer jobtype, for dig!" if print_job.printed_by.nil? raise PrintJobPrintingError.new t('action_printer.user_not_found') else PrinterMailer.send_print(print_job.printed_by,file_path,msg,t('print_delivered_by_email')).deliver_now end end def print_print prn, print_job, args args[:copies] ||= 1 cmd = build_print_cmd prn, args if args[:copies].to_i > 1 cmdargs = cmd.split(" ") f = cmdargs.pop cmdargs.push "-n", args[:copies].to_i, f cmd = cmdargs.join(" ") end # Here we start actually printing # $1 is the CUPS printer # $2 is the PDF file_path_and_name # $3 is the PDF filename # the command being something along the lines of: lp -d $1 -o media=a4 $2 return `#{cmd}` end def build_print_cmd prn, args cups = !prn.printserver ? prn.cups_printer : "#{prn.cups_printer} -h 10.0.0.26:4#{prn.printserver.port}" pdf_path = pdf_file_path.split("/")[-1] paper = args.delete(:paper) || prn.paper prn.command.gsub( /\$1/, cups ).gsub( /\$2/, paper ).gsub( /\$3/, pdf_file_path ).gsub( /\$4/, pdf_path ) end def logit( log_type, msg ) Rails.logger.send(log_type, "[OXEN] #{Time.now} [#{log_type.to_s}] #{msg}") end end