Initial commit
165
garazd_product_label/LICENSE
Normal 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.
|
||||
55
garazd_product_label/README.rst
Normal 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.
|
||||
2
garazd_product_label/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from . import models
|
||||
from . import wizard
|
||||
35
garazd_product_label/__manifest__.py
Normal 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,
|
||||
}
|
||||
12
garazd_product_label/data/ir_filters_data.xml
Normal 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>
|
||||
7
garazd_product_label/data/print_label_type_data.xml
Normal 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>
|
||||
14
garazd_product_label/data/product_data.xml
Normal 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>
|
||||
8
garazd_product_label/demo/ir_filters_demo.xml
Normal 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>
|
||||
21
garazd_product_label/demo/product_demo.xml
Normal 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>
|
||||
18
garazd_product_label/doc/changelog.rst
Normal 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.
|
||||
|
||||
|
||||
443
garazd_product_label/i18n/uk_UA.po
Normal 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 ""
|
||||
"Ви можете фільтрувати шаблони етикеток, вибравши їх тип. Це має сенс, "
|
||||
"якщо ви використовуєте додаткові розширення для друку етикеток не лише для товарів, "
|
||||
"а й для інших об'єктів, таких як складські переміщення, замовлення на продаж, виробничі "
|
||||
"замовлення тощо. >>> Щоб переглянути доступні розширення, перейдіть до меню \"Дії\" та "
|
||||
"натисніть \"Отримати розширення\"."
|
||||
4
garazd_product_label/models/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from . import res_config_settings
|
||||
from . import product_template
|
||||
from . import product_product
|
||||
from . import print_label_type
|
||||
11
garazd_product_label/models/print_label_type.py
Normal 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.')]
|
||||
13
garazd_product_label/models/product_product.py
Normal 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
|
||||
13
garazd_product_label/models/product_template.py
Normal 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
|
||||
7
garazd_product_label/models/res_config_settings.py
Normal 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')
|
||||
68
garazd_product_label/report/product_label_reports.xml
Normal 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>
|
||||
101
garazd_product_label/report/product_label_templates.xml
Normal 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>
|
||||
4
garazd_product_label/security/ir.model.access.csv
Normal 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
|
||||
|
BIN
garazd_product_label/static/description/banner.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 58 KiB |
BIN
garazd_product_label/static/description/banner_youtube.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
garazd_product_label/static/description/icon.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
484
garazd_product_label/static/description/index.html
Normal 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&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 & 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&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 © <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>
|
||||
|
||||
BIN
garazd_product_label/static/description/label_print_wizard.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 124 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 191 KiB |
BIN
garazd_product_label/static/description/select_products.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
1
garazd_product_label/tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import test_print_product_label
|
||||
31
garazd_product_label/tests/test_print_product_label.py
Normal 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'
|
||||
)
|
||||
21
garazd_product_label/views/res_config_settings_views.xml
Normal 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>
|
||||
2
garazd_product_label/wizard/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from . import print_product_label_line
|
||||
from . import print_product_label
|
||||
184
garazd_product_label/wizard/print_product_label.py
Normal 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])
|
||||
48
garazd_product_label/wizard/print_product_label_line.py
Normal 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})
|
||||
108
garazd_product_label/wizard/print_product_label_views.xml
Normal 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>
|
||||