Skip to content

Commit

Permalink
[ADD] stock_picking_auto_print
Browse files Browse the repository at this point in the history
  • Loading branch information
jbaudoux committed Mar 3, 2023
1 parent bfa46d4 commit 69e710e
Show file tree
Hide file tree
Showing 50 changed files with 2,236 additions and 7 deletions.
5 changes: 2 additions & 3 deletions base_report_to_label_printer/__manifest__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
# Copyright (C) 2022 Raumschmiede GmbH - Christopher Hansen (<https://www.raumschmiede.de>)
# Copyright 2022 Raumschmiede GmbH - Christopher Hansen (<https://www.raumschmiede.de>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "Report to label printer",
"version": "14.0.1.0.0",
"category": "Generic Modules/Base",
"author": "Raumschmiede GmbH - Christopher Hansen,"
" Odoo Community Association (OCA)",
"author": "Raumschmiede GmbH, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/report-print-send",
"license": "AGPL-3",
"depends": ["base_report_to_printer"],
Expand Down
4 changes: 2 additions & 2 deletions base_report_to_label_printer/models/ir_actions_report.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright (C) 2022 Raumschmiede GmbH - Christopher Hansen (<https://www.raumschmiede.de>)
# Copyright 2022 Raumschmiede GmbH - Christopher Hansen (<https://www.raumschmiede.de>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import fields, models
Expand All @@ -7,7 +7,7 @@
class IrActionsReport(models.Model):
_inherit = "ir.actions.report"

label = fields.Boolean(string="Report is a Label")
label = fields.Boolean("Report is a Label")

def _get_user_default_printer(self, user):
if self.label:
Expand Down
2 changes: 1 addition & 1 deletion base_report_to_label_printer/static/description/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
<title>Report to label printer</title>
<style type="text/css">

Expand Down
3 changes: 2 additions & 1 deletion base_report_to_printer/models/ir_actions_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
# Copyright (c) 2009 Albert Cervera i Areny <[email protected]>
# Copyright (C) 2011 Agile Business Group sagl (<http://www.agilebg.com>)
# Copyright (C) 2011 Domsense srl (<http://www.domsense.com>)
# Copyright (C) 2013-2014 Camptocamp (<http://www.camptocamp.com>)
# Copyright 2013 Camptocamp (<http://www.camptocamp.com>)
# Copyright 2022 Jacques-Etienne Baudoux (BCIM) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from time import time

Expand Down
77 changes: 77 additions & 0 deletions printing_auto_base/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
==================
printing_auto_base
==================

.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freport--print--send-lightgray.png?logo=github
:target: https://github.com/OCA/report-print-send/tree/14.0/printing_auto_base
:alt: OCA/report-print-send
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/report-print-send-14-0/report-print-send-14-0-printing_auto_base
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/report-print-send&target_branch=14.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

Base module to support automatic priting of a report or attachments.

**Table of contents**

.. contents::
:local:

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/report-print-send/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/report-print-send/issues/new?body=module:%20printing_auto_base%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
~~~~~~~

* BCIM
* MT Software

Contributors
~~~~~~~~~~~~

* Jacques-Etienne Baudoux (BCIM) <[email protected]>
* Michael Tietz (MT Software) <[email protected]>
* Camptocamp
* Christopher Hansen <[email protected]>

Maintainers
~~~~~~~~~~~

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/report-print-send <https://github.com/OCA/report-print-send/tree/14.0/printing_auto_base>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions printing_auto_base/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
17 changes: 17 additions & 0 deletions printing_auto_base/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright 2022 Jacques-Etienne Baudoux (BCIM) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "Printing Auto Base",
"author": "BCIM, MT Software, Odoo Community Association (OCA)",
"category": "Warehouse Management",
"data": [
"views/printing_auto.xml",
],
"depends": [
"base_report_to_printer",
],
"license": "AGPL-3",
"version": "14.0.1.0.0",
"website": "https://github.com/OCA/report-print-send",
}
2 changes: 2 additions & 0 deletions printing_auto_base/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import printing_auto
from . import printing_auto_mixin
140 changes: 140 additions & 0 deletions printing_auto_base/models/printing_auto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
# Copyright 2022 Jacques-Etienne Baudoux (BCIM) <[email protected]>
# Copyright 2022 Michael Tietz (MT Software) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

import base64

from odoo import _, api, fields, models
from odoo.exceptions import UserError, ValidationError
from odoo.osv import expression
from odoo.tools.safe_eval import safe_eval


class PrintingAuto(models.Model):
"""Configure which document to print automatically. This model must be
linked with a many2many relation from the another model from which you want
to print a document"""

_name = "printing.auto"
_description = "Printing Auto"

name = fields.Char(string="Name", required=True)

data_source = fields.Selection(
[
("report", "Report"),
("attachment", "Attachment"),
],
string="Data source",
default="report",
required=True,
help=(
"Choose to print the result of an odoo report or a pre-existing "
"attachment (useful for labels received from carriers that are "
"recorded on the picking as an attachment)"
),
)
report_id = fields.Many2one("ir.actions.report")
attachment_domain = fields.Char("Attachment domain", default="[]")

