[IMP] report_fillpdf: black, isort, prettier

This commit is contained in:
Cyril VINH-TUNG
2022-10-12 11:27:53 -10:00
parent fc700935da
commit e405538571
12 changed files with 144 additions and 120 deletions

View File

@@ -1,32 +1,31 @@
# Copyright 2017 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
'name': "Base report PDF Filler",
'summary': """
"name": "Base report PDF Filler",
"summary": """
Base module that fills PDFs""",
'author': 'Creu Blanca,'
'Odoo Community Association (OCA)',
'website': "http://github.com/oca/reporting-engine",
'category': 'Reporting',
'version': '11.0.1.0.1',
'license': 'AGPL-3',
'external_dependencies': {
'python': [
'fdfgen',
"author": "Creu Blanca," "Odoo Community Association (OCA)",
"website": "https://github.com/OCA/reporting-engine",
"category": "Reporting",
"version": "11.0.1.0.1",
"license": "AGPL-3",
"external_dependencies": {
"python": [
"fdfgen",
],
"bin": [
"pdftk",
],
'bin': [
'pdftk',
]
},
'depends': [
'base', 'web',
"depends": [
"base",
"web",
],
'data': [
'views/webclient_templates.xml',
"data": [
"views/webclient_templates.xml",
],
'demo': [
'demo/report.xml',
"demo": [
"demo/report.xml",
],
'installable': True,
"installable": True,
}

View File

@@ -1,41 +1,39 @@
# Copyright (C) 2017 Creu Blanca
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
from odoo.addons.web.controllers import main as report
from odoo.http import content_disposition, route, request
import json
from odoo.http import content_disposition, request, route
from odoo.addons.web.controllers import main as report
class ReportController(report.ReportController):
@route()
def report_routes(self, reportname, docids=None, converter=None, **data):
if converter == 'fillpdf':
report = request.env['ir.actions.report']._get_report_from_name(
reportname)
if converter == "fillpdf":
report = request.env["ir.actions.report"]._get_report_from_name(reportname)
context = dict(request.env.context)
if docids:
docids = [int(i) for i in docids.split(',')]
if data.get('options'):
data.update(json.loads(data.pop('options')))
if data.get('context'):
docids = [int(i) for i in docids.split(",")]
if data.get("options"):
data.update(json.loads(data.pop("options")))
if data.get("context"):
# Ignore 'lang' here, because the context in data is the one
# from the webclient *but* if the user explicitely wants to
# change the lang, this mechanism overwrites it.
data['context'] = json.loads(data['context'])
if data['context'].get('lang'):
del data['context']['lang']
context.update(data['context'])
pdf = report.with_context(context).render_fillpdf(
docids, data=data
)[0]
data["context"] = json.loads(data["context"])
if data["context"].get("lang"):
del data["context"]["lang"]
context.update(data["context"])
pdf = report.with_context(context).render_fillpdf(docids, data=data)[0]
pdfhttpheaders = [
('Content-Type', 'application/pdf'),
('Content-Length', len(pdf)),
("Content-Type", "application/pdf"),
("Content-Length", len(pdf)),
(
'Content-Disposition',
content_disposition(report.report_file + '.pdf')
)
"Content-Disposition",
content_disposition(report.report_file + ".pdf"),
),
]
return request.make_response(pdf, headers=pdfhttpheaders)
return super(ReportController, self).report_routes(

View File

@@ -1,33 +1,35 @@
# Copyright 2017 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models, _
from odoo import _, api, fields, models
from odoo.exceptions import UserError
class ReportAction(models.Model):
_inherit = 'ir.actions.report'
_inherit = "ir.actions.report"
report_type = fields.Selection(selection_add=[("fillpdf", "PDF Filler")])
@api.model
def render_fillpdf(self, docids, data):
report_model_name = 'report.%s' % self.report_name
report_model_name = "report.%s" % self.report_name
report_model = self.env.get(report_model_name)
if report_model is None:
raise UserError(_('%s model was not found' % report_model_name))
return report_model.with_context({
'active_model': self.model
}).fill_report(docids, data)
raise UserError(_("%s model was not found" % report_model_name))
return report_model.with_context({"active_model": self.model}).fill_report(
docids, data
)
@api.model
def _get_report_from_name(self, report_name):
res = super(ReportAction, self)._get_report_from_name(report_name)
if res:
return res
report_obj = self.env['ir.actions.report']
qwebtypes = ['fillpdf']
conditions = [('report_type', 'in', qwebtypes),
('report_name', '=', report_name)]
context = self.env['res.users'].context_get()
report_obj = self.env["ir.actions.report"]
qwebtypes = ["fillpdf"]
conditions = [
("report_type", "in", qwebtypes),
("report_name", "=", report_name),
]
context = self.env["res.users"].context_get()
return report_obj.with_context(context).search(conditions, limit=1)

View File

@@ -2,31 +2,36 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from io import BytesIO
import os
from contextlib import closing
import logging
import os
import tempfile
from subprocess import Popen, PIPE
from contextlib import closing
from io import BytesIO
from subprocess import PIPE, Popen
from odoo import api, models, tools
_logger = logging.getLogger(__name__)
try:
from fdfgen import forge_fdf
EXTERNAL_DEPENDENCY_BINARY_PDFTK = tools.find_in_path('pdftk')
EXTERNAL_DEPENDENCY_BINARY_PDFTK = tools.find_in_path("pdftk")
except (ImportError, IOError) as err:
_logger.debug('Error while importing: %s.' % err)
_logger.debug("Error while importing: %s." % err)
EXTERNAL_DEPENDENCY_BINARY_PDFTK = ""
class ReportFillPDFAbstract(models.AbstractModel):
_name = 'report.report_fillpdf.abstract'
_name = "report.report_fillpdf.abstract"
def fill_report(self, docids, data):
objs = self.env[self.env.context.get('active_model')].browse(docids)
return self.fill_pdf_form(
self.get_form(data, objs),
self.get_document_values(data, objs)), 'pdf'
objs = self.env[self.env.context.get("active_model")].browse(docids)
return (
self.fill_pdf_form(
self.get_form(data, objs), self.get_document_values(data, objs)
),
"pdf",
)
@api.model
def get_original_document_path(self, data, objs):
@@ -34,7 +39,7 @@ class ReportFillPDFAbstract(models.AbstractModel):
@api.model
def get_form(self, data, objs):
with open(self.get_original_document_path(data, objs), 'rb') as file:
with open(self.get_original_document_path(data, objs), "rb") as file:
result = file.read()
return result
@@ -45,17 +50,18 @@ class ReportFillPDFAbstract(models.AbstractModel):
@api.model
def fill_pdf_form(self, form, vals):
fdf = forge_fdf("", vals.items(), [], [], [])
document_fd, document_path = tempfile.mkstemp(
suffix='.pdf', prefix='')
with closing(os.fdopen(document_fd, 'wb')) as body_file:
document_fd, document_path = tempfile.mkstemp(suffix=".pdf", prefix="")
with closing(os.fdopen(document_fd, "wb")) as body_file:
body_file.write(form)
args = [
EXTERNAL_DEPENDENCY_BINARY_PDFTK,
document_path,
"fill_form", "-",
"output", "-",
"fill_form",
"-",
"output",
"-",
"dont_ask",
"flatten"
"flatten",
]
p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate(fdf)

View File

@@ -6,15 +6,14 @@ from odoo.modules import get_resource_path
class PartnerPDF(models.AbstractModel):
_name = 'report.report_fillpdf.partner_fillpdf'
_inherit = 'report.report_fillpdf.abstract'
_name = "report.report_fillpdf.partner_fillpdf"
_inherit = "report.report_fillpdf.abstract"
@api.model
def get_original_document_path(self, data, objs):
return get_resource_path(
'report_fillpdf', 'static/src/pdf', 'partner_pdf.pdf')
return get_resource_path("report_fillpdf", "static/src/pdf", "partner_pdf.pdf")
@api.model
def get_document_values(self, data, objs):
objs.ensure_one()
return {'name': objs.name}
return {"name": objs.name}

View File

@@ -1,42 +1,49 @@
// © 2017 Creu Blanca
// License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
odoo.define('report_fillpdf.report', function(require){
'use strict';
odoo.define("report_fillpdf.report", function (require) {
"use strict";
var ActionManager= require('web.ActionManager');
var crash_manager = require('web.crash_manager');
var framework = require('web.framework');
var ActionManager = require("web.ActionManager");
var crash_manager = require("web.crash_manager");
var framework = require("web.framework");
ActionManager.include({
ir_actions_report: function (action, options){
var self = this;
var cloned_action = _.clone(action);
if (cloned_action.report_type === 'fillpdf') {
framework.blockUI();
var report_fillpdf_url = 'report/fillpdf/' + cloned_action.report_name;
if(cloned_action.context.active_ids){
report_fillpdf_url += '/' + cloned_action.context.active_ids.join(',');
}else{
report_fillpdf_url += '?options=' + encodeURIComponent(JSON.stringify(cloned_action.data));
report_fillpdf_url += '&context=' + encodeURIComponent(JSON.stringify(cloned_action.context));
}
self.getSession().get_file({
url: report_fillpdf_url,
data: {data: JSON.stringify([
report_fillpdf_url,
cloned_action.report_type
])},
error: crash_manager.rpc_error.bind(crash_manager),
success: function (){
if(cloned_action && options && !cloned_action.dialog){
options.on_close();
}
ActionManager.include({
ir_actions_report: function (action, options) {
var self = this;
var cloned_action = _.clone(action);
if (cloned_action.report_type === "fillpdf") {
framework.blockUI();
var report_fillpdf_url = "report/fillpdf/" + cloned_action.report_name;
if (cloned_action.context.active_ids) {
report_fillpdf_url +=
"/" + cloned_action.context.active_ids.join(",");
} else {
report_fillpdf_url +=
"?options=" +
encodeURIComponent(JSON.stringify(cloned_action.data));
report_fillpdf_url +=
"&context=" +
encodeURIComponent(JSON.stringify(cloned_action.context));
}
});
framework.unblockUI();
return;
}
return self._super(action, options);
}
});
self.getSession().get_file({
url: report_fillpdf_url,
data: {
data: JSON.stringify([
report_fillpdf_url,
cloned_action.report_type,
]),
},
error: crash_manager.rpc_error.bind(crash_manager),
success: function () {
if (cloned_action && options && !cloned_action.dialog) {
options.on_close();
}
},
});
framework.unblockUI();
return;
}
return self._super(action, options);
},
});
});

View File

@@ -6,9 +6,9 @@ from odoo.tests import common
class TestReport(common.TransactionCase):
def test_report(self):
report_object = self.env['ir.actions.report']
report_name = 'report_fillpdf.partner_fillpdf'
report_object = self.env["ir.actions.report"]
report_name = "report_fillpdf.partner_fillpdf"
report = report_object._get_report_from_name(report_name)
docs = self.env['res.company'].search([], limit=1).partner_id
self.assertEqual(report.report_type, 'fillpdf')
docs = self.env["res.company"].search([], limit=1).partner_id
self.assertEqual(report.report_type, "fillpdf")
report.render(docs.ids, {})

View File

@@ -6,7 +6,10 @@
-->
<template id="assets_backend" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/report_fillpdf/static/src/js/report/qwebactionmanager.js"/>
<script
type="text/javascript"
src="/report_fillpdf/static/src/js/report/qwebactionmanager.js"
/>
</xpath>
</template>

View File

@@ -1,5 +1,6 @@
# generated from manifests external_dependencies
cryptography
endesive
fdfgen
py3o.formats
py3o.template

View File

@@ -0,0 +1 @@
../../../../report_fillpdf

View File

@@ -0,0 +1,2 @@
[bdist_wheel]
universal=1

View File

@@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)