diff --git a/frappe/cli.py b/frappe/cli.py
index 86803365e5..01c3c48e36 100755
--- a/frappe/cli.py
+++ b/frappe/cli.py
@@ -362,13 +362,13 @@ def latest(verbose=True, rebuild_website_config=True, quiet=False):
# sync
frappe.model.sync.sync_all(verbose=verbose)
+ sync_fixtures()
+ statics.sync().start()
# build website config if any changes in templates etc.
if rebuild_website_config:
rebuild_config()
- statics.sync().start()
- sync_fixtures()
frappe.translate.clear_cache()
diff --git a/frappe/core/page/data_import_tool/data_import_tool.py b/frappe/core/page/data_import_tool/data_import_tool.py
index 674b226962..5105c15222 100644
--- a/frappe/core/page/data_import_tool/data_import_tool.py
+++ b/frappe/core/page/data_import_tool/data_import_tool.py
@@ -18,11 +18,11 @@ data_keys = frappe._dict({
@frappe.whitelist()
def get_doctypes():
if "System Manager" in frappe.get_roles():
- return [r[0] for r in frappe.db.sql("""select name from `tabDocType`
+ return [r[0] for r in frappe.db.sql("""select name from `tabDocType`
where allow_import = 1""")]
else:
return frappe.user._get("can_import")
-
+
@frappe.whitelist()
def get_doctype_options():
doctype = frappe.form_dict['doctype']
@@ -35,7 +35,7 @@ def import_file_by_path(path, ignore_links=False, overwrite=False, submit=False)
from frappe.core.page.data_import_tool.importer import upload
print "Importing " + path
with open(path, "r") as infile:
- upload(rows = read_csv_content(infile), ignore_links=ignore_links, overwrite=overwrite, submit_after_import=submit)
+ upload(rows = read_csv_content(infile.read()), ignore_links=ignore_links, overwrite=overwrite, submit_after_import=submit)
def export_csv(doctype, path):
from frappe.core.page.data_import_tool.exporter import get_template
@@ -59,25 +59,30 @@ def export_json(doctype, name, path):
def export_fixture(doctype, name, app):
if frappe.session.user != "Administrator":
raise frappe.PermissionError
-
+
if not os.path.exists(frappe.get_app_path(app, "fixtures")):
os.mkdir(frappe.get_app_path(app, "fixtures"))
-
+
export_json(doctype, name, frappe.get_app_path(app, "fixtures", frappe.scrub(name) + ".json"))
-
+
def import_doc(path, overwrite=False, ignore_links=False, ignore_insert=False, insert=False, submit=False):
if os.path.isdir(path):
files = [os.path.join(path, f) for f in os.listdir(path)]
else:
files = [path]
-
+
def _import_doc(d):
doc = frappe.get_doc(d)
doc.ignore_links = ignore_links
if insert:
doc.set("__islocal", True)
try:
+ if doc.name and overwrite:
+ if frappe.db.exists(doc.doctype, doc.name):
+ frappe.delete_doc(doc.doctype, doc.name, force=True)
+ doc.set("__islocal", True)
+ doc.ignore_links = ignore_links
doc.save()
except NameError:
if ignore_insert:
@@ -85,7 +90,7 @@ def import_doc(path, overwrite=False, ignore_links=False, ignore_insert=False, i
else:
raise
print "Imported: " + doc.doctype + " / " + doc.name
-
+
for f in files:
if f.endswith(".json"):
with open(f, "r") as infile:
@@ -97,5 +102,5 @@ def import_doc(path, overwrite=False, ignore_links=False, ignore_insert=False, i
_import_doc(data)
frappe.db.commit()
if f.endswith(".csv"):
- import_file_by_path(f, ignore_links=True, overwrite=overwrite, submit=submit)
+ import_file_by_path(f, ignore_links=ignore_links, overwrite=overwrite, submit=submit)
frappe.db.commit()
diff --git a/frappe/core/page/data_import_tool/importer.py b/frappe/core/page/data_import_tool/importer.py
index 5e2ed8ff9a..4a0a132232 100644
--- a/frappe/core/page/data_import_tool/importer.py
+++ b/frappe/core/page/data_import_tool/importer.py
@@ -17,7 +17,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
frappe.flags.mute_emails = True
# extra input params
params = json.loads(frappe.form_dict.get("params") or '{}')
-
+
if params.get("_submit"):
submit_after_import = True
if params.get("ignore_encoding_errors"):
@@ -54,7 +54,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
def filter_empty_columns(columns):
empty_cols = filter(lambda x: x in ("", None), columns)
-
+
if empty_cols:
if columns[-1*len(empty_cols):] == empty_cols:
# filter empty columns if they exist at the end
@@ -69,7 +69,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
doctype_row, row_idx = get_header_row_and_idx(data_keys.doctype)
if row_idx == -1: # old style
return
-
+
dt = None
for i, d in enumerate(doctype_row[1:]):
if d not in ("~", "-"):
@@ -97,7 +97,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
try:
fieldname = column_idx_to_fieldname[dt][column_idx]
fieldtype = column_idx_to_fieldtype[dt][column_idx]
-
+
d[fieldname] = rows[idx][column_idx]
if fieldtype in ("Int", "Check"):
d[fieldname] = cint(d[fieldname])
@@ -105,7 +105,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
d[fieldname] = flt(d[fieldname])
except IndexError, e:
pass
-
+
# scrub quotes from name and modified
if d.get("name") and d["name"].startswith('"'):
d["name"] = d["name"][1:-1]
@@ -125,13 +125,13 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
return doc
else:
- d = frappe._dict(zip(columns, rows[start_idx][1:]))
- d['doctype'] = doctype
- return [d]
+ doc = frappe._dict(zip(columns, rows[start_idx][1:]))
+ doc['doctype'] = doctype
+ return doc
def main_doc_empty(row):
return not (row and ((len(row) > 1 and row[1]) or (len(row) > 2 and row[2])))
-
+
# header
if not rows:
rows = read_csv_content_from_uploaded_file(ignore_encoding_errors)
@@ -144,13 +144,13 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
doctype_parentfield = {}
column_idx_to_fieldname = {}
column_idx_to_fieldtype = {}
-
- if submit_after_import and not cint(frappe.db.get_value("DocType",
+
+ if submit_after_import and not cint(frappe.db.get_value("DocType",
doctype, "is_submittable")):
submit_after_import = False
parenttype = get_header_row(data_keys.parent_table)
-
+
if len(parenttype) > 1:
parenttype = parenttype[1]
parentfield = get_parent_field(doctype, parenttype)
@@ -159,15 +159,15 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
if not frappe.permissions.can_import(parenttype or doctype):
frappe.flags.mute_emails = False
return {"messages": [_("Not allowed to Import") + ": " + _(doctype)], "error": True}
-
+
# allow limit rows to be uploaded
check_data_length()
make_column_map()
-
+
frappe.db.begin()
if overwrite==None:
overwrite = params.get('overwrite')
-
+
# delete child rows (if parenttype)
if parenttype and overwrite:
delete_child_rows(data, doctype)
@@ -179,10 +179,10 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
# bypass empty rows
if main_doc_empty(row):
continue
-
+
row_idx = i + start_row
doc = None
-
+
doc = get_doc(row_idx)
try:
frappe.local.message_log = []
@@ -192,7 +192,7 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
parent.save()
ret.append('Inserted row for %s at #%s' % (getlink(parenttype,
doc.parent), unicode(doc.idx)))
-
+
else:
if overwrite and frappe.db.exists(doctype, doc["name"]):
original = frappe.get_doc(doctype, doc["name"])
@@ -210,36 +210,36 @@ def upload(rows = None, submit_after_import=None, ignore_encoding_errors=False,
except Exception, e:
error = True
if doc:
- frappe.errprint(doc.as_dict())
+ frappe.errprint(doc if isinstance(doc, dict) else doc.as_dict())
err_msg = frappe.local.message_log and "
".join(frappe.local.message_log) or cstr(e)
- ret.append('Error for row (#%d) %s : %s' % (row_idx + 1,
+ ret.append('Error for row (#%d) %s : %s' % (row_idx + 1,
len(row)>1 and row[1] or "", err_msg))
frappe.errprint(frappe.get_traceback())
-
+
if error:
- frappe.db.rollback()
+ frappe.db.rollback()
else:
frappe.db.commit()
-
+
frappe.flags.mute_emails = False
-
+
return {"messages": ret, "error": error}
-
+
def get_parent_field(doctype, parenttype):
parentfield = None
-
+
# get parentfield
if parenttype:
for d in frappe.get_meta(parenttype).get_table_fields():
if d.options==doctype:
parentfield = d.fieldname
break
-
+
if not parentfield:
frappe.msgprint("Did not find parentfield for %s (%s)" % \
(parenttype, doctype))
raise Exception
-
+
return parentfield
def delete_child_rows(rows, doctype):
diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py
index bdab3baee2..4395809216 100644
--- a/frappe/model/delete_doc.py
+++ b/frappe/model/delete_doc.py
@@ -19,7 +19,7 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa
if not doctype:
doctype = frappe.form_dict.get('dt')
name = frappe.form_dict.get('dn')
-
+
if not doctype:
frappe.msgprint('Nothing to delete!', raise_exception =1)
@@ -28,16 +28,20 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa
return
doc = frappe.get_doc(doctype, name)
-
+
if not for_reload:
check_permission_and_not_submitted(doc, ignore_permissions)
doc.run_method("on_trash")
# check if links exist
if not force:
check_if_doc_is_linked(doc)
-
+
try:
- frappe.db.sql("delete from `tab%s` where name=%s" % (doctype, "%s"), (name,))
+ if doctype==name:
+ frappe.db.sql("delete from `tabSingles` where doctype=%s", name)
+ else:
+ frappe.db.sql("delete from `tab%s` where name=%s" % (doctype, "%s"), (name,))
+
for t in doc.meta.get_table_fields():
if t.options not in ignore_doctypes:
frappe.db.sql("delete from `tab%s` where parent = %s" % (t.options, '%s'), (name,))
@@ -45,15 +49,15 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa
except Exception, e:
if e.args[0]==1451:
frappe.msgprint("Cannot delete %s '%s' as it is referenced in another record. You must delete the referred record first" % (doctype, name))
-
+
raise
-
+
# delete attachments
remove_all(doctype, name)
-
+
# delete restrictions
frappe.defaults.clear_default(parenttype="Restriction", key=doctype, value=name)
-
+
return 'okay'
def check_permission_and_not_submitted(doc, ignore_permissions=False):
@@ -78,12 +82,12 @@ def check_if_doc_is_linked(doc, method="Delete"):
for link_dt, link_field, issingle in link_fields:
if not issingle:
- item = frappe.db.get_value(link_dt, {link_field:doc.name},
+ item = frappe.db.get_value(link_dt, {link_field:doc.name},
["name", "parent", "parenttype", "docstatus"], as_dict=True)
-
- if item and item.parent != doc.name and ((method=="Delete" and item.docstatus<2) or
+
+ if item and item.parent != doc.name and ((method=="Delete" and item.docstatus<2) or
(method=="Cancel" and item.docstatus==1)):
frappe.msgprint(method + " " + _("Error") + ":"+\
- ("%s (%s) " % (doc.name, doc.doctype)) + _("is linked in") + (" %s (%s)") %
+ ("%s (%s) " % (doc.name, doc.doctype)) + _("is linked in") + (" %s (%s)") %
(item.parent or item.name, item.parent and item.parenttype or link_dt),
raise_exception=LinkExistsError)
diff --git a/frappe/templates/generators/website_group.py b/frappe/templates/generators/website_group.py
index 51e5a6a949..77ad3aeb3a 100644
--- a/frappe/templates/generators/website_group.py
+++ b/frappe/templates/generators/website_group.py
@@ -13,13 +13,13 @@ no_cache = 1
def get_context(context):
group, view = guess_group_view(context)
-
+
try:
if not has_access(context.access, view):
raise frappe.PermissionError
-
+
return get_group_context(group, view, context)
-
+
except frappe.DoesNotExistError:
return {
"content": '