backendmodulesinv8-Raphael Collet.pdf
-
Upload
jason-hall -
Category
Documents
-
view
7 -
download
1
Transcript of backendmodulesinv8-Raphael Collet.pdf
![Page 2: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/2.jpg)
Agenda
Architecture of Odoo
Module Open Academy
·
·
![Page 3: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/3.jpg)
Architecture of Odoo
![Page 4: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/4.jpg)
Architecture of Odoo
Three-tier client/server/database
Web client in Javascript
Server and backend modules in Python
MVC framework
·
·
·
·
![Page 5: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/5.jpg)
Module Open Academy
![Page 6: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/6.jpg)
The Module
Manage courses, sessions, and subscriptions
Learn
Structure of a module
Definition of data models
Definition of views and menus
·
·
·
·
·
![Page 7: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/7.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/8.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/9.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/10.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/11.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/12.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/13.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/14.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/15.jpg)
Relational Fields
Let us link sessions to partners for attendee subscription:
classclass Session((Model):):
_name == 'openacademy.session'
......
attendees == fields..Many2many(('res.partner'))
![Page 16: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/16.jpg)
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](('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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/17.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/18.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/19.jpg)
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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/20.jpg)
Model Constraints
Prevent bad data:
fromfrom odoo.exceptions importimport WarningWarning
classclass Session((Model):):
_name == 'openacademy.session'
......
@[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: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/21.jpg)
More Stuff
Extend existing models
Many view types
Workflows
Reports
Security
Translations
·
·
·
·
·
·
![Page 22: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/22.jpg)
Backend Modules in V8
![Page 23: backendmodulesinv8-Raphael Collet.pdf](https://reader037.fdocuments.us/reader037/viewer/2022103104/577c85421a28abe054bc6414/html5/thumbnails/23.jpg)
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)
·
·
·
·
·