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>

-