Add a printer job queue via the printer plugin
This commit is contained in:
parent
63e1541aa3
commit
c955a6ee40
24 changed files with 561 additions and 1 deletions
58
plugins/printer/app/controllers/printer_controller.rb
Normal file
58
plugins/printer/app/controllers/printer_controller.rb
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
class PrinterController < ApplicationController
|
||||
include Concerns::SendOrderPdf
|
||||
include Tubesock::Hijack
|
||||
|
||||
skip_before_filter :authenticate
|
||||
before_filter :authenticate_printer
|
||||
before_filter -> { require_plugin_enabled FoodsoftPrinter }
|
||||
|
||||
def socket
|
||||
hijack do |tubesock|
|
||||
tubesock.onopen do
|
||||
tubesock.send_data unfinished_jobs
|
||||
end
|
||||
|
||||
tubesock.onmessage do |data|
|
||||
update_job data
|
||||
tubesock.send_data unfinished_jobs
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
job = PrinterJob.find(params[:id])
|
||||
send_order_pdf job.order, job.document
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def unfinished_jobs
|
||||
{
|
||||
unfinished_jobs: PrinterJob.pending.map(&:id)
|
||||
}.to_json
|
||||
end
|
||||
|
||||
def update_job(data)
|
||||
json = JSON.parse data, symbolize_names: true
|
||||
job = PrinterJob.unfinished.find_by_id(json[:id])
|
||||
return unless job
|
||||
if json[:state]
|
||||
job.add_update! json[:state], json[:message]
|
||||
end
|
||||
job.finish! if json[:finish]
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def bearer_token
|
||||
pattern = /^Bearer /
|
||||
header = request.headers['Authorization']
|
||||
header.gsub(pattern, '') if header && header.match(pattern)
|
||||
end
|
||||
|
||||
def authenticate_printer
|
||||
return head(:unauthorized) unless bearer_token
|
||||
return head(:forbidden) if bearer_token != FoodsoftConfig[:printer_token]
|
||||
end
|
||||
|
||||
end
|
||||
44
plugins/printer/app/controllers/printer_jobs_controller.rb
Normal file
44
plugins/printer/app/controllers/printer_jobs_controller.rb
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
class PrinterJobsController < ApplicationController
|
||||
include Concerns::SendOrderPdf
|
||||
|
||||
before_filter -> { require_plugin_enabled FoodsoftPrinter }
|
||||
|
||||
def index
|
||||
jobs = PrinterJob.includes(:printer_job_updates)
|
||||
@pending_jobs = jobs.pending
|
||||
@queued_jobs = jobs.queued
|
||||
@finished_jobs = jobs.finished.order(finished_at: :desc).page(params[:page]).per(@per_page)
|
||||
end
|
||||
|
||||
def create
|
||||
order = Order.find(params[:order])
|
||||
state = order.open? ? 'queued' : 'ready'
|
||||
count = 0
|
||||
PrinterJob.transaction do
|
||||
%w(articles fax groups matrix).each do |document|
|
||||
next unless FoodsoftConfig["printer_print_order_#{document}"]
|
||||
job = PrinterJob.create! order: order, document: document, created_by: current_user
|
||||
job.add_update! state
|
||||
count += 1
|
||||
end
|
||||
end
|
||||
redirect_to order, notice: t('.notice', count: count)
|
||||
end
|
||||
|
||||
def show
|
||||
@job = PrinterJob.find(params[:id])
|
||||
end
|
||||
|
||||
def document
|
||||
job = PrinterJob.find(params[:id])
|
||||
send_order_pdf job.order, job.document
|
||||
end
|
||||
|
||||
def destroy
|
||||
job = PrinterJob.find(params[:id])
|
||||
job.finish! current_user
|
||||
redirect_to printer_jobs_path, notice: t('.notice')
|
||||
rescue => error
|
||||
redirect_to printer_jobs_path, t('errors.general_msg', msg: error.message)
|
||||
end
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue