Tải bản đầy đủ (.pdf) (27 trang)

(yenbao1340@gmail.com) Lập trình Odoo (OpenERP) Phần 1: Giới thiệu và xây dựng đối tượng (model) trong Odoo

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.51 MB, 27 trang )

1
LAB_1
GIỚI THIỆU & TẠO ĐỐI TƯỢNG TRONG
ODOO
MÃ NGUỒN MỞ
TRƯỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH
KHOA CÔNG NGHỆ THÔNG TIN
Hướng dẫn: Nguyễn Yên Bảo
Điện thoại:
Email:
2
NỘI DUNG
2
1. Giới thiệu
2. Kiến trúc tổng quát
3. Xây dựng module
4. Q/A
5. Bài tập
3
1. GIỚI THIỆU
3
1.1. Odoo là gì?
 Odoo (tên gọi cũ là OpenERP) là một phần mềm quản
lý doanh nghiệp hiện đại, phát hành theo giấy phép
AGPL, và có đầy đủ các tính năng CRM, Nhân Sự,
Bán Hàng, Kế Toán, Sản Xuất, Quản Lý Kho, Quản Lý
Dự Án…
 Được phát triển dựa trên framework OpenObject, một
framework hướng mô đun, có khả năng mở rộng.
 Được viết bằng ngôn ngữ Python
4


1. GIỚI THIỆU
4
1.2. Ưu điểm
 Dễ cài đặt, sử dụng
o Đầy đủ tài liệu hướng dẫn, hỗ trợ nhiều ngôn ngữ
 Toàn diện: Có đầy đủ các mô đun cần thiết của một
doanh nghiệp (hiện tại có hơn 700 mô đun)
 Mạnh mẽ
o Tự động thu thập thông tin doanh nghiệp
o Có thể tự thiết kế các báo cáo
 Linh hoạt
o Thay đổi mà không cần phải lập trình
o Quản lý các module một cách linh hoạt
o Dễ dàng khi nâng cấp hoặc di chuyển hệ thống
5
5
Odoo sử dụng mô hình client-server
2. KIẾN TRÚC TỔNG QUÁT
6
6
Odoo sử dụng mô hình MVC(Model-View-Control)
 Model : database PostgreSQL để lưu trữ dữ liệu.
 View : dùng XML để tạo ra giao diện.
 Control : dùng ngôn ngữ Python để tạo các object, truy
xuất cơ sở dữ liệu, chuyển cho view để đưa ra giao diện
2. KIẾN TRÚC TỔNG QUÁT
7
7
3.1. Module là gì?
Module là một thành phần giữ một nhiệm vụ cụ thể nào đó

trong 1 phần mềm, một máy tính hay 1 hệ thống
VD: phần mềm quản lý nhân sự có các chức năng tính
lương, quản lý thông tin nhân viên…
Thì chúng ta có thể chia phần mềm đó ra thành các
module khác nhau. Mỗi module đảm nhận 1 nhiệm vụ.
Sau đó chúng ta kết hợp các module lại với nhau để trở
thành 1 phần mềm hoàn chỉnh
3. XÂY DỰNG MODULE
8
8
3.1. Module là gì?
Giá trị của Odoo chính là từ hệ thống các module khác
nhau của nó. Các module có thể thực hiện bất kỳ nhu cầu
kinh doanh nào.
Odoo Server chỉ là nền tảng cần thiết để chạy các module.
Rất nhiều module đã được phát triển trong đó Odoo chính
thức phát hành bao gồm khoảng hơn 200 module, và hàng
trăm các module được phát triển bởi cộng đồng.
3. XÂY DỰNG MODULE
9
9
Mỗi module cũng được xây dựng theo cấu trúc MVC
Một module có thể bao gồm
 Business object (đối tượng): khai báo như class trong
Python
 Data (dữ liệu): các tập tin XML/CSVsẽ chứa các khai
báo, định nghĩa cho các views, workflow…
 Wizards: những hộp thoại tương tác để hỗ trợ người
dùng thực hiện một tác vụ, hành động nào đó;
 Report (báo cáo): tạo báo cáo kinh doanh dạng HTML,

ODT, PDF
3. XÂY DỰNG MODULE
10
10
Các module được chứa tại thư mục server/bin/addons trong
chỗ cài đặt Odoo server.
addons/
| - module_x/ # tên thư mục mô đun
| - demo/ # chứa các dữ liệu demo và test
| - i18n/ # chứa các file dịch thuật
| - report/ # các báo cáo
| - security/ # phân quyền truy cập cho các nhóm người dùng
| - view/ # khai báo các views để hiển thị thông tin
| - wizard/ # định nghĩa các hộp thoại wizard
| - workflow/ # định nghĩa workflow
| - __init__.py # file khởi tạo package Python (bắt buộc phải có)
| - __openerp__.py # khai báo mô đun (bắt buộc phải có)
| - object.py # các lớp python, các đối tượng trong mô đun
3. XÂY DỰNG MODULE
11
11
3.1. Cấu trúc của file __init__
 Các tập tin __init__.py rất cần thiết để cho Python biết các thư mục
