This commit is contained in:
gsinghpal
2026-02-22 01:37:50 -05:00
parent 5200d5baf0
commit d6bac8e623
1550 changed files with 263540 additions and 0 deletions

View File

@@ -0,0 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

View File

@@ -0,0 +1,55 @@
=====================
Custom Product Labels
=====================
.. |badge1| image:: https://img.shields.io/badge/maturity-Production-green.png
:alt: Production
.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-purple.png
:target: https://www.gnu.org/licenses/lgpl-3.0.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/demo-Try%20me-FEA621.png
:target: https://garazd.biz/r/V3Y
:alt: Try me on a Demo Instance
.. |badge4| image:: https://img.shields.io/badge/link-Garazd%20Apps-154577.png
:target: https://garazd.biz/shop/custom-product-labels-2
:alt: Get the app on Garazd Apps store
|badge1| |badge2| |badge3| |badge4|
Print custom product labels with barcode | Barcode Product Label
**Table of contents**
.. contents::
:local:
Credits
=======
Authors
~~~~~~~
* Garazd Creation
Maintainers
~~~~~~~~~~~
This module is maintained by the Garazd Creation.
.. image:: https://garazd.biz/logo.png
:alt: Garazd Creation
:target: https://garazd.biz
Our mission is to create convenient and effective business solutions
based on the Odoo ERP system in the areas in which we have the maximum
expertise, such as: eCommerce, marketing, SEO, integration with
marketplaces and analytic systems, product label printing and designing.
To solve these tasks, we create modules that complement each other,
extend the functionality of Odoo and improve the usability of the system.
Our solutions come with detailed documentation and additional materials
for easy use.

View File

@@ -0,0 +1,2 @@
from . import models
from . import wizard

View File

