Czarodzieje i raporty
Do pobrania parametrów służy mechanizm kreatora („czarodzieja”, wizard). Wykorzystuje się go na przykład przy uruchamianiu raportów.
Kreator budujemy w oparciu o model typu TransientModel.
Przykład
from odoo import models, fields, api
PARAMS = [
("login", "apps_odoo_com.login"),
("password", "apps_odoo_com.password"),
]
class Settings(models.TransientModel):
_name = 'apps_odoo_com.settings'
_inherit = 'res.config.settings'
login = fields.Char("Login")
password = fields.Char("Password")
@api.multi
def set_params(self):
self.ensure_one()
for field_name, key_name in PARAMS:
value = getattr(self, field_name, '').strip()
self.env['ir.config_parameter'].set_param(key_name, value)
def get_default_params(self, cr, uid, fields, context=None):
res = {}
for field_name, key_name in PARAMS:
res[field_name] = self.env['ir.config_parameter'].get_param(key_name, '').strip()
return res
Najczęściej to rozwiązanie stosuje się do otwierania okien lub raportów z parametrami. Model (TransientModel) służy do zapamiętania i przekazania parametrów. Oto prosty przykład wyboru rodzaju wydruku (PDF/HTML):
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class PrintWizard(models.TransientModel):
_name = 'demo_report.raport1wizard'
rodzaj = fields.Selection([('html','Strona HTML'),
('pdf','Raport PDF')], string="Rodzaj", default='pdf')
@api.multi
def procedura_druku_python(self): # druk raportu - wywolywany z okna wizarda
if self.rodzaj == 'pdf':
return self.env['report'].get_action(self, 'demo_report.demo_report_template')
else:
return self.env['report'].get_action(self,'demo_report.demo_report_template_html')
Odpowiedni wzorzec ekranu:
<!-- Print wizard (TransientModel) -->
<record id="demo_report.wizard_print" model="ir.ui.view">
<field name="name">demo_report.wizard.print</field>
<field name="model">demo_report.raport1wizard</field>
<field name="arch" type="xml">
<form string="Print report" version="10.0">
<group>
<field string="HTML/PDF" name="rodzaj" required="True" />
</group>
<footer>
<button name="procedura_druku_python" string="Print" type="object"
class="oe_highlight" />
<button special="cancel" string="Cancel" class="oe_link" />
</footer>
</form>
</field>
</record>
Modele typu TransientModel mają uproszczony sposób zarządzania prawami dostępu. Użytkownik ma dostęp do danych które sam utworzył. Administrator (super-user) ma nieograniczony dostp do wszystkich rekordów TransientModel.
Aby otworzyć taki wizard można dodać do menu wywołanie operacji otwarcia:
<!-- definicja akcji w menu -->
<record id="action_demo_report" model="ir.actions.act_window">
<field name="name">Uruchom raport</field>
<field name="res_model">demo_report.raport1wizard</field>
<field name="view_id" ref="demo_report.wizard_print"/>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="target">new</field>
</record>
<menuitem name="Demo - raport" id="menu_demo_report" sequence="1"
action='action_demo_report' />
Wzorce prostych raportów, otwieranych powyżej:
<template id="demo_report_template">
<t t-call="report.external_layout">
<div class="page">
<div class="row">
<div class="col-xs-12">
<h1 t-field="res_company.name" />
</div>
</div>
<div class="row">
<div class="col-xs-12">
Hello World
</div>
</div>
</div>
</t>
</template>
<template id="demo_report_template_html">
<t t-call="report.html_container">
<div class="page">
<div class="row">
<div class="col-xs-12">
<h1 t-field="res_company.name" />
</div>
</div>
<div class="row">
<div class="col-xs-12">
Hello World
</div>
</div>
</div>
</t>
</template>
<report
id="demo_report_action"
name="demo_report.demo_report_template"
string="Demo"
model="report.abstract_report"
report_type="qweb-pdf"
file="demo_report.demo_report_template"
attachment_use="False"
/>
<report
id="demo_report_action_html"
name="demo_report.demo_report_template_html"
string="Demo"
model="report.abstract_report"
report_type="qweb-html"
file="demo_report.demo_report_template_html"
attachment_use="False"
/>
Wzorce raporót tworzymy przy pomocy QWeb. Dostępne są przy tym następujące wartości:
- docs kolekcja rekordów do wydruku
- doc_ids - lista identyfikatorów (ID, klucz główny) rekordów do wydrukowania
- doc_model - identyfikator modelu
- time - odniesienie do biblioteki time (Python)
- user is the record for the user running the report
- res_company is the record for the current user's company
Z kolei w definicji operacji wywołania raportu (rekord "report") możemy użyć następujących atrybutów:
- id:- identyfikator raportu
- string:- opis raportu
- model:- Model z którym raport jest związany
- report_type - Typ reportu:
- qweb-pdf
- qweb-html
- controller (generowany przez program )
- xlsx
- Name: Nazwa (identyfikator zewnętrzny)
- File: wzorzec w postaci nazwa_katalogu.id_wzorca_raportu
- Groups:- Pole many2many ograniczające prawa dostępu
- attachement_use: jeśli ustawisz na True, raport będzie dołączany jako załącznik (np. obraz faktury dołączany do jej zapisu)
- paperformat_id: określenie formatu papueru (np. paperformat_id="a4_format")
- menu: menu wydruku (domyślnie True).
Można definiować swoje formaty papieru (plik XML). Na przykład:
<!-- format papieru -->
<record id="a4_format" model="report.paperformat">
<field name="name">A4</field>
<field name="default" eval="False" />
<field name="format">custom</field>
<field name="page_height">297</field>
<field name="page_width">220</field>
<field name="orientation">Portrait</field>
<field name="margin_top">0</field>
<field name="margin_bottom">0</field>
<field name="margin_left">10</field>
<field name="margin_right">10</field>
<field name="header_line" eval="False" />
<field name="header_spacing">10</field>
<field name="dpi">90</field>
</record>
-