Lập trình Odoo (OpenERP) Phần 1: Giới thiệu và xây dựng đối tượng (model) trong OdooOdoo (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 viết bằng ngôn ngữ Python và XML
Trang 1LAB_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
Trang 31 GIỚI THIỆU
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épAGPL, 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
Trang 41 GIỚI THIỆU
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
Trang 5Odoo sử dụng mô hình client-server
2 KIẾN TRÚC TỔNG QUÁT
Trang 6Odoo 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, truyxuất cơ sở dữ liệu, chuyển cho view để đưa ra giao diện
2 KIẾN TRÚC TỔNG QUÁT
Trang 73.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
Trang 83.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
Trang 9Mỗ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
Trang 10Cá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ó)
# khai báo mô đun (bắt buộc phải có)
3 XÂY DỰNG MODULE
Trang 113.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
3 XÂY DỰNG MODULE
Trang 123.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:
Trang 133.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 = { }
Kế thừa lớp osv.osv
Trang 143.3 Tạo đối tượng
VD chúng ta tạo ra 1 đối tượng giảng viên như sau:
Trang 153.3 Tạo đối tượng
Một số khai báo thường dùng của class
Trang 163.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
3 XÂY DỰNG MODULE
Trang 173.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à
3 XÂY DỰNG MODULE
Trang 183.4 Các thuộc tính trong đối tượng
3.4.1 Loại đơn giản
Trang 193.4 Các thuộc tính trong đối tượng
3.4.1 Loại đơn giản
Trang 203.4 Các thuộc tính trong đối tượng
3.4.1 Loại đơn giản
Trang 213.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
Trang 223.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
Trang 233.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
Trang 243.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
3 XÂY DỰNG MODULE
Trang 254 Q/A
Trang 261 Xây dựng module “quản lý sinh viên”:
2 Mô tả:
Có bao nhiêu đối tượng (sinh viên, khoa, ngành…)
Thuộc tính của từng đối tượng
5 BÀI TẬP
Trang 27The End.