@@ -0,0 +1,35 @@
# Copyright © 2018 Garazd Creation (https://garazd.biz)
# @author: Yurii Razumovskyi (support@garazd.biz)
# @author: Iryna Razumovska (support@garazd.biz)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.html).
{
'name': 'Custom Product Labels',
'version': '19.0.1.0.0',
'category': 'Extra Tools',
'author': 'Garazd Creation',
'website': 'https://garazd.biz/en/shop/category/odoo-product-labels-15',
'license': 'LGPL-3',
'summary': 'Print custom product labels with barcode | Barcode Product Label',
'images': ['static/description/banner.png', 'static/description/icon.png'],
'live_test_url': 'https://garazd.biz/r/V3Y',
'depends': [
'product',
],
'data': [
'security/ir.model.access.csv',
'data/product_data.xml',
'data/print_label_type_data.xml',
'report/product_label_reports.xml',
'report/product_label_templates.xml',
'wizard/print_product_label_views.xml',
'views/res_config_settings_views.xml',
],
'demo': [
'demo/product_demo.xml',
],
'support': 'support@garazd.biz',
'application': True,
'installable': True,
'auto_install': False,
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="filter_label_apps" model="ir.filters">
<field name="name">Garazd Product Labels</field>
<field name="model_id">ir.module.module</field>
<field name="domain">[("name", "ilike", "garazd_product_label")]</field>
<field name="user_id" eval="False"/>
<field name="is_default" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="type_product" model="print.label.type" forcecreate="True">
<field name="name">Products</field>
<field name="code">product.product</field>
</record>
</odoo>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="1">
<record id="product_blank" model="product.product">
<field name="name">Blank Product</field>
<field name="type">consu</field>
<field name="description">Please do not delete this product! This product has been created by Garazd Product Label solution for technical purposes, and it's used for label printing.</field>
<field name="active" eval="False"/>
</record>
<record id="garazd_product_label.product_blank_product_template" model="product.template">
<field name="active" eval="False"/>
</record>
</odoo>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="garazd_product_label.filter_data_feed_apps" model="ir.filters">
<field name="is_default" eval="True"/>
</record>
</odoo>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="1">
<!-- Corner Desk Right Sit -->
<record id="product.product_product_5" model="product.product">
<field name="barcode">3333000022222</field>
</record>
<!-- Storage Box -->
<record id="product.product_product_7" model="product.product">
<field name="barcode">0123456789017</field>
</record>
<!-- Monitor Stand -->
<record id="product.monitor_stand" model="product.product">
<field name="barcode">0700020543219</field>
</record>
<!-- Flipover -->
<record id="product.product_product_20" model="product.product">
<field name="barcode">01234090543216</field>
</record>
</odoo>

View File

@@ -0,0 +1,18 @@
.. _changelog:
Changelog
=========
`18.0.1.0.1`
------------
- Improve the lable 57 x 35 mm.
- Add the app filter "Product Labels".
`18.0.1.0.0`
------------
- Migration from 17.0.

View File

@@ -0,0 +1,443 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * garazd_product_label
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-09-02 06:35+0000\n"
"PO-Revision-Date: 2024-09-02 06:35+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: garazd_product_label
#: model:ir.actions.report,print_report_name:garazd_product_label.action_report_product_label_50x38
msgid "'Product Labels 50x38mm'"
msgstr "'Етикетки 50х38 мм'"
#. module: garazd_product_label
#: model:ir.actions.report,print_report_name:garazd_product_label.action_report_product_label_A4_57x35
msgid "'Product Labels 57x35mm'"
msgstr "'Етикетки 57х35 мм'"
#. module: garazd_product_label
#: model:ir.actions.report,print_report_name:garazd_product_label.action_report_product_label_from_template
msgid "'Product Labels Custom Design'"
msgstr "'Етикетки товарів з власний дизайном'"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "<span class=\"text-muted px-3\">|</span>"
msgstr ""
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "<span>Get the Label Builder to create your own labels</span>"
msgstr "<span>Дізнайтеся, як створювати етикетки з власним дизайном за допомогою "
"Label Builder</span>"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__barcode
msgid "Barcode"
msgstr "Штрих-код"
#. module: garazd_product_label
#: model:product.template,name:garazd_product_label.product_blank_product_template
msgid "Blank Product"
msgstr ""
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__border_width
msgid "Border"
msgstr "Обрамлення"
#. module: garazd_product_label
#: model:ir.model.fields,help:garazd_product_label.field_print_product_label__border_width
msgid "Border width for labels (in pixels). Set \"0\" for no border."
msgstr ""
"Ширина рамки для етикеток (у пікселях). Встановіть \"0\", якщо рамка не "
"потрібна."
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_label_type__code
msgid "Code"
msgstr "Код"
#. module: garazd_product_label
#: model:ir.model.constraint,message:garazd_product_label.constraint_print_label_type_print_label_type_code_uniq
msgid "Code of a print label type must be unique."
msgstr "Код типу етикетки має бути унікальним."
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__company_id
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__company_id
msgid "Company"
msgstr "Компанія"
#. module: garazd_product_label
#: model:ir.model,name:garazd_product_label.model_res_config_settings
msgid "Config Settings"
msgstr "Налаштування"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_label_type__create_uid
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__create_uid
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__create_uid
msgid "Created by"
msgstr ""
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_label_type__create_date
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__create_date
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__create_date
msgid "Created on"
msgstr ""
#. module: garazd_product_label
#: model:ir.actions.act_window,name:garazd_product_label.action_print_label_from_product
#: model:ir.actions.act_window,name:garazd_product_label.action_print_label_from_template
msgid "Custom Product Labels"
msgstr "Етикетки товарів"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__custom_value
msgid "Custom Value"
msgstr "Користувацьке значення"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Decrease Qty"
msgstr "Зменшити кількість"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_label_type__display_name
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__display_name
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__display_name
msgid "Display Name"
msgstr ""
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "How to get Product Label Builder"
msgstr "Як отримати конструктор етикеток \"Product Label Builder\""
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__humanreadable
msgid "Human readable barcode"
msgstr "Читабельний штрих-код"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_label_type__id
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__id
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__id
msgid "ID"
msgstr ""
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Increase Qty"
msgstr "Збільшити кількість"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__qty_initial
msgid "Initial Qty"
msgstr "Первісна кількість"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__is_template_report
msgid "Is Template Report"
msgstr "Шаблон звіту"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__report_id
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Label"
msgstr "Етикетка"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__qty
msgid "Label Qty"
msgstr "Кількість етикеток"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__label_type_id
msgid "Label Type"
msgstr "Тип етикетки"
#. module: garazd_product_label
#: model:ir.model,name:garazd_product_label.model_print_label_type
msgid "Label Types"
msgstr "Типи етикеток"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__qty_per_product
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Label quantity per product"
msgstr "Кількість етикеток для кожного товару"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Labels"
msgstr "Етикетки"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__label_ids
msgid "Labels for Products"
msgstr "Етикетки для товарів"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__lang
msgid "Language"
msgstr "Мова"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_label_type__write_uid
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__write_uid
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__write_uid
msgid "Last Updated by"
msgstr ""
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_label_type__write_date
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__write_date
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__write_date
msgid "Last Updated on"
msgstr ""
#. module: garazd_product_label
#: model:ir.model,name:garazd_product_label.model_print_product_label_line
msgid "Line with a Product Label Data"
msgstr ""
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__message
msgid "Message"
msgstr "Повідомлення"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__mode
msgid "Mode"
msgstr "Режим"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_label_type__name
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__name
msgid "Name"
msgstr "Назва"
#. module: garazd_product_label
#. odoo-python
#: code:addons/garazd_product_label/wizard/print_product_label.py:0
#, python-format
msgid "Nothing to print, set the quantity of labels in the table."
msgstr "Друкувати немає чого, встановіть кількість етикеток у таблиці."
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Options"
msgstr "Налаштування"
#. module: garazd_product_label
#: model:ir.model.fields.selection,name:garazd_product_label.selection__print_product_label__output__pdf
msgid "PDF"
msgstr ""
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__partner_id
msgid "Partner"
msgstr "Партнер"
#. module: garazd_product_label
#: model_terms:product.template,description:garazd_product_label.product_blank_product_template
msgid ""
"Please do not delete this product! This product has been created by Garazd "
"Product Label solution for technical purposes, and it's used for label "
"printing."
msgstr ""
"Будь ласка, не видаляйте цей товар! Цей товар створено модулем для друку "
"етикеток від компанії Garazd Creation для технічних цілей, він "
"використовується для друку етикеток."
#. module: garazd_product_label
#. odoo-python
#: code:addons/garazd_product_label/wizard/print_product_label.py:0
#, python-format
msgid "Please select a label type."
msgstr "Будь ласка, оберіть тип етикетки."
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Preview"
msgstr "Попередній перегляд"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Preview product labels"
msgstr "Попередній перегляд товарних етикеток"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__selected
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Print"
msgstr "Друк"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Print Product Labels"
msgstr "Друк етикеток"
#. module: garazd_product_label
#: model:ir.model.fields,help:garazd_product_label.field_print_product_label__humanreadable
msgid "Print digital code of barcode."
msgstr "Роздрукувати цифровий код штрих-коду."
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Print product labels"
msgstr "Друк товарних етикеток"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label__output
msgid "Print to"
msgstr "Друкувати в"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.res_config_settings_view_form
msgid "Print with the alternative wizard"
msgstr "Друк за допомогою альтернативного рішення"
#. module: garazd_product_label
#: model:ir.model,name:garazd_product_label.model_product_template
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__product_id
msgid "Product"
msgstr "Товар"
#. module: garazd_product_label
#: model:ir.actions.report,name:garazd_product_label.action_report_product_label_from_template
msgid "Product Label from your own template"
msgstr "Етикетки з вашим власним дизайном"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.res_config_settings_view_form
msgid "Product Labels"
msgstr "Друк етикеток"
#. module: garazd_product_label
#: model:ir.actions.report,name:garazd_product_label.action_report_product_label_50x38
msgid "Product Labels 50x38mm"
msgstr "Етикетки 50х38 мм"
#. module: garazd_product_label
#: model:ir.actions.report,name:garazd_product_label.action_report_product_label_A4_57x35
msgid "Product Labels 57x35mm (A4, 21 pcs)"
msgstr "Етикетки 57x35 мм (A4, 21 шт)"
#. module: garazd_product_label
#: model:ir.model,name:garazd_product_label.model_product_product
msgid "Product Variant"
msgstr "Варіант товару"
#. module: garazd_product_label
#: model:ir.model.fields.selection,name:garazd_product_label.selection__print_product_label__mode__product_product
#: model:print.label.type,name:garazd_product_label.type_product
msgid "Products"
msgstr "Товари"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_res_config_settings__replace_standard_wizard
msgid "Replace Standard Wizard"
msgstr "Замінити стандартний майстер"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Restore initial quantity"
msgstr "Відновити первісну кількість етикеток"
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__sequence
msgid "Sequence"
msgstr "Послідовність"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Set a certain quantity for each line."
msgstr "Встановіть певну кількість для кожного рядка."
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Set quantity"
msgstr "Встановити кількість"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Sort labels by a product"
msgstr "Сортування етикеток за товаром"
#. module: garazd_product_label
#: model:ir.model.fields,help:garazd_product_label.field_print_product_label__company_id
msgid "Specify a company for product labels."
msgstr "Вкажіть компанію для товарних етикеток."
#. module: garazd_product_label
#: model:ir.model.fields,help:garazd_product_label.field_print_product_label__mode
msgid "Technical field to specify the mode of the label printing wizard."
msgstr ""
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Template"
msgstr "Шаблон"
#. module: garazd_product_label
#: model:ir.model.fields,help:garazd_product_label.field_print_product_label__lang
msgid "The language that will be used to translate label names."
msgstr "Мова, яка використовуватиметься для перекладу полів етикетки."
#. module: garazd_product_label
#: model:ir.model.fields,help:garazd_product_label.field_print_product_label_line__custom_value
msgid "This field can be filled manually to use in label templates."
msgstr "Це поле можна заповнити вручну для використання в шаблонах етикеток."
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.print_product_label_view_form
msgid "Total"
msgstr "Всього"
#. module: garazd_product_label
#: model_terms:ir.ui.view,arch_db:garazd_product_label.res_config_settings_view_form
msgid ""
"Use the custom print wizard by clicking on the 'Print Labels' button instead"
" of standard"
msgstr ""
"Використовувати альтернативний майстер друку, при натисканні на кнопку 'Друк "
"етикеток', замість стандартного."
#. module: garazd_product_label
#: model:ir.model.fields,field_description:garazd_product_label.field_print_product_label_line__wizard_id
msgid "Wizard"
msgstr "Майстер"
#. module: garazd_product_label
#: model:ir.model,name:garazd_product_label.model_print_product_label
msgid "Wizard to print Product Labels"
msgstr "Майстер для друку етикеток товарів"
#. module: garazd_product_label
#: model:ir.model.fields,help:garazd_product_label.field_print_product_label__label_type_id
msgid ""
"You can filter label templates by selecting their type. It makes sense if "
"you use additional extensions to print labels not for products only but for "
"other objects as well. Like as Stock Packages, Sales Orders, Manufacturing "
"Orders, etc. >>> To view available extensions go to the \"Actions\" menu and"
" click to the \"Get Label Extensions\"."
msgstr ""
"Ви можете фільтрувати шаблони етикеток, вибравши їх тип. Це має сенс, "
"якщо ви використовуєте додаткові розширення для друку етикеток не лише для товарів, "
"а й для інших об'єктів, таких як складські переміщення, замовлення на продаж, виробничі "
"замовлення тощо. >>> Щоб переглянути доступні розширення, перейдіть до меню \"Дії\" та "
"натисніть \"Отримати розширення\"."

View File

@@ -0,0 +1,4 @@
from . import res_config_settings
from . import product_template
from . import product_product
from . import print_label_type

View File

@@ -0,0 +1,11 @@
from odoo import fields, models
class PrintLabelTypePy(models.Model):
_name = "print.label.type"
_description = 'Label Types'
name = fields.Char(required=True, translate=True)
code = fields.Char(required=True)
_sql_constraints = [('print_label_type_code_uniq', 'UNIQUE (code)', 'Code of a print label type must be unique.')]

View File

@@ -0,0 +1,13 @@
from odoo import models
class ProductProduct(models.Model):
_inherit = "product.product"
def action_open_label_layout(self):
# flake8: noqa: E501
if not self.env['ir.config_parameter'].sudo().get_param('garazd_product_label.replace_standard_wizard'):
return super(ProductProduct, self).action_open_label_layout()
action = self.env['ir.actions.act_window']._for_xml_id('garazd_product_label.action_print_label_from_product')
action['context'] = {'default_product_product_ids': self.ids}
return action

View File

@@ -0,0 +1,13 @@
from odoo import models
class ProductTemplate(models.Model):
_inherit = "product.template"
def action_open_label_layout(self):
# flake8: noqa: E501
if not self.env['ir.config_parameter'].sudo().get_param('garazd_product_label.replace_standard_wizard'):
return super(ProductTemplate, self).action_open_label_layout()
action = self.env['ir.actions.act_window']._for_xml_id('garazd_product_label.action_print_label_from_template')
action['context'] = {'default_product_template_ids': self.ids}
return action

View File

@@ -0,0 +1,7 @@
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
replace_standard_wizard = fields.Boolean(config_parameter='garazd_product_label.replace_standard_wizard')

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="paperformat_label_a4_blank" model="report.paperformat">
<field name="name">Label A4</field>
<field name="format">A4</field>
<field name="page_height">0</field>
<field name="page_width">0</field>
<field name="orientation">Portrait</field>
<field name="margin_top">10</field>
<field name="margin_bottom">10</field>
<field name="margin_left">5</field>
<field name="margin_right">5</field>
<field name="header_line" eval="False"/>
<field name="header_spacing">0</field>
<field name="disable_shrinking" eval="True"/>
<field name="dpi">96</field>
<field name="default" eval="False"/>
</record>
<record id="paperformat_label_50x38" model="report.paperformat">
<field name="name">Label 50x38 mm</field>
<field name="format">custom</field>
<field name="page_height">38</field>
<field name="page_width">50</field>
<field name="orientation">Portrait</field>
<field name="margin_top">1</field>
<field name="margin_bottom">0</field>
<field name="margin_left">0</field>
<field name="margin_right">0</field>
<field name="header_line" eval="False"/>
<field name="header_spacing">0</field>
<field name="disable_shrinking" eval="True"/>
<field name="dpi">96</field>
<field name="default" eval="False"/>
</record>
<record id="action_report_product_label_A4_57x35" model="ir.actions.report">
<field name="name">Product Labels 57x35mm (A4, 21 pcs)</field>
<field name="model">print.product.label.line</field>
<field name="report_type">qweb-pdf</field>
<field name="paperformat_id" ref="paperformat_label_a4_blank"/>
<field name="report_name">garazd_product_label.report_product_label_57x35_template</field>
<field name="report_file">garazd_product_label.report_product_label_57x35_template</field>
<field name="print_report_name">'Product Labels 57x35mm'</field>
</record>
<record id="action_report_product_label_50x38" model="ir.actions.report">
<field name="name">Product Labels 50x38mm</field>
<field name="model">print.product.label.line</field>
<field name="report_type">qweb-pdf</field>
<field name="paperformat_id" ref="paperformat_label_50x38"/>
<field name="report_name">garazd_product_label.report_product_label_50x38_template</field>
<field name="report_file">garazd_product_label.report_product_label_50x38_template</field>
<field name="print_report_name">'Product Labels 50x38mm'</field>
</record>
<record id="action_report_product_label_from_template" model="ir.actions.report">
<field name="name">Product Label from your own template</field>
<field name="model">print.product.label.line</field>
<field name="report_type">qweb-pdf</field>
<field name="paperformat_id" ref="garazd_product_label.paperformat_label_a4_blank"/>
<field name="report_name">garazd_product_label.report_product_label_from_template</field>
<field name="report_file">garazd_product_label.report_product_label_from_template</field>
<field name="print_report_name">'Product Labels Custom Design'</field>
</record>
</odoo>

View File

@@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<template id="label_57x35">
<table class="table" style="margin: 0; padding: 0;">
<tr height="144px" style="border:0;margin:0;padding:0;">
<td class="col-xs-4 text-center" style="border:0;margin:0;padding:0;">
<div style="overflow:hidden; height:65px !important; padding: 5px 5px 0; line-height: 1.2;">
<span t-field="label.product_id.name" style="line-height: 1.2;"/>
<span t-if="label.product_id.product_template_attribute_value_ids"
t-esc="u', '.join(map(lambda x: x.attribute_line_id.attribute_id.name + u': ' + x.name, label.product_id.product_template_attribute_value_ids))"
class="badge"/>
</div>
<div style="width: 100%; padding: 0; margin: 0; font-size: 21px; font-weight: bold;">
<span t-if="label.product_id.currency_id.position == 'before'" t-field="label.product_id.currency_id.symbol"/>
<span t-field="label.product_id.lst_price"/>
<span t-if="label.product_id.currency_id.position == 'after'" t-field="label.product_id.currency_id.symbol"/>
</div>
<div t-if="label.product_id.default_code" style="width: 100%; padding: 0; margin: 0; font-size: 12px;">
<span t-field="label.product_id.default_code"/>
</div>
<t t-if="label.product_id.barcode">
<div t-out="label.product_id.barcode" t-options="{'widget': 'barcode', 'symbology': 'auto', 'img_style': 'overflow: hidden; width: 100%; height: 1.4rem;', 'humanreadable': label.wizard_id.humanreadable}" class="px-1"/>
</t>
</td>
</tr>
</table>
</template>
<template id="report_product_label_57x35_template">
<t t-call="web.html_container">
<t t-call="web.basic_layout">
<t t-set="count" t-value="0" />
<div class="page">
<div class="oe_structure"/>
<t t-foreach="docs" t-as="label">
<t t-set="qty" t-value="1" />
<t t-if="label.qty">
<t t-set="qty" t-value="label.qty" />
</t>
<t t-foreach="list(range(qty))" t-as="index_qty">
<div t-if="count % 21 == 0" style="page-break-after:always;"/>
<div t-if="count % 3 == 0" style="clear:both;"/>
<div t-att-style="'width: 233px; float: left; height: 145px; margin: 0 4px 4px; border: {};'.format('%dpx solid #777;' % label.wizard_id.border_width if label.wizard_id.border_width else '0')">
<t t-call="garazd_product_label.label_57x35"/>
</div>
<t t-set="count" t-value="count+1" />
</t>
</t>
</div>
</t>
</t>
</template>
<template id="report_product_label_50x38_template">
<t t-call="web.html_container">
<t t-call="web.basic_layout">
<t t-foreach="docs" t-as="label">
<t t-set="qty" t-value="1"/>
<t t-if="label.qty" t-set="qty" t-value="label.qty" />
<t t-foreach="list(range(qty))" t-as="index_qty">
<div class="page" style="page-break-after: always;">
<div style="height: 136px !important; width: 165px !important;">
<table class="table" t-att-style="'height: 100%; border: {};'.format('%dpx solid #777;' % label.wizard_id.border_width if label.wizard_id.border_width else '0')">
<tr style="border: 0;">
<td class="text-center" style="padding: 0; margin: 0; border: 0;">
<div style="overflow: hidden; height: 64px !important; font-size: 13px; line-height: 1.2; margin-bottom: 2px;">
<span t-field="label.product_id.name" style="line-height: 1.2;"/>
<span t-if="label.product_id.product_template_attribute_value_ids"
t-esc="u', '.join(map(lambda x: x.attribute_line_id.attribute_id.name + u': ' + x.name, label.product_id.product_template_attribute_value_ids))"
class="badge"/>
</div>
<div style="width: 100%; overflow: hidden; height: 26px !important;">
<div style="float: right; width: 60%; font-size: 20px; font-weight: bold; line-height: 1.0; text-align: right; margin-bottom: 0px;">
<span t-if="label.product_id.currency_id.position == 'before'" t-field="label.product_id.currency_id.symbol"/>
<span t-field="label.product_id.lst_price"/>
<span t-if="label.product_id.currency_id.position == 'after'" t-field="label.product_id.currency_id.symbol"/>
</div>
<div style="float: left; width: 40%; font-size: 10px; font-weight: 900; line-height: 1.0; text-align: left; margin-bottom: 0px; padding-top: 6px;">
<span t-if="label.product_id.default_code"><span t-field="label.product_id.default_code"/> </span>
</div>
</div>
<t t-if="label.product_id.barcode">
<div t-out="label.product_id.barcode" style="margin-top: 5px;" t-options="{'widget': 'barcode', 'quiet': 0, 'symbology': 'auto', 'img_style': 'overflow: hidden; width: 100%; height: 2.0rem;', 'humanreadable': label.wizard_id.humanreadable}"/>
</t>
</td>
</tr>
</table>
</div>
</div>
</t>
</t>
</t>
</t>
</template>
<template id="report_product_label_from_template">
<t t-call="web.basic_layout"/>
</template>
</odoo>

View File

@@ -0,0 +1,4 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_print_product_label_line_user,access_print_product_label_line_user,model_print_product_label_line,base.group_user,1,1,1,1
access_print_product_label_user,access_print_product_label_user,model_print_product_label,base.group_user,1,1,1,0
access_print_label_type_user_read,access_print_label_type_user_read,model_print_label_type,base.group_user,1,0,0,0
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_print_product_label_line_user access_print_product_label_line_user model_print_product_label_line base.group_user 1 1 1 1
3 access_print_product_label_user access_print_product_label_user model_print_product_label base.group_user 1 1 1 0
4 access_print_label_type_user_read access_print_label_type_user_read model_print_label_type base.group_user 1 0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,484 @@
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row mt-3">
<ul class="offset-3 col-6 text-left d-md-none list-unstyled pt-5">
<li class="border-top border-bottom"><div class="my-2 mx-sm-2" style="color: #6F649A;"><i class="fa fa-check-circle"></i> Community</div></li>
<li class="border-bottom"><div class="my-2 mx-sm-2" style="color: #694D65;"><i class="fa fa-check-circle"></i> Enterprise</div></li>
</ul>
<div class="col-12 text-right d-none d-md-block">
<span class="m-2" style="float: right; background-color: #694D65; border-color: #694D65; color: #FFFFFF; padding: 5px 18px; border-radius: 15px 0 15px 0; opacity: 1;"><i class="fa fa-check"></i> Enterprise</span>
<span class="m-2" style="float: right; background-color: #6F649A; border-color: #6F649A; color: #FFFFFF; padding: 5px 18px; border-radius: 15px 0 15px 0; opacity: 1;"><i class="fa fa-check"></i> Community</span>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row oe_spaced">
<div class="offset-2 col-8 offset-md-3 col-md-6 offset-lg-0 col-lg-2">
<div class="text-center shadow ml8">
<div class="s_panel_video" data-video-id="0Sem8pMbUyU?rel=0&start=0" style="cursor: pointer; width: 100%;" data-container="body" data-toggle="popover" data-placement="top" data-content="Click on the image to play the video.">
<img class="s_tooltip_tabs_tooltip_image s_figure_link img-fluid rounded-top pb-0" src="banner_youtube.png" alt="Custom Product Labels youtube video tutorial">
</div>
<a href="https://youtu.be/0Sem8pMbUyU" target="_blank" class="btn btn-danger rounded-bottom p-1 w-100" role="button" style="width: 100%; font-size: 0.7rem;">Watch on Youtube <i class="fa fa-external-link"></i></a>
</div>
</div>
<div class="offset-xl-1 col-lg-9 d-flex d-column mt-5 mt-lg-0">
<h2 class="h1 align-self-center text-center" style="color: #154577; font-weight: 900; font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">Product label printing easily in Odoo</h2>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row oe_spaced">
<div class="col-12">
<div class="h2 text-left ml8" style="color: #FEA621;"><i class="fa fa-newspaper-o mr8"></i>Description</div>
<div class="media p-2 pt-4 overflow-hidden" style="border-color: #FEA621 !important; border-radius: 0 15px 0 0; border-top-style: solid; border-right-style: solid;">
<div class="py-2 px-md-5 lead w-100" style="line-height: 2.5rem;"><p>There are a lot of cases when company business processes require having the ability to print product barcode labels. However, different printers and label makers use varied paper formats and label designs can be individual for each company.</p>
<p>The <a href="https://apps.odoo.com/apps/modules/browse?search=product+label&amp;repo_maintainer_id=119796">Odoo Product Labels</a> app family by <b>Garazd Creation</b> solves this business need and gives a usable tool to generate and print product labels with required sizes.</p>
<p class="pt-3">This module allows printing custom product labels with barcode on various paper formats. It includes two label templates:</p>
<ul>
<li><b>57x35mm</b> (21 pcs on the A4 paper format, 3 pcs x 7 rows)</li>
<li><b>50x38mm</b> (the Dymo label, 2" x 1.5")</li>
</ul>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row oe_spaced">
<div class="col-12">
<div class="h2 text-left ml8" style="color: #FEA621;"><i class="fa fa-check-square-o mr8"></i>Benefits</div>
<div class="s_features_grid p-2 pt-4 o_colored_level" data-snippet="s_features_grid" data-name="Features Grid" style="border-color: #FEA621 !important; border-radius: 0 15px 0 0; border-top-style: solid; border-right-style: solid; background-color: #ffa81f14;">
<div class="container p-0">
<div class="row px-md-5">
<div class="col-lg-6 s_col_no_bgcolor pb24">
<div class="row">
<div class="col-lg-12 o_colored_level" data-name="Box">
<i class="s_features_grid_icon fa fa-2x float-left mr32 mr-3 bg-warning fa-youtube-play rounded-circle" style="line-height:5rem; height:5rem; width:5rem; text-align:center; float:left;"></i>
<div class="s_features_grid_content">
<div class="h4 pt-2">Watch Demo</div>
<p>Watch the video tutorial</p>
</div>
</div>
</div>
</div>
<div class="col-lg-6 s_col_no_bgcolor pb24">
<div class="row">
<div class="col-lg-12 o_colored_level" data-name="Box">
<i class="s_features_grid_icon fa fa-2x float-left mr32 mr-3 bg-warning fa-check-square-o rounded-circle" style="line-height:5rem; height:5rem; width:5rem; text-align:center; float:left;"></i>
<div class="s_features_grid_content">
<div class="h4 pt-2">Tested</div>
<p>Include unit tests</p>
</div>
</div>
</div>
</div>
<div class="col-lg-6 s_col_no_bgcolor pb24">
<div class="row">
<div class="col-lg-12 o_colored_level" data-name="Box">
<i class="s_features_grid_icon fa fa-2x float-left mr32 mr-3 bg-warning fa-edit rounded-circle" style="line-height:5rem; height:5rem; width:5rem; text-align:center; float:left;"></i>
<div class="s_features_grid_content">
<div class="h4 pt-2">Customize</div>
<p>Contact us for improvements and changes</p>
</div>
</div>
</div>
</div>
<div class="col-lg-6 s_col_no_bgcolor pb24">
<div class="row">
<div class="col-lg-12 o_colored_level" data-name="Box">
<i class="s_features_grid_icon fa fa-2x float-left mr32 mr-3 bg-dark fa-search rounded-circle" style="line-height:5rem; height:5rem; width:5rem; text-align:center; float:left;"></i>
<div class="s_features_grid_content">
<div class="h4 pt-2">Try me</div>
<p>Demo &amp; Test. Click on the "Live Preview" button</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row oe_spaced">
<div class="col-12">
<section class="oe_container" style="font-family: 'Montserrat','Odoo Unicode Support Noto',sans-serif; line-height: 2rem;">
<div class="h2 text-left ml8 pt-5" style="color: #FEA621;"><i class="fa fa-print mr8"></i>Replace the default print wizard</div>
<div class="media p-2 pt-4 border-top border-right" style="border-color: #FEA621 !important; border-radius: 0 15px 0 0;">
<div class="media-body">
<div class="py-2 px-md-5" style="line-height: 2rem;">
If you want to use this custom print wizard instead of standard, go to the menu "<b>Settings</b>" - "<b>General Settings</b>" and activate the "<b>Print with the alternative wizard</b>" option in the "Product Labels" section.
</div>
<div class="text-center my-5 mx-md-5">
<img src="odoo_product_label_alternative_print_wizard_setting.png" class="w-100 img-fluid rounded shadow-lg border" alt="Odoo print product labels by alternative print wizard in 18.0">
</div>
<div class="py-2 px-md-5" style="line-height: 2rem;">
After that, you can open this print wizard by clicking on "<b>Print Labels</b>" button in product forms and lists.
</div>
<div class="text-center my-5 mx-md-5">
<img src="odoo_product_barcode_label_print.png" class="w-100 w-lg-75 img-fluid rounded shadow-lg border" alt="Odoo barcode labels printing in 18.0">
</div>
</div>
</div>
</section>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row oe_spaced">
<div class="col-12">
<section class="oe_container" style="font-family: 'Montserrat','Odoo Unicode Support Noto',sans-serif; line-height: 2rem;">
<div class="h2 text-left ml8" style="color: #FEA621;"><i class="fa fa-mouse-pointer mr8"></i>Product Selection</div>
<div class="media p-2 pt-4 border-top border-right" style="border-color: #FEA621 !important; border-radius: 0 15px 0 0;">
<div class="media-body">
<div class="py-2 px-md-5" style="line-height: 2rem;">
To print labels by the wizard, go to the "<b>Products</b>" or "<b>Product Variants</b>" menu and select one or several products.
Then click on the "<b>Custom Product Labels</b>" in the "<b>Print</b>" menu.
</div>
<div class="text-center my-5 mx-md-5">
<img src="print_product_label_select_products.png" class="w-100 img-fluid rounded shadow-lg border" alt="Odoo 18.0 select products to print">
</div>
<blockquote class="py-2 my-3 ml-md-5">By using our additional modules, you will also be able to select products from:
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_picking/">Stock Pickings</a>,
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_packaging/">Product Packaging</a>,
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_purchase/">Purchase Orders</a>,
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_mrp/">Manufacturing Orders</a>.
</blockquote>
</div>
</div>
</section>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row oe_spaced">
<div class="col-12">
<section class="oe_container" style="font-family: 'Montserrat','Odoo Unicode Support Noto',sans-serif; line-height: 2rem;">
<div class="h2 text-left ml8" style="color: #FEA621;"><i class="fa fa-gears mr8"></i>Label Settings</div>
<div class="media p-2 pt-4 border-top border-right bg-light" style="border-color: #FEA621 !important; border-radius: 0 15px 0 0;">
<div class="media-body">
<div class="h3 mt-4 p-2 pl-md-5">Label Settings</div>
<div class="py-2 px-md-5" style="line-height: 2rem;">
In the print wizard form:
</div>
<ol class="py-2 mx-md-3">
<li>Select a <b>Label Template</b>.</li>
<blockquote>
Templates can be in a variety of designs, sizes, and paper formats. Look at our <a href="https://apps.odoo.com/apps/modules/browse?search=garazd_product_label&amp;repo_maintainer_id=119796">other related modules</a>.
</blockquote>
<li>Specify the number of labels you want to print</li>
<blockquote> You can enter a quantity value or use <i class="fa fa-minus"></i> / <i class="fa fa-plus"></i> buttons.</blockquote>
<li>If you need to set a specific quantity for each label, enter the value and click on <b>Set quantity</b>.</li>
<li>After changing the label quantities, you can restore the initial values by clicking the button <i class="fa fa-undo"></i>.</li>
<li>To sort labels by product, click on this button.</li>
<li>You can reorder the labels manually or deactivate some labels to avoid printing them.</li>
</ol>
<div class="text-center my-5 mx-md-5">
<img src="print_product_label_settings.png" class="w-100 img-fluid rounded shadow-lg border" alt="Odoo 18.0 product label settings">
</div>
<div class="h3 mt-4 p-2 pl-md-5">Label Options</div>
<div class="py-2 px-md-5" style="line-height: 2rem;">
You can also set some label options on the tab <b>Options</b>:
</div>
<ul class="py-2 mx-md-5">
<li><b>Language</b> - to specify the language to translate label fields.</li>
<li><b>Human readable barcode</b> - to print a barcode digit code on the labels.</li>
<li><b>Border</b> - to set the label border width.</li>
<blockquote>Set to <b>0</b> to print labels without border.</blockquote>
<li><b>Company</b> - select a company if your label's data is related from the company.</li>
</ul>
<div class="text-center my-5 mx-md-5">
<img src="print_product_label_options.png" class="w-100 img-fluid rounded shadow-lg border" alt="Odoo 18.0 product label options">
</div>
<div class="h3 mt-4 p-2 pl-md-5">Label Printing</div>
<div class="py-2 px-md-5 mb-4" style="line-height: 2rem;">
Finally, you can preview the labels before printing, by clicking on the <span class="btn btn-sm btn-secondary"><i class="fa fa-search"/> PREVIEW</span> button, or print them with the <span class="btn btn-sm btn-primary"><i class="fa fa-print"/> PRINT</span>
</div>
</div>
</div>
</section>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row oe_spaced">
<div class="col-12">
<section class="oe_container" style="font-family: 'Montserrat','Odoo Unicode Support Noto',sans-serif; line-height: 2rem;">
<div class="h2 text-left pl-2" style="color: #FEA621;"><i class="fa fa-paint-brush mr8"></i>Design your own label</div>
<div class="mb-3 border-top border-right" style="background-color: #FEA621; border-color: #FEA621 !important; border-radius: 0 15px 0 0;">
<div class="container p-0">
<div class="py-2 px-md-5 text-white d-flex justify-content-center" style="line-height: 2rem; font-size: 1.2rem;">
<span class="my-auto">Create a variety of labels with awesome designs using the </span>
<i class="fa fa-angle-double-right fa-2x px-3 my-auto"></i>
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_pro/" class="btn btn-light text-primary my-auto">Product Label Builder</a>
</div>
</div>
</div>
</section>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row oe_spaced">
<div class="col-12">
<section class="oe_container" style="font-family: 'Montserrat','Odoo Unicode Support Noto',sans-serif; line-height: 2rem;">
<div class="h2 text-left ml8" style="color: #FEA621;"><i class="fa fa-barcode mr8"></i>Label Samples</div>
<div class="media p-2 pt-4 border-top border-right" style="border-color: #FEA621 !important; border-radius: 0 15px 0 0;">
<div class="media-body">
<div class="py-2 px-md-5" style="line-height: 2rem;">
Labels will be generated in the PDF format:
</div>
<div class="text-center my-5 mx-md-5">
<img src="product_barcode_label_50x38mm.png" class="w-100 w-lg-25 img-fluid rounded shadow-lg border" alt="Odoo 18.0 Custom Product Labels">
</div>
<div class="text-center my-5 mx-md-5">
<img src="product_barcode_label_A4_57x35mm.png" class="w-100 w-lg-50 img-fluid rounded shadow-lg border" alt="Odoo 18.0 Custom Product Labels">
</div>
</div>
</div>
</section>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat','Odoo Unicode Support Noto',sans-serif;">
<div class="row oe_spaced">
<div class="col-12">
<div class="h2 text-left pl-2 pt-3" style="color: #FEA621; font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">Related Modules</div>
<div class="mb-3 bg-light" style="border-color:#FEA621 !important; border-radius: 0 15px 0 0; border-top-style: solid; border-right-style: solid;">
<div id="related_modules" class="carousel slide mt-2 mx-3" data-ride="carousel" data-interval="15000" data-pause="hover">
<div class="carousel-inner">
<div class="carousel-item row active" style="min-height: 0px;">
<div class="col-xs-12 col-sm-4 col-md-4 my-4 px-3" style="float:left">
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_pro/" target="_blank">
<div class="card shadow-sm border rounded deep-1 deep_hover">
<img class="img img-responsive center-block border-bottom w-100" src="banner_garazd_product_label_pro.png" alt="Odoo App Product Label Builder" title="Product Label Builder | Product Barcode Label Building and Printing | Professional Tool to Print Labels | Barcode Product Label Builder | Product Label Designer | Sticker Label Maker | Dymo Label Maker | Barcode Label Generator | Direct Print">
<div class="card-body">
<div class="card-title h5 text-nowrap text-truncate" title="Product Label Builder">Product Label Builder</div>
<p class="card-text small text-nowrap text-truncate" title="Product Barcode Label Building and Printing | Professional Tool to Print Labels | Barcode Product Label Builder | Product Label Designer | Sticker Label Maker | Dymo Label Maker | Barcode Label Generator | Direct Print">Product Barcode Label Building and Printing | Professional Tool to Print Labels | Barcode Product Label Builder | Product Label Designer | Sticker Label Maker | Dymo Label Maker | Barcode Label Generator | Direct Print</p>
</div>
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 my-4 px-3" style="float:left">
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_picking/" target="_blank">
<div class="card shadow-sm border rounded deep-1 deep_hover">
<img class="img img-responsive center-block border-bottom w-100" src="banner_garazd_product_label_picking.png" alt="Odoo App Stock Product Labels" title="Stock Product Labels | Print custom product barcode labels for stock transfers | Product Barcode Labels Printing | Print Product Labels | Barcode Product Labels Printinf from Stock | Barcode labels for inventory | Label Inventory Tag">
<div class="card-body">
<div class="card-title h5 text-nowrap text-truncate" title="Stock Product Labels">Stock Product Labels</div>
<p class="card-text small text-nowrap text-truncate" title="Print custom product barcode labels for stock transfers | Product Barcode Labels Printing | Print Product Labels | Barcode Product Labels Printinf from Stock | Barcode labels for inventory | Label Inventory Tag">Print custom product barcode labels for stock transfers | Product Barcode Labels Printing | Print Product Labels | Barcode Product Labels Printinf from Stock | Barcode labels for inventory | Label Inventory Tag</p>
</div>
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 my-4 px-3" style="float:left">
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_purchase/" target="_blank">
<div class="card shadow-sm border rounded deep-1 deep_hover">
<img class="img img-responsive center-block border-bottom w-100" src="banner_garazd_product_label_purchase.png" alt="Odoo App Purchase Product Labels" title="Purchase Product Labels | Print custom product barcode labels for purchase orders | Barcode product label printing from purchase order">
<div class="card-body">
<div class="card-title h5 text-nowrap text-truncate" title="Purchase Product Labels">Purchase Product Labels</div>
<p class="card-text small text-nowrap text-truncate" title="Print custom product barcode labels for purchase orders | Barcode product label printing from purchase order">Print custom product barcode labels for purchase orders | Barcode product label printing from purchase order</p>
</div>
</div>
</a>
</div>
</div>
<div class="carousel-item row" style="min-height: 0px;">
<div class="col-xs-12 col-sm-4 col-md-4 my-4 px-3" style="float:left">
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_packaging/" target="_blank">
<div class="card shadow-sm border rounded deep-1 deep_hover">
<img class="img img-responsive center-block border-bottom w-100" src="banner_garazd_product_label_packaging.png" alt="Odoo App Product Packaging Labels" title="Product Packaging Labels | Custom Product Packagings Labels | Product Barcode Labels Printing | Print Product Labels">
<div class="card-body">
<div class="card-title h5 text-nowrap text-truncate" title="Product Packaging Labels">Product Packaging Labels</div>
<p class="card-text small text-nowrap text-truncate" title="Custom Product Packagings Labels | Product Barcode Labels Printing | Print Product Labels">Custom Product Packagings Labels | Product Barcode Labels Printing | Print Product Labels</p>
</div>
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 my-4 px-3" style="float:left">
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_mrp/" target="_blank">
<div class="card shadow-sm border rounded deep-1 deep_hover">
<img class="img img-responsive center-block border-bottom w-100" src="banner_garazd_product_label_mrp.png" alt="Odoo App MRP Product Labels" title="MRP Product Labels | Custom Product Labels in Manufacturing | Barcode Product Labels Printinf from Manufacturing">
<div class="card-body">
<div class="card-title h5 text-nowrap text-truncate" title="MRP Product Labels">MRP Product Labels</div>
<p class="card-text small text-nowrap text-truncate" title="Custom Product Labels in Manufacturing | Barcode Product Labels Printinf from Manufacturing">Custom Product Labels in Manufacturing | Barcode Product Labels Printinf from Manufacturing</p>
</div>
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 my-4 px-3" style="float:left">
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label_account/" target="_blank">
<div class="card shadow-sm border rounded deep-1 deep_hover">
<img class="img img-responsive center-block border-bottom w-100" src="banner_garazd_product_label_account.png" alt="Odoo App Account Product Labels" title="Account Product Labels | Product Labels with Accounting Features | Barcode Labels with VAT | Product Labels with Tax-included prices">
<div class="card-body">
<div class="card-title h5 text-nowrap text-truncate" title="Account Product Labels">Account Product Labels</div>
<p class="card-text small text-nowrap text-truncate" title="Product Labels with Accounting Features | Barcode Labels with VAT | Product Labels with Tax-included prices">Product Labels with Accounting Features | Barcode Labels with VAT | Product Labels with Tax-included prices</p>
</div>
</div>
</a>
</div>
</div>
</div>
<!-- Control arrows -->
<a class="carousel-control-prev w-0" href="#related_modules" data-slide="prev" style="color: #FEA621;">
<span class="carousel-control-prev-icon"><i class="fa fa-chevron-left fa-2x"></i></span>
</a>
<a class="carousel-control-next w-0" href="#related_modules" data-slide="next" style="color: #FEA621;">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right fa-2x"></i></span>
</a>
</div>
</div>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif; background-color: #FEA621; border-color: #fea621; padding: 12px 28px; border-radius: 15px 0 15px 0;">
<div class="row my-2">
<div class="col-lg-4 text-center mb-5 mb-lg-0">
<div class="h3 p-2 mb-2 font-weight-bold">Contact Us</div>
<div class="lead text-white pb-2">Support, customizations, and development</div>
<div class="w-100 w-md-75 w-lg-100 my-1 pl-3 text-nowrap text-truncate btn btn-dark rounded">
<i class="fa fa-envelope fa-fw" style="font-size:1.2rem;"></i>
<a href="mailto:support@garazd.biz" target="_blank">support@garazd.biz</a>
</div>
<div class="w-100 w-md-75 w-lg-100 my-1 pl-3 text-nowrap text-truncate btn btn-dark rounded">
<i class="fa fa-skype fa-fw" style="font-size:1.2rem;"></i>
<span>Skype: </span>
<a href="skype:live:7f0648d653072c5f?chat" target="_blank">GarazdCreation</a>
</div>
<div class="w-100 w-md-75 w-lg-100 m-auto my-1 pl-3 text-nowrap text-truncate btn-light border border-dark rounded" style="line-height: 2.4rem;">
<a href="https://garazd.biz/contactus" target="_blank">https://garazd.biz/contactus</a>
</div>
</div>
<div class="col-12 col-lg-4 border-left border-right">
<div class="h3 p-2 mb-3 text-center font-weight-bold">Our expertise</div>
<div class="text-left">
<div class="my-3 pl-3 text-nowrap text-truncate lead text-white" data-container="body" data-toggle="popover" data-placement="top" data-content="Garazd Creation is official Odoo Partner with the status 'Learning Partner'.">
<i class="fa fa-handshake-o fa-fw"></i> Odoo Learning Partner
</div>
<div class="my-3 pl-3 text-nowrap text-truncate lead text-white" data-container="body" data-toggle="popover" data-placement="top" data-content="Odoo Community Association member.">
<i class="fa fa-group fa-fw"></i> OCA Member
</div>
<div class="my-3 pl-3 text-nowrap text-truncate lead text-white" data-container="body" data-toggle="popover" data-placement="top" data-content="Garazd Creation with Odoo since 2014.">
<i class="fa fa-calendar-check-o fa-fw"></i> With Odoo since 2014
</div>
<div class="my-3 pl-3 lead text-white" data-container="body" data-toggle="popover" data-placement="top" data-content="Over 20,000 app downloads and purchases in Odoo Apps Store.">
<i class="fa fa-download fa-fw"></i> Over 20,000 app downloads and purchases
</div>
<div class="my-3 pl-3 lead text-white" data-container="body" data-toggle="popover" data-placement="top" data-content="Our apps in the TOP 10 on Odoo Apps.">
<i class="fa fa-trophy fa-fw"></i> Our apps in the TOP 10 on Odoo Apps
</div>
</div>
</div>
<div class="col-12 col-lg-4 mt-5 mt-lg-0">
<div class="h3 p-2 text-center font-weight-bold">Explore our apps</div>
<div class="text-center mb-3">
<a href="https://apps.odoo.com/apps/browse?repo_maintainer_id=119796" target="_blank">
<div class="text-black bg-warning shadow-sm rounded">
<i class="fa fa-compass fa-4x py-0"></i>
</div>
</a>
</div>
<div class="h4 p-2 text-center font-weight-bold">Watch and subscribe</div>
<div class="text-center">
<a href="https://www.youtube.com/channel/UCjHB3t-qc6SQmbgnS8bSPOA?sub_confirmation=1" target="_blank">
<div class="text-black bg-warning shadow-sm rounded">
<i class="fa fa-youtube-play fa-4x py-0"></i>
</div>
</a>
</div>
</div>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat', 'Odoo Unicode Support Noto', sans-serif;">
<div class="row mt-5 mb-4 align-items-center">
<div class="col-6 text-left">Version: 18.0.1.0.1</div>
<div class="col-6 text-right" style="text-align: right;"><small>Module design is reserved</small> | Copyright &copy; <a href="https://garazd.biz/" target="_blank">Garazd Creation</a></div>
<section class="oe_container col-12 mt-5" style="font-family: 'Montserrat','Odoo Unicode Support Noto',sans-serif; line-height: 1.75rem;">
<div class="h2 text-left ml8 mr32" style="color: #FEA621;"><i class="fa fa-code-fork mr8"></i>Changelog</div>
<div class="media p-2 pt-4" style="border-color:#FEA621 !important; border-radius: 15px; border: solid;">
<small class="media-body">
<ul class="list-unstyled">
<li class="media">
<div class="media-body mb-4">
<div class="h5 ml32 my-1" style="font-size: 1.0rem;">
<span class="font-weight-bold bg-dark text-white rounded py-1 px-3">18.0.1.0.1</span>
<span class="text-muted ml16">2024-10-22</span>
</div>
<ul class="mt-2">
<li class="mx-3"><small>Improve the lable 57 x 35 mm.</small></li>
<li class="mx-3"><small>Add the app filter "Product Labels".</small></li>
</ul>
</div>
</li>
<li class="media">
<div class="media-body mb-4">
<div class="h5 ml32 my-1" style="font-size: 1.0rem;">
<span class="font-weight-bold bg-dark text-white rounded py-1 px-3">18.0.1.0.0</span>
<span class="text-muted ml16">2024-10-02</span>
</div>
<ul class="mt-2">
<li class="mx-3"><small>Migration from 17.0.</small></li>
</ul>
</div>
</li>
</ul>
</div>
</small>
</div>
</section>
</div>
</section>
<section class="oe_container" style="font-family: 'Montserrat','Odoo Unicode Support Noto',sans-serif;">
<div class="container" id="odoo-app-rating">
<div class="row my-4 py-3 bg-light" style="padding: 12px 28px; border-radius: 0 0 15px 15px;">
<div class="col d-flex justify-content-center text-center" style="color: #FEA621;">
<i class="fa fa-fw fa-thumbs-o-up fa-4x"></i>
<span class="my-auto mx-5 display-4">
<a href="https://apps.odoo.com/apps/modules/18.0/garazd_product_label/#odoo-app-rating" class="btn btn-lg btn-warning text-white rounded">Rate the app</a>
- support us to do more!
</span>
<i class="fa fa-fw fa-angle-double-down fa-4x"></i>
</div>
<div>
</div>
</section>

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View File

@@ -0,0 +1 @@
from . import test_print_product_label

View File

@@ -0,0 +1,31 @@
from odoo.tests.common import TransactionCase
from odoo.tools import test_reports
from odoo.tests import tagged
@tagged('post_install', '-at_install', 'garazd_product_label')
class TestPrintProductLabel(TransactionCase):
def setUp(self):
super(TestPrintProductLabel, self).setUp()
self.product_chair = self.env.ref('product.product_product_12')
self.product_drawer = self.env.ref('product.product_product_27')
def test_print_wizard(self):
ctx = {
'active_model': 'product.product',
'default_product_product_ids': [
self.product_chair.id,
self.product_drawer.id,
],
}
wizard = self.env['print.product.label'].with_context(**ctx).create({})
self.assertEqual(len(wizard.label_ids), 2)
test_reports.try_report(
self.env.cr,
self.env.uid,
'garazd_product_label.report_product_label_57x35_template',
ids=wizard.label_ids.ids,
our_module='garazd_product_label'
)

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.garazd_product_label</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="product.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//block[@id='product_general_settings']" position="after">
<block title="Product Labels" id="garazd_product_label_setting">
<setting id="product_label_printing_wizard"
string="Print with the alternative wizard"
help="Use the custom print wizard by clicking on the 'Print Labels' button instead of standard">
<field name="replace_standard_wizard"/>
</setting>
</block>
</xpath>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,2 @@
from . import print_product_label_line
from . import print_product_label

View File

@@ -0,0 +1,184 @@
# Copyright © 2018 Garazd Creation (<https://garazd.biz>)
# @author: Yurii Razumovskyi (<support@garazd.biz>)
# @author: Iryna Razumovska (<support@garazd.biz>)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.html).
import base64
from typing import List
from odoo import api, fields, models, _
from odoo.exceptions import UserError
from odoo.addons.base.models.res_partner import _lang_get
class PrintProductLabel(models.TransientModel):
_name = "print.product.label"
_description = 'Wizard to print Product Labels'
@api.model
def _complete_label_fields(self, label_ids: List[int]) -> List[int]:
"""Set additional fields for product labels. Method to override."""
# Increase a label sequence
labels = self.env['print.product.label.line'].browse(label_ids)
for seq, label in enumerate(labels):
label.sequence = 1000 + seq
return label_ids
@api.model
def _get_product_label_ids(self):
res = []
# flake8: noqa: E501
if self._context.get('active_model') == 'product.template':
products = self.env[self._context.get('active_model')].browse(
self._context.get('default_product_template_ids')
)
for product in products:
label = self.env['print.product.label.line'].create({
'product_id': product.product_variant_id.id,
})
res.append(label.id)
elif self._context.get('active_model') == 'product.product':
products = self.env[self._context.get('active_model')].browse(
self._context.get('default_product_product_ids')
)
for product in products:
label = self.env['print.product.label.line'].create({'product_id': product.id})
res.append(label.id)
res = self._complete_label_fields(res)
return res
@api.model
def default_get(self, fields_list):
default_vals = super(PrintProductLabel, self).default_get(fields_list)
if 'label_type_id' in fields_list and not default_vals.get('label_type_id'):
default_vals['label_type_id'] = self.env.ref('garazd_product_label.type_product').id
return default_vals
name = fields.Char(default='Print Product Labels')
message = fields.Char(readonly=True)
output = fields.Selection(selection=[('pdf', 'PDF')], string='Print to', default='pdf')
mode = fields.Selection(
selection=[('product.product', 'Products')],
help='Technical field to specify the mode of the label printing wizard.',
default='product.product',
)
label_type_id = fields.Many2one(comodel_name='print.label.type', string='Label Type')
label_ids = fields.One2many(
comodel_name='print.product.label.line',
inverse_name='wizard_id',
string='Labels for Products',
default=_get_product_label_ids,
)
report_id = fields.Many2one(
comodel_name='ir.actions.report',
string='Label',
domain=[('model', '=', 'print.product.label.line')],
)
is_template_report = fields.Boolean(compute='_compute_is_template_report')
qty_per_product = fields.Integer(
string='Label quantity per product',
default=1,
)
# Options
humanreadable = fields.Boolean(
string='Human readable barcode',
help='Print digital code of barcode.',
default=False,
)
border_width = fields.Integer(
string='Border',
help='Border width for labels (in pixels). Set "0" for no border.'
)
lang = fields.Selection(
selection=_lang_get,
string='Language',
help="The language that will be used to translate label names.",
)
company_id = fields.Many2one(
comodel_name='res.company',
help='Specify a company for product labels.'
)
@api.depends('report_id')
def _compute_is_template_report(self):
for wizard in self:
# flake8: noqa: E501
wizard.is_template_report = self.report_id == self.env.ref('garazd_product_label.action_report_product_label_from_template')
def get_labels_to_print(self):
self.ensure_one()
labels = self.label_ids.filtered(lambda l: l.selected and l.qty)
if not labels:
raise UserError(_('Nothing to print, set the quantity of labels in the table.'))
return labels
def _get_report_action_params(self):
"""Return two params for a report action: record "ids" and "data"."""
self.ensure_one()
return self.get_labels_to_print().ids, None
def _prepare_report(self):
self.ensure_one()
output_mode = self._context.get('print_mode', 'pdf')
if not self.report_id:
raise UserError(_('Please select a label type.'))
report = self.report_id.with_context(discard_logo_check=True, lang=self.lang)
report.sudo().write({'report_type': f'qweb-{output_mode}'})
return report
def action_print(self):
"""Print labels."""
self.ensure_one()
report = self._prepare_report()
return report.report_action(*self._get_report_action_params())
def action_set_qty(self):
"""Set a specific number of labels for all lines."""
self.ensure_one()
self.label_ids.write({'qty': self.qty_per_product})
def action_restore_initial_qty(self):
"""Restore the initial number of labels for all lines."""
self.ensure_one()
for label in self.label_ids:
if label.qty_initial:
label.update({'qty': label.qty_initial})
@api.model
def get_quick_report_action(
self, model_name: str, ids: List[int], qty: int = None, template=None, force_direct: bool = False,
):
""" Allow to get a report action for custom labels. Method to override. """
wizard = self.with_context(
**{'active_model': model_name, f'default_{model_name.replace(".", "_")}_ids': ids}
).create({'report_id': self.env.ref('garazd_product_label.action_report_product_label_50x38').id})
return wizard.action_print()
@api.model
def _set_sequence(self, lbl, seq, processed):
if lbl in processed:
return seq, processed
lbl.sequence = seq
seq += 1
processed += lbl
return seq, processed
def action_sort_by_product(self):
self.ensure_one()
sequence = 1000
processed_labels = self.env['print.product.label.line'].browse()
# flake8: noqa: E501
for label in self.label_ids:
sequence, processed_labels = self._set_sequence(label, sequence, processed_labels)
tmpl_labels = self.label_ids.filtered(lambda l: l.product_id.product_tmpl_id == label.product_id.product_tmpl_id).sorted(lambda l: l.product_id.id, reverse=True) - label
for tmpl_label in tmpl_labels:
sequence, processed_labels = self._set_sequence(tmpl_label, sequence, processed_labels)
product_labels = tmpl_labels.filtered(lambda l: l.product_id == label.product_id) - tmpl_label
for product_label in product_labels:
sequence, processed_labels = self._set_sequence(product_label, sequence, processed_labels)
def get_pdf(self):
self.ensure_one()
report = self.with_context(print_mode='pdf')._prepare_report()
pdf_data = report._render_qweb_pdf(report, *self._get_report_action_params())
return base64.b64encode(pdf_data[0])

View File

@@ -0,0 +1,48 @@
# Copyright © 2018 Garazd Creation (<https://garazd.biz>)
# @author: Yurii Razumovskyi (<support@garazd.biz>)
# @author: Iryna Razumovska (<support@garazd.biz>)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.html).
from odoo import api, fields, models
class PrintProductLabelLine(models.TransientModel):
_name = "print.product.label.line"
_description = 'Line with a Product Label Data'
_order = 'sequence'
sequence = fields.Integer(default=900)
selected = fields.Boolean(string='Print', default=True)
wizard_id = fields.Many2one(comodel_name='print.product.label') # Do not make required
product_id = fields.Many2one(comodel_name='product.product', required=True)
barcode = fields.Char(compute='_compute_barcode')
qty_initial = fields.Integer(string='Initial Qty', default=1)
qty = fields.Integer(string='Label Qty', default=1)
custom_value = fields.Char(help="This field can be filled manually to use in label templates.")
company_id = fields.Many2one(comodel_name='res.company', compute='_compute_company_id')
# Allow users to specify a partner to use it on label templates
partner_id = fields.Many2one(comodel_name='res.partner', readonly=False)
@api.depends('wizard_id.company_id')
def _compute_company_id(self):
for label in self:
label.company_id = label.wizard_id.company_id.id \
if label.wizard_id.company_id else self.env.user.company_id.id
@api.depends('product_id')
def _compute_barcode(self):
for label in self:
label.barcode = label.product_id.barcode
def action_plus_qty(self):
self.ensure_one()
if not self.qty:
self.update({'selected': True})
self.update({'qty': self.qty + 1})
def action_minus_qty(self):
self.ensure_one()
if self.qty > 0:
self.update({'qty': self.qty - 1})
if not self.qty:
self.update({'selected': False})

View File

@@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="print_product_label_view_form" model="ir.ui.view">
<field name="name">print.product.label.view.form</field>
<field name="model">print.product.label</field>
<field name="arch" type="xml">
<form create="false" string="Print Product Labels">
<header>
<button name="action_print"
string="Print"
help="Print product labels"
type="object"
icon="fa-print"
class="btn-primary mr8"/>
<button name="action_print"
string="Preview"
context="{'print_mode': 'html'}"
help="Preview product labels"
type="object"
icon="fa-search"
class="border btn-light mr8"/>
<field name="label_type_id" widget="selection_badge" invisible="1"/> <!-- Technical field to specify the label type -->
</header>
<div class="oe_button_box" name="button_box"/>
<field name="mode" invisible="1"/> <!-- Technical field to specify the mode of the label printing wizard -->
<field name="is_template_report" invisible="1"/> <!-- Technical field to specify if the custom label template is selected -->
<div class="alert alert-info text-center mb-3" invisible="not message" role="alert">
<field name="message"/>
</div>
<group col="6" colspan="2" name="top_group">
<group name="output_format" col="2" colspan="1">
<field name="output" widget="badge"/>
</group>
<group name="label_report" col="2" colspan="2">
<field name="report_id" string="Label" widget="radio" />
</group>
<group name="label_template" col="2" colspan="2" invisible="not is_template_report">
<label for="report_id" string="Template"/>
<div class="o_row">
<a name="label_builder_link" invisible="not is_template_report" href="https://garazd.biz/r/kb3" title="How to get Product Label Builder" target="_blank" rel="noopener noreferrer">
<span>Get the Label Builder to create your own labels</span>
</a>
</div>
</group>
</group>
<div name="extra_action" class="oe_row">
<button name="action_sort_by_product" title="Sort labels by a product" icon="fa-sort-amount-desc" type="object" class="btn-xs btn-light"/>
<span class="text-muted px-3">|</span>
<field name="qty_per_product" class="mr-2 mt-1 text-right" help="Label quantity per product" style="width: 40px !important;"/>
<button name="action_set_qty" string="Set quantity" help="Set a certain quantity for each line." type="object" class="btn-xs btn-light mr-2"/>
<button name="action_restore_initial_qty" title="Restore initial quantity" help="Restore initial quantity" icon="fa-undo" type="object" class="btn-xs btn-light"/>
</div>
<notebook>
<page string="Labels" name="labels">
<field name="label_ids" mode="list">
<list editable="top" decoration-muted="qty==0">
<field name="sequence" widget="handle" width="0.5"/>
<field name="selected" widget="boolean_toggle"/>
<field name="partner_id" optional="hide"/>
<field name="product_id"/>
<field name="barcode" optional="show"/>
<field name="custom_value" optional="hide"/>
<field name="company_id" groups="base.group_multi_company" optional="hide"/>
<button name="action_minus_qty" type="object" title="Decrease Qty" icon="fa-minus" class="btn-light"/>
<field name="qty" sum="Total" width="0.6" class="text-center font-weight-bold"/>
<button name="action_plus_qty" type="object" title="Increase Qty" icon="fa-plus" class="btn-light"/>
</list>
</field>
</page>
<page string="Options" name="options">
<group name="general_options" class="o_label_nowrap">
<group>
<field name="lang" widget="radio" options="{'horizontal': true}"/>
<field name="humanreadable" widget="boolean_toggle" />
<field name="border_width" />
</group>
<group>
<field name="company_id" widget="radio" groups="base.group_multi_company"/>
</group>
</group>
</page>
</notebook>
</form>
</field>
</record>
<record id="action_print_label_from_template" model="ir.actions.act_window">
<field name="name">Custom Product Labels</field>
<field name="res_model">print.product.label</field>
<field name="view_mode">form</field>
<field name="target">current</field>
<field name="context">{'default_product_template_ids': context.get('active_ids', [])}</field>
<field name="binding_model_id" ref="product.model_product_template"/>
<field name="binding_type">report</field>
</record>
<record id="action_print_label_from_product" model="ir.actions.act_window">
<field name="name">Custom Product Labels</field>
<field name="res_model">print.product.label</field>
<field name="view_mode">form</field>
<field name="target">current</field>
<field name="context">{'default_product_product_ids': context.get('active_ids', [])}</field>
<field name="binding_model_id" ref="product.model_product_product"/>
<field name="binding_type">report</field>
</record>
</odoo>