Skip to content

Commit

Permalink
[IMP] report_fillpdf: black, isort, prettier
Browse files Browse the repository at this point in the history
  • Loading branch information
cvinh committed Oct 12, 2022
1 parent 30602d7 commit 9fbb548
Show file tree
Hide file tree
Showing 12 changed files with 144 additions and 120 deletions.
43 changes: 21 additions & 22 deletions report_fillpdf/__manifest__.py
Original file line number Diff line number Diff line change
@@ -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,
}
42 changes: 20 additions & 22 deletions report_fillpdf/controllers/main.py
Original file line number Diff line number Diff line change
@@ -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(
Expand Down
26 changes: 14 additions & 12 deletions report_fillpdf/models/ir_report.py
Original file line number Diff line number Diff line change
@@ -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)
42 changes: 24 additions & 18 deletions report_fillpdf/report/report_fill_pdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,44 @@
# 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):
raise NotImplementedError()

@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

Expand All @@ -45,17 +50,18 @@ def get_document_values(self, data, objs):
@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)
Expand Down
9 changes: 4 additions & 5 deletions report_fillpdf/report/report_partner_pdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,14 @@


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}
79 changes: 43 additions & 36 deletions report_fillpdf/static/src/js/report/qwebactionmanager.js
Original file line number Diff line number Diff line change
@@ -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);
},
});
});
8 changes: 4 additions & 4 deletions report_fillpdf/tests/test_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

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, {})
5 changes: 4 additions & 1 deletion report_fillpdf/views/webclient_templates.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# generated from manifests external_dependencies
cryptography
endesive
fdfgen
py3o.formats
py3o.template
1 change: 1 addition & 0 deletions setup/report_fillpdf/odoo/addons/report_fillpdf
2 changes: 2 additions & 0 deletions setup/report_fillpdf/setup.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[bdist_wheel]
universal=1
6 changes: 6 additions & 0 deletions setup/report_fillpdf/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

0 comments on commit 9fbb548

Please sign in to comment.