Rushabh Mehta 11 years ago
parent
commit
7bef30b270
76 changed files with 238 additions and 216 deletions
  1. +0
    -18
      frappe/__init__.py
  2. +1
    -1
      frappe/api.py
  3. +10
    -10
      frappe/client.py
  4. +4
    -4
      frappe/core/doctype/comment/test_comment.py
  5. +1
    -1
      frappe/core/doctype/communication/communication.py
  6. +1
    -1
      frappe/core/doctype/custom_field/custom_field.py
  7. +1
    -1
      frappe/core/doctype/customize_form/customize_form.py
  8. +1
    -0
      frappe/core/doctype/defaultvalue/defaultvalue.py
  9. +5
    -3
      frappe/core/doctype/doctype/doctype.py
  10. +1
    -1
      frappe/core/doctype/event/event.py
  11. +5
    -5
      frappe/core/doctype/event/test_event.py
  12. +1
    -1
      frappe/core/doctype/file_data/file_data.py
  13. +5
    -2
      frappe/core/doctype/notification_count/notification_count.py
  14. +2
    -2
      frappe/core/doctype/print_format/print_format.py
  15. +1
    -1
      frappe/core/doctype/property_setter/property_setter.py
  16. +1
    -1
      frappe/core/doctype/todo/todo.py
  17. +3
    -3
      frappe/core/doctype/user/test_user.py
  18. +4
    -4
      frappe/core/doctype/user/user.py
  19. +3
    -2
      frappe/core/doctype/version/version.py
  20. +1
    -1
      frappe/core/doctype/workflow/workflow.py
  21. +6
    -6
      frappe/core/page/data_import_tool/data_import_tool.py
  22. +1
    -1
      frappe/core/page/permission_manager/permission_manager.py
  23. +1
    -1
      frappe/database.py
  24. +1
    -1
      frappe/defaults.py
  25. +1
    -1
      frappe/handler.py
  26. +1
    -1
      frappe/installer.py
  27. +1
    -1
      frappe/model/__init__.py
  28. +5
    -2
      frappe/model/base_document.py
  29. +0
    -1
      frappe/model/create_new.py
  30. +16
    -9
      frappe/model/document.py
  31. +20
    -4
      frappe/model/meta.py
  32. +3
    -1
      frappe/model/naming.py
  33. +2
    -2
      frappe/model/rename_doc.py
  34. +17
    -15
      frappe/modules/import_file.py
  35. +1
    -1
      frappe/modules/patch_handler.py
  36. +3
    -3
      frappe/permissions.py
  37. +1
    -1
      frappe/templates/generators/blog_post.py
  38. +2
    -2
      frappe/templates/generators/website_group.py
  39. +1
    -1
      frappe/templates/includes/comments.py
  40. +1
    -1
      frappe/templates/pages/about.py
  41. +1
    -1
      frappe/templates/pages/blog.py
  42. +2
    -2
      frappe/templates/pages/contact.py
  43. +3
    -3
      frappe/templates/pages/login.py
  44. +1
    -1
      frappe/templates/pages/rss.py
  45. +1
    -1
      frappe/templates/pages/style_settings.py
  46. +1
    -1
      frappe/templates/pages/writers.py
  47. +5
    -5
      frappe/templates/website_group/post.py
  48. +4
    -4
      frappe/templates/website_group/settings.py
  49. +4
    -0
      frappe/tests/test_document.py
  50. +1
    -1
      frappe/translate.py
  51. +2
    -2
      frappe/utils/datautils.py
  52. +1
    -1
      frappe/utils/email_lib/bulk.py
  53. +1
    -1
      frappe/utils/email_lib/smtp.py
  54. +4
    -4
      frappe/utils/file_manager.py
  55. +2
    -2
      frappe/utils/install.py
  56. +1
    -1
      frappe/utils/scheduler.py
  57. +2
    -2
      frappe/utils/user.py
  58. +1
    -1
      frappe/website/context.py
  59. +1
    -1
      frappe/website/doctype/blog_post/blog_post.py
  60. +14
    -14
      frappe/website/doctype/blog_post/test_blog_post.py
  61. +1
    -1
      frappe/website/doctype/blogger/blogger.py
  62. +1
    -1
      frappe/website/doctype/post/post.py
  63. +1
    -1
      frappe/website/doctype/user_vote/user_vote.py
  64. +3
    -3
      frappe/website/doctype/web_page/test_web_page.py
  65. +16
    -16
      frappe/website/doctype/website_route/website_route.py
  66. +1
    -1
      frappe/website/doctype/website_settings/website_settings.py
  67. +1
    -1
      frappe/website/doctype/website_slideshow/website_slideshow.py
  68. +7
    -7
      frappe/website/doctype/website_template/website_template.py
  69. +5
    -5
      frappe/website/page/sitemap_browser/sitemap_browser.py
  70. +4
    -4
      frappe/website/sitemap.py
  71. +5
    -5
      frappe/website/statics.py
  72. +1
    -1
      frappe/widgets/calendar.py
  73. +2
    -2
      frappe/widgets/form/assign_to.py
  74. +1
    -1
      frappe/widgets/form/utils.py
  75. +1
    -1
      frappe/widgets/query_report.py
  76. +1
    -1
      frappe/widgets/reportview.py

+ 0
- 18
frappe/__init__.py View File

@@ -309,13 +309,6 @@ def reset_metadata_version():
cache().set_value("metadata_version", v) cache().set_value("metadata_version", v)
return v return v


def get_obj(dt = None, dn = None, doc=None, doclist=None, with_children = True):
from frappe.model.code import get_obj
return get_obj(dt, dn, doc, doclist, with_children)

def doc(doctype=None, name=None, fielddata=None):
return Document(doctype, name, fielddata)

def new_doc(doctype, parent_doc=None, parentfield=None): def new_doc(doctype, parent_doc=None, parentfield=None):
from frappe.model.create_new import get_new_doc from frappe.model.create_new import get_new_doc
return get_new_doc(doctype, parent_doc, parentfield) return get_new_doc(doctype, parent_doc, parentfield)
@@ -328,21 +321,10 @@ def doclist(lst=None):
from frappe.model.doclist import DocList from frappe.model.doclist import DocList
return DocList(lst) return DocList(lst)


def bean(doctype=None, name=None, copy=None):
"""return an instance of the object, wrapped as a Bean (frappe.model.bean)"""
from frappe.model.bean import Bean
if copy:
return Bean(copy_doc(copy))
else:
return Bean(doctype, name)

def set_value(doctype, docname, fieldname, value): def set_value(doctype, docname, fieldname, value):
import frappe.client import frappe.client
return frappe.client.set_value(doctype, docname, fieldname, value) return frappe.client.set_value(doctype, docname, fieldname, value)


def get_doclist(doctype, name=None):
return bean(doctype, name).doclist

def get_doc(arg1, arg2=None): def get_doc(arg1, arg2=None):
import frappe.model.document import frappe.model.document
return frappe.model.document.get_doc(arg1, arg2) return frappe.model.document.get_doc(arg1, arg2)


+ 1
- 1
frappe/api.py View File

@@ -41,7 +41,7 @@ def handle():
elif call=="resource": elif call=="resource":
if "run_method" in frappe.local.form_dict: if "run_method" in frappe.local.form_dict:
bean = frappe.bean(doctype, name)
bean = frappe.get_doc(doctype, name)


if frappe.local.request.method=="GET": if frappe.local.request.method=="GET":
if not bean.has_permission("read"): if not bean.has_permission("read"):


+ 10
- 10
frappe/client.py View File

@@ -14,7 +14,7 @@ def get(doctype, name=None, filters=None):
name = frappe.db.get_value(doctype, json.loads(filters)) name = frappe.db.get_value(doctype, json.loads(filters))
if not name: if not name:
raise Exception, "No document found for given filters" raise Exception, "No document found for given filters"
return [d.fields for d in frappe.bean(doctype, name).doclist]
return [d.fields for d in frappe.get_doc(doctype, name).doclist]


@frappe.whitelist() @frappe.whitelist()
def get_value(doctype, fieldname, filters=None, as_dict=True, debug=False): def get_value(doctype, fieldname, filters=None, as_dict=True, debug=False):
@@ -32,11 +32,11 @@ def set_value(doctype, name, fieldname, value):
doc = frappe.db.get_value(doctype, name, ["parenttype", "parent"], as_dict=True) doc = frappe.db.get_value(doctype, name, ["parenttype", "parent"], as_dict=True)
if doc and doc.parent: if doc and doc.parent:
bean = frappe.bean(doc.parenttype, doc.parent)
bean = frappe.get_doc(doc.parenttype, doc.parent)
child = bean.doclist.getone({"doctype": doctype, "name": name}) child = bean.doclist.getone({"doctype": doctype, "name": name})
child.set(fieldname, value) child.set(fieldname, value)
else: else:
bean = frappe.bean(doctype, name)
bean = frappe.get_doc(doctype, name)
bean.set(fieldname, value) bean.set(fieldname, value)
bean.save() bean.save()
@@ -54,12 +54,12 @@ def insert(doclist):
if doclist[0].get("parent") and doclist[0].get("parenttype"): if doclist[0].get("parent") and doclist[0].get("parenttype"):
# inserting a child record # inserting a child record
d = doclist[0] d = doclist[0]
bean = frappe.bean(d["parenttype"], d["parent"])
bean = frappe.get_doc(d["parenttype"], d["parent"])
bean.append(d) bean.append(d)
bean.save() bean.save()
return [d] return [d]
else: else:
bean = frappe.bean(doclist).insert()
bean = frappe.get_doc(doclist).insert()
return [d.fields for d in bean.doclist] return [d.fields for d in bean.doclist]


@frappe.whitelist() @frappe.whitelist()
@@ -67,7 +67,7 @@ def save(doclist):
if isinstance(doclist, basestring): if isinstance(doclist, basestring):
doclist = json.loads(doclist) doclist = json.loads(doclist)


bean = frappe.bean(doclist).save()
bean = frappe.get_doc(doclist).save()
return [d.fields for d in bean.doclist] return [d.fields for d in bean.doclist]
@frappe.whitelist() @frappe.whitelist()
@@ -80,14 +80,14 @@ def submit(doclist):
if isinstance(doclist, basestring): if isinstance(doclist, basestring):
doclist = json.loads(doclist) doclist = json.loads(doclist)


doclistobj = frappe.bean(doclist)
doclistobj = frappe.get_doc(doclist)
doclistobj.submit() doclistobj.submit()


return [d.fields for d in doclist] return [d.fields for d in doclist]


@frappe.whitelist() @frappe.whitelist()
def cancel(doctype, name): def cancel(doctype, name):
wrapper = frappe.bean(doctype, name)
wrapper = frappe.get_doc(doctype, name)
wrapper.cancel() wrapper.cancel()
return [d.fields for d in wrapper.doclist] return [d.fields for d in wrapper.doclist]
@@ -106,7 +106,7 @@ def set_default(key, value, parent=None):
def make_width_property_setter(): def make_width_property_setter():
doclist = json.loads(frappe.form_dict.doclist) doclist = json.loads(frappe.form_dict.doclist)
if doclist[0]["doctype"]=="Property Setter" and doclist[0]["property"]=="width": if doclist[0]["doctype"]=="Property Setter" and doclist[0]["property"]=="width":
bean = frappe.bean(doclist)
bean = frappe.get_doc(doclist)
bean.ignore_permissions = True bean.ignore_permissions = True
bean.insert() bean.insert()