và các tập tin Python (*.py) trong module; việc này được đặt ra để
tránh các thư mục với trùng tên với các thư mục chứa các thư viện
có sẳng của Python
 Trong trường hợp đơn giản nhất, __init__.py có thể chỉ là một tập tin
rỗng
 Cấu trúc trong file __init__
import <tên thư mục/file .py>

VD: nội dung file __init__ ở module_x như sau:
import l18n
import report
import security
import view
import wizard
import workflow
import object
3. XÂY DỰNG MODULE
12
12
3.2. Cấu trúc của file __openerp__
Là file mô tả module Odoo và chứa một dictionary (một kiểu dữ liệu trong Python) với
khai báo các thông tin của module như tên, các module phụ thuộc, mô tả, và thành
phần khác của module (view, security…)
VD: nội dung file __ openerp __ như sau:
3. XÂY DỰNG MODULE
{
"name": "module_x",
"version": "1.0",
"author": "OpenERP",
"description": "Ideas management module",
"category": "Tools",
"website": "",
"depends": ["base"],
"update_xml":
[
"security/groups.xml",
"security/ir.model.access.csv",
"workflow/workflow.xml",

"view/views.xml",
"wizard/wizard.xml",
"report/report.xml",
],
"init_xml": [‘demo/demo.xml’],
"active": False,
}
13
13
3.3. Tạo đối tượng
Là thành phần chính của OpenObject, Odoo sẽ ánh xạ
toàn bộ giữa đối tượng trong framework và bảng dữ liệu
quan hệ dưới PostgreSQL**, giúp các nhà phát triển
không cần phải viết các câu lệnh SQL dài dòng.
Các đối tượng được khai báo giống như các lớp trong
Python, được kế thừa từ lớp osv.osv
3. XÂY DỰNG MODULE
class name_of_the_object(osv.osv):
_name = 'name.of.the.object'
_columns = { }

name_of_the_object()
Kế thừa lớp osv.osv
Khởi tạo class
14
14
3.3. Tạo đối tượng
VD chúng ta tạo ra 1 đối tượng giảng viên như sau:
3. XÂY DỰNG MODULE
class x_giangvien(osv.osv):

_name = 'x_giangvien'
_description = 'Giang vien'
_columns = {
'name': fields.char('Tên giảng viên',size=64,required="True"),
'ma_giangvien': fields.char('Mã giảng viên', size=64, required="True"),
'phai': fields.selection([('nam','Nam'),('nu','Nữ')], 'Phái', required="True"),
'ngaysinh': fields.date('Ngày sinh',required="True"),
'hinh': fields.binary('Hình'),
}
_defaults = {}
_sql_constraints = []
_constraints = []
x_giangvien()
Tên đối tượng
Mô tả về obj
Giá trị mặc
định
Ràng buộc dữ liệu viết bằng
SQL hoặc Python
Distionary mô tả
các thuộc tính của
đối tượng
15
15
3.3. Tạo đối tượng
Một số khai báo thường dùng của class
_inherit:
Kế thừa 1 đối tượng đã tồn tại
VD: _inherit = 'sale.order'
_inherits:

