Odoo8 - 根据给定的用户和数据范围从 Python 生成报告
Odoo8 - generate report from Python by given user and data range
我需要为给定数据范围内的给定用户生成时间表报告。
而且我还需要按日期对时间表的小时数求和,以便报告中的每一行都有唯一的日期。
我已经准备好简单的报告以及用于选择特定用户和日期的向导。
但我在 Python 中实际生成报告并将数据传递给报告时遇到了问题。当我单击向导上的打印按钮时,出现此错误:
ProgrammingError: relation "hr_timesheet_karty_wizard" does not exist
LINE 1: INSERT INTO "hr_timesheet_karty_wizard" ("id", "date_from", ...
我做错了什么?
我不太确定如何处理 records
。我应该将它们放在 'doc_ids' 还是 'docs' 中?
如何按日期对记录求和?
我正在使用 Odoo 8。
这是我的 python 代码:
# __init__.py
# -*- coding: utf-8 -*-
from . import wizard
# wizard/__init__.py
# -*- coding: utf-8 -*-
from . import wizard_karty
# wizard/wizard_karty.py
from openerp import api, models, fields
from datetime import datetime
class hr_timesheet_karty_wizard(models.AbstractModel):
_name = 'hr.timesheet.karty.wizard'
employee_id = fields.Many2one(comodel_name="hr.employee", required=True)
date_from = fields.Date(default=fields.Datetime.now, required=True)
date_to = fields.Date(default=fields.Datetime.now, required=True)
@api.multi
def print_report(self, data=None):
records = self.env['hr.analytic.timesheet'].search([('employee_id', '=', self.employee_id),('date_from', '>=', self.date_from),('date_to', '<=', self.date_to)])
# sum records hours if date is the same (group by date)
report_obj = self.env['report']
report = report_obj._get_report_from_name('hr_timesheet_karty.template_hr_timesheet_karty')
docargs = {
'doc_ids': self._ids,
'doc_model': report.model,
'docs': records,
}
return report_obj.render('hr_timesheet_karty.template_hr_timesheet_karty', docargs)
这是我的向导:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_hr_timesheet_karty_wizard" model="ir.ui.view">
<field name="name">hr.timesheet.karty.wizard.form</field>
<field name="model">hr.timesheet.karty.wizard</field>
<field name="arch" type="xml">
<form string="Leaves by Department">
<group>
<field name="employee_id"/>
<field name="date_from"/>
<field name="date_to"/>
</group>
<footer>
<button name="print_report" string="Print" type="object" class="oe_highlight"/> or
<button string="Cancel" special="cancel" class="oe_link"/>
</footer>
</form>
</field>
</record>
<record id="action_hr_timesheet_karty_wizard" model="ir.actions.act_window">
<field name="name">Time sheet report</field>
<field name="res_model">hr.timesheet.karty.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_hr_timesheet_karty_wizard"/>
<field name="target">new</field>
</record>
<menuitem id="menu_hr_timesheet_karty_wizard"
name="Time sheet report"
parent="hr.menu_hr_reporting_timesheet"
action="action_hr_timesheet_karty_wizard"
sequence="1"
icon="STOCK_PRINT"/>
</data>
</openerp>
这是我的报告:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report
id="action_hr_timesheet_karty"
string="Time sheet report"
model="hr.analytic.timesheet"
report_type="qweb-pdf"
name="hr_timesheet_karty.template_report_hr_timesheet_karty"
/>
<template id="template_hr_timesheet_karty">
<t t-call="report.html_container">
<t t-call="report.external_layout">
<div class="page">
<table class="table table-condensed">
<thead>
<tr>
<th>User</th>
<th>Date</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<tr t-foreach="docs" t-as="o">
<td><span t-field="o.user_id.name"/></td>
<td><span t-field="o.date"/></td>
<td class="text-right"><span t-field="o.unit_amount"/> h</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
</data>
</openerp>
请帮忙
该错误消息表明您的数据库中没有 table 向导。即使它是一个抽象模型,它也应该有一个。
您是否在 __init__.py
文件中导入 Python 代码?
Abstract Model super-class 用于创建抽象 class 意味着由常规模型(模型或 TransientModels)继承 但不能单独使用或坚持.
_auto = False
# 不要为 AbstractModels 创建任何数据库后端
_register = False
# 在 ORM 注册表中不可见,意味着 python-仅继承
TransientModel
用于临时数据,存储在数据库中但每隔一段时间自动清理。
您需要使用 TransientModel
而不是 AbstractModel
。
class hr_timesheet_karty_wizard(models.TransientModel):
_name = 'hr.timesheet.karty.wizard'
print_report
方法看起来像 qweb 报告解析器的 render_html
方法。
将print_report
更改为:
@api.multi
def print_report(self):
self.ensure_one()
datas = {'wizard_id': self.id}
return self.env['report'].get_action(self, 'hr_timesheet_karty.template_hr_timesheet_karty', data=datas)
添加报表解析器:
class HrTimesheetKartyReport(models.AbstractModel):
_name = 'report.hr_timesheet_karty.template_hr_timesheet_karty'
@api.multi
def render_html(self, data=None):
hr_analytic_timesheet = self.env['hr.analytic.timesheet']
if data and 'wizard_id' in data:
wizard = self.env['hr.timesheet.karty.wizard'].browse(data['wizard_id'])
records = hr_analytic_timesheet.search([('employee_id', '=', wizard.employee_id.id),
('date_from', '>=', wizard.date_from),
('date_to', '<=', wizard.date_to)])
else:
records = hr_analytic_timesheet.browse(self._ids)
# sum records hours if date is the same (group by date)
report_obj = self.env['report']
report = report_obj._get_report_from_name('hr_timesheet_karty.template_hr_timesheet_karty')
docargs = {
'doc_ids': self._ids,
'doc_model': report.model,
'docs': records,
}
return report_obj.render('hr_timesheet_karty.template_hr_timesheet_karty', docargs)
将报告操作名称和模板 ID 更改为 hr_timesheet_karty.template_hr_timesheet_karty
。
<report
id="action_hr_timesheet_karty"
string="Time sheet report"
model="hr.analytic.timesheet"
report_type="qweb-pdf"
name="hr_timesheet_karty.template_hr_timesheet_karty"
/>
<template id="template_hr_timesheet_karty">
我需要为给定数据范围内的给定用户生成时间表报告。 而且我还需要按日期对时间表的小时数求和,以便报告中的每一行都有唯一的日期。
我已经准备好简单的报告以及用于选择特定用户和日期的向导。
但我在 Python 中实际生成报告并将数据传递给报告时遇到了问题。当我单击向导上的打印按钮时,出现此错误:
ProgrammingError: relation "hr_timesheet_karty_wizard" does not exist
LINE 1: INSERT INTO "hr_timesheet_karty_wizard" ("id", "date_from", ...
我做错了什么?
我不太确定如何处理 records
。我应该将它们放在 'doc_ids' 还是 'docs' 中?
如何按日期对记录求和?
我正在使用 Odoo 8。
这是我的 python 代码:
# __init__.py
# -*- coding: utf-8 -*-
from . import wizard
# wizard/__init__.py
# -*- coding: utf-8 -*-
from . import wizard_karty
# wizard/wizard_karty.py
from openerp import api, models, fields
from datetime import datetime
class hr_timesheet_karty_wizard(models.AbstractModel):
_name = 'hr.timesheet.karty.wizard'
employee_id = fields.Many2one(comodel_name="hr.employee", required=True)
date_from = fields.Date(default=fields.Datetime.now, required=True)
date_to = fields.Date(default=fields.Datetime.now, required=True)
@api.multi
def print_report(self, data=None):
records = self.env['hr.analytic.timesheet'].search([('employee_id', '=', self.employee_id),('date_from', '>=', self.date_from),('date_to', '<=', self.date_to)])
# sum records hours if date is the same (group by date)
report_obj = self.env['report']
report = report_obj._get_report_from_name('hr_timesheet_karty.template_hr_timesheet_karty')
docargs = {
'doc_ids': self._ids,
'doc_model': report.model,
'docs': records,
}
return report_obj.render('hr_timesheet_karty.template_hr_timesheet_karty', docargs)
这是我的向导:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_hr_timesheet_karty_wizard" model="ir.ui.view">
<field name="name">hr.timesheet.karty.wizard.form</field>
<field name="model">hr.timesheet.karty.wizard</field>
<field name="arch" type="xml">
<form string="Leaves by Department">
<group>
<field name="employee_id"/>
<field name="date_from"/>
<field name="date_to"/>
</group>
<footer>
<button name="print_report" string="Print" type="object" class="oe_highlight"/> or
<button string="Cancel" special="cancel" class="oe_link"/>
</footer>
</form>
</field>
</record>
<record id="action_hr_timesheet_karty_wizard" model="ir.actions.act_window">
<field name="name">Time sheet report</field>
<field name="res_model">hr.timesheet.karty.wizard</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_hr_timesheet_karty_wizard"/>
<field name="target">new</field>
</record>
<menuitem id="menu_hr_timesheet_karty_wizard"
name="Time sheet report"
parent="hr.menu_hr_reporting_timesheet"
action="action_hr_timesheet_karty_wizard"
sequence="1"
icon="STOCK_PRINT"/>
</data>
</openerp>
这是我的报告:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<report
id="action_hr_timesheet_karty"
string="Time sheet report"
model="hr.analytic.timesheet"
report_type="qweb-pdf"
name="hr_timesheet_karty.template_report_hr_timesheet_karty"
/>
<template id="template_hr_timesheet_karty">
<t t-call="report.html_container">
<t t-call="report.external_layout">
<div class="page">
<table class="table table-condensed">
<thead>
<tr>
<th>User</th>
<th>Date</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<tr t-foreach="docs" t-as="o">
<td><span t-field="o.user_id.name"/></td>
<td><span t-field="o.date"/></td>
<td class="text-right"><span t-field="o.unit_amount"/> h</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
</data>
</openerp>
请帮忙
该错误消息表明您的数据库中没有 table 向导。即使它是一个抽象模型,它也应该有一个。
您是否在 __init__.py
文件中导入 Python 代码?
Abstract Model super-class 用于创建抽象 class 意味着由常规模型(模型或 TransientModels)继承 但不能单独使用或坚持.
_auto = False
# 不要为 AbstractModels 创建任何数据库后端_register = False
# 在 ORM 注册表中不可见,意味着 python-仅继承
TransientModel
用于临时数据,存储在数据库中但每隔一段时间自动清理。
您需要使用 TransientModel
而不是 AbstractModel
。
class hr_timesheet_karty_wizard(models.TransientModel):
_name = 'hr.timesheet.karty.wizard'
print_report
方法看起来像 qweb 报告解析器的 render_html
方法。
将
print_report
更改为:@api.multi def print_report(self): self.ensure_one() datas = {'wizard_id': self.id} return self.env['report'].get_action(self, 'hr_timesheet_karty.template_hr_timesheet_karty', data=datas)
添加报表解析器:
class HrTimesheetKartyReport(models.AbstractModel): _name = 'report.hr_timesheet_karty.template_hr_timesheet_karty' @api.multi def render_html(self, data=None): hr_analytic_timesheet = self.env['hr.analytic.timesheet'] if data and 'wizard_id' in data: wizard = self.env['hr.timesheet.karty.wizard'].browse(data['wizard_id']) records = hr_analytic_timesheet.search([('employee_id', '=', wizard.employee_id.id), ('date_from', '>=', wizard.date_from), ('date_to', '<=', wizard.date_to)]) else: records = hr_analytic_timesheet.browse(self._ids) # sum records hours if date is the same (group by date) report_obj = self.env['report'] report = report_obj._get_report_from_name('hr_timesheet_karty.template_hr_timesheet_karty') docargs = { 'doc_ids': self._ids, 'doc_model': report.model, 'docs': records, } return report_obj.render('hr_timesheet_karty.template_hr_timesheet_karty', docargs)
将报告操作名称和模板 ID 更改为
hr_timesheet_karty.template_hr_timesheet_karty
。<report id="action_hr_timesheet_karty" string="Time sheet report" model="hr.analytic.timesheet" report_type="qweb-pdf" name="hr_timesheet_karty.template_hr_timesheet_karty" /> <template id="template_hr_timesheet_karty">