style: format code with black
This commit is contained in:
@@ -10,7 +10,9 @@ from frappe.utils import cint, cstr, flt, get_time, now_datetime
|
||||
from erpnext.controllers.status_updater import StatusUpdater
|
||||
|
||||
|
||||
class UOMMustBeIntegerError(frappe.ValidationError): pass
|
||||
class UOMMustBeIntegerError(frappe.ValidationError):
|
||||
pass
|
||||
|
||||
|
||||
class TransactionBase(StatusUpdater):
|
||||
def validate_posting_time(self):
|
||||
@@ -18,69 +20,79 @@ class TransactionBase(StatusUpdater):
|
||||
if frappe.flags.in_import and self.posting_date:
|
||||
self.set_posting_time = 1
|
||||
|
||||
if not getattr(self, 'set_posting_time', None):
|
||||
if not getattr(self, "set_posting_time", None):
|
||||
now = now_datetime()
|
||||
self.posting_date = now.strftime('%Y-%m-%d')
|
||||
self.posting_time = now.strftime('%H:%M:%S.%f')
|
||||
self.posting_date = now.strftime("%Y-%m-%d")
|
||||
self.posting_time = now.strftime("%H:%M:%S.%f")
|
||||
elif self.posting_time:
|
||||
try:
|
||||
get_time(self.posting_time)
|
||||
except ValueError:
|
||||
frappe.throw(_('Invalid Posting Time'))
|
||||
frappe.throw(_("Invalid Posting Time"))
|
||||
|
||||
def add_calendar_event(self, opts, force=False):
|
||||
if cstr(self.contact_by) != cstr(self._prev.contact_by) or \
|
||||
cstr(self.contact_date) != cstr(self._prev.contact_date) or force or \
|
||||
(hasattr(self, "ends_on") and cstr(self.ends_on) != cstr(self._prev.ends_on)):
|
||||
if (
|
||||
cstr(self.contact_by) != cstr(self._prev.contact_by)
|
||||
or cstr(self.contact_date) != cstr(self._prev.contact_date)
|
||||
or force
|
||||
or (hasattr(self, "ends_on") and cstr(self.ends_on) != cstr(self._prev.ends_on))
|
||||
):
|
||||
|
||||
self.delete_events()
|
||||
self._add_calendar_event(opts)
|
||||
|
||||
def delete_events(self):
|
||||
participations = frappe.get_all("Event Participants", filters={"reference_doctype": self.doctype, "reference_docname": self.name,
|
||||
"parenttype": "Event"}, fields=["name", "parent"])
|
||||
participations = frappe.get_all(
|
||||
"Event Participants",
|
||||
filters={
|
||||
"reference_doctype": self.doctype,
|
||||
"reference_docname": self.name,
|
||||
"parenttype": "Event",
|
||||
},
|
||||
fields=["name", "parent"],
|
||||
)
|
||||
|
||||
if participations:
|
||||
for participation in participations:
|
||||
total_participants = frappe.get_all("Event Participants", filters={"parenttype": "Event", "parent": participation.parent})
|
||||
total_participants = frappe.get_all(
|
||||
"Event Participants", filters={"parenttype": "Event", "parent": participation.parent}
|
||||
)
|
||||
|
||||
if len(total_participants) <= 1:
|
||||
frappe.db.sql("delete from `tabEvent` where name='%s'" % participation.parent)
|
||||
|
||||
frappe.db.sql("delete from `tabEvent Participants` where name='%s'" % participation.name)
|
||||
|
||||
|
||||
def _add_calendar_event(self, opts):
|
||||
opts = frappe._dict(opts)
|
||||
|
||||
if self.contact_date:
|
||||
event = frappe.get_doc({
|
||||
"doctype": "Event",
|
||||
"owner": opts.owner or self.owner,
|
||||
"subject": opts.subject,
|
||||
"description": opts.description,
|
||||
"starts_on": self.contact_date,
|
||||
"ends_on": opts.ends_on,
|
||||
"event_type": "Private"
|
||||
})
|
||||
|
||||
event.append('event_participants', {
|
||||
"reference_doctype": self.doctype,
|
||||
"reference_docname": self.name
|
||||
event = frappe.get_doc(
|
||||
{
|
||||
"doctype": "Event",
|
||||
"owner": opts.owner or self.owner,
|
||||
"subject": opts.subject,
|
||||
"description": opts.description,
|
||||
"starts_on": self.contact_date,
|
||||
"ends_on": opts.ends_on,
|
||||
"event_type": "Private",
|
||||
}
|
||||
)
|
||||
|
||||
event.append(
|
||||
"event_participants", {"reference_doctype": self.doctype, "reference_docname": self.name}
|
||||
)
|
||||
|
||||
event.insert(ignore_permissions=True)
|
||||
|
||||
if frappe.db.exists("User", self.contact_by):
|
||||
frappe.share.add("Event", event.name, self.contact_by,
|
||||
flags={"ignore_share_permission": True})
|
||||
frappe.share.add("Event", event.name, self.contact_by, flags={"ignore_share_permission": True})
|
||||
|
||||
def validate_uom_is_integer(self, uom_field, qty_fields):
|
||||
validate_uom_is_integer(self, uom_field, qty_fields)
|
||||
|
||||
def validate_with_previous_doc(self, ref):
|
||||
self.exclude_fields = ["conversion_factor", "uom"] if self.get('is_return') else []
|
||||
self.exclude_fields = ["conversion_factor", "uom"] if self.get("is_return") else []
|
||||
|
||||
for key, val in ref.items():
|
||||
is_child = val.get("is_child_table")
|
||||
@@ -105,8 +117,9 @@ class TransactionBase(StatusUpdater):
|
||||
def compare_values(self, ref_doc, fields, doc=None):
|
||||
for reference_doctype, ref_dn_list in ref_doc.items():
|
||||
for reference_name in ref_dn_list:
|
||||
prevdoc_values = frappe.db.get_value(reference_doctype, reference_name,
|
||||
[d[0] for d in fields], as_dict=1)
|
||||
prevdoc_values = frappe.db.get_value(
|
||||
reference_doctype, reference_name, [d[0] for d in fields], as_dict=1
|
||||
)
|
||||
|
||||
if not prevdoc_values:
|
||||
frappe.throw(_("Invalid reference {0} {1}").format(reference_doctype, reference_name))
|
||||
@@ -115,7 +128,6 @@ class TransactionBase(StatusUpdater):
|
||||
if prevdoc_values[field] is not None and field not in self.exclude_fields:
|
||||
self.validate_value(field, condition, prevdoc_values[field], doc)
|
||||
|
||||
|
||||
def validate_rate_with_reference_doc(self, ref_details):
|
||||
buying_doctypes = ["Purchase Order", "Purchase Invoice", "Purchase Receipt"]
|
||||
|
||||
@@ -131,17 +143,26 @@ class TransactionBase(StatusUpdater):
|
||||
if d.get(ref_link_field):
|
||||
ref_rate = frappe.db.get_value(ref_dt + " Item", d.get(ref_link_field), "rate")
|
||||
|
||||
if abs(flt(d.rate - ref_rate, d.precision("rate"))) >= .01:
|
||||
if abs(flt(d.rate - ref_rate, d.precision("rate"))) >= 0.01:
|
||||
if action == "Stop":
|
||||
role_allowed_to_override = frappe.db.get_single_value(settings_doc, 'role_to_override_stop_action')
|
||||
role_allowed_to_override = frappe.db.get_single_value(
|
||||
settings_doc, "role_to_override_stop_action"
|
||||
)
|
||||
|
||||
if role_allowed_to_override not in frappe.get_roles():
|
||||
frappe.throw(_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4})").format(
|
||||
d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate))
|
||||
frappe.throw(
|
||||
_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4})").format(
|
||||
d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate
|
||||
)
|
||||
)
|
||||
else:
|
||||
frappe.msgprint(_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4})").format(
|
||||
d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate), title=_("Warning"), indicator="orange")
|
||||
|
||||
frappe.msgprint(
|
||||
_("Row #{0}: Rate must be same as {1}: {2} ({3} / {4})").format(
|
||||
d.idx, ref_dt, d.get(ref_dn_field), d.rate, ref_rate
|
||||
),
|
||||
title=_("Warning"),
|
||||
indicator="orange",
|
||||
)
|
||||
|
||||
def get_link_filters(self, for_doctype):
|
||||
if hasattr(self, "prev_link_mapper") and self.prev_link_mapper.get(for_doctype):
|
||||
@@ -150,11 +171,7 @@ class TransactionBase(StatusUpdater):
|
||||
values = filter(None, tuple(item.as_dict()[fieldname] for item in self.items))
|
||||
|
||||
if values:
|
||||
ret = {
|
||||
for_doctype : {
|
||||
"filters": [[for_doctype, "name", "in", values]]
|
||||
}
|
||||
}
|
||||
ret = {for_doctype: {"filters": [[for_doctype, "name", "in", values]]}}
|
||||
else:
|
||||
ret = None
|
||||
else:
|
||||
@@ -163,17 +180,17 @@ class TransactionBase(StatusUpdater):
|
||||
return ret
|
||||
|
||||
def reset_default_field_value(self, default_field: str, child_table: str, child_table_field: str):
|
||||
""" Reset "Set default X" fields on forms to avoid confusion.
|
||||
"""Reset "Set default X" fields on forms to avoid confusion.
|
||||
|
||||
example:
|
||||
doc = {
|
||||
"set_from_warehouse": "Warehouse A",
|
||||
"items": [{"from_warehouse": "warehouse B"}, {"from_warehouse": "warehouse A"}],
|
||||
}
|
||||
Since this has dissimilar values in child table, the default field will be erased.
|
||||
example:
|
||||
doc = {
|
||||
"set_from_warehouse": "Warehouse A",
|
||||
"items": [{"from_warehouse": "warehouse B"}, {"from_warehouse": "warehouse A"}],
|
||||
}
|
||||
Since this has dissimilar values in child table, the default field will be erased.
|
||||
|
||||
doc.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
|
||||
"""
|
||||
doc.reset_default_field_value("set_from_warehouse", "items", "from_warehouse")
|
||||
"""
|
||||
child_table_values = set()
|
||||
|
||||
for row in self.get(child_table):
|
||||
@@ -182,8 +199,11 @@ class TransactionBase(StatusUpdater):
|
||||
if len(child_table_values) > 1:
|
||||
self.set(default_field, None)
|
||||
|
||||
|
||||
def delete_events(ref_type, ref_name):
|
||||
events = frappe.db.sql_list(""" SELECT
|
||||
events = (
|
||||
frappe.db.sql_list(
|
||||
""" SELECT
|
||||
distinct `tabEvent`.name
|
||||
from
|
||||
`tabEvent`, `tabEvent Participants`
|
||||
@@ -191,18 +211,27 @@ def delete_events(ref_type, ref_name):
|
||||
`tabEvent`.name = `tabEvent Participants`.parent
|
||||
and `tabEvent Participants`.reference_doctype = %s
|
||||
and `tabEvent Participants`.reference_docname = %s
|
||||
""", (ref_type, ref_name)) or []
|
||||
""",
|
||||
(ref_type, ref_name),
|
||||
)
|
||||
or []
|
||||
)
|
||||
|
||||
if events:
|
||||
frappe.delete_doc("Event", events, for_reload=True)
|
||||
|
||||
|
||||
def validate_uom_is_integer(doc, uom_field, qty_fields, child_dt=None):
|
||||
if isinstance(qty_fields, str):
|
||||
qty_fields = [qty_fields]
|
||||
|
||||
distinct_uoms = list(set(d.get(uom_field) for d in doc.get_all_children()))
|
||||
integer_uoms = list(filter(lambda uom: frappe.db.get_value("UOM", uom,
|
||||
"must_be_whole_number", cache=True) or None, distinct_uoms))
|
||||
integer_uoms = list(
|
||||
filter(
|
||||
lambda uom: frappe.db.get_value("UOM", uom, "must_be_whole_number", cache=True) or None,
|
||||
distinct_uoms,
|
||||
)
|
||||
)
|
||||
|
||||
if not integer_uoms:
|
||||
return
|
||||
@@ -213,6 +242,11 @@ def validate_uom_is_integer(doc, uom_field, qty_fields, child_dt=None):
|
||||
qty = d.get(f)
|
||||
if qty:
|
||||
if abs(cint(qty) - flt(qty)) > 0.0000001:
|
||||
frappe.throw(_("Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}.") \
|
||||
.format(qty, d.idx, frappe.bold(_("Must be Whole Number")), frappe.bold(d.get(uom_field))),
|
||||
UOMMustBeIntegerError)
|
||||
frappe.throw(
|
||||
_(
|
||||
"Row {1}: Quantity ({0}) cannot be a fraction. To allow this, disable '{2}' in UOM {3}."
|
||||
).format(
|
||||
qty, d.idx, frappe.bold(_("Must be Whole Number")), frappe.bold(d.get(uom_field))
|
||||
),
|
||||
UOMMustBeIntegerError,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user