|
|
|
@@ -3,7 +3,6 @@ require 'sinatra'
|
|
|
|
|
require "sinatra/reloader"
|
|
|
|
|
require 'tmpdir'
|
|
|
|
|
require 'net/http'
|
|
|
|
|
require 'json'
|
|
|
|
|
require_relative 'lib/receipt_builder'
|
|
|
|
|
require_relative 'lib/label_repository'
|
|
|
|
|
|
|
|
|
@@ -155,45 +154,6 @@ helpers do
|
|
|
|
|
receipt.print!(PRINTER_DEVICE_EPSON)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
GITEA_TOKEN_FILE = File.join(File.dirname(__FILE__), '.gitea_token')
|
|
|
|
|
|
|
|
|
|
def fetch_open_issues(repo)
|
|
|
|
|
token = File.read(GITEA_TOKEN_FILE).strip
|
|
|
|
|
uri = URI("https://git.priesol.net/api/v1/repos/randy/#{repo}/issues?state=open&type=issues&limit=50")
|
|
|
|
|
req = Net::HTTP::Get.new(uri)
|
|
|
|
|
req['Authorization'] = "token #{token}"
|
|
|
|
|
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
|
|
|
|
|
raise "Gitea API returned #{res.code}" unless res.is_a?(Net::HTTPSuccess)
|
|
|
|
|
|
|
|
|
|
JSON.parse(res.body)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# Prints a receipt-style summary of a repo's open issues -- number, title,
|
|
|
|
|
# labels, one separator per issue, total at the end.
|
|
|
|
|
def print_issues(repo)
|
|
|
|
|
issues = fetch_open_issues(repo).sort_by { |i| i['number'] }
|
|
|
|
|
|
|
|
|
|
receipt = ReceiptBuilder.new
|
|
|
|
|
receipt.align(:center).bold.text("Open issues: #{repo}\n").bold(false)
|
|
|
|
|
receipt.text("#{Time.now.strftime('%Y-%m-%d %H:%M')}\n")
|
|
|
|
|
receipt.align(:left).text(('-' * 32) + "\n")
|
|
|
|
|
|
|
|
|
|
if issues.empty?
|
|
|
|
|
receipt.text("(no open issues)\n")
|
|
|
|
|
else
|
|
|
|
|
issues.each do |issue|
|
|
|
|
|
receipt.bold.text("##{issue['number']} #{issue['title']}\n").bold(false)
|
|
|
|
|
labels = issue['labels'].map { |l| l['name'] }.join(', ')
|
|
|
|
|
receipt.text("#{labels}\n") unless labels.empty?
|
|
|
|
|
receipt.text(('-' * 32) + "\n")
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
receipt.text("Total: #{issues.size}\n")
|
|
|
|
|
receipt.feed(3).cut
|
|
|
|
|
receipt.print!(PRINTER_DEVICE_EPSON)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# Renders ZPL to a PNG via Labelary's public API for an inline preview.
|
|
|
|
|
# Fixed at the Datamax label size (4x6in @ 8dpmm ~= 203dpi) -- good enough
|
|
|
|
|
# for a thumbnail, not meant to be exact for other sizes.
|
|
|
|
@@ -253,16 +213,6 @@ get '/' do
|
|
|
|
|
erb :index
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
post '/issues/print' do
|
|
|
|
|
begin
|
|
|
|
|
print_issues('home-gitops')
|
|
|
|
|
flash 'Open issues sent to printer', 'success'
|
|
|
|
|
rescue => e
|
|
|
|
|
flash "Failed to print issues (#{e.message})", 'danger'
|
|
|
|
|
end
|
|
|
|
|
redirect '/'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
get '/upload' do
|
|
|
|
|
erb :upload
|
|
|
|
|
end
|
|
|
|
@@ -270,21 +220,37 @@ end
|
|
|
|
|
post '/shipping/zpl' do
|
|
|
|
|
zpl = params[:zpl].to_s
|
|
|
|
|
name = params[:save_as].to_s
|
|
|
|
|
|
|
|
|
|
if zpl.strip.empty?
|
|
|
|
|
flash 'ZPL text is empty', 'warning'
|
|
|
|
|
elsif name.empty?
|
|
|
|
|
flash 'Name is required to save', 'warning'
|
|
|
|
|
else
|
|
|
|
|
LABEL_REPO.save(name: name, type: 'zpl', content: zpl)
|
|
|
|
|
if params[:commit] == 'save_and_print'
|
|
|
|
|
begin
|
|
|
|
|
print_to_datamax(zpl)
|
|
|
|
|
flash "Saved '#{name}' and sent to printer", 'success'
|
|
|
|
|
rescue => e
|
|
|
|
|
flash "Saved '#{name}', but print failed (#{e.message})", 'danger'
|
|
|
|
|
end
|
|
|
|
|
redirect '/upload'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
case params[:commit]
|
|
|
|
|
when 'save', 'save_and_print'
|
|
|
|
|
if name.empty?
|
|
|
|
|
flash 'Name is required to save', 'warning'
|
|
|
|
|
else
|
|
|
|
|
flash "Saved '#{name}'", 'success'
|
|
|
|
|
LABEL_REPO.save(name: name, type: 'zpl', content: zpl)
|
|
|
|
|
if params[:commit] == 'save_and_print'
|
|
|
|
|
begin
|
|
|
|
|
print_to_datamax(zpl)
|
|
|
|
|
flash "Saved '#{name}' and sent to printer", 'success'
|
|
|
|
|
rescue => e
|
|
|
|
|
flash "Saved '#{name}', but print failed (#{e.message})", 'danger'
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
flash "Saved '#{name}'", 'success'
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
# No explicit save/save_and_print action -- e.g. a plain API/CI call.
|
|
|
|
|
# labelprint stays a "dumb" print API here: just print, nothing saved.
|
|
|
|
|
begin
|
|
|
|
|
print_to_datamax(zpl)
|
|
|
|
|
flash 'ZPL sent to printer', 'success'
|
|
|
|
|
rescue => e
|
|
|
|
|
flash "ZPL print failed (#{e.message})", 'danger'
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
redirect '/upload'
|
|
|
|
@@ -354,21 +320,37 @@ end
|
|
|
|
|
post '/epson/raw' do
|
|
|
|
|
content = params[:content].to_s
|
|
|
|
|
name = params[:save_as].to_s
|
|
|
|
|
|
|
|
|
|
if content.strip.empty?
|
|
|
|
|
flash 'Receipt text is empty', 'warning'
|
|
|
|
|
elsif name.empty?
|
|
|
|
|
flash 'Name is required to save', 'warning'
|
|
|
|
|
else
|
|
|
|
|
LABEL_REPO.save(name: name, type: 'escpos', content: content)
|
|
|
|
|
if params[:commit] == 'save_and_print'
|
|
|
|
|
begin
|
|
|
|
|
print_raw_escpos(content)
|
|
|
|
|
flash "Saved '#{name}' and sent to printer", 'success'
|
|
|
|
|
rescue => e
|
|
|
|
|
flash "Saved '#{name}', but print failed (#{e.message})", 'danger'
|
|
|
|
|
end
|
|
|
|
|
redirect '/epson'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
case params[:commit]
|
|
|
|
|
when 'save', 'save_and_print'
|
|
|
|
|
if name.empty?
|
|
|
|
|
flash 'Name is required to save', 'warning'
|
|
|
|
|
else
|
|
|
|
|
flash "Saved '#{name}'", 'success'
|
|
|
|
|
LABEL_REPO.save(name: name, type: 'escpos', content: content)
|
|
|
|
|
if params[:commit] == 'save_and_print'
|
|
|
|
|
begin
|
|
|
|
|
print_raw_escpos(content)
|
|
|
|
|
flash "Saved '#{name}' and sent to printer", 'success'
|
|
|
|
|
rescue => e
|
|
|
|
|
flash "Saved '#{name}', but print failed (#{e.message})", 'danger'
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
flash "Saved '#{name}'", 'success'
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
# No explicit save/save_and_print action -- e.g. a plain API/CI call.
|
|
|
|
|
# labelprint stays a "dumb" print API here: just print, nothing saved.
|
|
|
|
|
begin
|
|
|
|
|
print_raw_escpos(content)
|
|
|
|
|
flash 'Sent to Epson printer', 'success'
|
|
|
|
|
rescue => e
|
|
|
|
|
flash "Epson print failed (#{e.message})", 'danger'
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
redirect '/epson'
|
|
|
|
|