Chương 9: Sẵn Sàng Cho Một Số Hành Động?¶
So far we have mostly built our module by declaring fields and views. We just introduced business logic in the previous chapter thanks to computed fields and onchanges. In any real business scenario, we would want to link some business logic to action buttons. In our real estate example, we would like to be able to:
hủy bỏ hoặc thiết lập một tài sản được bán
chấp nhận hoặc từ chối một lời đề nghị
Người ta có thể lập luận rằng chúng ta đã có thể thực hiện những việc này bằng cách thay đổi trạng thái theo cách thủ công, nhưng điều này không thực sự thuận tiện. Hơn nữa, chúng tôi muốn bổ sung thêm một số quy trình xử lý: khi một đề nghị được chấp nhận, chúng tôi muốn đặt giá bán và người mua tài sản.
Loại đối tượng¶
Tham khảo: tài liệu liên quan đến chủ đề này có thể được tìm thấy trong Hành động và Quản lý lỗi.
Ghi chú
Mục tiêu: ở cuối phần này:
Bạn có thể hủy hoặc đặt tài sản là đã bán:

Assets bị hủy không thể được bán và tài sản đã bán không thể bị hủy. Để rõ ràng, trường state
đã được thêm vào dạng xem.
Bạn có thể chấp nhận hoặc từ chối một lời đề nghị:

Khi một đề nghị được chấp nhận, giá bán và người mua phải được xác định:

Trong mô-đun bất động sản, chúng tôi muốn liên kết logic nghiệp vụ với một số nút. Cách phổ biến nhất để làm điều này là:
Thêm một nút trong chế độ xem, ví dụ như trong
tiêu đề
của chế độ xem:
<form>
<header>
<button name="action_do_something" type="object" string="Do Something"/>
</header>
<sheet>
<field name="name"/>
</sheet>
</form>
và liên kết nút này với logic nghiệp vụ:
from odoo import fields, models
class TestAction(models.Model):
_name = "test.action"
name = fields.Char()
def action_do_something(self):
for record in self:
record.name = "Something"
return True
Bằng cách gán type="object"
cho nút của chúng ta, khung SoOn sẽ thực thi một phương thức Python với name="action_do_something"
trên mô hình đã cho.
Chi tiết quan trọng đầu tiên cần lưu ý là tên phương thức của chúng ta không có tiền tố gạch dưới (_
). Điều này làm cho phương thức của chúng tôi trở thành phương thức công khai, có thể được gọi trực tiếp từ giao diện SoOn (thông qua lệnh gọi RPC). Cho đến thời điểm hiện tại, tất cả các phương thức chúng tôi đã tạo (compute, onchange) đều được gọi nội bộ, vì vậy chúng tôi đã sử dụng các phương thức private có tiền tố là dấu gạch dưới. Bạn phải luôn xác định các phương thức của mình là riêng tư trừ khi chúng cần được gọi từ giao diện người dùng.
Cũng lưu ý rằng chúng ta lặp lại self
. Luôn giả định rằng một phương thức có thể được gọi trên nhiều bản ghi; nó tốt hơn cho khả năng tái sử dụng.
Cuối cùng, một phương thức công khai phải luôn trả về một cái gì đó để có thể gọi nó thông qua XML-RPC. Khi nghi ngờ, chỉ cần return True
.
Có hàng trăm ví dụ trong mã nguồn SoOn. Một ví dụ là nút này trong chế độ xem và phương thức Python tương ứng của nó
Exercise
Hủy bỏ và thiết lập một tài sản như đã bán.
Thêm các nút 'Hủy' và 'Đã bán' vào mô hình
estate.property
. Assets bị hủy không thể được đặt là đã bán và tài sản đã bán không thể bị hủy.Tham khảo hình ảnh đầu tiên của Mục tiêu để biết kết quả mong đợi.
Mẹo: để báo lỗi, bạn có thể sử dụng hàm UserError. Có rất nhiều ví dụ trong mã nguồn SoOn ;-)
Thêm các nút 'Chấp nhận' và 'Từ chối' vào mô hình
estate.property.offer
.Tham khảo hình ảnh thứ hai của Mục tiêu để biết kết quả mong đợi.
Mẹo: để sử dụng biểu tượng làm nút, hãy xem ví dụ này.
Khi một đề nghị được chấp nhận, hãy đặt người mua và giá bán cho tài sản tương ứng.
Tham khảo hình ảnh thứ ba của Mục tiêu để biết kết quả mong đợi.
Hãy chú ý: trong đời thực chỉ có thể chấp nhận một lời đề nghị cho một tài sản nhất định!
Loại hành động¶
In Chương 5: Cuối Cùng, Một Số Giao Diện Để Khám Phá, we created an action that was linked to a menu. You may be wondering if it is possible to link an action to a button. Good news, it is! One way to do it is:
<button type="action" name="%(test.test_model_action)d" string="My Action"/>
Chúng tôi sử dụng type="action"
và chúng tôi đề cập đến định danh bên ngoài trong name
.
In the next chapter we'll see how we can prevent encoding incorrect data in Odoo.