@@ -3,49 +3,48 @@ | |||
import frappe, unittest | |||
from frappe.model.delete_doc import delete_doc, LinkExistsError | |||
from frappe.model.delete_doc import delete_doc | |||
test_records = frappe.get_test_records('User') | |||
class TestUser(unittest.TestCase): | |||
def test_delete(self): | |||
self.assertRaises(LinkExistsError, delete_doc, "Role", "_Test Role 2") | |||
self.assertRaises(frappe.LinkExistsError, delete_doc, "Role", "_Test Role 2") | |||
frappe.db.sql("""delete from tabUserRole where role='_Test Role 2'""") | |||
delete_doc("Role","_Test Role 2") | |||
user = frappe.copy_doc(test_records[1]) | |||
user.email = "_test@example.com" | |||
user.insert() | |||
frappe.get_doc({"doctype": "ToDo", "description": "_Test"}).insert() | |||
delete_doc("User", "_test@example.com") | |||
self.assertTrue(not frappe.db.sql("""select * from `tabToDo` where owner=%s""", | |||
("_test@example.com",))) | |||
from frappe.core.doctype.role.test_role import test_records as role_records | |||
frappe.copy_doc(role_records[1]).insert() | |||
def test_get_value(self): | |||
self.assertEquals(frappe.db.get_value("User", "test@example.com"), "test@example.com") | |||
self.assertEquals(frappe.db.get_value("User", {"email":"test@example.com"}), "test@example.com") | |||
self.assertEquals(frappe.db.get_value("User", {"email":"test@example.com"}, "email"), "test@example.com") | |||
self.assertEquals(frappe.db.get_value("User", {"email":"test@example.com"}, ["first_name", "email"]), | |||
self.assertEquals(frappe.db.get_value("User", {"email":"test@example.com"}, ["first_name", "email"]), | |||
("_Test", "test@example.com")) | |||
self.assertEquals(frappe.db.get_value("User", | |||
{"email":"test@example.com", "first_name": "_Test"}, | |||
["first_name", "email"]), | |||
self.assertEquals(frappe.db.get_value("User", | |||
{"email":"test@example.com", "first_name": "_Test"}, | |||
["first_name", "email"]), | |||
("_Test", "test@example.com")) | |||
test_user = frappe.db.sql("select * from tabUser where name='test@example.com'", | |||
test_user = frappe.db.sql("select * from tabUser where name='test@example.com'", | |||
as_dict=True)[0] | |||
self.assertEquals(frappe.db.get_value("User", {"email":"test@example.com"}, "*", as_dict=True), | |||
self.assertEquals(frappe.db.get_value("User", {"email":"test@example.com"}, "*", as_dict=True), | |||
test_user) | |||
self.assertEquals(frappe.db.get_value("User", "xxxtest@example.com"), None) | |||
frappe.db.set_value("Website Settings", "Website Settings", "_test", "_test_val") | |||
self.assertEquals(frappe.db.get_value("Website Settings", None, "_test"), "_test_val") | |||
self.assertEquals(frappe.db.get_value("Website Settings", "Website Settings", "_test"), "_test_val") | |||
@@ -42,3 +42,4 @@ class LinkValidationError(ValidationError): pass | |||
class DocstatusTransitionError(ValidationError): pass | |||
class TimestampMismatchError(ValidationError): pass | |||
class EmptyTableError(ValidationError): pass | |||
class LinkExistsError(ValidationError): pass |
@@ -1,91 +0,0 @@ | |||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | |||
# MIT License. See license.txt | |||
from __future__ import unicode_literals | |||
import frappe | |||
from frappe import msgprint, _ | |||
from frappe.utils import flt, cint, cstr | |||
from frappe.model.meta import get_field_precision | |||
from frappe.model.document import Document | |||
class DocListController(Document): | |||
def __init__(self, arg1, arg2=None): | |||
super(DocListController, self).__init__(arg1, arg2) | |||
if hasattr(self, "setup"): | |||
self.setup() | |||
def validate_value(self, fieldname, condition, val2, doc=None, raise_exception=None): | |||
"""check that value of fieldname should be 'condition' val2 | |||
else throw exception""" | |||
error_condition_map = { | |||
"in": _("one of"), | |||
"not in": _("none of"), | |||
"^": _("beginning with"), | |||
} | |||
if not doc: | |||
doc = self | |||
df = doc.meta.get_field(fieldname) | |||
val1 = doc.get(fieldname) | |||
if df.fieldtype in ("Currency", "Float"): | |||
val1 = flt(val1, self.precision(df.fieldname, doc.parentfield or None)) | |||
val2 = flt(val2, self.precision(df.fieldname, doc.parentfield or None)) | |||
elif df.fieldtype in ("Int", "Check"): | |||
val1 = cint(val1) | |||
val2 = cint(val2) | |||
elif df.fieldtype in ("Data", "Text", "Small Text", "Long Text", | |||
"Text Editor", "Select", "Link"): | |||
val1 = cstr(val1) | |||
val2 = cstr(val2) | |||
if not frappe.compare(val1, condition, val2): | |||
label = doc.meta.get_label(fieldname) | |||
condition_str = error_condition_map.get(condition, condition) | |||
if doc.parentfield: | |||
msg = _("Incorrect value in row {0}: {1} must be {2} {3}".format(doc.idx, label, condition_str, val2)) | |||
else: | |||
msg = _("Incorrect value: {1} must be {2} {3}".format(label, condition_str, val2)) | |||
# raise passed exception or True | |||
msgprint(msg, raise_exception=raise_exception or True) | |||
def validate_table_has_rows(self, parentfield, raise_exception=None): | |||
if not (isinstance(self.get(parentfield), list) and len(self.get(parentfield)) > 0): | |||
label = self.meta.get_label(parentfield) | |||
frappe.throw(_("Table {0} cannot be empty").format(label), raise_exception or frappe.EmptyTableError) | |||
def round_floats_in(self, doc, fieldnames=None): | |||
if not fieldnames: | |||
fieldnames = [df.fieldname for df in doc.meta.get("fields", | |||
{"fieldtype": ["in", ["Currency", "Float"]]})] | |||
for fieldname in fieldnames: | |||
doc.set(fieldname, flt(doc.get(fieldname), self.precision(fieldname, doc.parentfield))) | |||
def precision(self, fieldname, parentfield=None): | |||
if parentfield and not isinstance(parentfield, basestring): | |||
parentfield = parentfield.parentfield | |||
if not hasattr(self, "_precision"): | |||
self._precision = frappe._dict({ | |||
"default": cint(frappe.db.get_default("float_precision")) or 3, | |||
"options": {} | |||
}) | |||
if self._precision.setdefault(parentfield or "main", {}).get(fieldname) is None: | |||
meta = frappe.get_meta(self.meta.get_field(parentfield).options if parentfield else self.doctype) | |||
df = meta.get_field(fieldname) | |||
if df.fieldtype == "Currency" and df.options and not self._precision.options.get(df.options): | |||
self._precision.options[df.options] = get_field_precision(df, self) | |||
if df.fieldtype == "Currency": | |||
self._precision[parentfield or "main"][fieldname] = cint(self._precision.options.get(df.options)) or \ | |||
self._precision.default | |||
elif df.fieldtype == "Float": | |||
self._precision[parentfield or "main"][fieldname] = self._precision.default | |||
return self._precision[parentfield or "main"][fieldname] |
@@ -70,8 +70,6 @@ def check_permission_and_not_submitted(doc, ignore_permissions=False): | |||
frappe.msgprint(_("Submitted Record cannot be deleted")+": "+doc.name+"("+doc.doctype+")", | |||
raise_exception=True) | |||
class LinkExistsError(frappe.ValidationError): pass | |||
def check_if_doc_is_linked(doc, method="Delete"): | |||
""" | |||
Raises excption if the given doc(dt, dn) is linked in another record. | |||
@@ -89,4 +87,4 @@ def check_if_doc_is_linked(doc, method="Delete"): | |||
(method=="Cancel" and item.docstatus==1)): | |||
frappe.throw(_("Cannot delete or cancel because {0} {1} is linked with {2} {3}").format(doc.doctype, | |||
doc.name, item.parent or item.name, item.parenttype if item.parent else link_dt), | |||
LinkExistsError) | |||
frappe.LinkExistsError) |
@@ -4,7 +4,7 @@ | |||
from __future__ import unicode_literals | |||
import frappe | |||
from frappe import _, msgprint | |||
from frappe.utils import cstr, now | |||
from frappe.utils import flt, cint, cstr, now | |||
from frappe.modules import load_doctype_module | |||
from frappe.model.base_document import BaseDocument | |||
from frappe.model.naming import set_new_name | |||
@@ -424,3 +424,80 @@ class Document(BaseDocument): | |||
return composer | |||
def validate_value(self, fieldname, condition, val2, doc=None, raise_exception=None): | |||
"""check that value of fieldname should be 'condition' val2 | |||
else throw exception""" | |||
error_condition_map = { | |||
"in": _("one of"), | |||
"not in": _("none of"), | |||
"^": _("beginning with"), | |||
} | |||
if not doc: | |||
doc = self | |||
df = doc.meta.get_field(fieldname) | |||
val1 = doc.get(fieldname) | |||
if df.fieldtype in ("Currency", "Float"): | |||
val1 = flt(val1, self.precision(df.fieldname, doc.parentfield or None)) | |||
val2 = flt(val2, self.precision(df.fieldname, doc.parentfield or None)) | |||
elif df.fieldtype in ("Int", "Check"): | |||
val1 = cint(val1) | |||
val2 = cint(val2) | |||
elif df.fieldtype in ("Data", "Text", "Small Text", "Long Text", | |||
"Text Editor", "Select", "Link"): | |||
val1 = cstr(val1) | |||
val2 = cstr(val2) | |||
if not frappe.compare(val1, condition, val2): | |||
label = doc.meta.get_label(fieldname) | |||
condition_str = error_condition_map.get(condition, condition) | |||
if doc.parentfield: | |||
msg = _("Incorrect value in row {0}: {1} must be {2} {3}".format(doc.idx, label, condition_str, val2)) | |||
else: | |||
msg = _("Incorrect value: {1} must be {2} {3}".format(label, condition_str, val2)) | |||
# raise passed exception or True | |||
msgprint(msg, raise_exception=raise_exception or True) | |||
def validate_table_has_rows(self, parentfield, raise_exception=None): | |||
if not (isinstance(self.get(parentfield), list) and len(self.get(parentfield)) > 0): | |||
label = self.meta.get_label(parentfield) | |||
frappe.throw(_("Table {0} cannot be empty").format(label), raise_exception or frappe.EmptyTableError) | |||
def round_floats_in(self, doc, fieldnames=None): | |||
if not fieldnames: | |||
fieldnames = (df.fieldname for df in | |||
doc.meta.get("fields", {"fieldtype": ["in", ["Currency", "Float"]]})) | |||
for fieldname in fieldnames: | |||
doc.set(fieldname, flt(doc.get(fieldname), self.precision(fieldname, doc.parentfield))) | |||
def precision(self, fieldname, parentfield=None): | |||
from frappe.model.meta import get_field_precision | |||
if parentfield and not isinstance(parentfield, basestring): | |||
parentfield = parentfield.parentfield | |||
if not hasattr(self, "_precision"): | |||
self._precision = frappe._dict({ | |||
"default": cint(frappe.db.get_default("float_precision")) or 3, | |||
"options": {} | |||
}) | |||
if self._precision.setdefault(parentfield or "main", {}).get(fieldname) is None: | |||
meta = frappe.get_meta(self.meta.get_field(parentfield).options if parentfield else self.doctype) | |||
df = meta.get_field(fieldname) | |||
if df.fieldtype == "Currency" and df.options and not self._precision.options.get(df.options): | |||
self._precision.options[df.options] = get_field_precision(df, self) | |||
if df.fieldtype == "Currency": | |||
self._precision[parentfield or "main"][fieldname] = cint(self._precision.options.get(df.options)) or \ | |||
self._precision.default | |||
elif df.fieldtype == "Float": | |||
self._precision[parentfield or "main"][fieldname] = self._precision.default | |||
return self._precision[parentfield or "main"][fieldname] |