@@ -119,7 +119,7 @@ def bulk_update(docs):
ddoc = {key: val for key, val in doc.iteritems() if key not in ['doctype', 'docname']} ddoc = {key: val for key, val in doc.iteritems() if key not in ['doctype', 'docname']}
doctype = doc['doctype'] doctype = doc['doctype']
docname = doc['docname'] docname = doc['docname']
bean = frappe.bean(doctype, docname)
bean = frappe.get_doc(doctype, docname)
bean.update(ddoc) bean.update(ddoc)
bean.save() bean.save()
except: except:


+ 4
- 4
frappe/core/doctype/comment/test_comment.py View File

@@ -9,7 +9,7 @@ import frappe, unittest, json
# class TestComment(unittest.TestCase): # class TestComment(unittest.TestCase):
# def setUp(self): # def setUp(self):
# self.cleanup() # self.cleanup()
# self.test_rec = frappe.bean({
# self.test_rec = frappe.get_doc({
# "doctype":"Event", # "doctype":"Event",
# "subject":"__Comment Test Event", # "subject":"__Comment Test Event",
# "event_type": "Private", # "event_type": "Private",
@@ -29,21 +29,21 @@ import frappe, unittest, json
# frappe.db.sql("""alter table `tabEvent` drop column `_comments`""") # frappe.db.sql("""alter table `tabEvent` drop column `_comments`""")
# #
# def test_add_comment(self): # def test_add_comment(self):
# self.comment = frappe.bean({
# self.comment = frappe.get_doc({
# "doctype":"Comment", # "doctype":"Comment",
# "comment_doctype": self.test_rec.doctype, # "comment_doctype": self.test_rec.doctype,
# "comment_docname": self.test_rec.name, # "comment_docname": self.test_rec.name,
# "comment": "__Test Comment" # "comment": "__Test Comment"
# }).insert() # }).insert()
# #
# test_rec = frappe.doc(self.test_rec.doctype, self.test_rec.name)
# test_rec = frappe.get_doc(self.test_rec.doctype, self.test_rec.name)
# _comments = json.loads(test_rec.get("_comments")) # _comments = json.loads(test_rec.get("_comments"))
# self.assertTrue(_comments[0].get("comment")=="__Test Comment") # self.assertTrue(_comments[0].get("comment")=="__Test Comment")
# #
# def test_remove_comment(self): # def test_remove_comment(self):
# self.test_add_comment() # self.test_add_comment()
# frappe.delete_doc("Comment", self.comment.name) # frappe.delete_doc("Comment", self.comment.name)
# test_rec = frappe.doc(self.test_rec.doctype, self.test_rec.name)
# test_rec = frappe.get_doc(self.test_rec.doctype, self.test_rec.name)
# _comments = json.loads(test_rec.get("_comments")) # _comments = json.loads(test_rec.get("_comments"))
# self.assertEqual(len(_comments), 0) # self.assertEqual(len(_comments), 0)
# #


+ 1
- 1
frappe/core/doctype/communication/communication.py View File

@@ -16,7 +16,7 @@ from frappe.model.document import Document


class Communication(Document): class Communication(Document):
def get_parent_bean(self): def get_parent_bean(self):
return frappe.bean(self.parenttype, self.parent)
return frappe.get_doc(self.parenttype, self.parent)
def update_parent(self): def update_parent(self):
"""update status of parent Lead or Contact based on who is replying""" """update status of parent Lead or Contact based on who is replying"""


+ 1
- 1
frappe/core/doctype/custom_field/custom_field.py View File

