2. eq_rmanager: Implementierung

Anlegen der Tabellen

Die Tabellen der Datenbank werden als python Klassen angelegt. Diese Klassen werden dann von Odoo in SQL umgewandelt und in die Datenbank geschrieben. Dies macht SQL Kenntnisse überflüssig.

Um die Datenbank anlegen zu können muss das models Modul importiert werden

from odoo import models, fields, api

Es gilt folgende Felder anzulegen:

requirement: Bezeichnung der Anforderung sowie eine Beschreibung dieser.

name
description
author
target_language
source_language

Klasse der Tabelle:

class requirement(models.Model):

Jede Tabelle erhält einen Namen, dieser wird in der _name Variable hinterlegt. 

_name = 'requirement'

Jetzt folgen die entsprechenden Felder.

name = fields.Char()
author = fields.Many2one('res.users')
description = fields.Text()

source_language und target_language beziehen sich auf eine andere Tabelle. In diesem Fall ist dies die 'requirement.languages'. Many2one wird hier gewählt da aus vielen möglichen Sprachen eine ausgewählt werden soll.

Die ganze Klasse sieht dann so aus:

class requirement(models.Model):
	_name = 'requirement'
	name = fields.Char()
	author = fields.Many2one('res.users')
	description = fields.Text()

Startet man jetzt den Server neu, so kann man die Veränderung sehen(Eventuel muss der Browsercache gelöscht werden).

Der Menüpunkt öffnet dann die gerade definierte Ansicht.

Möchte man einen neuen Datansatz der Datenbank hinzufügen so clickt man auf create. Es erscheint dieses Formular.

Die vorher spezifizierten Datenbankfelder werden angezeigt und es können nun Datensätze hinzugefügt werden.

Als nächstes wird die languages Tabelle angelegt

class languages(models.Model):
	_name = 'requirement.languages'
	name = fields.Char()
	language = fields.Char()

Auf der Oberfläche haben die Felder die selben Namen wie die Variablen in python. Dies kann durch den string Parameter geändert werden.

class requirement(models.Model):
	_name = 'requirement'
	name = fields.Char(string='requirement')
	author = fields.Char()
	description = fields.Text()

Im unteren Bild wurde name zu requirement.

Jetzt werden die beiden Tabellen miteinander verknüpft. Hierzu wird in der requirement Tabelle folgende Zeilen hinzugefügt.

source_language = fields.Many2one('requirement.languages', string="source language")
target_language = fields.Many2one('requirement.languages', string="target language")

Many2one bedeutet dass aus allen Feldern von languages nur eines ausgewählt werden kann. Dadurch wird die Quell- und Zielsprache für die Übersetzung definiert.


line

Unterteilung der Anforderung in einzelne Punkte.

Felder:

name
name_translated
description
description_translated
requirement
image
image_translated
sections
complete_name

class line(models.Model):
    _name = 'requirement.line'
    name = fields.Char(string="line")
    name_translated = fields.Char(string="line translated")
    description = fields.Text(string="description")
    description_translated = fields.Text(string="description translated")
    image = fields.Binary(string="image")
    image_translated = fields.Binary(string="image translated")
    requirement = fields.Many2one('requirement', string="requirement")
    sections = fields.Many2one('requirement.sections', type="char", string='section', domain="[('requirement', '=', requirement)]")
    complete_name = fields.Char(compute='construct_complete_name', type="char", string='Name')

complet_name

	complete_name = fields.Char(compute='construct_complete_name', type="char", string='Name')

Der Parameter compute erlaubt es eine Methode aufzurufen. Auf diese Weise befüllte Felder werden nicht in der Datenbank gespeichert sondern erneut berechnet.

@api.multi
def construct_complete_name(self):
    for item in self:
        req_line = item.requirement.name, ''.join([x.name for x in item])
        item.complete_name = "%s / %s" %  (req_line[0], req_line[1])


Über das Feld requirement wird dessen Name ausgelesen und im Format requirement/line ausgegeben. Dadurch ist auf den ersten Blich erkennbar welche line zu welchem requirement gehört.

requirement_line_view.xml

<odoo>
    <data>
        <record model="ir.actions.act_window" id="requirement_line_list_action">
            <field name="name">line</field>
            <field name="res_model">requirement.line</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
            <field name="help" type="html">
                <p class="oe_view_nocontent_create">Create the first line
                </p>
            </field>
        </record>

        <menuitem id="line_menu" name="lines" parent="rmanager"
                  action="requirement_line_list_action"/>
    </data>
</odoo>

settings

Hinterlegen des API keys.

name
api_key
url 

class settings(models.Model):
    _name = 'requirement.settings'
    name = fields.Char()
    api_key = fields.Char(string="Google API Key")
    url = fields.Char(string="API URL")


requirement_settings_view.xml