condition = fields.Char(
"Condition",
default="[]",
help="Give a domain that must be valid for printing this",
)
record_change = fields.Char(
"Record change", help="Select on which document the report must be executed"
)

printer_id = fields.Many2one("printing.printer", "Printer")
printer_tray_id = fields.Many2one("printing.tray", "Tray")
nbr_of_copies = fields.Integer("Number of Copies", default=1)

@api.constrains("data_source", "report_id", "attachment_domain")
def _check_data_source(self):
for rec in self:
if rec.data_source == "report" and not rec.report_id:
raise UserError(_("Report is not set"))
if rec.data_source == "attachment" and (
not rec.attachment_domain or rec.attachment_domain == "[]"
):
raise UserError(_("Attachment domain is not set"))

def _get_behaviour(self):
if self.printer_id:
result = {"printer": self.printer_id}
if self.printer_tray_id:
result["tray"] = self.printer_tray_id.system_name
return result
if self.data_source == "report":
return self.report_id.behaviour()
return self.env["ir.actions.report"]._get_user_default_print_behaviour()

def _get_record(self, record):
if self.record_change:
try:
return safe_eval(f"obj.{self.record_change}", {"obj": record})
except Exception as e:
raise ValidationError(
_("The Record change could not be applied because: %s") % str(e)
) from e
return record

def _check_condition(self, record):
domain = safe_eval(self.condition, {"env": self.env})
return record.filtered_domain(domain)

def _get_content(self, record):
generate_data_func = getattr(
self, f"_generate_data_from_{self.data_source}", None
)
if generate_data_func:
record = self._get_record(record)
return generate_data_func(record)
return []

def _prepare_attachment_domain(self, record):
domain = safe_eval(self.attachment_domain)
record_domain = [
("res_id", "=", record.id),
("res_model", "=", record._name),
]
return expression.AND([domain, record_domain])

def _generate_data_from_attachment(self, record):
domain = self._prepare_attachment_domain(record)
attachments = self.env["ir.attachment"].search(domain)
if not attachments:
raise ValidationError(_("No attachment was found."))
return [base64.b64decode(a.datas) for a in attachments]

def _generate_data_from_report(self, record):
self.ensure_one()
data, _ = self.report_id.with_context(must_skip_send_to_printer=True)._render(
record.id
)
return [data]

def do_print(self, record):
self.ensure_one()
record.ensure_one()

behaviour = self._get_behaviour()
printer = behaviour["printer"]

if self.nbr_of_copies <= 0:
return (printer, 0)
if not self._check_condition(record):
return (printer, 0)

if not printer:
raise UserError(
_("No printer configured to print this {}.").format(self.name)
)

count = 0
for content in self._get_content(record):
for _n in range(self.nbr_of_copies):
printer.print_document(report=None, content=content, **behaviour)
count += 1
return (printer, count)
61 changes: 61 additions & 0 deletions printing_auto_base/models/printing_auto_mixin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Copyright 2022 Jacques-Etienne Baudoux (BCIM) <[email protected]>
# Copyright 2022 Michael Tietz (MT Software) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging

from odoo import _, fields, models

_logger = logging.getLogger(__name__)


class PrintingAutoMixin(models.AbstractModel):
_name = "printing.auto.mixin"
_description = "Printing Auto Mixin"

auto_printing_ids = fields.Many2many(
"printing.auto", string="Auto Printing Configuration"
)
printing_auto_error = fields.Text("Printing error")

def _on_printing_auto_start(self):
self.write({"printing_auto_error": False})

def _printing_auto_done_post(self, auto, printer, count):
self.ensure_one()
self.message_post(
body=_("{name}: {count} document(s) sent to printer {printer}").format(
name=auto.name, count=count, printer=printer.name
)
)

def _on_printing_auto_done(self, auto, printer, count):
self._printing_auto_done_post(auto, printer, count)

def _on_printing_auto_error(self, e):
self.write({"printing_auto_error": str(e)})

def _get_printing_auto(self):
return self.auto_printing_ids

def _handle_print_auto(self, printing_auto):
self.ensure_one()
printing_auto.ensure_one()
try:
with self.env.cr.savepoint():
printer, count = printing_auto.do_print(self)
if count:
self._on_printing_auto_done(printing_auto, printer, count)
except Exception as e:
_logger.exception(
"An error occurred while printing '%s' for record %s.",
printing_auto,
self,
)
self._on_printing_auto_error(e)

def handle_print_auto(self):
"""Print some report or attachment directly to the corresponding printer."""
self._on_printing_auto_start()
for record in self:
for printing_auto in record._get_printing_auto():
record._handle_print_auto(printing_auto)
4 changes: 4 additions & 0 deletions printing_auto_base/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
* Jacques-Etienne Baudoux (BCIM) <[email protected]>
* Michael Tietz (MT Software) <[email protected]>
* Camptocamp
* Christopher Hansen <[email protected]>
1 change: 1 addition & 0 deletions printing_auto_base/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Base module to support automatic priting of a report or attachments.
Loading

0 comments on commit 69e710e

Please sign in to comment.