Odoo - Backend modules in v8

23
Backend Modules in V8 Raphael Collet ( rco @ odoo . com )

description

Architecture of Odoo Module Open Academy

Transcript of Odoo - Backend modules in v8

Page 1: Odoo - Backend modules in v8

Backend Modules in V8Raphael Collet ([email protected])

Page 2: Odoo - Backend modules in v8

Agenda

Architecture of Odoo

Module Open Academy

·

·

Page 3: Odoo - Backend modules in v8

Architecture of Odoo

Page 4: Odoo - Backend modules in v8

Architecture of Odoo

Three-tier client/server/database

Web client in Javascript

Server and backend modules in Python

MVC framework

·

·

·

·

Page 5: Odoo - Backend modules in v8

Module Open Academy

Page 6: Odoo - Backend modules in v8

The Module

Manage courses, sessions, and subscriptions

Learn

Structure of a module

Definition of data models

Definition of views and menus

·

·

·

·

·

Page 7: Odoo - Backend modules in v8

Structure of a Module

An Odoo module is

a python module (data models), with

a manifest file,

XML and CSV data files (base data, views, menus),

frontend resources (Javascript, CSS).

·

·

·

·

Page 8: Odoo - Backend modules in v8

The Open Academy Module

The manifest file __odoo__.py:

{{

'name':: 'Open Academy',,

'version':: '1.0',,

'category':: 'Tools',,

'summary':: 'Courses, Sessions, Subscriptions',,

'description':: "...",,

'depends' :: [['base'],],

'data' :: [['view/menu.xml'],],

'images':: [],[],

'demo':: [],[],

'application':: True,,

}}

Page 9: Odoo - Backend modules in v8

The Course Model

A model and its fields are defined in a Python class:

fromfrom odoo importimport Model,, fields

classclass Course((Model):):

_name == 'openacademy.course'

name == fields..Char((string=='Title',, required==True))

description == fields..Text()()

Page 10: Odoo - Backend modules in v8

The Menu as XML data<?xml version="1.0" encoding="UTF-8"?>

<openerp><openerp>

<data><data>

<menuitem<menuitem name="Open Academy" id="menu_root" sequence="110"/>/>

<menuitem<menuitem name="General" id="menu_general" parent="menu_root"/>/>

<record<record model="ir.actions.act_window" id="action_courses">>

<field<field name="name">>Courses</field></field>

<field<field name="res_model">>openacademy.course</field></field>

<field<field name="view_mode">>tree,form</field></field>

</record></record>

<menuitem<menuitem name="Courses" id="menu_courses" parent="menu_general"

sequence="1" action="action_courses"/>/>

</data></data>

</openerp></openerp>

Page 11: Odoo - Backend modules in v8

Let's add a Form View<record<record model="ir.ui.view" id="course_form">>

<field<field name="name">>course form view</field></field>

<field<field name="model">>openacademy.course</field></field>

<field<field name="arch" type="xml">>

<form<form string="Course" version="7.0">>

<sheet><sheet>

<h1><h1>

<field<field name="name" placeholder="Course Title"/>/>

</h1></h1>

<notebook><notebook>

<page<page string="Description">>

<field<field name="description"/>/>

</page></page>

</notebook></notebook>

</sheet></sheet>

</form></form>

</field></field>

</record></record>

Page 12: Odoo - Backend modules in v8

The Session Modelclassclass Session((Model):):

_name == 'openacademy.session'

name == fields..Char((required==True))

start_date == fields..Date()()

duration == fields..Integer((help=="Duration in days"))

seats == fields..Integer((string=="Number of Seats"))

Page 13: Odoo - Backend modules in v8

Relational Fields

Let us link sessions to courses and instructors:

classclass Session((Model):):

_name == 'openacademy.session'

......

course == fields..Many2one(('openacademy.course',, required==True))

instructor == fields..Many2one(('res.partner'))

Page 14: Odoo - Backend modules in v8

Relational Fields

Let us back-link courses and sessions:

classclass Course((Model):):

_name == 'openacademy.course'

......

responsible == fields..Many2one(('res.users'))

sessions == fields..One2many(('openacademy.session',, 'course'))

Page 15: Odoo - Backend modules in v8

Relational Fields

Let us link sessions to partners for attendee subscription:

classclass Session((Model):):

_name == 'openacademy.session'

......

attendees == fields..Many2many(('res.partner'))

Page 16: Odoo - Backend modules in v8

Computed Fields

The value of those fields is computed:

classclass Session((Model):):

_name == 'openacademy.session'

......

taken_seats == fields..Float((compute=='_compute_taken_seats'))

@[email protected]

@[email protected](('attendees',, 'seats'))

defdef _compute_taken_seats((self):):

ifif self..seats::

self..taken_seats == 100.0100.0 ** len((self..attendees)) // self..seats

elseelse::

self..taken_seats == 0.00.0

Page 17: Odoo - Backend modules in v8

About self

Model instances are recordsetsrecordsets.

A recordset is an hybrid concept:

collection of records

record

forfor session inin self::

printprint session..name

printprint session..course..name

assertassert self..name ==== self[[00]]..name

·

·

Page 18: Odoo - Backend modules in v8

Feedback with "Onchange"Methods

Modify form values when some field is filled in:

classclass Session((Model):):

_name == 'openacademy.session'

......

@[email protected](('course'))

defdef _onchange_course((self):):

ifif notnot self..name::

self..name == self..course..name

Page 19: Odoo - Backend modules in v8

Default Values

Specify the initial value to use in a form:

classclass Session((Model):):

_name == 'openacademy.session'

......

active == fields..Boolean((default==True))

start_date == fields..Date((default==fields..Date..today))

......

Page 20: Odoo - Backend modules in v8

Model Constraints

Prevent bad data:

fromfrom odoo.exceptions importimport WarningWarning

classclass Session((Model):):

_name == 'openacademy.session'

......

@[email protected]

@[email protected](('instructor',, 'attendees'))

defdef _check_instructor((self):):

ifif self..instructor inin self..attendees::

raiseraise WarningWarning(("Instructor of session '%s' "

"cannot attend its own session" %% self..name))

Page 21: Odoo - Backend modules in v8

More Stuff

Extend existing models

Many view types

Workflows

Reports

Security

Translations

·

·

·

·

·

·

Page 22: Odoo - Backend modules in v8

Backend Modules in V8

Page 23: Odoo - Backend modules in v8

Conclusion

Modules have a simple structure

Model definition intuitive and efficient

uses Python standards (decorators, descriptors)

recordsets provide support for "batch" processing

many model hooks (default values, constraints,

computed fields)

·

·

·

·

·