From caed23686c37bc2715a0554ce76768dc5bcaa0cf Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 18 Mar 2014 19:21:18 +0530 Subject: [PATCH] minor fixes --- frappe/auth.py | 3 ++- frappe/client.py | 17 ++++++++++++++--- frappe/core/doctype/doctype/doctype.py | 3 --- frappe/memc.py | 1 + frappe/model/bean.py | 18 ++++++++++++------ frappe/model/db_query.py | 9 ++++++--- frappe/model/doc.py | 11 +++++++---- frappe/modules/export_file.py | 4 ++-- frappe/utils/response.py | 3 +++ frappe/website/sitemap.py | 2 +- 10 files changed, 48 insertions(+), 23 deletions(-) diff --git a/frappe/auth.py b/frappe/auth.py index 8ea02b4d22..97984a9d3c 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -266,5 +266,6 @@ def get_logged_user(): return frappe.session.user def clear_cookies(): - frappe.session.sid = "" + if frappe.session: + frappe.session.sid = "" frappe.local.cookie_manager.delete_cookie(["full_name", "user_id", "sid", "user_image", "system_user"]) diff --git a/frappe/client.py b/frappe/client.py index 13ce3fffa7..b6bde9e342 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -47,9 +47,20 @@ def set_value(doctype, name, fieldname, value): def insert(doclist): if isinstance(doclist, basestring): doclist = json.loads(doclist) - - bean = frappe.bean(doclist).insert() - return [d.fields for d in bean.doclist] + + if isinstance(doclist, dict): + doclist = [doclist] + + if doclist[0].get("parent") and doclist[0].get("parenttype"): + # inserting a child record + d = doclist[0] + bean = frappe.bean(d["parenttype"], d["parent"]) + bean.doclist.append(d) + bean.save() + return [d] + else: + bean = frappe.bean(doclist).insert() + return [d.fields for d in bean.doclist] @frappe.whitelist() def save(doclist): diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 4a7597aeeb..f08c3c9c99 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -273,9 +273,6 @@ def validate_permissions(permissions, for_remove=False): raise_exception=True) def check_permission_dependency(d): - if d.write and not d.read: - frappe.msgprint(get_txt(d) + " Cannot set Write permission if Read is not set.", - raise_exception=True) if d.cancel and not d.submit: frappe.msgprint(get_txt(d) + " Cannot set Cancel permission if Submit is not set.", raise_exception=True) diff --git a/frappe/memc.py b/frappe/memc.py index 6471cca959..3d03d1ac12 100644 --- a/frappe/memc.py +++ b/frappe/memc.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import memcache, frappe +from frappe.model.doc import Document class MClient(memcache.Client): """memcache client that will automatically prefix conf.db_name""" diff --git a/frappe/model/bean.py b/frappe/model/bean.py index 4a2c8f56b6..d7f62f3d55 100644 --- a/frappe/model/bean.py +++ b/frappe/model/bean.py @@ -291,10 +291,16 @@ class Bean: return self.has_permission("read") def has_permission(self, permtype): - return frappe.has_permission(self.doc.doctype, permtype, self.doc) + if self.ignore_permissions: + return True + if self.doc.parent and self.doc.parenttype: + return frappe.has_permission(self.doc.parenttype, permtype, + frappe.doc(self.doc.parenttype, self.doc.parent)) + else: + return frappe.has_permission(self.doc.doctype, permtype, self.doc) def save(self, check_links=1, ignore_permissions=None): - if ignore_permissions: + if ignore_permissions!=None: self.ignore_permissions = ignore_permissions perm_to_check = "write" if self.doc.fields.get("__islocal"): @@ -306,7 +312,7 @@ class Bean: self.prepare_for_save("save") # check permissions after preparing for save, since name might be required - if self.ignore_permissions or frappe.has_permission(self.doc.doctype, perm_to_check, self.doc): + if self.has_permission(perm_to_check): if not self.ignore_validate: self.run_method('validate') self.validate_doclist() @@ -321,7 +327,7 @@ class Bean: return self def submit(self): - if self.ignore_permissions or frappe.has_permission(self.doc.doctype, "submit", self.doc): + if self.has_permission("submit"): self.to_docstatus = 1 self.prepare_for_save("submit") self.run_method('validate') @@ -336,7 +342,7 @@ class Bean: return self def cancel(self): - if self.ignore_permissions or frappe.has_permission(self.doc.doctype, "cancel", self.doc): + if self.has_permission("cancel"): self.to_docstatus = 2 self.prepare_for_save("cancel") self.run_method('before_cancel') @@ -352,7 +358,7 @@ class Bean: def update_after_submit(self): if self.doc.docstatus != 1: frappe.msgprint("Only to called after submit", raise_exception=1) - if self.ignore_permissions or frappe.has_permission(self.doc.doctype, "write", self.doc): + if self.has_permission("write"): self.to_docstatus = 1 self.prepare_for_save("update_after_submit") self.run_method('validate') diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index d06c849a1a..c5752abce8 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -89,9 +89,9 @@ class DatabaseQuery(object): def make_filter_tuple(self, key, value): if isinstance(value, (list, tuple)): - return (self.doctype, key, value[0], value[1]) + return [self.doctype, key, value[0], value[1]] else: - return (self.doctype, key, "=", value) + return [self.doctype, key, "=", value] def extract_tables(self): """extract tables from fields""" @@ -176,7 +176,10 @@ class DatabaseQuery(object): # prepare in condition if f[2] in ['in', 'not in']: - opts = ["'" + t.strip().replace("'", "\\'") + "'" for t in f[3].split(',')] + opts = f[3] + if not isinstance(opts, (list, tuple)): + opts = f[3].split(",") + opts = ["'" + t.strip().replace("'", "\\'") + "'" for t in opts] f[3] = "(" + ', '.join(opts) + ")" self.conditions.append('ifnull(' + tname + '.' + f[1] + ", '') " + f[2] + " " + f[3]) else: diff --git a/frappe/model/doc.py b/frappe/model/doc.py index 18890b0e43..907f1320da 100755 --- a/frappe/model/doc.py +++ b/frappe/model/doc.py @@ -62,9 +62,9 @@ class Document: name = frappe.db.get_value(doctype, name, "name") or None if fielddata: - self.fields = frappe._dict(fielddata) + self.fields = fielddata else: - self.fields = frappe._dict() + self.fields = {} if not self.fields.has_key('name'): self.fields['name']='' # required on save @@ -85,8 +85,8 @@ class Document: if not fielddata: self.fields['__islocal'] = 1 - if not self.fields.docstatus: - self.fields.docstatus = 0 + if not self.fields.get("docstatus"): + self.fields["docstatus"] = 0 def __nonzero__(self): return True @@ -600,6 +600,9 @@ def make_autoname(key, doctype=''): * DE/./.YY./.MM./.##### will create a series like DE/09/01/0001 where 09 is the year, 01 is the month and 0001 is the series """ + if key=="hash": + return frappe.generate_hash(doctype) + if not "#" in key: key = key + ".#####" diff --git a/frappe/modules/export_file.py b/frappe/modules/export_file.py index df2fc771a9..2044988d94 100644 --- a/frappe/modules/export_file.py +++ b/frappe/modules/export_file.py @@ -44,8 +44,8 @@ def filter_fields(doc): from frappe.model.doctype import get from frappe.model import default_fields - doctypelist = get(doc.doctype, False) - valid_fields = [d.fieldname for d in doctypelist.get({"parent":doc.doctype, + doctypelist = get(doc.get("doctype"), False) + valid_fields = [d.fieldname for d in doctypelist.get({"parent":doc.get("doctype"), "doctype":"DocField"})] to_remove = [] diff --git a/frappe/utils/response.py b/frappe/utils/response.py index babd8a2f21..3186bafe9a 100644 --- a/frappe/utils/response.py +++ b/frappe/utils/response.py @@ -9,6 +9,7 @@ import mimetypes import os import frappe from frappe import _ +from frappe.model.doc import Document import frappe.utils import frappe.sessions import frappe.model.utils @@ -106,6 +107,8 @@ def json_handler(obj): return unicode(obj) elif isinstance(obj, LocalProxy): return unicode(obj) + elif isinstance(obj, Document): + return obj.fields else: raise TypeError, """Object of type %s with value of %s is not JSON serializable""" % \ (type(obj), repr(obj)) diff --git a/frappe/website/sitemap.py b/frappe/website/sitemap.py index bf99cc9ffc..f401dfedc8 100644 --- a/frappe/website/sitemap.py +++ b/frappe/website/sitemap.py @@ -21,7 +21,7 @@ def get_sitemap_options(path): return frappe._dict(sitemap_options) def build_sitemap_options(path): - sitemap_options = frappe.doc("Website Route", path).fields + sitemap_options = frappe._dict(frappe.doc("Website Route", path).fields) home_page = get_home_page() sitemap_config = frappe.doc("Website Template",