oxen_printer 0.3.4 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/oxen/printers_controller.rb +3 -3
- data/app/mailers/printer_mailer.rb +2 -2
- data/config/locales/da.yml +6 -0
- data/lib/action_printer.rb +1 -1
- data/lib/generators/printer/printer_generator.rb +5 -2
- data/lib/oxen_printer/version.rb +1 -1
- data/lib/print_drivers.rb +27 -34
- data/lib/print_engine.rb +151 -72
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3926f0dc3bad41ffe690545fb03beea76eb5482
|
4
|
+
data.tar.gz: ed071ff53e49d90317bf37744b1bd9049cb05ec0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 510a1ea5d4a260c6563a808778defa8da6eb6507191e34123c6e9669c62af4fb4be5515dd79ae795fe22890e388ff56fe9f2026a5ea5ef9c04b48105db0ee8d8
|
7
|
+
data.tar.gz: efb4fc3b9c431b712bf426bd424aae5cf3088a2c93986204ceea360d05d240038f743ad07e50e599cdbc7b04a4c29ce30f311a6cff8d70ed7c1174fa993b8a9b
|
@@ -15,9 +15,9 @@ class Oxen::PrintersController < AbstractResourcesController
|
|
15
15
|
|
16
16
|
opt = { items: {}}
|
17
17
|
case params[:action]
|
18
|
-
when 'edit','update'
|
19
|
-
when 'show';
|
20
|
-
when 'index';
|
18
|
+
when 'edit','update';# opt[:items].merge! list: { ajax: 'get', icon: 'list', class: 'blue', url: "/admin/accounts/#{resource.account.id}" }
|
19
|
+
when 'show'; # opt[:items].merge! list: { ajax: 'get', icon: 'list', class: 'blue', url: "/admin/accounts/#{resource.account.id}" }
|
20
|
+
when 'index'; # opt[:items].merge! list: { ajax: 'get', icon: 'list', class: 'blue', url: "/admin/accounts/#{resource.account.id}" }
|
21
21
|
end
|
22
22
|
|
23
23
|
@fab_button_options = opt
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class PrinterMailer < ActionMailer::Base
|
2
2
|
layout 'mailer'
|
3
3
|
|
4
|
-
def send_print usr, file
|
4
|
+
def send_print usr, file, msg=nil
|
5
5
|
@usr = User.find(usr)
|
6
6
|
fname = case file
|
7
7
|
when /\/pdf.*$/; 'print%s.pdf' % DateTime.now.nsec
|
@@ -9,7 +9,7 @@ class PrinterMailer < ActionMailer::Base
|
|
9
9
|
end
|
10
10
|
attachments[fname] = File.read(file) unless file.blank?
|
11
11
|
@logo = @usr.account.logos.first.image.url rescue ""
|
12
|
-
@msg = "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!"
|
12
|
+
@msg = msg || "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!"
|
13
13
|
|
14
14
|
mail from: 'no-reply@wheelstore.space',
|
15
15
|
to: @usr.email,
|
data/config/locales/da.yml
CHANGED
@@ -9,3 +9,9 @@ da:
|
|
9
9
|
cups_printer: 'Angiv navnet på den CUPS printer, der skal håndtere print'
|
10
10
|
cups_cmd: 'Indfør den kommando som skal starte printjobbet ("lp -d $1 -o media=$2 $3" eller "lp -d $1 -o raw $2")'
|
11
11
|
paper: 'Angiv papirformatet - exvis Letter, A4, 30x57mm, eller lignende'
|
12
|
+
output:
|
13
|
+
email:
|
14
|
+
email_sent: 'Udskriften dannet korrekt og email sendt!'
|
15
|
+
email_address_missing: 'Email adresse ikke fundet - udskrift ikke sendt!'
|
16
|
+
medium:
|
17
|
+
no_medium_found: 'Intet medie valgt?! Udskriften kunne ikke dannes!'
|
data/lib/action_printer.rb
CHANGED
@@ -17,11 +17,14 @@ class PrinterGenerator < Rails::Generators::NamedBase
|
|
17
17
|
def create_migration_file
|
18
18
|
migration_template 'printer.rb', 'db/migrate/create_printers.rb'
|
19
19
|
# allow the clock to advance 1sec
|
20
|
-
sleep
|
20
|
+
sleep 2
|
21
21
|
migration_template 'print_job.rb', 'db/migrate/create_print_jobs.rb'
|
22
22
|
# allow the clock to advance 1sec
|
23
|
-
sleep
|
23
|
+
sleep 2
|
24
24
|
migration_template 'printable.rb', 'db/migrate/create_printables.rb'
|
25
|
+
# allow the clock to advance 1sec
|
26
|
+
sleep 2
|
27
|
+
migration_template 'template.rb', 'db/migrate/create_templates.rb'
|
25
28
|
end
|
26
29
|
|
27
30
|
end
|
data/lib/oxen_printer/version.rb
CHANGED
data/lib/print_drivers.rb
CHANGED
@@ -16,36 +16,32 @@ module PrintDrivers
|
|
16
16
|
|
17
17
|
# build PDF or somehow prepare printer output
|
18
18
|
def rendered_on(*args)
|
19
|
-
|
20
|
-
update_column(:state, "rendering")
|
19
|
+
update_column(:state, "rendering")
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
40
|
-
rescue => e
|
41
|
-
logit :error, "assigning printer driver failed - #{e.message}"
|
42
|
-
return nil
|
21
|
+
# TODO 2013-06-08 set the action_printer with respect to the selected output & printer
|
22
|
+
action_printer = case print_driver
|
23
|
+
when :pdf, "pdf"
|
24
|
+
require 'oxen_printer/pdf_printer'
|
25
|
+
PdfPrinter.new(printer, paper)
|
26
|
+
when :cab, "cab"
|
27
|
+
require 'oxen_printer/cab_printer'
|
28
|
+
CabPrinter.new(printer, paper)
|
29
|
+
when :label, "label"
|
30
|
+
require 'oxen_printer/label_printer'
|
31
|
+
LabelPrinter.new(printer, paper)
|
32
|
+
when :html, "html"
|
33
|
+
require 'oxen_printer/html_printer'
|
34
|
+
HtmlPrinter.new(printer, paper)
|
35
|
+
when :csv, "csv"
|
36
|
+
require 'oxen_printer/csv_printer'
|
37
|
+
CsvPrinter.new(printer, paper)
|
43
38
|
end
|
44
39
|
|
45
40
|
# print_job.action_printer.printer = print_job.printer
|
46
41
|
# print_job.cycle if
|
47
42
|
return action_printer if action_printer.do_render(self,args)
|
48
|
-
|
43
|
+
update_column(:state, 'error rendering')
|
44
|
+
raise PrintJobRenderingError
|
49
45
|
end
|
50
46
|
|
51
47
|
#
|
@@ -65,16 +61,13 @@ module PrintDrivers
|
|
65
61
|
end
|
66
62
|
|
67
63
|
def send_with action_printer, context
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
raise PrintJobPrintingError
|
76
|
-
end
|
77
|
-
rescue => e
|
64
|
+
update_column(:state, 'sending')
|
65
|
+
if action_printer && action_printer.send_print_file( context)
|
66
|
+
update_column(:state, 'done')
|
67
|
+
action_printer.file_path
|
68
|
+
else
|
69
|
+
update_column(:state, 'error sending')
|
70
|
+
raise PrintJobPrintingError
|
78
71
|
end
|
79
72
|
end
|
80
73
|
|
data/lib/print_engine.rb
CHANGED
@@ -11,6 +11,43 @@
|
|
11
11
|
# http://rarlindseysmash.com/posts/config-and-generators-in-gems
|
12
12
|
#
|
13
13
|
|
14
|
+
#
|
15
|
+
#
|
16
|
+
# ARGS # first value is default
|
17
|
+
#
|
18
|
+
# collation # 'list' | 'record'
|
19
|
+
# paper # 'A4' | 'label' | ...
|
20
|
+
# template # '' | 'slip' | 'quote'
|
21
|
+
# cmd # '' | 'print_label' - a particular method on the printing_class
|
22
|
+
#
|
23
|
+
# PRINTPROMPT
|
24
|
+
# print[medium] # 'display' | 'email' | 'printer' | 'download'
|
25
|
+
# print[output_type] # 'html' | 'pdf' | 'text'
|
26
|
+
# print[printer] # what printer to send output to
|
27
|
+
# print[email_to] # email address
|
28
|
+
# print[message] # body of email
|
29
|
+
# print[range] # which pages should print
|
30
|
+
# print[copies] # number of copies
|
31
|
+
#
|
32
|
+
# PRINTJOB
|
33
|
+
# id,
|
34
|
+
# account_id, # what 'system' / customer
|
35
|
+
# printer_id, # on what printer
|
36
|
+
# printed_by_id, # what id has the printed_by entity
|
37
|
+
# printed_by_type, # what entity - like user
|
38
|
+
# view_template_path, # what template
|
39
|
+
# name, # label the job
|
40
|
+
# printing_class, # what entity provides the data
|
41
|
+
# print_driver, # what 'driver' - like :pdf, :cab, :zebra, :csv, :html, etc
|
42
|
+
# print_format, # data collation - like 'record', 'list'
|
43
|
+
# state, # record the progress
|
44
|
+
# paper, # what material - like 'label32x42', 'A4', etc
|
45
|
+
# copies, # number of identical prints
|
46
|
+
# print_sql, # how to find what will be printed
|
47
|
+
# created_at,
|
48
|
+
# updated_at
|
49
|
+
#
|
50
|
+
#
|
14
51
|
|
15
52
|
#
|
16
53
|
module PrintEngine
|
@@ -20,24 +57,10 @@ module PrintEngine
|
|
20
57
|
def self.included(base)
|
21
58
|
|
22
59
|
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
printer = (usr.printers.empty? ? nil : usr.printers.active.preferred_printer.first) or raise NoPreferredPrintersFound.new('No preferred printers were found!')
|
28
|
-
else
|
29
|
-
printer = (usr.printers.empty? ? nil : (usr.printers.active.preferred_printer.on_paper(paper).first || usr.printers.on_paper(paper).first ) ) or raise NoPreferredPrintersFound.new('No preferred printers were found!')
|
30
|
-
end
|
31
|
-
else
|
32
|
-
printer = Printer.active.find_by( 'name like ?', "%#{printer_name.downcase}%")
|
33
|
-
end
|
34
|
-
# usr.printers.where{ (printownerables.preferred==true) & (printownerables.preferred==true) }
|
35
|
-
|
36
|
-
# raise PrintJobPrinterNotAvailableError
|
37
|
-
printer || Printer.first
|
38
|
-
rescue NoPreferredPrintersFound
|
39
|
-
logit :error, 'No preferred printers found! Sending PDF by email to %s (%s) ' % [usr.name,usr.email]
|
40
|
-
Printer.create paper: paper, command: 'email', name: 'tmp printer - will be deleted shortly - DONT TOUCH!!', account_id: usr.account.id
|
60
|
+
def base.print_list(options={})
|
61
|
+
options = set_print_job_defaults options[:resources], options
|
62
|
+
options[:print_job][:print_format] = options[:print][:collation] || 'list'
|
63
|
+
pj = print options[:resources], options
|
41
64
|
end
|
42
65
|
|
43
66
|
#
|
@@ -51,77 +74,82 @@ module PrintEngine
|
|
51
74
|
# and the PrintJob will be enqueued in the delayed_job queue called 'printing'.
|
52
75
|
# cycle_error will be called in print_job.rb if it cannot be enqueued sucessfully.
|
53
76
|
def base.print( resources, params )
|
54
|
-
|
55
|
-
|
56
|
-
return
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
begin
|
68
|
-
if Rails.env=='development' or pj.download
|
69
|
-
return pj if pj.perform params
|
70
|
-
else
|
71
|
-
user = User.find(pj.printed_by_id)
|
72
|
-
BackgroundPrinterJob.perform_later pj, queue: "printing", account_id: user.account.id
|
73
|
-
# Delayed::Job.enqueue pj, :queue => 'printing'
|
74
|
-
# pj.cycle if Delayed::Job.enqueue pj, :queue => 'printing'
|
75
|
-
# If you comment out above line and use below line with pj.perform instead, you thereby surpass delayed_job, and thus don't have to wait for it
|
76
|
-
# pj.perform
|
77
|
-
return pj
|
78
|
-
end
|
79
|
-
rescue => e
|
80
|
-
# self.logit :error, 'PrintJob could not be enqueued'
|
81
|
-
pj.update_columns( state: "could not be queued for printing - #{e}" )
|
82
|
-
return nil
|
77
|
+
pj = create_print_job( resources, params )
|
78
|
+
if Rails.env=='development' or pj.download
|
79
|
+
return pj.perform params
|
80
|
+
else
|
81
|
+
user = User.find(pj.printed_by_id)
|
82
|
+
BackgroundPrinterJob.perform_later pj, queue: "printing", account_id: user.account.id
|
83
|
+
# Delayed::Job.enqueue pj, :queue => 'printing'
|
84
|
+
# pj.cycle if Delayed::Job.enqueue pj, :queue => 'printing'
|
85
|
+
# If you comment out above line and use below line with pj.perform instead, you thereby surpass delayed_job, and thus don't have to wait for it
|
86
|
+
# pj.perform
|
87
|
+
return pj
|
83
88
|
end
|
84
89
|
end
|
85
90
|
|
86
91
|
#
|
87
92
|
#
|
88
93
|
def base.create_print_job( resources, params )
|
89
|
-
printer_name = params.delete(:printer_name) || "default"
|
90
94
|
params = ActionController::Parameters.new( params) unless params.class == ActionController::Parameters
|
91
|
-
|
92
|
-
|
93
|
-
|
95
|
+
pj=PrintJob.create( params_permit(params) )
|
96
|
+
raise PrintJobNotCreatedError.new('arguments not permitted!') unless pj
|
97
|
+
pj
|
98
|
+
end
|
99
|
+
|
100
|
+
def base.params_permit(params)
|
101
|
+
params[:print_job].permit(:download, :snap_shot, :account_id, :printer_id, :printed_by_id,
|
102
|
+
:printed_by_type, :view_template_path, :printing_class, :name, :print_driver, :print_format, :paper, :copies, :state, :print_sql)
|
94
103
|
end
|
95
104
|
|
96
105
|
# Sets print_job defaults using the provided params
|
97
106
|
# and looks up any print_job settings to be tweaked
|
98
107
|
# as per klass and user
|
99
|
-
def base.set_print_job_defaults(resources,
|
100
|
-
klass = resources.first.class.to_s rescue "class not found!"
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
108
|
+
def base.set_print_job_defaults(resources, options)
|
109
|
+
klass = self.to_s #resources.first.class.to_s rescue "class not found!"
|
110
|
+
pb = options[:printed_by]
|
111
|
+
printer_name = options[:print].delete(:printer) || "default"
|
112
|
+
|
113
|
+
options[:print_job][:printer_id] ||= self.default_printer(pb,printer_name,options[:print_job][:paper]).id
|
114
|
+
options[:print_job][:state] = "drafted"
|
115
|
+
options[:print_job][:snap_shot] ||= false
|
116
|
+
options[:print_job][:print_sql] = set_resource_sql(resources,options)
|
117
|
+
options[:print_job] ||= {}
|
118
|
+
options[:print_job][:printing_class] ||= klass
|
119
|
+
options[:print_job][:account_id] ||= pb.account.id
|
120
|
+
options[:print_job][:printed_by_id] = pb.id
|
121
|
+
options[:print_job][:printed_by_type] = pb.class.to_s
|
122
|
+
options[:print_job][:name] ||= "#{klass} print at #{I18n.l Time.now, format: :short_date }"
|
123
|
+
options[:print_job][:copies] ||= 1
|
124
|
+
options[:context] ||= ""
|
125
|
+
options[:print_job][:download] = options[:print][:medium]=="download" || false
|
126
|
+
# options[:print_job][:view_template_path] = find_template( options[:print][:template], options[:print][:paper] ) || options[:print_job][:view_template_path]
|
127
|
+
#
|
118
128
|
# this is what we ultimately return
|
119
|
-
|
129
|
+
options
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# find the best printer for the job
|
134
|
+
def base.default_printer usr, printer_name, paper=nil
|
135
|
+
if printer_name=="default"
|
136
|
+
if paper.nil?
|
137
|
+
printer = (usr.printers.empty? ? nil : usr.printers.active.preferred_printer.first) or raise NoPreferredPrintersFound.new('No preferred printers found!')
|
138
|
+
else
|
139
|
+
printer = (usr.printers.empty? ? nil : (usr.printers.active.preferred_printer.on_paper(paper).first || usr.printers.on_paper(paper).first ) ) or raise NoPreferredPrintersFound.new('No preferred printers found!')
|
140
|
+
end
|
141
|
+
else
|
142
|
+
printer = Printer.active.find_by( 'name like ?', "%#{printer_name.downcase}%")
|
143
|
+
end
|
144
|
+
# usr.printers.where{ (printownerables.preferred==true) & (printownerables.preferred==true) }
|
145
|
+
|
146
|
+
# raise PrintJobPrinterNotAvailableError
|
147
|
+
printer || Printer.first
|
120
148
|
end
|
121
149
|
|
122
150
|
def base.set_resource_sql(resources,params)
|
123
151
|
return resources if resources.class == String && resources.downcase =~ /select/
|
124
|
-
raise PrintJobResourceError unless resources.respond_to?(:any?) and resources.any?
|
152
|
+
raise PrintJobResourceError.new('No items found to print?!') unless resources.respond_to?(:any?) and resources.any?
|
125
153
|
params[:print_job][:snap_shot] ? resources.to_yaml : (resources.class==Array ? array_to_arel(resources) : resources.to_sql)
|
126
154
|
end
|
127
155
|
|
@@ -132,5 +160,56 @@ module PrintEngine
|
|
132
160
|
end
|
133
161
|
|
134
162
|
end
|
163
|
+
#
|
164
|
+
#
|
165
|
+
# # list_title
|
166
|
+
# def list_title
|
167
|
+
# self.respond_to?( "name") ? self.name : "please define list_title on model (#{self.class.to_s})!"
|
168
|
+
# end
|
169
|
+
#
|
170
|
+
# # implement on relevant models
|
171
|
+
def find_template template, paper="A4"
|
172
|
+
raise 'you have to implement "def find_template(paper)" on your Model'
|
173
|
+
# 'label.html.haml'
|
174
|
+
end
|
175
|
+
#
|
176
|
+
#
|
177
|
+
#
|
178
|
+
# def set_print_defaults options
|
179
|
+
# options[:context] ||= ""
|
180
|
+
# options[:print_job][:download] = options[:print][:medium]=="download" || false
|
181
|
+
# options[:print_job][:print_driver] = spot_the_driver(options)
|
182
|
+
# options[:print_job][:paper] = options[:paper] || "A4"
|
183
|
+
# options[:print_job][:view_template_path] = find_template( options[:template], options[:paper] ) || params[:print_job][:view_template_path]
|
184
|
+
# options
|
185
|
+
# end
|
186
|
+
#
|
187
|
+
|
188
|
+
def print_label(options={})
|
189
|
+
options = self.class.set_print_job_defaults [self], options
|
190
|
+
options[:print_job][:print_driver] = options[:print][:print_driver] || :cab
|
191
|
+
options[:print_job][:paper] = options[:print][:paper] || "label"
|
192
|
+
options[:print_job][:print_format] = options[:print][:collation] || 'record'
|
193
|
+
options[:print_job][:view_template_path] = "stock_items/print/zebra_stock_items_label.html.haml"
|
194
|
+
|
195
|
+
pj = self.class.print [self], options
|
196
|
+
end
|
197
|
+
|
198
|
+
|
199
|
+
# options[:print][:printer_name] = options[:print][:printer_name] || ''
|
200
|
+
# options[:user] = options[:user] || current_user
|
201
|
+
|
202
|
+
|
203
|
+
def print_record(options={})
|
204
|
+
options = self.class.set_print_job_defaults [self], options
|
205
|
+
options[:print_job][:print_driver] = options[:print][:print_driver] || :pdf
|
206
|
+
options[:print_job][:paper] = options[:print][:paper] || "A4"
|
207
|
+
options[:print_job][:print_format] = options[:print][:collation] || 'record'
|
208
|
+
options[:print_job][:view_template_path] = "stock_items/print/slip.html.haml"
|
209
|
+
|
210
|
+
pj = self.class.print [self], options
|
211
|
+
end
|
212
|
+
|
213
|
+
|
135
214
|
|
136
215
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oxen_printer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Walther H Diechmann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oxen_job
|