QWeb pdf report odoo 10 - pdf

I am new in odoo I want to make a report pdf to my model, I have try all tuto I have find in net youtube, google but no one work for me please give me an advice.
there is my model :
# modelx.py file
from openerp import models, fields, api
class omega(models.Model):
_name = 'omega.model'
_description = 'No Description for now !!'
#api.model
def render_html(self, docids, data=None):
report_obj = self.env['report']
report = report_obj._get_report_from_name('report.external_layout')
docargs = {
'doc_ids': docids,
'doc_model': report.model,
'docs': self,
}
return report_obj.render('report.external_layout', docargs)
state = fields.Selection([
('Nouveau', 'Nouveau'),
('valid', 'Validation Responsable'),
('Termine', 'Termine'),
],default='Nouveau')
#api.one
def confirmer(self):
self.write({
'state': 'valid',
})
employe = fields.Many2one(comodel_name="res.users", string="Employe", required=True, delegate=True)
date = fields.Datetime(string="Date", required=True)
date2 = fields.Date(string="Date2", required=True)
day_number = fields.Integer(string="Nombre de jour", required=True)
transport = fields.Selection(string="Transport", selection=[('1', 'Train'), ('2', 'Voiture de Service'), ('3', 'Avion')])
sujet = fields.Char(string="Sujet", required=True)
lieu = fields.Char(string="Lieu", required=False)
I have also this two file XML:
<!-- report.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<openerp>
<data>
<report
id="action_report_omega"
model="omega.model"
string="Report"
report_type="qweb-pdf"
file="report.external_layout"
name="report.external_layout"
/>
</data>
</openerp>
and this file for template view as I find in net and odoo documentation
<!-- report_template.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<openerp>
<data>
<template id="report_omega_document">
<t t-call="report.html_container">
<t t-call="report.external_layout">
<div class="page">
<div class="oe_structure">
<div class="row">
<H1>Hi there hello</H1>
</div>
</div>
</div>
</t>
</t>
</template>
<template id="report_omega">
<t t-call="report.html_container">
<t t-call="report.external_layout">
<t t-foreach="doc_ids" t-as="doc_id">
<div class="page">
<div class="oe_structure">
<div class="row">
<H3>Hi hello </H3>
</div>
</div>
</div>
</t>
</t>
</t>
</template>
</data>
</openerp>
when I execute the programme for printing the report I get an empty file, give me any advice please

You need to change file and name attribute of report tag. It always represent module_name.report_template_name
<report
id="action_report_omega"
model="omega.model"
string="Report"
report_type="qweb-pdf"
file="your_module_name.report_omega"
name="your_module_name.report_omega"
/>
Afterwards, upgrade your module and try it. It should work fine.
For more details, you may refer Qweb Reports - Odoo10 Document.

Related

Generate html and render in qweb

Is it possible generate html in .py file and render in qweb?
<openerp>
<data>
<record id="paperformat_time" model="report.paperformat">
<field name="name">Time</field>
<field name="font_size">10</field>
</record>
<report id="time_qweb" model="hr_timesheet_sheet.sheet" string="Time"
report_type="qweb-pdf" name="time.report_time" file="time.report_time" />
<record id="time_qweb" model="ir.actions.report.xml">
<field name="paperformat_id" ref="time.paperformat_time" />
</record>
</data>
</openerp>
qweb
<template id="report_time">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="t">
<span t-esc="t.__compute_html()" />
<div class="page">
<span t-field="t.html_text " />
</div>
</t>
</t>
</template>
.py file
class Time(models.Model):
_inherit = 'hr_timesheet_sheet.sheet'
html_text = fields.Html(string = 'Html')
#api.one
def _compute_html(self):
html_value = "<h1>TEST</h1>"
html_value += "<h1>TEST 2</h1>"
self.html_text = html_value
eg.
html_value = "<h1> + employee_id.name + "</h1>"
html_value += "<h1> + employee_id.phone + "</h1>"
now I need html_value render in qweb in put in <div class="page"> put here html_value </div>
Now I save text in database, any better solution?................................
Yes you can if you have a variable that have html code if you use t-esc or t-field odoo will print it as text.
If you want to render it use. t-raw
<div t-raw="doc.some_attribute" > </div>
Or
<t t-raw="doc.some_attribute" > </t>
You can try this
<span t-raw="my_html_field"/>
Here my_html_field is your html formated data
Since Odoo version 15, t-raw is deprecated. You need to render the HTML in a safe way using Python, then parse that into XML. Reference
import markupsafe
...
class YourController(http.Controller):
...
#http.route(...)
def your_rendering_method(self):
...
return request.render("YOUR_TEMPLATE", {"YOUR_FIELD": markupsafe.Markup("<a href='https://www.stackoverflow.com'>Stack Overflow</a>")})
<t t-esc="YOUR_FIELD" />

Odoo 10 how to replace inherited qweb template content