<odoo>
    <data>
        <record model="ir.actions.act_window" id="requirement_settings_list_action">
            <field name="name">settings</field>
            <field name="res_model">requirement.settings</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
            <field name="help" type="html">
                <p class="oe_view_nocontent_create">Create the first settings
                </p>
            </field>
        </record>

        <menuitem id="settings_menu" name="settings" parent="rmanager"
                  action="requirement_settings_list_action"/>
    </data>
</odoo>

sections:

name
parent_id
complete_name
requirement
requirement_sections_view.xml

<odoo>
    <data>
        <record model="ir.actions.act_window" id="requirement_sections_list_action">
                <field name="name">sections</field>
                <field name="res_model">requirement.sections</field>
                <field name="view_type">form</field>
                <field name="view_mode">tree,form</field>
                <field name="help" type="html">
                    <p class="oe_view_nocontent_create">Create the first section
                    </p>
                </field>
        </record>

        <menuitem id="section_menu" name="sections" parent="rmanager"
                  action="requirement_sections_list_action"/>
    </data>
</odoo>

languages: Speichern der Sprachen der Google API ind deren Sprachcodes.

name
language(Sprachcode)

requirement_languages_view.xml

<odoo>
    <data>
        <record model="ir.actions.act_window" id="requirement_languages_list_action">
            <field name="name">Languages</field>
            <field name="res_model">requirement.languages</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
            <field name="help" type="html">
                <p class="oe_view_nocontent_create">Create the first language
                </p>
            </field>
        </record>

        <menuitem id="language_menu" name="languages" parent="rmanager"
              action="requirement_languages_list_action"/>
    </data>
</odoo>

Die entstanden Formalure werden schliesslich noch formatiert.

Odoo hat eine Standardansicht für Modelle.


Diese kann man überschreiben und anpassen.

requirement_view.xml 

<record model="ir.ui.view" id="requirement_form_view">
    <field name="name">requirement_form_view</field>
    <field name="model">requirement</field>
    <field name="arch" type="xml">
        <form string="Requirement Form">
            <sheet>
                <group>
                    <field name="name"/>
                    <field name="description"/>
                    <field name="author"/>
                    <field name="source_language"/>
                    <field name="target_language"/>
                </group>
            </sheet>
        </form>
    </field>
</record>

Danach sieht das so aus.

requirement_line_view.xml

<record model="ir.ui.view" id="requirement_line_form_view">
        <field name="name">requirement_line_view</field>
        <field name="model">requirement.line</field>
        <field name="arch" type="xml">
            <form string="Requirement Line Form">
                <sheet>
                    <header>
                        <button name="translate_title" type="object" class="oe_highlight" string="translate title"/>
                        <button name="translate_description" type="object" class="oe_highlight" string="translate description"/>
                    </header>
                    <group>
                        <field name="name"/>
                        <field name="name_translated"/>
                        <field name="requirement"/>
                        <field name="sections" widget="field.translate"/>
                        <field name="description"/>
                        <field name="description_translated"/>
                        <field name="image" widget="image"/>
                        <field name="image_translated" widget="image"/>
                    </group>
                </sheet>
            </form>
        </field>
    </record>

requirement_sections_view.xml

<record model="ir.ui.view" id="sections_form_view">
        <field name="name">sections</field>
        <field name="model">requirement.sections</field>
        <field name="arch" type="xml">
            <form string="Requirement Section Form">
                <sheet>
                    <group>
                        <field name="name"/>
                        <field name="requirement"/>
                        <field name="parent_id"/>
                    </group>
                </sheet>
            </form>
        </field>
    </record>

Das blau hinterlegte Feld ist erforderlich um den Datensatz anlegen zu können.

required=True

requirement_settings_view.xml

<record model="ir.ui.view" id="requirement_settings_form_view">
    <field name="name">settings</field>
    <field name="model">requirement.settings</field>
    <field name="arch" type="xml">
        <form string="Requirement Settings Form">
            <sheet>
                <group>
                    <field name="name"/>
                    <field name="api_key"/>
                    <field name="url"/>
                </group>
            </sheet>
        </form>
    </field>
</record>


List View

Die einzelnen Datensätze werden in Listenform dargestellt. Auch dies Anzeige kann über xml manipuliert werden.

Der folgende Code bewerkstelligt dies.

requirement tree view

<record id="requirement_tree_view" model="ir.ui.view">
    <field name="name">requirement treeview</field>
    <field name="model">requirement</field>
    <field name= "arch" type = "xml">
        <tree string="lines" default_order="write_date desc">
            <field name="name"/>
            <field name="author"/>
            <field name="write_date"/>
            <field name="create_date"/>
        </tree>
    </field>
</record>

Im Prinzip das Selbe wie die Form View.

line tree view

<record id="requirement_line_tree_view" model="ir.ui.view">
    <field name="name">line treeview</field>
    <field name="model">requirement.line</field>
    <field name= "arch" type = "xml">
        <tree string="lines" default_order="write_date desc">
            <field name="complete_name"/>
            <field name="sections"/>
            <field name="write_date"/>
        </tree>
    </field>
</record>