Trong framework Odoo đã xây dựng cho chúng ta một số tool có sẵn cho developer. Bạn có thể tìm thấy chúng ở odoo/tools
Mình sẽ nêu ra một số hàm sử dụng phổ biến và cách sử dụng chúng ra sao nhé!
config
ở file config.py sẽ giúp chúng ta lấy được tham số từ odoo.conf
from odoo.tools import config
config.get("db_name")
# "odoo"
config.filestore(config.get("db_name"))
# "/var/lib/odoo/filestore/odoo"
config.session_dir
# "/var/lib/odoo/sessions"
config.options
# {
# "addons_paths": "/opt/odoo/core/odoo/addons",
# "auto_reload": False,
# "db_host": "db",
# }
convert
Helper này chủ yếu tập trung vào việc chuyển đổi các loại dữ liệu như xml và csv dành riêng cho Odoo, trong đó có 1 hàm ***str2bool()***được sử dụng
from odoo.tools import convert
convert.str2bool("0") # False
convert.str2bool("false") # False
convert.str2bool("False") # False
convert.str2bool("1") # True
convert.str2bool("true") # True
convert.str2bool("True") # True
date_utils—getters
Helper này được sử dụng để thao tác với ngày tháng
from odoo import fields
from odoo.tools import date_utils
sample_date = fields.Datetime.now() # assume it's March 3rd, 2019
date_utils.get_month(sample_date)
# Returns the range for the first day of the month to the last
# (datetime.datetime(2019, 3, 1, 0, 0), datetime.datetime(2019, 3, 31, 0, 0))
date_utils.get_quarter(sample_date)
# Returns the range for the first day of the fiscal quarter to the last
# (datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 3, 31, 0, 0))
date_utils.get_quarter_number(sample_date)
# Returns the number of the current quarter (1, 2, 3, or 4) based on the date
# 1 in this case
date_utils.get_fiscal_year(sample_date)
# Returns the range for the first day of the fiscal year to the last
# (datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 12, 31, 0, 0))
date_utils–range helpers
from dateutil.relativedelta import relativedelta
from odoo import fields
from odoo.tools import date_utils
sample_date = fields.Datetime.now() # assume it's March 3rd, 2019
date_utils.start_of(sample_date, "hour") # datetime.datetime(2019, 3, 3, 17, 0)
date_utils.start_of(sample_date, "day") # datetime.datetime(2019, 3, 3, 0, 0)
date_utils.start_of(sample_date, "week") # datetime.datetime(2019, 2, 25, 0, 0)
date_utils.start_of(sample_date, "month") # datetime.datetime(2019, 3, 1, 0, 0)
date_utils.start_of(sample_date, "quarter") # datetime.datetime(2019, 1, 1, 0, 0)
date_utils.start_of(sample_date, "year") # datetime.datetime(2019, 1, 1, 0, 0)
date_utils.end_of(sample_date, "hour") # datetime.datetime(2019, 3, 3, 17 59, 59, 999999)
date_utils.end_of(sample_date, "day") # datetime.datetime(2019, 3, 3, 23, 59, 59, 999999)
date_utils.end_of(sample_date, "week") # datetime.datetime(2019, 3, 3, 23, 59, 59, 999999)
date_utils.end_of(sample_date, "month") # datetime.datetime(2019, 3, 31, 23, 59, 59, 999999)
date_utils.end_of(sample_date, "quarter") # datetime.datetime(2019, 3, 31, 23, 59, 59, 999999)
date_utils.end_of(sample_date, "year") # datetime.datetime(2019, 12, 31, 23, 59, 59, 999999)
for date in date_utils.date_range(
start=sample_date,
end=date_utils.add(sample_date, days=15),
step=relativedelta(days=1),
):
print(date)
# 2019-03-03 17:29:03
# 2019-03-04 17:29:03
# 2019-03-05 17:29:03
# 2019-03-06 17:29:03
# 2019-03-07 17:29:03
# 2019-03-08 17:29:03
# 2019-03-09 17:29:03
# 2019-03-10 17:29:03
# 2019-03-11 17:29:03
# 2019-03-12 17:29:03
# 2019-03-13 17:29:03
# 2019-03-14 17:29:03
# 2019-03-15 17:29:03
# 2019-03-16 17:29:03
# 2019-03-17 17:29:03
# 2019-03-18 17:29:03
date_utils-calculations
Thực hiện tính toán ngày tháng đơn giản
from odoo import fields
from odoo.tools import date_utils
sample_date = fields.Datetime.now() # assume it's March 3rd, 2019
date_utils.add(sample_date, days=5) # datetime.datetime(2019, 3, 8, 17, 29, 3)
date_utils.add(sample_date, weeks=2) # datetime.datetime(2019, 3, 17, 17, 29, 3)
date_utils.add(sample_date, months=1) # datetime.datetime(2019, 4, 3, 17, 29, 3)
date_utils.add(sample_date, years=1) # datetime.datetime(2019, 3, 3, 17, 29, 3)
date_utils.add(sample_date, days=2, months=6, years=1) # datetime.datetime(2019, 9, 5, 17, 29, 3)
date_utils.subtract(sample_date, days=5) # datetime.datetime(2019, 2, 26, 17, 29, 3)
date_utils.subtract(sample_date, weeks=2) # datetime.datetime(2019, 2, 17, 17, 29, 3)
date_utils.subtract(sample_date, months=1) # datetime.datetime(2019, 2, 3, 17, 29, 3)
date_utils.subtract(sample_date, years=1) # datetime.datetime(2019, 3, 3, 17, 29, 3)
date_utils.subtract(sample_date, days=2, months=6, years=1) # datetime.datetime(2019, 9, 1, 17, 29, 3)
float_utils
Liên quan đến việc xử lý dấu phẩy động trong Odoo
from odoo.tools import float_utils
float_utils.float_round(
1.5424,
precision_digits=2,
rounding_method="DOWN",
) # 1.54
float_utils.float_round(
1.5424,
precision_digits=3,
rounding_method="UP",
) # 1.543
float_utils.float_round(
1.5424,
precision_digits=3,
rounding_method="HALF-UP",
) # 1.542
float_utils.float_is_zero(0.04252, precision_digits=5) # False
float_utils.float_is_zero(0.04252, precision_digits=1) # True
float_utils.float_compare(0.042555, 0.04256, precision_digits=5) # 0 => equal
float_utils.float_compare(0.042555, 0.04256, precision_digits=6) # -1 => value1 is lower than value2
image
Liên quan đến việc xử lý hình ảnh như sau
from odoo.tools import image
image.image_resize_image(img, size=(500, 500))
image.image_resize_and_sharpen(img, size=(500, 500))
with open("/tmp/my_image.png", "w") as f:
image.image_save_for_web(img, f)
Liên quan đến việc tạo mail
from odoo.tools import mail
mail.html_keep_url("http://google.com")
# '<a href="https://google.com" rel="noreferrer" target="_blank">https://google.com</a>'
html = '''
<html>
<head>
<script src="/my/script.js"/>
</head>
<body>
<p>
<span>A cool html email with <a href="https://google.com">a link to goolge.</a></span>
</p>
</body>
</html>
'''
mail.html.sanitize(html)
# '
<p>
<span>A cool html email with <a href="https://google.com">a link to google.</a></span>'
mail.html2plaintext(html)
# A cool html email with a link to google.com. [1]
# [1] https://google.com
mail.plaintext2html(mail.html2plaintext(html))
# <p><br/>A cool html email with a link to google.com.</p>
misc
Mình biết phải nói helper này có ý nghĩa gì nhưng đọc ví dụ code dưới đây mình tin bạn cũng sẽ hiểu
from odoo.tools import misc
misc.DEFAULT_SERVER_DATE_FORMAT # "%Y-%m-%d"
misc.DEFAULT_SERVER_TIME_FORMAT # "%H:%M:%S"
misc.DEFAULT_SERVER_DATETIME_FORMAT # "%Y-%m-%d %H:%M:%S"
misc.flatten([[["a", "b"], "c"], "d", ["e", [], "f"]])
# ["a", "b", "c", "d", "e", "f"]
for i, el in misc.reverse_enumerate(["a", "b", "c"]):
print(i, el)
# 2 c
# 1 b
# 0 a
misc.topological_sort(
{
"a": ["b", "c"],
"b": ["c"].
"d": ["a"],
"r": ["y"],
"y": ["z"],
}
)
# ["y", "b", "a", "r", "d"]
misc.scan_languages()
# [
# ("sq_AL", "Albanian / Shqip")],
# ...
# ("zh_HK", "Chinese (HK)")],
# ...
# ]
misc.human_size(1024, * 10) # "10.00 Kb"
misc.human_size(1024 * 10000) # "9.77 Mb"
misc.human_size(1024 * 10000000) # "9.54 Gb"
for split in misc.split_every(iterable=["a", "b", "c", "d"], n=2):
print(split)
# ("a", "b")
# ("c", "d")
misc.groupby(
[
{"first_name": "Jon", "last_name": "Stewart"},
{"first_name": "Martha", "last_name": "Stewart"},
{"first_name": "Rod", "last_name": "Stewart"},
{"first_name": "Jow", "last_name": "Jackson"},
],
key=lambda el: el["last_name"]
)
# dict_items(
# [
# ("Jackson", [
# {"first_name": "Jow", "last_name": "Jackson"},
# ],
# ("Stewart": [
# {"first_name": "Jon", "last_name": "Stewart"},
# {"first_name": "Martha", "last_name": "Stewart"},
# {"first_name": "Rod", "last_name": "Stewart"},
# ])
# ]
# )
list(misc.unique(["a", "a", "b", "c"]))
# ["a", "b", "c"]