Đa kế thừa,là một dictionaries có khóa là các đối tượng cha muốn thừa kế,
giá trị là các tên các trường khóa ngoại tương ứng mà bạn muốn dùng.
VD: _inherits = {'product.template': 'product_tmpl_id'}
_constraints:
Là một list các tuple định nghĩa các ràng buộc dữ liệu viết bằng Python.
VD: _constraints = [(_check_name,'Please avoid spam in ideas !',
['name'])]
_sql_constraints:
Là một list các tuple định nghĩa các ràng buộc dữ liệu viết bằng SQL,
VD: _sql_constraints = [('name_uniq','unique(name)', 'Idea must be
unique!')]
3. XÂY DỰNG MODULE
16
16
3.3. Tạo đối tượng
Một số khai báo thường dùng của class
_log_access
Nếu True (mặc định), 4 trường dữ liệu (create_uid, create_date, write_uid,
write_date) sẽ được tạo ra để ghi log lại các thao tác trên các bản ghi của
bảng dữ liệu, bạn có thể dùng hàm perm_read() của osv để truy xuất các
trường này.
_order
Một list các tên trường; hệ thống sẽ sắp xếp thứ tự của các bản ghi theo thứ
tự của các tên trường này
Ví dụ: _order = 'default_code,name_template'; sẽ sắp xếp thứ tự các bản
ghi theo default_code và name_template
_table
Tên bảng dữ liệu (mặc định: các từ trong _name được phân cách bằng dấu
chấm '.' sẽ được thay bằng dấu gạch dưới '_'); ví dụ: _name =
'idea.idea' thì hệ thống sẽ tự động tạo ra một bảng dữ liệu có tên

'idea_idea'
3. XÂY DỰNG MODULE
17
17
3.4. Các thuộc tính trong đối tượng
Đối tượng có thể chứa các trường dữ liệu thuộc 3 loại
sau: đơn giản, quan hệ, và chức năng.
 Kiểu dữ liệu đơn giản là các kiểu dữ liệu như: số
nguyên, chấm động, boolean, chuỗi
 Kiểu dữ liệu quan hệ biểu thị cho các mối quan hệ
giữa các đối tượng (one2many, many2one,
many2many). T
 Theo mặc định, các trường có kiểu dữ liệu là chức
năng sẽ không được lưu trữ trong cơ sở dữ liệu mà
được tính toán lại mỗi lần chạy.
3. XÂY DỰNG MODULE
18
18
3.4. Các thuộc tính trong đối tượng
3.4.1. Loại đơn giản
boolean:
fields.boolean('Field Name' [, Optional Parameters]),
VD:
‘quantrong’:fields.boolean(‘Có quan trọng không’),
integer:
fields.integer('Field Name' [, Optional Parameters]),
VD:
‘soluong’:fields.integer(‘Số lượng’)
float:
fields.float('Field Name' [, Optional Parameters]),

VD:
‘diem': fields.float( ‘Điểm')
3. XÂY DỰNG MODULE
19
19
3.4. Các thuộc tính trong đối tượng
3.4.1. Loại đơn giản
char:
fields.char( 'Field Name', size=n [, Optional Parameters]),
VD:
‘noisinh': fields.char(‘Nơi sinh', size=30,
required=True),
text:
fields.text('Field Name' [, Optional Parameters]),
date:
fields.date('Field Name' [, Optional Parameters]),
3. XÂY DỰNG MODULE
20
20
3.4. Các thuộc tính trong đối tượng
3.4.1. Loại đơn giản
datetime:
fields.datetime('Field Name' [, Optional Parameters]),
binary:
VD:trong đối tượng x_giangvien
‘hinh’:fields.binary(‘Hinh’),
selection:
VD:trong đối tượng x_giangvien
‘gioitinh’:fields.selection([(‘na’,’Nam’), (‘nu’,’Nữ’)],’Giới tính’),
3. XÂY DỰNG MODULE

21
21
3.4. Các thuộc tính trong đối tượng
3.4.2. Loại quan hệ
many2one:
fields.many2one( 'other.object.name', 'Field Name', optional parameters)
VD: trong đối tượng x_sinhvien
‘nganh': fields.many2one( ‘x_nganh', ‘Ngành học', ondelete='cascade'),
one2many:
fields.one2many( 'other.object.name', 'Field relation id', 'Fieldname',
optional parameter)
VD: trong đối tượng res.users
‘ds_sinhvien': fields.one2many( ‘x_sinhvien', ‘nganh', ‘Danh sách sinh
viên'),
3. XÂY DỰNG MODULE
22
22
3.4. Các thuộc tính trong đối tượng
3.4.2. Loại quan hệ
many2many:
fields.many2many('other.object.name', 'relation object',
'actual.object.id', 'other.object.id', 'Field Name')
VD: trong đối tượng x_lophoc
‘ds_sinhvien': fields.many2many( ‘x_sinhvien',
‘lophoc_sinhvien', ‘lophoc_id', ‘sinhvien_id', ‘Danh sách sinh
viên'),
3. XÂY DỰNG MODULE
23
23
3.4. Các thuộc tính trong đối tượng

3.4.3. Loại chức năng
def _get_diemtb_monhoc (self,cr,uid,ids,fields_name,arg,context):
res={}
kq=0.0
for obj in self.browse(cr, uid, ids, context=context):
kq=(obj.KT15)+2*(obj.KT1tiet)+3*(obj.ThiHKI))/7
res[obj.id] = kq
return res
'diemtb_monhoc':fields.function(_get_diemtb_monhoc,method=True
,string=u"Điểm TB môn học kỳ I",type='float',store=True),
3. XÂY DỰNG MODULE
24
24
3.4. Các thuộc tính trong đối tượng
3.4.4. Một số optional parameters thường dùng
required: nếu là True thì bắt buộc người dùng phải nhập dữ liệu vào
trường này
readonly: nếu là True thì người dùng không thể thay đổi dữ liệu trường
này.
help: giải thích, hướng dẫn cho trường dữ liệu này
select: 1 để đưa trường này vào màn hình tìm kiếm và để giúp tối ưu
cho việc lọc danh sách (được đánh dấu index trong csdl)
context: là một dictionaries chứa các tham số về ngữ cảnh như: ngôn
ngữ sử dụng là gì, múi giờ là gì, model nào đang đang được sử dụng, id
là bao nhiêu…hoặc chúng ta có thể tự tạo ra các ngữ cảnh riêng
Ví dụ: {‘lang’: ‘en_us’, ‘tz’: ‘UTC’, …}
ondelete: sử dụng trong các trường kiểu quan hệ. Khi 1 dòng dữ liệu bị
xóa thì các dữ liệu liên quan sẽ xóa theo (khi ondelete='cascade’)
states: thay đổi thuộc tính của trường này dựa vào trường state.
3. XÂY DỰNG MODULE

25
25
4. Q/A

×