@@ -3,49 +3,48 @@ | |||||
import frappe, unittest | 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') | test_records = frappe.get_test_records('User') | ||||
class TestUser(unittest.TestCase): | class TestUser(unittest.TestCase): | ||||
def test_delete(self): | 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'""") | frappe.db.sql("""delete from tabUserRole where role='_Test Role 2'""") | ||||
delete_doc("Role","_Test Role 2") | delete_doc("Role","_Test Role 2") | ||||
user = frappe.copy_doc(test_records[1]) | user = frappe.copy_doc(test_records[1]) | ||||
user.email = "_test@example.com" | user.email = "_test@example.com" | ||||
user.insert() | user.insert() | ||||
frappe.get_doc({"doctype": "ToDo", "description": "_Test"}).insert() | frappe.get_doc({"doctype": "ToDo", "description": "_Test"}).insert() | ||||
delete_doc("User", "_test@example.com") | delete_doc("User", "_test@example.com") | ||||
self.assertTrue(not frappe.db.sql("""select * from `tabToDo` where owner=%s""", | self.assertTrue(not frappe.db.sql("""select * from `tabToDo` where owner=%s""", | ||||
("_test@example.com",))) | ("_test@example.com",))) | ||||
from frappe.core.doctype.role.test_role import test_records as role_records | from frappe.core.doctype.role.test_role import test_records as role_records | ||||
frappe.copy_doc(role_records[1]).insert() | frappe.copy_doc(role_records[1]).insert() | ||||
def test_get_value(self): | 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", "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"}), "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"}, "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")) | ("_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", "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] | 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) | test_user) | ||||
self.assertEquals(frappe.db.get_value("User", "xxxtest@example.com"), None) | self.assertEquals(frappe.db.get_value("User", "xxxtest@example.com"), None) | ||||
frappe.db.set_value("Website Settings", "Website Settings", "_test", "_test_val") | 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", None, "_test"), "_test_val") | ||||
self.assertEquals(frappe.db.get_value("Website Settings", "Website Settings", "_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 DocstatusTransitionError(ValidationError): pass | ||||
class TimestampMismatchError(ValidationError): pass | class TimestampMismatchError(ValidationError): pass | ||||
class EmptyTableError(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+")", | frappe.msgprint(_("Submitted Record cannot be deleted")+": "+doc.name+"("+doc.doctype+")", | ||||
raise_exception=True) | raise_exception=True) | ||||
class LinkExistsError(frappe.ValidationError): pass | |||||
def check_if_doc_is_linked(doc, method="Delete"): | def check_if_doc_is_linked(doc, method="Delete"): | ||||
""" | """ | ||||
Raises excption if the given doc(dt, dn) is linked in another record. | 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)): | (method=="Cancel" and item.docstatus==1)): | ||||
frappe.throw(_("Cannot delete or cancel because {0} {1} is linked with {2} {3}").format(doc.doctype, | 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), | 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 | from __future__ import unicode_literals | ||||
import frappe | import frappe | ||||
from frappe import _, msgprint | 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.modules import load_doctype_module | ||||
from frappe.model.base_document import BaseDocument | from frappe.model.base_document import BaseDocument | ||||
from frappe.model.naming import set_new_name | from frappe.model.naming import set_new_name | ||||
@@ -424,3 +424,80 @@ class Document(BaseDocument): | |||||
return composer | 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] |