[IMP] Add a preview on the label using labelary.com

This commit is contained in:
Florent de Labarre
2018-01-23 00:28:50 +01:00
committed by Nils Hamerlinck
parent 5467d9d384
commit 76e719e09b
4 changed files with 190 additions and 2 deletions

View File

@@ -6,8 +6,9 @@ import base64
import datetime import datetime
import io import io
import logging import logging
import requests
from PIL import Image, ImageOps from PIL import Image, ImageOps
from odoo import exceptions, fields, models, _ from odoo import api, exceptions, fields, models, _
from odoo.tools.safe_eval import safe_eval from odoo.tools.safe_eval import safe_eval
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@@ -48,6 +49,19 @@ class PrintingLabelZpl2(models.Model):
default=True) default=True)
action_window_id = fields.Many2one( action_window_id = fields.Many2one(
comodel_name='ir.actions.act_window', string='Action', readonly=True) comodel_name='ir.actions.act_window', string='Action', readonly=True)
test_labelary_mode = fields.Boolean(string='Mode Labelary')
record_id = fields.Integer(string='Record ID', default=1)
extra = fields.Text(string="Extra", default='{}')
labelary_image = fields.Binary(string='Image from Labelary', readonly=True)
labelary_dpmm = fields.Selection(
selection=[
('6dpmm', '6dpmm (152 pdi)'),
('8dpmm', '8dpmm (203 dpi)'),
('12dpmm', '12dpmm (300 pdi)'),
('24dpmm', '24dpmm (600 dpi)'),
], string='Print density', required=True, default='8dpmm')
labelary_width = fields.Float(string='Width in mm', default=140)
labelary_height = fields.Float(string='Height in mm', default=70)
def _generate_zpl2_components_data( def _generate_zpl2_components_data(
self, label_data, record, page_number=1, page_count=1, self, label_data, record, page_number=1, page_count=1,
@@ -205,9 +219,11 @@ class PrintingLabelZpl2(models.Model):
self.ensure_one() self.ensure_one()
label_data = zpl2.Zpl2() label_data = zpl2.Zpl2()
labelary_emul = extra.get('labelary_emul', False)
for page_number in range(page_count): for page_number in range(page_count):
# Initialize printer's configuration # Initialize printer's configuration
label_data.label_start() label_data.label_start()
if not labelary_emul:
label_data.print_width(self.width) label_data.print_width(self.width)
label_data.label_encoding() label_data.label_encoding()
@@ -255,3 +271,65 @@ class PrintingLabelZpl2(models.Model):
def unlink_action(self): def unlink_action(self):
self.mapped('action_window_id').unlink() self.mapped('action_window_id').unlink()
def _get_record(self):
self.ensure_one()
Obj = self.env[self.model_id.model]
record = Obj.search([('id', '=', self.record_id)], limit=1)
if not record:
record = Obj.search([], limit=1, order='id desc')
self.record_id = record.id
return record
@api.onchange(
'record_id', 'labelary_dpmm', 'labelary_width', 'labelary_height',
'component_ids', 'origin_x', 'origin_y')
def _on_change_labelary(self):
self.ensure_one()
if not(self.test_labelary_mode and self.record_id and
self.labelary_width and self.labelary_height and
self.labelary_dpmm and self.component_ids):
return
record = self._get_record()
if record:
# If case there an error (in the data field with the safe_eval
# for exemple) the new component or the update is not lost.
try:
url = 'http://api.labelary.com/v1/printers/' \
'{dpmm}/labels/{width}x{height}/0/'
width = round(self.labelary_width / 25.4, 2)
height = round(self.labelary_height / 25.4, 2)
url = url.format(
dpmm=self.labelary_dpmm, width=width, height=height)
extra = safe_eval(self.extra, {'env': self.env})
zpl_file = self._generate_zpl2_data(
record, labelary_emul=True, **extra)
files = {'file': zpl_file}
headers = {'Accept': 'image/png'}
response = requests.post(
url, headers=headers, files=files, stream=True)
if response.status_code == 200:
# Add a padd
im = Image.open(io.BytesIO(response.content))
im_size = im.size
new_im = Image.new(
'RGB', (im_size[0] + 2, im_size[1] + 2),
(164, 164, 164))
new_im.paste(im, (1, 1))
imgByteArr = io.BytesIO()
new_im.save(imgByteArr, format='PNG')
self.labelary_image = base64.b64encode(
imgByteArr.getvalue())
else:
return {'warning': {
'title': _('Error with Labelary API.'),
'message': response.status_code,
}}
except Exception as e:
self.labelary_image = False
return {'warning': {
'title': _('Some thing is wrong.'),
'message': e,
}}

View File

@@ -4,3 +4,4 @@
from . import test_printing_label_zpl2 from . import test_printing_label_zpl2
from . import test_wizard_print_record_label from . import test_wizard_print_record_label
from . import test_generate_action from . import test_generate_action
from . import test_test_mode

View File

@@ -0,0 +1,85 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import TransactionCase
model = 'odoo.addons.base_report_to_printer.models.printing_server'
class TestWizardPrintRecordLabel(TransactionCase):
def setUp(self):
super(TestWizardPrintRecordLabel, self).setUp()
self.Model = self.env['wizard.print.record.label']
self.server = self.env['printing.server'].create({})
self.printer = self.env['printing.printer'].create({
'name': 'Printer',
'server_id': self.server.id,
'system_name': 'Sys Name',
'default': True,
'status': 'unknown',
'status_message': 'Msg',
'model': 'res.users',
'location': 'Location',
'uri': 'URI',
})
self.label = self.env['printing.label.zpl2'].create({
'name': 'ZPL II Label',
'model_id': self.env.ref(
'base_report_to_printer.model_printing_printer').id,
})
def test_get_record(self):
""" Check if return a record """
self.label.record_id = 10
res = self.label._get_record()
Obj = self.env[self.label.model_id.model]
record = Obj.search([('id', '=', self.label.record_id)], limit=1)
if not record:
record = Obj.search([], limit=1, order='id desc')
self.assertEqual(res, record)
def test_emulation_without_params(self):
""" Check if not execute next if not in this mode """
self.label.test_labelary_mode = False
self.label._on_change_labelary()
self.assertIs(self.label.labelary_image, None)
def test_emulation_with_bad_header(self):
""" Check if bad header """
self.label.test_labelary_mode = True
self.label.labelary_width = 80
self.label.labelary_dpmm = '8dpmm'
self.label.labelary_height = 10000000
self.env['printing.label.zpl2.component'].create({
'name': 'ZPL II Label',
'label_id': self.label.id,
'data': '"Test"'})
self.label._on_change_labelary()
self.assertFalse(self.label.labelary_image)
def test_emulation_with_bad_data_compute(self):
""" Check if bad data compute """
self.label.test_labelary_mode = True
self.label.labelary_width = 80
self.label.labelary_height = 30
self.label.labelary_dpmm = '8dpmm'
component = self.env['printing.label.zpl2.component'].create({
'name': 'ZPL II Label',
'label_id': self.label.id,
'data': 'wrong_data'})
self.label._on_change_labelary()
component.unlink()
self.assertIs(self.label.labelary_image, None)
def test_emulation_with_good_data(self):
""" Check if ok """
self.label.test_labelary_mode = True
self.label.labelary_width = 80
self.label.labelary_height = 30
self.label.labelary_dpmm = '8dpmm'
self.env['printing.label.zpl2.component'].create({
'name': 'ZPL II Label',
'label_id': self.label.id,
'data': '"good_data"', })
self.label._on_change_labelary()
self.assertTrue(self.label.labelary_image)

View File

@@ -126,6 +126,30 @@
</notebook> </notebook>
</form> </form>
</field> </field>
<group string="Emulation" attrs="{'invisible':[('test_labelary_mode', '=', False)]}">
<field name="labelary_image" widget="image" nolabel="1" force_save="1"/>
<p class="oe_grey" colspan="4">
Note : It is an emulation from http://labelary.com/, the result on printer can be diffrent.
</p>
</group>
</page>
<page string="Test Mode">
<group>
<group>
<field name="test_labelary_mode"/>
</group>
</group>
<group>
<group>
<field name="record_id" context="{'select_model_id':model_id}" attrs="{'invisible':[('test_labelary_mode', '=', False)], 'required':[('test_labelary_mode', '=', True)]}"/>
<field name="labelary_dpmm" attrs="{'invisible':[('test_labelary_mode', '=', False)], 'required':[('test_labelary_mode', '=', True)]}"/>
<field name="labelary_width" attrs="{'invisible':[('test_labelary_mode', '=', False)], 'required':[('test_labelary_mode', '=', True)]}"/>
<field name="labelary_height" attrs="{'invisible':[('test_labelary_mode', '=', False)], 'required':[('test_labelary_mode', '=', True)]}"/>
</group>
</group>
<group string="Extra">
<field name="extra" nolabel="1" widget="ace" options="{'mode': 'python'}" attrs="{'invisible':[('test_labelary_mode', '=', False)]}"/>
</group>
</page> </page>
</notebook> </notebook>
</sheet> </sheet>