65 lines
1.5 KiB
Python
65 lines
1.5 KiB
Python
import random
|
|
from typing import TYPE_CHECKING
|
|
|
|
import frappe
|
|
|
|
if TYPE_CHECKING:
|
|
from frappe.model.document import Document
|
|
|
|
settings = frappe._dict(
|
|
prob={
|
|
"default": {"make": 0.6, "qty": (1, 5)},
|
|
}
|
|
)
|
|
|
|
|
|
def add_random_children(doc: "Document", fieldname: str, rows, randomize: dict, unique=None):
|
|
nrows = rows
|
|
if rows > 1:
|
|
nrows = random.randrange(1, rows)
|
|
|
|
for i in range(nrows):
|
|
d = {}
|
|
for key, val in randomize.items():
|
|
if isinstance(val[0], str):
|
|
d[key] = get_random(*val)
|
|
else:
|
|
d[key] = random.randrange(*val)
|
|
|
|
if unique:
|
|
if not doc.get(fieldname, {unique: d[unique]}):
|
|
doc.append(fieldname, d)
|
|
else:
|
|
doc.append(fieldname, d)
|
|
|
|
|
|
def get_random(doctype: str, filters: dict = None, doc: bool = False):
|
|
condition = []
|
|
if filters:
|
|
condition.extend("{}='{}'".format(key, str(val).replace("'", "'")) for key, val in filters.items())
|
|
condition = " where " + " and ".join(condition) if condition else ""
|
|
|
|
out = frappe.db.multisql(
|
|
{
|
|
"mariadb": """select name from `tab%s` %s
|
|
order by RAND() limit 1 offset 0"""
|
|
% (doctype, condition),
|
|
"postgres": """select name from `tab%s` %s
|
|
order by RANDOM() limit 1 offset 0"""
|
|
% (doctype, condition),
|
|
}
|
|
)
|
|
|
|
out = out and out[0][0] or None
|
|
|
|
if doc and out:
|
|
return frappe.get_doc(doctype, out)
|
|
return out
|
|
|
|
|
|
def can_make(doctype: str) -> bool:
|
|
return random.random() < settings.prob.get(doctype, settings.prob["default"])["make"]
|
|
|
|
|
|
def how_many(doctype: str) -> int:
|
|
return random.randrange(*settings.prob.get(doctype, settings.prob["default"])["qty"])
|