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">