I have tried to insert a tag into an existing template but couldn't get it to work.
Existing template in odoo/addons/mail/static/src/xml/thread.xml
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="mail.ChatThread">
<t t-if="messages.length">
:
<t t-name="mail.ChatComposer.Attachments">
<div class="o_attachments">
<t t-foreach="attachments" t-as='attachment'>
<t t-call="mail.Attachment">
<t t-set="editable" t-value="true"/>
</t>
</t>
</div>
</t>
<t t-name="mail.Attachment">
<div t-attf-class="o_attachment #{attachment.upload ? 'o_attachment_uploading' : ''}" t-att-title="attachment.name">
<a class="o_image" t-att-href='attachment.url' target="_blank" t-att-data-mimetype="attachment.mimetype" t-attf-data-src="/web/image/#{attachment.id}/100x80">
<span class='o_attachment_name'><t t-esc='attachment.name'/></span>
</a>
<t t-if="editable">
<div class="o_attachment_delete">
<i class='fa fa-times-circle' title="Delete this attachment" t-att-data-id="attachment.id"/>
</div>
<div class="o_attachment_progress_bar">
Uploading
</div>
</t>
</div>
</t>
My custom template (odoo/addons/mycustom/static/src/xml/thread.xml):
I want to insert the Hello world after the class o_image in the original template.
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="mycustom.ImageAttachment" t-extend="mail.Attachment">
<t t-jquery="o_image" t-operation="append">
<div>Hello world</div>
</t>
</t>
</templates>
My javascript to render the template (odoo/addons/mycustom/static/src/js/thread.js):
odoo.define('mycustom.thread', function (require) {
"use strict";
var core = require('web.core');
var ajax = require('web.ajax');
var qweb = core.qweb;
ajax.loadXML('/mycustom/static/src/xml/thread.xml', qweb);
console.log("INFO", "Hello World")
});
My assets file (odoo/addons/mycustom/views/assets.xml):
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="assets_backend" name="my assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/mycustom/static/src/js/thread.js"></script>
</xpath>
</template>
</odoo>
My manifest file (odoo/addons/mycustom/manifest.py):
# -*- coding: utf-8 -*-
{
'name': "test",
'summary': """my test""",
'description': """
This is my test module.
""",
'author': "peter",
'website': "",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'Test',
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base','mail'],
# always loaded
'data': [
'views/assets.xml',
],
'qweb': [
'static/src/xml/thread.xml',
],
}
The javascript is loaded because I can see the text Hello World written on the browser console.
However, I cannot see the <div>Hello World</div> in the chat thread. What did I miss?
Try this:
<t t-name="mail.Attachment" t-extend="mail.Attachment">
<t t-jquery="o_image" t-operation="inner">
<div>Hello world</div>
</t>
</t>
Hope it will help you.

Odoo9 Custom Print option shows Internal server error

Inside PDF it shows Internal server error. Any solutions?
1.View
<button name="print_button" string="Print" type="object" states="approved" />
2. Report View
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report
id="print_expense_report"
string="Expenses"
model="custom.expenses"
report_type="qweb-pdf"
file="custom_expenses.report_without_prices"
name="custom_expenses.report_without_prices"
/>
</data>
</openerp>
3. Print View
<?xml version="1.0" encoding="utf-8"?>
<!--Custom report.-->
<openerp>
<data>
<template id="report_without_prices_document">
<div class="page">
<div class="row">
<h3>Title1</h3>
</div>
</div>
</template>
<template id="report_without_prices">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="report_without_prices_document" t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>
</data>
</openerp>
3. Module
#api.multi
def print_button(self):
return self.env['report'].get_action(self, 'custom_expenses.report_without_prices')

QWebException: "'NoneType' object has no attribute 'with_context'" while evaluating "doc.with_context({'lang':doc.partner_id.lang})"

I am new to odoo, I created a module by inheriting sales_order to create a custom report. I am getting the above error when I am printing the report. Need help please?
Here is the code snippets:
test/my_module.py:
class sale_order(models.Model):
_name = 'sale.order'
_description = 'Inheritance'
_inherit = 'sale.order'
test/views/report_template_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="test_report">
<t t-call="report.html_container">
<t t-call="report.internal_layout">
<t t-set="doc" t-value="doc.with_context({'lang':doc.partner_id.lang})"/>
<div class="page">
<div class="oe_structure"/>
<div> <strong><left>User</left></strong>
<p t-field="doc.user_id"/>
</div>
</div>
</t>
</t>
</template>
</data>
How can I access records in custom_report_template?
i know i'm late but the name of the variable containing the recordSet passed to the template is docs not doc.
and you are trying to get value from a variable that don't have anything.
doc.with_context({'lang':doc.partner_id.lang})
i think you need to do docs not doc because doc is None
This why all template in loop docs :
<t t-foreach="docs" t-as="o">

ParseError: External ID conflict while creating custom qweb report

I created a folder called Student. When i open this module i am getting the above said error. this is my opennerp file,
{
'name': "Student",
'version': '1.0',
'sequence': 7,
'depends': ['base','report'],
'author': "ZD",
'category': 'Testing',
'description': "Module used for testing purpose only",
'data': [
'student_custom_view.xml',
'views/Student_report123.xml',
'Student_report.xml',
],
'installable': True,
'auto_install': False,
}
Then in .py file,
class student(models.Model):
_name = 'student'
name = fields.Char(string='Number', compute='_compute_name')
total2 = fields.Char(string='Total in words', compute='_compute_total')
student_report.xml,
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report
id="Student_report123"
string="Report"
model="student"
report_type="qweb-pdf"
file="Student.Student_report123"
name="Student.Student_report123"
attachment_use="False"
/>
</data>
</openerp>
Inside views folder i created a file called Student_report123.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="Student_report123">
<t t-call="report.external_layout">
<div class="page">
<div class="row">
<span t-field="o.total2"></span>
</div>
</div>
</t>
</template>
</data>
</openerp>
Under you student_report.xml file and student_report123.xml file the id provided are xml ids and no two xml ids are allowed same. Xml IDs must be unique throughout the database.
you can try this code:
<t t-name="student_report123">
<t t-call="report.external_layout">
<div class="page">
<div class="row">
<h2>Success</h2>
<span t-field="o.total2"/>
</div>
</div>
</t>
</t>