@@ -114,7 +114,7 @@ def create_custom_field_if_values_exist(doctype, df):
frappe.db.sql("""select count(*) from `tab{doctype}` frappe.db.sql("""select count(*) from `tab{doctype}`
where ifnull({fieldname},'')!=''""".format(doctype=doctype, fieldname=df.fieldname))[0][0] and \ where ifnull({fieldname},'')!=''""".format(doctype=doctype, fieldname=df.fieldname))[0][0] and \
not frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": df.fieldname}): not frappe.db.get_value("Custom Field", {"dt": doctype, "fieldname": df.fieldname}):
frappe.bean({
frappe.get_doc({
"doctype":"Custom Field", "doctype":"Custom Field",
"dt": doctype, "dt": doctype,
"permlevel": df.permlevel or 0, "permlevel": df.permlevel or 0,


+ 1
- 1
frappe/core/doctype/customize_form/customize_form.py View File

@@ -291,7 +291,7 @@ class CustomizeForm(Document):
if d.doctype=="Customize Form Field": if d.doctype=="Customize Form Field":
fields.append(d.fieldname) fields.append(d.fieldname)
d = frappe.doc('Property Setter')
d = frappe.get_doc('Property Setter')
d.doctype_or_field = 'DocType' d.doctype_or_field = 'DocType'
d.doc_type = self.doc_type d.doc_type = self.doc_type
d.property = "_idx" d.property = "_idx"


+ 1
- 0
frappe/core/doctype/defaultvalue/defaultvalue.py View File

@@ -7,6 +7,7 @@ import frappe
from frappe.model.document import Document from frappe.model.document import Document


class Defaultvalue(Document): class Defaultvalue(Document):
pass
def on_doctype_update(): def on_doctype_update():
if not frappe.db.sql("""show index from `tabDefaultValue` if not frappe.db.sql("""show index from `tabDefaultValue`


+ 5
- 3
frappe/core/doctype/doctype/doctype.py View File

@@ -328,16 +328,18 @@ def validate_permissions(permissions, for_remove=False):
def make_module_and_roles(doc, perm_fieldname="permissions"): def make_module_and_roles(doc, perm_fieldname="permissions"):
try: try:
if not frappe.db.exists("Module Def", doc.module): if not frappe.db.exists("Module Def", doc.module):
m = frappe.bean({"doctype": "Module Def", "module_name": doc.module})
m = frappe.get_doc({"doctype": "Module Def", "module_name": doc.module})
m.ignore_mandatory = m.ignore_permissions = True
m.insert() m.insert()
default_roles = ["Administrator", "Guest", "All"] default_roles = ["Administrator", "Guest", "All"]
roles = [p.role for p in doc.get(permissions)] + default_roles
roles = [p.role for p in doc.get("permissions") or []] + default_roles
for role in list(set(roles)): for role in list(set(roles)):
if not frappe.db.exists("Role", role): if not frappe.db.exists("Role", role):
r = frappe.bean({"doctype": "Role", "role_name": role})
r = frappe.get_doc({"doctype": "Role", "role_name": role})
r.role_name = role r.role_name = role
r.ignore_mandatory = r.ignore_permissions = True
r.insert() r.insert()
except frappe.DoesNotExistError, e: except frappe.DoesNotExistError, e:
pass pass


+ 1
- 1
frappe/core/doctype/event/event.py View File

@@ -33,7 +33,7 @@ def has_permission(doc, bean=None):
# need full doclist to check roles and users # need full doclist to check roles and users
if not bean: if not bean:
bean = frappe.bean("Event", doc.name)
bean = frappe.get_doc("Event", doc.name)
if len(bean.doclist)==1: if len(bean.doclist)==1:
return False return False


+ 5
- 5
frappe/core/doctype/event/test_event.py View File

@@ -35,25 +35,25 @@ import unittest


class TestEvent(unittest.TestCase): class TestEvent(unittest.TestCase):
# def setUp(self): # def setUp(self):
# user = frappe.bean("User", "test1@example.com")
# user.get_controller().add_roles("Website Manager")
# user = frappe.get_doc("User", "test1@example.com")
# user.add_roles("Website Manager")


def tearDown(self): def tearDown(self):
frappe.set_user("Administrator") frappe.set_user("Administrator")


def test_allowed_public(self): def test_allowed_public(self):
frappe.set_user("test1@example.com") frappe.set_user("test1@example.com")
doc = frappe.doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 1"}))
doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 1"}))
self.assertTrue(frappe.has_permission("Event", refdoc=doc)) self.assertTrue(frappe.has_permission("Event", refdoc=doc))
def test_not_allowed_private(self): def test_not_allowed_private(self):
frappe.set_user("test1@example.com") frappe.set_user("test1@example.com")
doc = frappe.doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 2"}))
doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 2"}))
self.assertFalse(frappe.has_permission("Event", refdoc=doc)) self.assertFalse(frappe.has_permission("Event", refdoc=doc))


def test_allowed_private_if_in_event_user(self): def test_allowed_private_if_in_event_user(self):
frappe.set_user("test1@example.com") frappe.set_user("test1@example.com")
doc = frappe.doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 3"}))
doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 3"}))
self.assertTrue(frappe.has_permission("Event", refdoc=doc)) self.assertTrue(frappe.has_permission("Event", refdoc=doc))
def test_event_list(self): def test_event_list(self):


+ 1
- 1
frappe/core/doctype/file_data/file_data.py View File

@@ -34,7 +34,7 @@ class FileData(Document):
if self.attached_to_name: if self.attached_to_name:
# check persmission # check persmission
try: try:
if not self.bean.ignore_permissions and \
if not self.ignore_permissions and \
not frappe.has_permission(self.attached_to_doctype, "write", self.attached_to_name): not frappe.has_permission(self.attached_to_doctype, "write", self.attached_to_name):
frappe.msgprint(frappe._("No permission to write / remove."), raise_exception=True) frappe.msgprint(frappe._("No permission to write / remove."), raise_exception=True)


+ 5
- 2
frappe/core/doctype/notification_count/notification_count.py View File

@@ -9,9 +9,12 @@ import frappe
from frappe.model.document import Document from frappe.model.document import Document


class NotificationCount(Document): class NotificationCount(Document):
pass


@frappe.whitelist() @frappe.whitelist()
def get_notifications(): def get_notifications():
if frappe.in_install_app:
return
config = get_notification_config() config = get_notification_config()
can_read = frappe.user.get_can_read() can_read = frappe.user.get_can_read()
open_count_doctype = {} open_count_doctype = {}
@@ -31,7 +34,7 @@ def get_notifications():
result = frappe.get_list(d, fields=["count(*)"], result = frappe.get_list(d, fields=["count(*)"],
filters=[[d, key, "=", condition[key]]], as_list=True, limit_page_length=1)[0][0] filters=[[d, key, "=", condition[key]]], as_list=True, limit_page_length=1)[0][0]


frappe.doc({"doctype":"Notification Count", "for_doctype":d,
frappe.get_doc({"doctype":"Notification Count", "for_doctype":d,
"open_count":result}).insert() "open_count":result}).insert()
open_count_doctype[d] = result open_count_doctype[d] = result
@@ -41,7 +44,7 @@ def get_notifications():
open_count_module[m] = notification_count[m] open_count_module[m] = notification_count[m]
else: else:
open_count_module[m] = frappe.get_attr(config.for_module[m])() open_count_module[m] = frappe.get_attr(config.for_module[m])()
frappe.doc({"doctype":"Notification Count", "for_doctype":m,
frappe.get_doc({"doctype":"Notification Count", "for_doctype":m,
"open_count":open_count_module[m]}).insert() "open_count":open_count_module[m]}).insert()


return { return {


+ 2
- 2
frappe/core/doctype/print_format/print_format.py View File

@@ -48,7 +48,7 @@ def get_args():
<pre>%s</pre>""" % repr(frappe.form_dict) <pre>%s</pre>""" % repr(frappe.form_dict)
} }
bean = frappe.bean(frappe.form_dict.doctype, frappe.form_dict.name)
bean = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name)
for ptype in ("read", "print"): for ptype in ("read", "print"):
if not frappe.has_permission(bean.doctype, ptype, bean.doc): if not frappe.has_permission(bean.doctype, ptype, bean.doc):
return { return {
@@ -66,7 +66,7 @@ def get_html(doc, doclist, print_format=None):
from jinja2 import Environment from jinja2 import Environment
if isinstance(doc, basestring) and isinstance(doclist, basestring): if isinstance(doc, basestring) and isinstance(doclist, basestring):
bean = frappe.bean(doc, doclist)
bean = frappe.get_doc(doc, doclist)
doc = bean.doc doc = bean.doc
doclist = bean.doclist doclist = bean.doclist




+ 1
- 1
frappe/core/doctype/property_setter/property_setter.py View File

@@ -55,7 +55,7 @@ class PropertySetter(Document):
validate_fields_for_doctype(self.doc_type) validate_fields_for_doctype(self.doc_type)
def make_property_setter(doctype, fieldname, property, value, property_type, for_doctype = False): def make_property_setter(doctype, fieldname, property, value, property_type, for_doctype = False):
return frappe.bean({
return frappe.get_doc({
"doctype":"Property Setter", "doctype":"Property Setter",
"doctype_or_field": for_doctype and "DocType" or "DocField", "doctype_or_field": for_doctype and "DocType" or "DocField",
"doc_type": doctype, "doc_type": doctype,


+ 1
- 1
frappe/core/doctype/todo/todo.py View File

@@ -20,7 +20,7 @@ class Todo(Document):
if not self.reference_type and self.reference_name: if not self.reference_type and self.reference_name:
return return
comment = frappe.bean({
comment = frappe.get_doc({
"doctype":"Comment", "doctype":"Comment",
"comment_by": frappe.session.user, "comment_by": frappe.session.user,
"comment_doctype": self.reference_type, "comment_doctype": self.reference_type,


+ 3
- 3
frappe/core/doctype/user/test_user.py View File

@@ -11,11 +11,11 @@ class TestUser(unittest.TestCase):
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.bean(copy=test_records[1])
user = frappe.get_doc(copy=test_records[1])
user.email = "_test@example.com" user.email = "_test@example.com"
user.insert() user.insert()
frappe.bean({"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")
@@ -23,7 +23,7 @@ class TestUser(unittest.TestCase):
("_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.bean(copy=role_records[1]).insert()
frappe.get_doc(copy=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")


+ 4
- 4
frappe/core/doctype/user/user.py View File

@@ -250,7 +250,7 @@ class User(Document):
"role": role "role": role
}) })
self.bean.save()
self.save()


@frappe.whitelist() @frappe.whitelist()
def get_languages(): def get_languages():
@@ -312,7 +312,7 @@ def sign_up(email, full_name):
TIMEDIFF(%s, modified) > '1:00:00' """, now())[0][0] > 200: TIMEDIFF(%s, modified) > '1:00:00' """, now())[0][0] > 200:
raise Exception, "Too Many New Users" raise Exception, "Too Many New Users"
from frappe.utils import random_string from frappe.utils import random_string
user = frappe.bean({
user = frappe.get_doc({
"doctype":"User", "doctype":"User",
"email": email, "email": email,
"first_name": full_name, "first_name": full_name,
@@ -333,8 +333,8 @@ def reset_password(user):
if frappe.db.sql("""select name from tabUser where name=%s""", (user,)): if frappe.db.sql("""select name from tabUser where name=%s""", (user,)):
# Hack! # Hack!
frappe.session["user"] = "Administrator" frappe.session["user"] = "Administrator"
user = frappe.bean("User", user)
user.get_controller().reset_password()
user = frappe.get_doc("User", user)
user.reset_password()
return "Password reset details sent to your email." return "Password reset details sent to your email."
else: else:
return "No such user (%s)" % user return "No such user (%s)" % user


+ 3
- 2
frappe/core/doctype/version/version.py View File

@@ -9,13 +9,14 @@ import frappe, json
from frappe.model.document import Document from frappe.model.document import Document


class Version(Document): class Version(Document):
pass
@frappe.whitelist() @frappe.whitelist()
def restore(version): def restore(version):
if not "System Manager" in frappe.get_roles(): if not "System Manager" in frappe.get_roles():
raise frappe.PermissionError raise frappe.PermissionError
version = frappe.doc("Version", version)
version = frappe.get_doc("Version", version)
doclist = json.loads(version.doclist_json) doclist = json.loads(version.doclist_json)


# check if renamed # check if renamed
@@ -27,4 +28,4 @@ def restore(version):
doclist[0]["modified"] = frappe.db.get_value(version.ref_doctype, version.docname, "modified") doclist[0]["modified"] = frappe.db.get_value(version.ref_doctype, version.docname, "modified")
# overwrite # overwrite
frappe.bean(doclist).save()
frappe.get_doc(doclist).save()

+ 1
- 1
frappe/core/doctype/workflow/workflow.py View File

@@ -21,7 +21,7 @@ class Workflow(Document):
meta = frappe.get_meta(self.document_type) meta = frappe.get_meta(self.document_type)
if not meta.get_field(self.workflow_state_field): if not meta.get_field(self.workflow_state_field):
# create custom field # create custom field
frappe.bean([{
frappe.get_doc([{
"doctype":"Custom Field", "doctype":"Custom Field",
"dt": self.document_type, "dt": self.document_type,
"__islocal": 1, "__islocal": 1,


+ 6
- 6
frappe/core/page/data_import_tool/data_import_tool.py View File

@@ -399,13 +399,13 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
check_record(d, None, doctype_dl) check_record(d, None, doctype_dl)
if overwrite and frappe.db.exists(doctype, doclist[0]["name"]): if overwrite and frappe.db.exists(doctype, doclist[0]["name"]):
bean = frappe.bean(doctype, doclist[0]["name"])
bean = frappe.get_doc(doctype, doclist[0]["name"])
bean.ignore_links = ignore_links bean.ignore_links = ignore_links
bean.doclist.update(doclist) bean.doclist.update(doclist)
bean.save() bean.save()
ret.append('Updated row (#%d) %s' % (row_idx + 1, getlink(bean.doctype, bean.name))) ret.append('Updated row (#%d) %s' % (row_idx + 1, getlink(bean.doctype, bean.name)))
else: else:
bean = frappe.bean(doclist)
bean = frappe.get_doc(doclist)
bean.ignore_links = ignore_links bean.ignore_links = ignore_links
bean.insert() bean.insert()
ret.append('Inserted row (#%d) %s' % (row_idx + 1, getlink(bean.doctype, bean.name))) ret.append('Inserted row (#%d) %s' % (row_idx + 1, getlink(bean.doctype, bean.name)))
@@ -417,7 +417,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,


if parenttype: if parenttype:
# child doc # child doc
doc = frappe.doc(doctype)
doc = frappe.get_doc(doctype)
doc.fields.update(doclist[0]) doc.fields.update(doclist[0])
if parenttype: if parenttype:
doc.parenttype = parenttype doc.parenttype = parenttype
@@ -454,7 +454,7 @@ def validate_parent(parent_list, parenttype, ret, error):
parent_list = list(set(parent_list)) parent_list = list(set(parent_list))
for p in parent_list: for p in parent_list:
try: try:
obj = frappe.bean(parenttype, p)
obj = frappe.get_doc(parenttype, p)
obj.run_method("validate") obj.run_method("validate")
obj.run_method("on_update") obj.run_method("on_update")
except Exception, e: except Exception, e:
@@ -503,7 +503,7 @@ def export_json(doctype, name, path):
if not name or name=="-": if not name or name=="-":
name = doctype name = doctype
with open(path, "w") as outfile: with open(path, "w") as outfile:
doclist = [d.fields for d in frappe.bean(doctype, name).doclist]
doclist = [d.fields for d in frappe.get_doc(doctype, name).doclist]
for d in doclist: for d in doclist:
if d.get("parent"): if d.get("parent"):
del d["parent"] del d["parent"]
@@ -529,7 +529,7 @@ def import_doclist(path, overwrite=False, ignore_links=False, ignore_insert=Fals
files = [path] files = [path]
def _import_doclist(d): def _import_doclist(d):
b = frappe.bean(d)
b = frappe.get_doc(d)
b.ignore_links = ignore_links b.ignore_links = ignore_links
if insert: if insert:
b.set("__islocal", True) b.set("__islocal", True)


+ 1
- 1
frappe/core/page/permission_manager/permission_manager.py View File

@@ -36,7 +36,7 @@ def remove(doctype, name):
@frappe.whitelist() @frappe.whitelist()
def add(parent, role, permlevel): def add(parent, role, permlevel):
frappe.only_for("System Manager") frappe.only_for("System Manager")
frappe.doc(fielddata={
frappe.get_doc({
"doctype":"DocPerm", "doctype":"DocPerm",
"__islocal": 1, "__islocal": 1,
"parent": parent, "parent": parent,


+ 1
- 1
frappe/database.py View File

@@ -475,7 +475,7 @@ class Database:


def exists(self, dt, dn=None): def exists(self, dt, dn=None):
if isinstance(dt, basestring): if isinstance(dt, basestring):
if dt==dn:
if dt!="DocType" and dt==dn:
return True # single always exists (!) return True # single always exists (!)
try: try:
return self.sql('select name from `tab%s` where name=%s' % (dt, '%s'), (dn,)) return self.sql('select name from `tab%s` where name=%s' % (dt, '%s'), (dn,))


+ 1
- 1
frappe/defaults.py View File

@@ -82,7 +82,7 @@ def set_default(key, value, parent, parenttype="Control Panel"):
add_default(key, value, parent) add_default(key, value, parent)


def add_default(key, value, parent, parenttype=None): def add_default(key, value, parent, parenttype=None):
d = frappe.doc({
d = frappe.get_doc({
"doctype": "DefaultValue", "doctype": "DefaultValue",
"parent": parent, "parent": parent,
"parenttype": parenttype or "Control Panel", "parenttype": parenttype or "Control Panel",


+ 1
- 1
frappe/handler.py View File

@@ -33,7 +33,7 @@ def web_logout():
@frappe.whitelist(allow_guest=True) @frappe.whitelist(allow_guest=True)
def run_custom_method(doctype, name, custom_method): def run_custom_method(doctype, name, custom_method):
"""cmd=run_custom_method&doctype={doctype}&name={name}&custom_method={custom_method}""" """cmd=run_custom_method&doctype={doctype}&name={name}&custom_method={custom_method}"""
bean = frappe.bean(doctype, name)
bean = frappe.get_doc(doctype, name)
controller = bean.get_controller() controller = bean.get_controller()
if getattr(controller, custom_method, frappe._dict()).is_whitelisted: if getattr(controller, custom_method, frappe._dict()).is_whitelisted:
frappe.call(getattr(controller, custom_method), **frappe.local.form_dict) frappe.call(getattr(controller, custom_method), **frappe.local.form_dict)


+ 1
- 1
frappe/installer.py View File

@@ -130,7 +130,7 @@ def set_all_patches_as_completed(app):
patch_path = os.path.join(frappe.get_pymodule_path(app), "patches.txt") patch_path = os.path.join(frappe.get_pymodule_path(app), "patches.txt")
if os.path.exists(patch_path): if os.path.exists(patch_path):
for patch in frappe.get_file_items(patch_path): for patch in frappe.get_file_items(patch_path):
frappe.doc({
frappe.get_doc({
"doctype": "Patch Log", "doctype": "Patch Log",
"patch": patch "patch": patch
}).insert() }).insert()


+ 1
- 1
frappe/model/__init__.py View File

@@ -19,7 +19,7 @@ def insert(doclist):
else: else:
d.set("__islocal", 1) d.set("__islocal", 1)
wrapper = frappe.bean(doclist)
wrapper = frappe.get_doc(doclist)
wrapper.save() wrapper.save()
return wrapper return wrapper


+ 5
- 2
frappe/model/base_document.py View File

@@ -42,7 +42,7 @@ class BaseDocument(object):
else: else:
value = self.__dict__.get(key, default) value = self.__dict__.get(key, default)
if value is None and key in self.get_table_fields():
if value is None and key!="_meta" and key in (d.fieldname for d in self.get_table_fields()):
self.set(key, []) self.set(key, [])
value = self.__dict__.get(key) value = self.__dict__.get(key)
@@ -111,6 +111,9 @@ class BaseDocument(object):
for fieldname in self.valid_columns: for fieldname in self.valid_columns:
d[fieldname] = self.get(fieldname) d[fieldname] = self.get(fieldname)
return d return d
def is_new(self):
return self.get("__islocal")
@property @property
def valid_columns(self): def valid_columns(self):
@@ -178,7 +181,7 @@ class BaseDocument(object):
self.docstatus = cint(self.docstatus) self.docstatus = cint(self.docstatus)
def set_missing_values(self, d): def set_missing_values(self, d):
for key, value in d.iteritems():
for key, value in d.get_valid_dict().iteritems():
if self.get(key) is None: if self.get(key) is None:
self.set(key, value) self.set(key, value)


+ 0
- 1
frappe/model/create_new.py View File

@@ -51,7 +51,6 @@ def get_new_doc(doctype, parent_doc = None, parentfield = None):
else: else:
ref_docname = frappe.db.get_default(ref_fieldname) ref_docname = frappe.db.get_default(ref_fieldname)
doc.set(d.fieldname, frappe.db.get_value(ref_doctype, ref_docname, d.fieldname)) doc.set(d.fieldname, frappe.db.get_value(ref_doctype, ref_docname, d.fieldname))

else: else:
doc.set(d.fieldname, d.default) doc.set(d.fieldname, d.default)


+ 16
- 9
frappe/model/document.py View File

@@ -72,7 +72,7 @@ class Document(BaseDocument):
self.update(d, valid_columns = d.keys()) self.update(d, valid_columns = d.keys())


for df in self.get_table_fields(): for df in self.get_table_fields():
children = frappe.db.get_values(df.options,
children = frappe.db.get_values(df.options,
{"parent": self.name, "parenttype": self.doctype, "parentfield": df.fieldname}, {"parent": self.name, "parenttype": self.doctype, "parentfield": df.fieldname},
"*", as_dict=True) "*", as_dict=True)
if children: if children:
@@ -81,13 +81,14 @@ class Document(BaseDocument):
self.set(df.fieldname, []) self.set(df.fieldname, [])
def has_permission(self, permtype): def has_permission(self, permtype):
if getattr(self, "_ignore_permissions", False):
if getattr(self, "ignore_permissions", False):
return True return True
return frappe.has_permission(self.doctype, permtype, self) return frappe.has_permission(self.doctype, permtype, self)
def insert(self):
# check links
# check permissions
def insert(self, ignore_permissions=None):
if ignore_permissions!=None:
self.ignore_permissions = ignore_permissions

self.set("__islocal", True) self.set("__islocal", True)
if not self.has_permission("create"): if not self.has_permission("create"):
@@ -114,7 +115,10 @@ class Document(BaseDocument):
self.run_method("after_insert") self.run_method("after_insert")
self.run_post_save_methods() self.run_post_save_methods()


def save(self):
def save(self, ignore_permissions=None):
if ignore_permissions!=None:
self.ignore_permissions = ignore_permissions
if self.get("__islocal") or not self.get("name"): if self.get("__islocal") or not self.get("name"):
self.insert() self.insert()
return return
@@ -135,7 +139,7 @@ class Document(BaseDocument):


# children # children
child_map = {} child_map = {}
ignore_children_type = self.get("_ignore_children_type", [])
ignore_children_type = self.get("ignore_children_type") or []


for d in self.get_all_children(): for d in self.get_all_children():
d.parent = self.name # rename if reqd d.parent = self.name # rename if reqd
@@ -199,13 +203,13 @@ class Document(BaseDocument):
self.set_missing_values(new_doc) self.set_missing_values(new_doc)


# children # children
for df in self.meta.get("fields", {"fieldtype":"Table"}):
for df in self.get_table_fields():
new_doc = frappe.new_doc(df.options) new_doc = frappe.new_doc(df.options)
value = self.get(df.fieldname) value = self.get(df.fieldname)
if isinstance(value, list): if isinstance(value, list):
for d in value: for d in value:
d.set_missing_values(new_doc) d.set_missing_values(new_doc)
def _check_if_latest(self): def _check_if_latest(self):
conflict = False conflict = False
self._action = "save" self._action = "save"
@@ -327,6 +331,9 @@ class Document(BaseDocument):
self.save() self.save()
def run_before_save_methods(self): def run_before_save_methods(self):
if getattr(self, "ignore_validate", False):
return
if self._action=="save": if self._action=="save":
self.run_method("validate") self.run_method("validate")
self.run_method("before_save") self.run_method("before_save")


+ 20
- 4
frappe/model/meta.py View File

@@ -4,17 +4,17 @@
# metadata # metadata


from __future__ import unicode_literals from __future__ import unicode_literals
import frappe
import frappe, json
from frappe.utils import cstr, cint from frappe.utils import cstr, cint
from frappe.model import integer_docfield_properties from frappe.model import integer_docfield_properties
from frappe.model.document import Document from frappe.model.document import Document
from frappe.model.base_document import BaseDocument


###### ######


def get_meta(doctype, cached=True): def get_meta(doctype, cached=True):
# TODO: cache to be cleared # TODO: cache to be cleared

if cached:
if cached and not frappe.flags.in_install_app:
if doctype not in frappe.local.meta: if doctype not in frappe.local.meta:
frappe.local.meta[doctype] = frappe.cache().get_value("meta:" + doctype, lambda: Meta(doctype)) frappe.local.meta[doctype] = frappe.cache().get_value("meta:" + doctype, lambda: Meta(doctype))
return frappe.local.meta.get(doctype) return frappe.local.meta.get(doctype)
@@ -25,7 +25,23 @@ class Meta(Document):
_metaclass = True _metaclass = True
def __init__(self, doctype): def __init__(self, doctype):
super(Meta, self).__init__("DocType", doctype) super(Meta, self).__init__("DocType", doctype)
def load_from_db(self):
try:
super(Meta, self).load_from_db()
except frappe.DoesNotExistError:
if self.doctype=="DocType" and self.name in ("DocField", "DocPerm", "Role", "DocType", "Module Def"):
fname = frappe.scrub(self.name)
with open(frappe.get_app_path("frappe", "core", "doctype", fname, fname + ".txt"), "r") as f:
txt = f.read()

self.__dict__.update(json.loads(txt))
self.fields = [BaseDocument(d) for d in self.fields]
if hasattr(self, "permissions"):
self.permissions = [BaseDocument(d) for d in self.permissions]
else:
raise
def get_link_fields(self): def get_link_fields(self):
tmp = self.get("fields", {"fieldtype":"Link"}) tmp = self.get("fields", {"fieldtype":"Link"})
tmp.extend(self.get("fields", {"fieldtype":"Select", "options": "^link:"})) tmp.extend(self.get("fields", {"fieldtype":"Select", "options": "^link:"}))


+ 3
- 1
frappe/model/naming.py View File

@@ -19,7 +19,9 @@ def set_new_name(doc):
if getattr(doc, "amended_from", None): if getattr(doc, "amended_from", None):
return doc._get_amended_name() return doc._get_amended_name()
else: else:
if hasattr(doc, "autoname"):
tmp = getattr(doc, "autoname", None)
if tmp and not isinstance(tmp, basestring):
# autoname in a function, not a property
doc.autoname() doc.autoname()
if doc.name and doc.localname != doc.name: if doc.name and doc.localname != doc.name:
return return


+ 2
- 2
frappe/model/rename_doc.py View File

@@ -23,7 +23,7 @@ def rename_doc(doctype, old, new, force=False, merge=False, ignore_permissions=F
doclist = frappe.model.doctype.get(doctype) doclist = frappe.model.doctype.get(doctype)
# call before_rename # call before_rename
out = frappe.bean(doctype, old).run_method("before_rename", old, new, merge) or {}
out = frappe.get_doc(doctype, old).run_method("before_rename", old, new, merge) or {}
new = out.get("new") or new new = out.get("new") or new
new = validate_rename(doctype, new, doclist, merge, force, ignore_permissions) new = validate_rename(doctype, new, doclist, merge, force, ignore_permissions)
@@ -43,7 +43,7 @@ def rename_doc(doctype, old, new, force=False, merge=False, ignore_permissions=F
frappe.delete_doc(doctype, old) frappe.delete_doc(doctype, old)
# call after_rename # call after_rename
frappe.bean(doctype, new).run_method("after_rename", old, new, merge)
frappe.get_doc(doctype, new).run_method("after_rename", old, new, merge)
rename_versions(doctype, old, new) rename_versions(doctype, old, new)


+ 17
- 15
frappe/modules/import_file.py View File

@@ -71,22 +71,24 @@ def import_doc(docdict):
docdict["__islocal"] = 1 docdict["__islocal"] = 1
doc = frappe.get_doc(docdict) doc = frappe.get_doc(docdict)


old_doc = None
if doctype in ignore_values:
if frappe.db.exists(doc.doctype, doc.name):
old_doc = frappe.get_doc(doc.doctype, doc.name)
# update ignore values
for key in ignore_values.get(doctype) or []:
doc.set(key, old_doc.get(key))
# update ignored docs into new doc
for df in doc.get_table_fields():
if df.options in ignore_doctypes:
doc.set(df.fieldname, [])
ignore = []

if frappe.db.exists(doc.doctype, doc.name):
old_doc = frappe.get_doc(doc.doctype, doc.name)
if doc.doctype in ignore_values:
# update ignore values
for key in ignore_values.get(doc.doctype) or []:
doc.set(key, old_doc.get(key))

# update ignored docs into new doc
for df in doc.get_table_fields():
if df.options in ignore_doctypes:
doc.set(df.fieldname, [])
ignore.append(df.options)
# delete old
frappe.delete_doc(doctype, name, force=1, ignore_doctypes=ignore, for_reload=True)
# delete old
frappe.delete_doc(doc.doctype, doc.name, force=1, ignore_doctypes=ignore, for_reload=True)
doc.ignore_children_type = ignore doc.ignore_children_type = ignore
doc.ignore_links = True doc.ignore_links = True


+ 1
- 1
frappe/modules/patch_handler.py View File

@@ -95,7 +95,7 @@ def update_patch_log(patchmodule):
frappe.db.sql("""INSERT INTO `__PatchLog` VALUES (%s, now())""", \ frappe.db.sql("""INSERT INTO `__PatchLog` VALUES (%s, now())""", \
patchmodule) patchmodule)
else: else:
frappe.doc({"doctype": "Patch Log", "patch": patchmodule}).insert()
frappe.get_doc({"doctype": "Patch Log", "patch": patchmodule}).insert()


def executed(patchmodule): def executed(patchmodule):
"""return True if is executed""" """return True if is executed"""


+ 3
- 3
frappe/permissions.py View File

@@ -36,7 +36,7 @@ def has_permission(doctype, ptype="read", doc=None, verbose=True):
if doc: if doc:
if isinstance(doc, basestring): if isinstance(doc, basestring):
doc = frappe.doc(meta.name, doc)
doc = frappe.get_doc(meta.name, doc)
if not has_unrestricted_access(doc, verbose=verbose): if not has_unrestricted_access(doc, verbose=verbose):
return False return False
@@ -105,9 +105,9 @@ def has_unrestricted_access(doc, verbose=True):
def has_controller_permissions(doc): def has_controller_permissions(doc):
if doc.get("__islocal"): if doc.get("__islocal"):
bean = frappe.bean([doc])
bean = frappe.get_doc([doc])
else: else:
bean = frappe.bean(doc.doctype, doc.name)
bean = frappe.get_doc(doc.doctype, doc.name)
condition_methods = frappe.get_hooks("has_permission:" + doc.doctype) condition_methods = frappe.get_hooks("has_permission:" + doc.doctype)
for method in frappe.get_hooks("has_permission:" + doc.doctype): for method in frappe.get_hooks("has_permission:" + doc.doctype):


+ 1
- 1
frappe/templates/generators/blog_post.py View File

@@ -24,7 +24,7 @@ def get_context(context):
blog_post.updated = global_date_format(blog_post.published_on) blog_post.updated = global_date_format(blog_post.published_on)
if blog_post.blogger: if blog_post.blogger:
blog_post.blogger_info = frappe.doc("Blogger", blog_post.blogger).fields
blog_post.blogger_info = frappe.get_doc("Blogger", blog_post.blogger).fields
blog_post.description = blog_post.blog_intro or blog_post.content[:140] blog_post.description = blog_post.blog_intro or blog_post.content[:140]
blog_post.meta_description = blog_post.description blog_post.meta_description = blog_post.description


+ 2
- 2
frappe/templates/generators/website_group.py View File

@@ -70,10 +70,10 @@ def build_view_context(context):
context.post_list_html = get_post_list_html(context.group.name, context.view.name) context.post_list_html = get_post_list_html(context.group.name, context.view.name)
elif context.view.name == "edit": elif context.view.name == "edit":
context.post = frappe.doc("Post", frappe.form_dict.name).fields
context.post = frappe.get_doc("Post", frappe.form_dict.name).fields
if context.post.assigned_to: if context.post.assigned_to:
context.user = frappe.doc("User", context.post.assigned_to)
context.user = frappe.get_doc("User", context.post.assigned_to)


elif context.view.name == "settings": elif context.view.name == "settings":
context.users = frappe.db.sql("""select p.*, wsp.`read`, wsp.`write`, wsp.`admin` context.users = frappe.db.sql("""select p.*, wsp.`read`, wsp.`write`, wsp.`admin`


+ 1
- 1
frappe/templates/includes/comments.py View File

@@ -30,7 +30,7 @@ def add_comment(args=None):
if "cmd" in args: if "cmd" in args:
del args["cmd"] del args["cmd"]


comment = frappe.bean(args)
comment = frappe.get_doc(args)
comment.ignore_permissions = True comment.ignore_permissions = True
comment.insert() comment.insert()


+ 1
- 1
frappe/templates/pages/about.py View File

@@ -5,4 +5,4 @@ from __future__ import unicode_literals
import frappe import frappe


def get_context(context): def get_context(context):
return { "obj": frappe.bean("About Us Settings", "About Us Settings").get_controller() }
return { "obj": frappe.get_doc("About Us Settings", "About Us Settings").get_controller() }

+ 1
- 1
frappe/templates/pages/blog.py View File

@@ -5,4 +5,4 @@ from __future__ import unicode_literals
import frappe import frappe


def get_context(context): def get_context(context):
return frappe.doc("Blog Settings", "Blog Settings").fields
return frappe.get_doc("Blog Settings", "Blog Settings").fields

+ 2
- 2
frappe/templates/pages/contact.py View File

@@ -7,12 +7,12 @@ import frappe
from frappe.utils import now from frappe.utils import now


def get_context(context): def get_context(context):
bean = frappe.bean("Contact Us Settings", "Contact Us Settings")
bean = frappe.get_doc("Contact Us Settings", "Contact Us Settings")
query_options = filter(None, bean.query_options.replace(",", "\n").split()) if \ query_options = filter(None, bean.query_options.replace(",", "\n").split()) if \
bean.query_options else ["Sales", "Support", "General"] bean.query_options else ["Sales", "Support", "General"]
address = frappe.bean("Address", bean.address).doc if bean.address else None
address = frappe.get_doc("Address", bean.address).doc if bean.address else None
out = { out = {
"query_options": query_options "query_options": query_options


+ 3
- 3
frappe/templates/pages/login.py View File

@@ -84,7 +84,7 @@ def get_oauth_keys(provider):


if not keys: if not keys:
# try database # try database
social = frappe.doc("Social Login Keys", "Social Login Keys")
social = frappe.get_doc("Social Login Keys", "Social Login Keys")
keys = {} keys = {}
for fieldname in ("client_id", "client_secret"): for fieldname in ("client_id", "client_secret"):
value = social.get("{provider}_{fieldname}".format(provider=provider, fieldname=fieldname)) value = social.get("{provider}_{fieldname}".format(provider=provider, fieldname=fieldname))
@@ -183,7 +183,7 @@ def create_oauth_user(data, provider):
if isinstance(data.get("location"), dict): if isinstance(data.get("location"), dict):
data["location"] = data.get("location").get("name") data["location"] = data.get("location").get("name")
user = frappe.bean({
user = frappe.get_doc({
"doctype":"User", "doctype":"User",
"first_name": data.get("first_name") or data.get("given_name") or data.get("name"), "first_name": data.get("first_name") or data.get("given_name") or data.get("name"),
"last_name": data.get("last_name") or data.get("family_name"), "last_name": data.get("last_name") or data.get("family_name"),
@@ -211,5 +211,5 @@ def create_oauth_user(data, provider):
user.github_username = data["login"] user.github_username = data["login"]
user.ignore_permissions = True user.ignore_permissions = True
user.get_controller().no_welcome_mail = True
user.no_welcome_mail = True
user.insert() user.insert()

+ 1
- 1
frappe/templates/pages/rss.py View File

@@ -29,7 +29,7 @@ def get_context(context):
else: else:
modified = now() modified = now()


ws = frappe.doc('Website Settings', 'Website Settings')
ws = frappe.get_doc('Website Settings', 'Website Settings')


context = { context = {
'title': ws.title_prefix, 'title': ws.title_prefix,


+ 1
- 1
frappe/templates/pages/style_settings.py View File

@@ -9,7 +9,7 @@ base_template_path = "templates/pages/style_settings.css"


def get_context(context): def get_context(context):
"""returns web style""" """returns web style"""
doc = frappe.doc("Style Settings", "Style Settings")
doc = frappe.get_doc("Style Settings", "Style Settings")
prepare(doc) prepare(doc)
return { "doc": doc.fields } return { "doc": doc.fields }


+ 1
- 1
frappe/templates/pages/writers.py View File

@@ -17,6 +17,6 @@ def get_context(context):
"categories": frappe.db.sql_list("select name from `tabBlog Category` order by name") "categories": frappe.db.sql_list("select name from `tabBlog Category` order by name")
} }
writers_context.update(frappe.doc("Blog Settings", "Blog Settings").fields)
writers_context.update(frappe.get_doc("Blog Settings", "Blog Settings").fields)
return writers_context return writers_context

+ 5
- 5
frappe/templates/website_group/post.py View File

@@ -9,7 +9,7 @@ from frappe.utils.file_manager import save_file
from frappe.templates.generators.website_group import get_pathname from frappe.templates.generators.website_group import get_pathname


def get_post_context(context): def get_post_context(context):
post = frappe.doc("Post", frappe.form_dict.name)
post = frappe.get_doc("Post", frappe.form_dict.name)
if post.parent_post: if post.parent_post:
raise frappe.PermissionError raise frappe.PermissionError
@@ -26,7 +26,7 @@ def get_post_context(context):
return frappe.cache().get_value(cache_key, lambda: _get_post_context()) return frappe.cache().get_value(cache_key, lambda: _get_post_context())
def get_parent_post_html(post, context): def get_parent_post_html(post, context):
user = frappe.bean("User", post.owner).doc
user = frappe.get_doc("User", post.owner).doc
for fieldname in ("first_name", "last_name", "user_image", "location"): for fieldname in ("first_name", "last_name", "user_image", "location"):
post.set(fieldname, user.fields[fieldname]) post.set(fieldname, user.fields[fieldname])
@@ -65,8 +65,8 @@ def add_post(group, content, picture, picture_name, title=None, parent_post=None
if frappe.db.get_value("Post", parent_post, "parent_post"): if frappe.db.get_value("Post", parent_post, "parent_post"):
frappe.throw("Cannot reply to a reply") frappe.throw("Cannot reply to a reply")
group = frappe.doc("Website Group", group)
post = frappe.bean({
group = frappe.get_doc("Website Group", group)
post = frappe.get_doc({
"doctype":"Post", "doctype":"Post",
"title": (title or "").title(), "title": (title or "").title(),
"content": content, "content": content,
@@ -98,7 +98,7 @@ def add_post(group, content, picture, picture_name, title=None, parent_post=None
def save_post(post, content, picture=None, picture_name=None, title=None, def save_post(post, content, picture=None, picture_name=None, title=None,
assigned_to=None, status=None, event_datetime=None): assigned_to=None, status=None, event_datetime=None):
post = frappe.bean("Post", post)
post = frappe.get_doc("Post", post)
access = get_access(get_pathname(post.website_group)) access = get_access(get_pathname(post.website_group))
if not access.get("write"): if not access.get("write"):


+ 4
- 4
frappe/templates/website_group/settings.py View File

@@ -36,7 +36,7 @@ def add_sitemap_permission(group, user):
if not get_access(pathname).get("admin"): if not get_access(pathname).get("admin"):
raise frappe.PermissionError raise frappe.PermissionError
permission = frappe.bean({
permission = frappe.get_doc({
"doctype": "Website Route Permission", "doctype": "Website Route Permission",
"website_route": pathname, "website_route": pathname,
"user": user, "user": user,
@@ -58,7 +58,7 @@ def update_permission(group, user, perm, value):
if not get_access(pathname).get("admin"): if not get_access(pathname).get("admin"):
raise frappe.PermissionError raise frappe.PermissionError
permission = frappe.bean("Website Route Permission", {"website_route": pathname, "user": user})
permission = frappe.get_doc("Website Route Permission", {"website_route": pathname, "user": user})
permission.set(perm, int(value)) permission.set(perm, int(value))
permission.save(ignore_permissions=True) permission.save(ignore_permissions=True)
@@ -79,7 +79,7 @@ def update_description(group, description):
if not get_access(get_pathname(group)).get("admin"): if not get_access(get_pathname(group)).get("admin"):
raise frappe.PermissionError raise frappe.PermissionError


group = frappe.bean("Website Group", group)
group = frappe.get_doc("Website Group", group)
group.group_description = description group.group_description = description
group.save(ignore_permissions=True) group.save(ignore_permissions=True)
@@ -91,7 +91,7 @@ def add_website_group(group, new_group, public_read, public_write, group_type="F
parent_website_route = frappe.db.get_value("Website Route", parent_website_route = frappe.db.get_value("Website Route",
{"ref_doctype": "Website Group", "docname": group}) {"ref_doctype": "Website Group", "docname": group})
frappe.bean({
frappe.get_doc({
"doctype": "Website Group", "doctype": "Website Group",
"group_name": group + "-" + new_group, "group_name": group + "-" + new_group,
"group_title": new_group, "group_title": new_group,


+ 4
- 0
frappe/tests/test_document.py View File

@@ -4,6 +4,10 @@
import frappe, unittest, time import frappe, unittest, time


class TestDocument(unittest.TestCase): class TestDocument(unittest.TestCase):
def test_get_return_empty_list_for_table_field_if_none(self):
d = frappe.get_doc({"doctype":"User"})
self.assertEquals(d.get("user_roles"), [])
def test_load(self): def test_load(self):
d = frappe.get_doc("DocType", "User") d = frappe.get_doc("DocType", "User")
self.assertEquals(d.doctype, "DocType") self.assertEquals(d.doctype, "DocType")


+ 1
- 1
frappe/translate.py View File

@@ -164,7 +164,7 @@ def get_messages_from_page(name):
return get_messages_from_page_or_report("Page", name) return get_messages_from_page_or_report("Page", name)
def get_messages_from_report(name): def get_messages_from_report(name):
report = frappe.doc("Report", name)
report = frappe.get_doc("Report", name)
messages = get_messages_from_page_or_report("Report", name, messages = get_messages_from_page_or_report("Report", name,
frappe.db.get_value("DocType", report.ref_doctype, "module")) frappe.db.get_value("DocType", report.ref_doctype, "module"))
if report.query: if report.query:


+ 2
- 2
frappe/utils/datautils.py View File

@@ -128,7 +128,7 @@ def import_doc(d, doctype, overwrite, row_idx, submit=False, ignore_links=False)
"""import main (non child) document""" """import main (non child) document"""
if d.get("name") and frappe.db.exists(doctype, d['name']): if d.get("name") and frappe.db.exists(doctype, d['name']):
if overwrite: if overwrite:
bean = frappe.bean(doctype, d['name'])
bean = frappe.get_doc(doctype, d['name'])
bean.ignore_links = ignore_links bean.ignore_links = ignore_links
bean.update(d) bean.update(d)
if d.get("docstatus") == 1: if d.get("docstatus") == 1:
@@ -140,7 +140,7 @@ def import_doc(d, doctype, overwrite, row_idx, submit=False, ignore_links=False)
return 'Ignored row (#%d) %s (exists)' % (row_idx + 1, return 'Ignored row (#%d) %s (exists)' % (row_idx + 1,
getlink(doctype, d['name'])) getlink(doctype, d['name']))
else: else:
bean = frappe.bean([d])
bean = frappe.get_doc([d])
bean.ignore_links = ignore_links bean.ignore_links = ignore_links
bean.insert() bean.insert()


+ 1
- 1
frappe/utils/email_lib/bulk.py View File

@@ -78,7 +78,7 @@ def send(recipients=None, sender=None, doctype='User', email_field='email',
def add(email, sender, subject, formatted, text_content=None, def add(email, sender, subject, formatted, text_content=None,
ref_doctype=None, ref_docname=None): ref_doctype=None, ref_docname=None):
"""add to bulk mail queue""" """add to bulk mail queue"""
e = frappe.doc('Bulk Email')
e = frappe.get_doc('Bulk Email')
e.sender = sender e.sender = sender
e.recipient = email e.recipient = email
try: try:


+ 1
- 1
frappe/utils/email_lib/smtp.py View File

@@ -38,7 +38,7 @@ class SMTPServer:
def __init__(self, login=None, password=None, server=None, port=None, use_ssl=None): def __init__(self, login=None, password=None, server=None, port=None, use_ssl=None):
# get defaults from control panel # get defaults from control panel
try: try:
es = frappe.doc('Outgoing Email Settings', 'Outgoing Email Settings')
es = frappe.get_doc('Outgoing Email Settings', 'Outgoing Email Settings')
except frappe.DoesNotExistError: except frappe.DoesNotExistError:
es = None es = None


+ 4
- 4
frappe/utils/file_manager.py View File

@@ -45,7 +45,7 @@ def save_url(file_url, dt, dn):
# frappe.msgprint("URL must start with 'http://' or 'https://'") # frappe.msgprint("URL must start with 'http://' or 'https://'")
# return None, None # return None, None
f = frappe.bean({
f = frappe.get_doc({
"doctype": "File Data", "doctype": "File Data",
"file_url": file_url, "file_url": file_url,
"attached_to_doctype": dt, "attached_to_doctype": dt,
@@ -55,7 +55,7 @@ def save_url(file_url, dt, dn):
try: try:
f.insert(); f.insert();
except frappe.DuplicateEntryError: except frappe.DuplicateEntryError:
return frappe.doc("File Data", f.duplicate_entry)
return frappe.get_doc("File Data", f.duplicate_entry)
return f.doc return f.doc


def get_uploaded_content(): def get_uploaded_content():
@@ -140,7 +140,7 @@ def save_file(fname, content, dt, dn, decode=False):
os.rename(temp_fname, fpath.encode("utf-8")) os.rename(temp_fname, fpath.encode("utf-8"))


f = frappe.bean({
f = frappe.get_doc({
"doctype": "File Data", "doctype": "File Data",
"file_name": os.path.relpath(os.path.join(files_path, fname), get_site_path("public")), "file_name": os.path.relpath(os.path.join(files_path, fname), get_site_path("public")),
"attached_to_doctype": dt, "attached_to_doctype": dt,
@@ -151,7 +151,7 @@ def save_file(fname, content, dt, dn, decode=False):
try: try:
f.insert(); f.insert();
except frappe.DuplicateEntryError: except frappe.DuplicateEntryError:
return frappe.doc("File Data", f.duplicate_entry)
return frappe.get_doc("File Data", f.duplicate_entry)


return f.doc return f.doc




+ 2
- 2
frappe/utils/install.py View File

@@ -29,12 +29,12 @@ def after_install():
for d in install_docs: for d in install_docs:
try: try:
frappe.bean(d).insert()
frappe.get_doc(d).insert()
except NameError: except NameError:
pass pass


# all roles to admin # all roles to admin
frappe.bean("User", "Administrator").get_controller().add_roles(*frappe.db.sql_list("""
frappe.get_doc("User", "Administrator").add_roles(*frappe.db.sql_list("""
select name from tabRole""")) select name from tabRole"""))


# update admin password # update admin password


+ 1
- 1
frappe/utils/scheduler.py View File

@@ -97,7 +97,7 @@ def log(method, message=None):
frappe.db.rollback() frappe.db.rollback()
frappe.db.begin() frappe.db.begin()
d = frappe.doc("Scheduler Log")
d = frappe.get_doc("Scheduler Log")
d.method = method d.method = method
d.error = message d.error = message
d.save() d.save()


+ 2
- 2
frappe/utils/user.py View File

@@ -195,7 +195,7 @@ def get_system_managers(only_name=False):
return [email.utils.formataddr((p.fullname, p.name)) for p in system_managers] return [email.utils.formataddr((p.fullname, p.name)) for p in system_managers]
def add_role(user, role): def add_role(user, role):
user_wrapper = frappe.bean("User", user).get_controller().add_roles(role)
user_wrapper = frappe.get_doc("User", user).add_roles(role)


def add_system_manager(email, first_name=None, last_name=None): def add_system_manager(email, first_name=None, last_name=None):
# add user # add user
@@ -213,7 +213,7 @@ def add_system_manager(email, first_name=None, last_name=None):
# add roles # add roles
roles = frappe.db.sql_list("""select name from `tabRole` roles = frappe.db.sql_list("""select name from `tabRole`
where name not in ("Administrator", "Guest", "All")""") where name not in ("Administrator", "Guest", "All")""")
user.get_controller().add_roles(*roles)
user.add_roles(*roles)
def get_roles(username=None, with_standard=True): def get_roles(username=None, with_standard=True):
"""get roles of current user""" """get roles of current user"""


+ 1
- 1
frappe/website/context.py View File

@@ -50,7 +50,7 @@ def build_context(sitemap_options):
# provide bean # provide bean
if context.doctype and context.docname: if context.doctype and context.docname:
context.bean = frappe.bean(context.doctype, context.docname)
context.bean = frappe.get_doc(context.doctype, context.docname)
if context.controller: if context.controller:
module = frappe.get_module(context.controller) module = frappe.get_module(context.controller)


+ 1
- 1
frappe/website/doctype/blog_post/blog_post.py View File

@@ -11,7 +11,7 @@ from frappe import _
from frappe.utils import today from frappe.utils import today


class BlogPost(WebsiteGenerator): class BlogPost(WebsiteGenerator):
self.save_versions = True
save_versions = True
def get_page_title(self): def get_page_title(self):
return self.title return self.title


+ 14
- 14
frappe/website/doctype/blog_post/test_blog_post.py View File

@@ -39,11 +39,11 @@ class TestBlogPost(unittest.TestCase):


frappe.clear_cache(doctype="Blog Post") frappe.clear_cache(doctype="Blog Post")
user = frappe.bean("User", "test1@example.com")
user.get_controller().add_roles("Website Manager")
user = frappe.get_doc("User", "test1@example.com")
user.add_roles("Website Manager")
user = frappe.bean("User", "test2@example.com")
user.get_controller().add_roles("Blogger")
user = frappe.get_doc("User", "test2@example.com")
user.add_roles("Blogger")
frappe.set_user("test1@example.com") frappe.set_user("test1@example.com")
@@ -53,17 +53,17 @@ class TestBlogPost(unittest.TestCase):
clear_restrictions("Blog Post") clear_restrictions("Blog Post")
def test_basic_permission(self): def test_basic_permission(self):
post = frappe.bean("Blog Post", "_test-blog-post")
post = frappe.get_doc("Blog Post", "_test-blog-post")
self.assertTrue(post.has_read_perm()) self.assertTrue(post.has_read_perm())
def test_restriction_in_bean(self): def test_restriction_in_bean(self):
frappe.defaults.add_default("Blog Category", "_Test Blog Category 1", "test1@example.com", frappe.defaults.add_default("Blog Category", "_Test Blog Category 1", "test1@example.com",
"Restriction") "Restriction")
post = frappe.bean("Blog Post", "_test-blog-post")
post = frappe.get_doc("Blog Post", "_test-blog-post")
self.assertFalse(post.has_read_perm()) self.assertFalse(post.has_read_perm())


post1 = frappe.bean("Blog Post", "_test-blog-post-1")
post1 = frappe.get_doc("Blog Post", "_test-blog-post-1")
self.assertTrue(post1.has_read_perm()) self.assertTrue(post1.has_read_perm())
def test_restriction_in_report(self): def test_restriction_in_report(self):
@@ -92,10 +92,10 @@ class TestBlogPost(unittest.TestCase):


frappe.set_user("test2@example.com") frappe.set_user("test2@example.com")


post = frappe.bean("Blog Post", "_test-blog-post")
post = frappe.get_doc("Blog Post", "_test-blog-post")
self.assertTrue(post.has_read_perm()) self.assertTrue(post.has_read_perm())


post1 = frappe.bean("Blog Post", "_test-blog-post-1")
post1 = frappe.get_doc("Blog Post", "_test-blog-post-1")
self.assertFalse(post1.has_read_perm()) self.assertFalse(post1.has_read_perm())
def test_owner_match_report(self): def test_owner_match_report(self):
@@ -130,11 +130,11 @@ class TestBlogPost(unittest.TestCase):
frappe.set_user("test2@example.com") frappe.set_user("test2@example.com")


# user can only access restricted blog post # user can only access restricted blog post
bean = frappe.bean("Blog Post", "_test-blog-post")
bean = frappe.get_doc("Blog Post", "_test-blog-post")
self.assertTrue(bean.has_read_perm()) self.assertTrue(bean.has_read_perm())


# and not this one # and not this one
bean = frappe.bean("Blog Post", "_test-blog-post-1")
bean = frappe.get_doc("Blog Post", "_test-blog-post-1")
self.assertFalse(bean.has_read_perm()) self.assertFalse(bean.has_read_perm())
def test_not_allowed_to_remove_self(self): def test_not_allowed_to_remove_self(self):
@@ -151,21 +151,21 @@ class TestBlogPost(unittest.TestCase):
self.add_restricted_on_blogger() self.add_restricted_on_blogger()


frappe.set_user("test2@example.com") frappe.set_user("test2@example.com")
bean = frappe.bean("Blog Post", "_test-blog-post-1")
bean = frappe.get_doc("Blog Post", "_test-blog-post-1")
self.assertFalse(bean.has_read_perm()) self.assertFalse(bean.has_read_perm())


frappe.set_user("test1@example.com") frappe.set_user("test1@example.com")
add("test2@example.com", "Blog Post", "_test-blog-post-1") add("test2@example.com", "Blog Post", "_test-blog-post-1")


frappe.set_user("test2@example.com") frappe.set_user("test2@example.com")
bean = frappe.bean("Blog Post", "_test-blog-post-1")
bean = frappe.get_doc("Blog Post", "_test-blog-post-1")


self.assertTrue(bean.has_read_perm()) self.assertTrue(bean.has_read_perm())
def test_set_only_once(self): def test_set_only_once(self):
blog_post = frappe.get_meta("Blog Post") blog_post = frappe.get_meta("Blog Post")
blog_post.get_field("title").set_only_once = 1 blog_post.get_field("title").set_only_once = 1
bean = frappe.bean("Blog Post", "_test-blog-post-1")
bean = frappe.get_doc("Blog Post", "_test-blog-post-1")
bean.title = "New" bean.title = "New"
self.assertRaises(frappe.CannotChangeConstantError, bean.save) self.assertRaises(frappe.CannotChangeConstantError, bean.save)
blog_post.get_field("title").set_only_once = 0 blog_post.get_field("title").set_only_once = 0


+ 1
- 1
frappe/website/doctype/blogger/blogger.py View File

@@ -20,6 +20,6 @@ class Blogger(Document):
if self.user: if self.user:
for blog in frappe.db.sql_list("""select name from `tabBlog Post` where owner=%s for blog in frappe.db.sql_list("""select name from `tabBlog Post` where owner=%s
and ifnull(blogger,'')=''""", self.user): and ifnull(blogger,'')=''""", self.user):
b = frappe.bean("Blog Post", blog)
b = frappe.get_doc("Blog Post", blog)
b.blogger = self.name b.blogger = self.name
b.save() b.save()

+ 1
- 1
frappe/website/doctype/post/post.py View File

@@ -54,7 +54,7 @@ class Post(Document):
def send_email_on_reply(self): def send_email_on_reply(self):
owner_fullname = get_fullname(self.owner) owner_fullname = get_fullname(self.owner)
parent_post = frappe.bean("Post", self.parent_post).doc
parent_post = frappe.get_doc("Post", self.parent_post).doc
message = self.get_reply_email_message(self.name, owner_fullname) message = self.get_reply_email_message(self.name, owner_fullname)


+ 1
- 1
frappe/website/doctype/user_vote/user_vote.py View File

@@ -42,7 +42,7 @@ def set_vote(ref_doctype, ref_name):
raise frappe.PermissionError raise frappe.PermissionError
try: try:
user_vote = frappe.bean({
user_vote = frappe.get_doc({
"doctype": "User Vote", "doctype": "User Vote",
"ref_doctype": ref_doctype, "ref_doctype": ref_doctype,
"ref_name": ref_name "ref_name": ref_name


+ 3
- 3
frappe/website/doctype/web_page/test_web_page.py View File

@@ -60,7 +60,7 @@ class TestWebPage(unittest.TestCase):
{"ref_doctype":"Web Page", "docname": "test-web-page-5"}, 'idx'), 2) {"ref_doctype":"Web Page", "docname": "test-web-page-5"}, 'idx'), 2)
def test_check_rename(self): def test_check_rename(self):
web_page = frappe.bean("Web Page", "test-web-page-1")
web_page = frappe.get_doc("Web Page", "test-web-page-1")
web_page.parent_website_route = "test-web-page-4" web_page.parent_website_route = "test-web-page-4"
web_page.save() web_page.save()


@@ -76,7 +76,7 @@ class TestWebPage(unittest.TestCase):
"test-web-page-1/test-web-page-2") "test-web-page-1/test-web-page-2")
def test_check_move(self): def test_check_move(self):
web_page = frappe.bean("Web Page", "test-web-page-3")
web_page = frappe.get_doc("Web Page", "test-web-page-3")
web_page.parent_website_route = "test-web-page-4" web_page.parent_website_route = "test-web-page-4"
web_page.save() web_page.save()
@@ -89,7 +89,7 @@ class TestWebPage(unittest.TestCase):
self.assertEquals(frappe.db.get_value("Website Route", self.assertEquals(frappe.db.get_value("Website Route",
{"ref_doctype":"Web Page", "docname": "test-web-page-5"}, 'idx'), 1) {"ref_doctype":"Web Page", "docname": "test-web-page-5"}, 'idx'), 1)
web_page = frappe.bean("Web Page", "test-web-page-3")
web_page = frappe.get_doc("Web Page", "test-web-page-3")
web_page.parent_website_route = "test-web-page-1" web_page.parent_website_route = "test-web-page-1"
web_page.save() web_page.save()


+ 16
- 16
frappe/website/doctype/website_route/website_route.py View File

@@ -11,7 +11,7 @@ sitemap_fields = ("page_name", "ref_doctype", "docname", "page_or_generator", "i
"lastmod", "parent_website_route", "public_read", "public_write", "page_title") "lastmod", "parent_website_route", "public_read", "public_write", "page_title")


class WebsiteRoute(DocTypeNestedSet): class WebsiteRoute(DocTypeNestedSet):
self.nsm_parent_field = "parent_website_route"
nsm_parent_field = "parent_website_route"
def autoname(self): def autoname(self):
self.name = self.get_url() self.name = self.get_url()
@@ -97,7 +97,7 @@ class WebsiteRoute(DocTypeNestedSet):
# rename children # rename children
for name in frappe.db.sql_list("""select name from `tabWebsite Route` for name in frappe.db.sql_list("""select name from `tabWebsite Route`
where parent_website_route=%s""", self.name): where parent_website_route=%s""", self.name):
child = frappe.bean("Website Route", name)
child = frappe.get_doc("Website Route", name)
child.parent_website_route = self.name child.parent_website_route = self.name
child.save() child.save()
@@ -139,32 +139,32 @@ class WebsiteRoute(DocTypeNestedSet):
clear_cache(self.parent_website_route) clear_cache(self.parent_website_route)
def add_to_sitemap(options): def add_to_sitemap(options):
bean = frappe.new_bean("Website Route")
website_route = frappe.new_doc("Website Route")


for key in sitemap_fields: for key in sitemap_fields:
bean.set(key, options.get(key))
if not bean.page_name:
bean.page_name = options.get("link_name")
bean.website_template = options.get("link_name")
website_route.set(key, options.get(key))
if not website_route.page_name:
website_route.page_name = options.get("link_name")
website_route.website_template = options.get("link_name")


bean.insert(ignore_permissions=True)
website_route.insert(ignore_permissions=True)
return bean.idx
return website_route.idx
def update_sitemap(website_route, options): def update_sitemap(website_route, options):
bean = frappe.bean("Website Route", website_route)
website_route = frappe.get_doc("Website Route", website_route)
for key in sitemap_fields: for key in sitemap_fields:
bean.set(key, options.get(key))
website_route.set(key, options.get(key))
if not bean.page_name:
if not website_route.page_name:
# for pages # for pages
bean.page_name = options.get("link_name")
website_route.page_name = options.get("link_name")
bean.website_template = options.get("link_name")
bean.save(ignore_permissions=True)
website_route.website_template = options.get("link_name")
website_route.save(ignore_permissions=True)


return bean.idx
return website_route.idx
def remove_sitemap(page_name=None, ref_doctype=None, docname=None): def remove_sitemap(page_name=None, ref_doctype=None, docname=None):
if page_name: if page_name:


+ 1
- 1
frappe/website/doctype/website_settings/website_settings.py View File

@@ -80,7 +80,7 @@ def get_website_settings():
] ]
}) })
settings = frappe.doc("Website Settings", "Website Settings")
settings = frappe.get_doc("Website Settings", "Website Settings")
for k in ["banner_html", "brand_html", "copyright", "twitter_share_via", for k in ["banner_html", "brand_html", "copyright", "twitter_share_via",
"favicon", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share", "favicon", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share",
"disable_signup"]: "disable_signup"]:


+ 1
- 1
frappe/website/doctype/website_slideshow/website_slideshow.py View File

@@ -16,7 +16,7 @@ class WebsiteSlideshow(Document):
clear_cache() clear_cache()
def get_slideshow(bean): def get_slideshow(bean):
slideshow = frappe.bean("Website Slideshow", bean.slideshow)
slideshow = frappe.get_doc("Website Slideshow", bean.slideshow)
return { return {
"slides": slideshow.doclist.get({"doctype":"Website Slideshow Item"}), "slides": slideshow.doclist.get({"doctype":"Website Slideshow Item"}),


+ 7
- 7
frappe/website/doctype/website_template/website_template.py View File

@@ -20,9 +20,9 @@ class WebsiteTemplate(Document):
website_route = frappe.db.get_value("Website Route", website_route = frappe.db.get_value("Website Route",
{"website_template": self.name, "page_or_generator": "Page"}) {"website_template": self.name, "page_or_generator": "Page"})
opts = self.copy()
opts = self.as_dict()
opts.update({"public_read": 1}) opts.update({"public_read": 1})
if website_route: if website_route:
update_sitemap(website_route, opts) update_sitemap(website_route, opts)
else: else:
@@ -37,13 +37,13 @@ class WebsiteTemplate(Document):
{condition} order by idx asc, {sort_field} {sort_order}""".format( {condition} order by idx asc, {sort_field} {sort_order}""".format(
doctype = self.ref_doctype, doctype = self.ref_doctype,
condition = condition, condition = condition,
sort_field = self.sort_field or "name",
sort_order = self.sort_order or "asc"
sort_field = getattr(self, "sort_field", "name"),
sort_order = getattr(self, "sort_order", "asc")
)): )):
bean = frappe.bean(self.ref_doctype, name)
doc = frappe.get_doc(self.ref_doctype, name)
# regenerate route # regenerate route
bean.run_method("on_update")
doc.run_method("on_update")
def rebuild_website_template(): def rebuild_website_template():
# TODO # TODO
@@ -127,7 +127,7 @@ def add_website_template(page_or_generator, app, path, fname, app_path):
# found by earlier app, override # found by earlier app, override
frappe.db.sql("""delete from `tabWebsite Template` where name=%s""", (wsc.link_name,)) frappe.db.sql("""delete from `tabWebsite Template` where name=%s""", (wsc.link_name,))
frappe.bean(wsc).insert()
frappe.get_doc(wsc).insert()
return name return name


+ 5
- 5
frappe/website/page/sitemap_browser/sitemap_browser.py View File

@@ -24,10 +24,10 @@ def move(name, up_or_down):
if not frappe.has_permission("Website Route"): if not frappe.has_permission("Website Route"):
raise frappe.PermissionError raise frappe.PermissionError


sitemap = frappe.doc("Website Route", name)
sitemap = frappe.get_doc("Website Route", name)
if up_or_down=="up": if up_or_down=="up":
if sitemap.idx > 0: if sitemap.idx > 0:
prev = frappe.doc("Website Route", {
prev = frappe.get_doc("Website Route", {
"parent_website_route": sitemap.parent_website_route, "parent_website_route": sitemap.parent_website_route,
"idx": sitemap.idx - 1 "idx": sitemap.idx - 1
}) })
@@ -40,7 +40,7 @@ def move(name, up_or_down):
ret = "ok" ret = "ok"


else: else:
nexts = frappe.doc("Website Route", {
nexts = frappe.get_doc("Website Route", {
"parent_website_route": sitemap.parent_website_route, "parent_website_route": sitemap.parent_website_route,
"idx": sitemap.idx + 1 "idx": sitemap.idx + 1
}) })
@@ -60,10 +60,10 @@ def update_parent(name, new_parent):
if not frappe.has_permission("Website Route"): if not frappe.has_permission("Website Route"):
raise frappe.PermissionError raise frappe.PermissionError
sitemap = frappe.doc("Website Route", name)
sitemap = frappe.get_doc("Website Route", name)
if sitemap.ref_doctype: if sitemap.ref_doctype:
generator = frappe.bean(sitemap.ref_doctype, sitemap.docname)
generator = frappe.get_doc(sitemap.ref_doctype, sitemap.docname)
if not generator.meta.has_field("parent_website_route"): if not generator.meta.has_field("parent_website_route"):
frappe.throw("Does not allow moving.") frappe.throw("Does not allow moving.")
generator.parent_website_route = new_parent generator.parent_website_route = new_parent


+ 4
- 4
frappe/website/sitemap.py View File

@@ -21,10 +21,10 @@ def get_sitemap_options(path):
return frappe._dict(sitemap_options) return frappe._dict(sitemap_options)
def build_sitemap_options(path): def build_sitemap_options(path):
sitemap_options = frappe._dict(frappe.doc("Website Route", path).fields)
sitemap_options = frappe._dict(frappe.get_doc("Website Route", path).fields)
home_page = get_home_page() home_page = get_home_page()
sitemap_config = frappe.doc("Website Template",
sitemap_config = frappe.get_doc("Website Template",
sitemap_options.get("website_template")).fields sitemap_options.get("website_template")).fields
# get sitemap config fields too # get sitemap config fields too
@@ -65,7 +65,7 @@ def set_sidebar_items(sitemap_options, pathname, home_page):
if sitemap_options.children: if sitemap_options.children:
# if children are from generator and sort order is specified, then get that condition # if children are from generator and sort order is specified, then get that condition
website_template = frappe.doc("Website Template", sitemap_options.children[0].website_template)
website_template = frappe.get_doc("Website Template", sitemap_options.children[0].website_template)
if website_template.sort_by!="name": if website_template.sort_by!="name":
sitemap_options.children = frappe.db.sql("""select t1.* from sitemap_options.children = frappe.db.sql("""select t1.* from
`tabWebsite Route` t1, `tab{ref_doctype}` t2 `tabWebsite Route` t1, `tab{ref_doctype}` t2
@@ -75,5 +75,5 @@ def set_sidebar_items(sitemap_options, pathname, home_page):
order by t2.{sort_by} {sort_order}""".format(**website_template.fields), order by t2.{sort_by} {sort_order}""".format(**website_template.fields),
pathname, as_dict=True) pathname, as_dict=True)
sitemap_options.children = [frappe.doc("Website Route", pathname).fields] + sitemap_options.children
sitemap_options.children = [frappe.get_doc("Website Route", pathname).fields] + sitemap_options.children

+ 5
- 5
frappe/website/statics.py View File

@@ -111,7 +111,7 @@ class sync(object):
self.insert_web_page(route, fpath, page_name, priority, parent_website_route) self.insert_web_page(route, fpath, page_name, priority, parent_website_route)


def insert_web_page(self, route, fpath, page_name, priority, parent_website_route): def insert_web_page(self, route, fpath, page_name, priority, parent_website_route):
page = frappe.bean({
page = frappe.get_doc({
"doctype":"Web Page", "doctype":"Web Page",
"idx": priority, "idx": priority,
"page_name": page_name, "page_name": page_name,
@@ -125,7 +125,7 @@ class sync(object):
page.insert() page.insert()
except NameError: except NameError:
# page exists, if deleted static, delete it and try again # page exists, if deleted static, delete it and try again
old_route = frappe.doc("Website Route", {"ref_doctype":"Web Page",
old_route = frappe.get_doc("Website Route", {"ref_doctype":"Web Page",
"docname": page.name}) "docname": page.name})
if old_route.static_file_timestamp and not os.path.exists(os.path.join(self.statics_path, if old_route.static_file_timestamp and not os.path.exists(os.path.join(self.statics_path,
old_route.name)): old_route.name)):
@@ -135,7 +135,7 @@ class sync(object):
# update timestamp # update timestamp
route_bean = frappe.bean("Website Route", {"ref_doctype": "Web Page",
route_bean = frappe.get_doc("Website Route", {"ref_doctype": "Web Page",
"docname": page.name}) "docname": page.name})
route_bean.static_file_timestamp = cint(os.path.getmtime(fpath)) route_bean.static_file_timestamp = cint(os.path.getmtime(fpath))
route_bean.save() route_bean.save()
@@ -148,12 +148,12 @@ class sync(object):
if str(cint(os.path.getmtime(fpath)))!= route_details.static_file_timestamp \ if str(cint(os.path.getmtime(fpath)))!= route_details.static_file_timestamp \
or (cint(route_details.idx) != cint(priority) and (priority is not None)): or (cint(route_details.idx) != cint(priority) and (priority is not None)):


page = frappe.bean("Web Page", route_details.docname)
page = frappe.get_doc("Web Page", route_details.docname)
page.update(get_static_content(fpath, route_details.docname)) page.update(get_static_content(fpath, route_details.docname))
page.idx = priority page.idx = priority
page.save() page.save()


route_bean = frappe.bean("Website Route", route_details.name)
route_bean = frappe.get_doc("Website Route", route_details.name)
route_bean.static_file_timestamp = cint(os.path.getmtime(fpath)) route_bean.static_file_timestamp = cint(os.path.getmtime(fpath))
route_bean.save() route_bean.save()




+ 1
- 1
frappe/widgets/calendar.py View File

@@ -11,7 +11,7 @@ import json
def update_event(args, field_map): def update_event(args, field_map):
args = frappe._dict(json.loads(args)) args = frappe._dict(json.loads(args))
field_map = frappe._dict(json.loads(field_map)) field_map = frappe._dict(json.loads(field_map))
w = frappe.bean(args.doctype, args.name)
w = frappe.get_doc(args.doctype, args.name)
w.set(field_map.start, args[field_map.start]) w.set(field_map.start, args[field_map.start])
w.set(field_map.end, args[field_map.end]) w.set(field_map.end, args[field_map.end])
w.save() w.save()


+ 2
- 2
frappe/widgets/form/assign_to.py View File

@@ -34,7 +34,7 @@ def add(args=None):
else: else:
from frappe.utils import nowdate from frappe.utils import nowdate
d = frappe.bean({
d = frappe.get_doc({
"doctype":"ToDo", "doctype":"ToDo",
"owner": args['assign_to'], "owner": args['assign_to'],
"reference_type": args['doctype'], "reference_type": args['doctype'],
@@ -79,7 +79,7 @@ def add(args=None):
@frappe.whitelist() @frappe.whitelist()
def remove(doctype, name, assign_to): def remove(doctype, name, assign_to):
"""remove from todo""" """remove from todo"""
todo = frappe.bean("ToDo", {"reference_type":doctype, "reference_name":name, "owner":assign_to, "status":"Open"})
todo = frappe.get_doc("ToDo", {"reference_type":doctype, "reference_name":name, "owner":assign_to, "status":"Open"})
todo.status = "Closed" todo.status = "Closed"
todo.save(ignore_permissions=True) todo.save(ignore_permissions=True)


+ 1
- 1
frappe/widgets/form/utils.py View File

@@ -59,7 +59,7 @@ def add_comment(doclist):
doclist = json.loads(doclist) doclist = json.loads(doclist)
doclist[0]["__islocal"] = 1 doclist[0]["__islocal"] = 1
doclistobj = frappe.bean(doclist)
doclistobj = frappe.get_doc(doclist)
doclistobj.ignore_permissions = True doclistobj.ignore_permissions = True
doclistobj.save() doclistobj.save()


+ 1
- 1
frappe/widgets/query_report.py View File

@@ -13,7 +13,7 @@ from frappe.utils import flt, cint
import frappe.widgets.reportview import frappe.widgets.reportview


def get_report_doc(report_name): def get_report_doc(report_name):
bean = frappe.bean("Report", report_name)
bean = frappe.get_doc("Report", report_name)
if not bean.has_read_perm(): if not bean.has_read_perm():
raise frappe.PermissionError("You don't have access to: {report}".format(report=report_name)) raise frappe.PermissionError("You don't have access to: {report}".format(report=report_name))


+ 1
- 1
frappe/widgets/reportview.py View File

@@ -63,7 +63,7 @@ def save_report():
d.report_type = "Report Builder" d.report_type = "Report Builder"
d.json = data['json'] d.json = data['json']
frappe.bean([d]).save()
frappe.get_doc([d]).save()
frappe.msgprint("%s saved." % d.name) frappe.msgprint("%s saved." % d.name)
return d.name return d.name




Loading…
Cancel
Save