@@ -530,7 +530,7 @@ def call(fn, *args, **kwargs): | |||
newargs[a] = kwargs.get(a) | |||
return fn(*args, **newargs) | |||
def make_property_setter(args, ignore_validate=False): | |||
def make_property_setter(args, ignore_validate=False, validate_fields_for_doctype=True): | |||
args = _dict(args) | |||
ps = get_doc({ | |||
'doctype': "Property Setter", | |||
@@ -543,6 +543,7 @@ def make_property_setter(args, ignore_validate=False): | |||
'__islocal': 1 | |||
}) | |||
ps.ignore_validate = ignore_validate | |||
ps.validate_fields_for_doctype = validate_fields_for_doctype | |||
ps.insert() | |||
def import_doc(path, ignore_links=False, ignore_insert=False, insert=False): | |||
@@ -1 +1 @@ | |||
__version__ = "4.5.2" | |||
__version__ = "4.5.3" |
@@ -68,7 +68,7 @@ | |||
"fieldname": "precision", | |||
"fieldtype": "Select", | |||
"label": "Precision", | |||
"options": "\n1\n2\n3\n4\n5\n6", | |||
"options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9", | |||
"permlevel": 0, | |||
"precision": "" | |||
}, | |||
@@ -267,7 +267,7 @@ | |||
], | |||
"icon": "icon-glass", | |||
"idx": 1, | |||
"modified": "2014-09-05 07:41:13.076820", | |||
"modified": "2014-11-07 12:59:28.734894", | |||
"modified_by": "Administrator", | |||
"module": "Core", | |||
"name": "Custom Field", | |||
@@ -3,7 +3,7 @@ | |||
from __future__ import unicode_literals | |||
import frappe | |||
from frappe.utils import cint, cstr | |||
from frappe.utils import cstr | |||
from frappe import _ | |||
from frappe.model.document import Document | |||
@@ -30,12 +30,11 @@ class CustomField(Document): | |||
frappe.throw(_("Fieldname not set for Custom Field")) | |||
def on_update(self): | |||
# validate field | |||
from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype | |||
frappe.clear_cache(doctype=self.dt) | |||
validate_fields_for_doctype(self.dt) | |||
if not getattr(self, "ignore_validate", False): | |||
# validate field | |||
from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype | |||
validate_fields_for_doctype(self.dt) | |||
# create property setter to emulate insert after | |||
self.create_property_setter() | |||
@@ -74,7 +73,7 @@ class CustomField(Document): | |||
"fieldname": self.fieldname, | |||
"property": "previous_field", | |||
"value": self.insert_after | |||
}) | |||
}, validate_fields_for_doctype=False) | |||
@frappe.whitelist() | |||
def get_fields_label(doctype=None): | |||
@@ -8,6 +8,7 @@ from __future__ import unicode_literals | |||
""" | |||
import frappe, json | |||
from frappe import _ | |||
from frappe.utils import cint | |||
from frappe.model.document import Document | |||
from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype | |||
@@ -103,6 +104,7 @@ class CustomizeForm(Document): | |||
self.make_property_setter(property=property, value=self.get(property), | |||
property_type=self.doctype_properties[property]) | |||
update_db = False | |||
for df in self.get("customize_form_fields"): | |||
if df.get("__islocal"): | |||
continue | |||
@@ -122,9 +124,17 @@ class CustomizeForm(Document): | |||
.format(df.idx)) | |||
continue | |||
elif property == "precision" and cint(df.get("precision")) > 6 \ | |||
and cint(df.get("precision")) > cint(meta_df[0].get("precision")): | |||
update_db = True | |||
self.make_property_setter(property=property, value=df.get(property), | |||
property_type=self.docfield_properties[property], fieldname=df.fieldname) | |||
if update_db: | |||
from frappe.model.db_schema import updatedb | |||
updatedb(self.doc_type) | |||
def update_custom_fields(self): | |||
for df in self.get("customize_form_fields"): | |||
if df.get("__islocal"): | |||
@@ -159,6 +169,7 @@ class CustomizeForm(Document): | |||
changed = True | |||
if changed: | |||
custom_field.ignore_validate = True | |||
custom_field.save() | |||
def delete_custom_fields(self): | |||
@@ -86,7 +86,7 @@ | |||
"fieldname": "precision", | |||
"fieldtype": "Select", | |||
"label": "Precision", | |||
"options": "\n1\n2\n3\n4\n5\n6", | |||
"options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9", | |||
"permlevel": 0, | |||
"precision": "" | |||
}, | |||
@@ -278,7 +278,7 @@ | |||
"idx": 1, | |||
"issingle": 0, | |||
"istable": 1, | |||
"modified": "2014-09-05 07:41:29.641454", | |||
"modified": "2014-11-07 11:08:52.125289", | |||
"modified_by": "Administrator", | |||
"module": "Core", | |||
"name": "Customize Form Field", | |||
@@ -97,7 +97,7 @@ | |||
"fieldname": "precision", | |||
"fieldtype": "Select", | |||
"label": "Precision", | |||
"options": "\n1\n2\n3\n4\n5\n6", | |||
"options": "\n1\n2\n3\n4\n5\n6\n7\n8\n9", | |||
"permlevel": 0, | |||
"print_hide": 1 | |||
}, | |||
@@ -314,7 +314,7 @@ | |||
"in_dialog": 1, | |||
"issingle": 0, | |||
"istable": 1, | |||
"modified": "2014-09-05 07:41:05.956027", | |||
"modified": "2014-11-07 11:40:55.281141", | |||
"modified_by": "Administrator", | |||
"module": "Core", | |||
"name": "DocField", | |||
@@ -6,13 +6,32 @@ from __future__ import unicode_literals | |||
import frappe, json, os | |||
from frappe import _ | |||
import frappe.permissions | |||
import re | |||
from frappe.utils.csvutils import UnicodeWriter | |||
from frappe.utils import cstr, cint, flt | |||
from frappe.core.page.data_import_tool.data_import_tool import get_data_keys | |||
reflags = { | |||
"I":re.I, | |||
"L":re.L, | |||
"M":re.M, | |||
"U":re.U, | |||
"S":re.S, | |||
"X":re.X, | |||
"D": re.DEBUG | |||
} | |||
@frappe.whitelist() | |||
def get_template(doctype=None, parent_doctype=None, all_doctypes="No", with_data="No"): | |||
all_doctypes = all_doctypes=="Yes" | |||
docs_to_export = {} | |||
if doctype: | |||
if isinstance(doctype, basestring): | |||
doctype = [doctype]; | |||
if len(doctype) > 1: | |||
docs_to_export = doctype[1] | |||
doctype = doctype[0] | |||
if not parent_doctype: | |||
parent_doctype = doctype | |||
@@ -151,6 +170,28 @@ def get_template(doctype=None, parent_doctype=None, all_doctypes="No", with_data | |||
# get permitted data only | |||
data = frappe.get_list(doctype, fields=["*"], limit_page_length=None) | |||
for doc in data: | |||
op = docs_to_export.get("op") | |||
names = docs_to_export.get("name") | |||
if names and op: | |||
if op == '=' and doc.name not in names: | |||
continue | |||
elif op == '!=' and doc.name in names: | |||
continue | |||
elif names: | |||
try: | |||
sflags = docs_to_export.get("flags", "I,U").upper() | |||
flags = 0 | |||
for a in re.split('\W+',sflags): | |||
flags = flags | reflags.get(a,0) | |||
c = re.compile(names, flags) | |||
m = c.match(doc.name) | |||
if not m: | |||
continue | |||
except: | |||
if doc.name not in names: | |||
continue | |||
# add main table | |||
row_group = [] | |||
@@ -0,0 +1,257 @@ | |||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors | |||
# MIT License. See license.txt | |||
import frappe | |||
import frappe.defaults | |||
from frappe.core.page.data_import_tool.data_import_tool import export_csv | |||
import unittest | |||
class TestDataImportFixtures(unittest.TestCase): | |||
def setUp(self): | |||
print "\nTeste for export explicit fixtures" | |||
print "see fixtures csv test files in sites folder" | |||
#start test for Custom Script | |||
def test_Custom_Script_fixture_simple(self): | |||
fixture = "Custom Script" | |||
path = frappe.scrub(fixture) + "_original_style.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Script_fixture_simple_name_equal_default(self): | |||
fixture = ["Custom Script", {"name":["Item-Client"]}] | |||
path = frappe.scrub(fixture[0]) + "_simple_name_equal_default.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Script_fixture_simple_name_equal(self): | |||
fixture = ["Custom Script", {"name":["Item-Client"],"op":"="}] | |||
path = frappe.scrub(fixture[0]) + "_simple_name_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Script_fixture_simple_name_not_equal(self): | |||
fixture = ["Custom Script", {"name":["Item-Client"],"op":"!="}] | |||
path = frappe.scrub(fixture[0]) + "_simple_name_not_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
#without [] around the name... | |||
def test_Custom_Script_fixture_simple_name_at_least_equal(self): | |||
fixture = ["Custom Script", {"name":"Item-Cli"}] | |||
path = frappe.scrub(fixture[0]) + "_simple_name_at_least_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Script_fixture_multi_name_equal(self): | |||
fixture = ["Custom Script", {"name":["Item-Client", "Customer-Client"],"op":"="}] | |||
path = frappe.scrub(fixture[0]) + "_multi_name_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Script_fixture_multi_name_not_equal(self): | |||
fixture = ["Custom Script", {"name":["Item-Client", "Customer-Client"],"op":"!="}] | |||
path = frappe.scrub(fixture[0]) + "_multi_name_not_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Script_fixture_empty_object(self): | |||
fixture = ["Custom Script", {}] | |||
path = frappe.scrub(fixture[0]) + "_empty_object_should_be_all.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Script_fixture_just_list(self): | |||
fixture = ["Custom Script"] | |||
path = frappe.scrub(fixture[0]) + "_just_list_should_be_all.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
# Custom Script regular expression | |||
def test_Custom_Script_fixture_rex_no_flags(self): | |||
fixture = ["Custom Script", {"name":r"^[i|A]"}] | |||
path = frappe.scrub(fixture[0]) + "_rex_no_flags.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Script_fixture_rex_with_flags(self): | |||
fixture = ["Custom Script", {"name":r"^[i|A]", "flags":"L,M"}] | |||
path = frappe.scrub(fixture[0]) + "_rex_with_flags.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
#start test for Custom Field | |||
def test_Custom_Field_fixture_simple(self): | |||
fixture = "Custom Field" | |||
path = frappe.scrub(fixture) + "_original_style.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Field_fixture_simple_name_equal_default(self): | |||
fixture = ["Custom Field", {"name":["Item-vat"]}] | |||
path = frappe.scrub(fixture[0]) + "_simple_name_equal_default.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Field_fixture_simple_name_equal(self): | |||
fixture = ["Custom Field", {"name":["Item-vat"],"op":"="}] | |||
path = frappe.scrub(fixture[0]) + "_simple_name_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Field_fixture_simple_name_not_equal(self): | |||
fixture = ["Custom Field", {"name":["Item-vat"],"op":"!="}] | |||
path = frappe.scrub(fixture[0]) + "_simple_name_not_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
#without [] around the name... | |||
def test_Custom_Field_fixture_simple_name_at_least_equal(self): | |||
fixture = ["Custom Field", {"name":"Item-va"}] | |||
path = frappe.scrub(fixture[0]) + "_simple_name_at_least_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Field_fixture_multi_name_equal(self): | |||
fixture = ["Custom Field", {"name":["Item-vat", "Bin-vat"],"op":"="}] | |||
path = frappe.scrub(fixture[0]) + "_multi_name_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Field_fixture_multi_name_not_equal(self): | |||
fixture = ["Custom Field", {"name":["Item-vat", "Bin-vat"],"op":"!="}] | |||
path = frappe.scrub(fixture[0]) + "_multi_name_not_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Field_fixture_empty_object(self): | |||
fixture = ["Custom Field", {}] | |||
path = frappe.scrub(fixture[0]) + "_empty_object_should_be_all.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Field_fixture_just_list(self): | |||
fixture = ["Custom Field"] | |||
path = frappe.scrub(fixture[0]) + "_just_list_should_be_all.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
# Custom Field regular expression | |||
def test_Custom_Field_fixture_rex_no_flags(self): | |||
fixture = ["Custom Field", {"name":r"^[r|L]"}] | |||
path = frappe.scrub(fixture[0]) + "_rex_no_flags.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Custom_Field_fixture_rex_with_flags(self): | |||
fixture = ["Custom Field", {"name":r"^[i|A]", "flags":"L,M"}] | |||
path = frappe.scrub(fixture[0]) + "_rex_with_flags.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
#start test for Doctype | |||
def test_Doctype_fixture_simple(self): | |||
fixture = "ToDo" | |||
path = "Doctype_" + frappe.scrub(fixture) + "_original_style_should_be_all.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Doctype_fixture_simple_name_equal_default(self): | |||
fixture = ["ToDo", {"name":["TDI00000008"]}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_simple_name_equal_default.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Doctype_fixture_simple_name_equal(self): | |||
fixture = ["ToDo", {"name":["TDI00000002"],"op":"="}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_simple_name_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Doctype_simple_name_not_equal(self): | |||
fixture = ["ToDo", {"name":["TDI00000002"],"op":"!="}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_simple_name_not_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
#without [] around the name... | |||
def test_Doctype_fixture_simple_name_at_least_equal(self): | |||
fixture = ["ToDo", {"name":"TDI"}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_simple_name_at_least_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Doctype_multi_name_equal(self): | |||
fixture = ["ToDo", {"name":["TDI00000002", "TDI00000008"],"op":"="}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_multi_name_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Doctype_multi_name_not_equal(self): | |||
fixture = ["ToDo", {"name":["TDI00000002", "TDI00000008"],"op":"!="}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_multi_name_not_equal.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Doctype_fixture_empty_object(self): | |||
fixture = ["ToDo", {}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_empty_object_should_be_all.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Doctype_fixture_just_list(self): | |||
fixture = ["ToDo"] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_just_list_should_be_all.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
# Doctype regular expression | |||
def test_Doctype_fixture_rex_no_flags(self): | |||
fixture = ["ToDo", {"name":r"^TDi"}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_rex_no_flags_should_be_all.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
def test_Doctype_fixture_rex_with_flags(self): | |||
fixture = ["ToDo", {"name":r"^TDi", "flags":"L,M"}] | |||
path = "Doctype_" + frappe.scrub(fixture[0]) + "_rex_with_flags_should_be_none.csv" | |||
print "teste done {}".format(path) | |||
export_csv(fixture, path) | |||
self.assertTrue(True) | |||
@@ -3,7 +3,7 @@ app_title = "Frappe Framework" | |||
app_publisher = "Web Notes Technologies Pvt. Ltd." | |||
app_description = "Full Stack Web Application Framework in Python" | |||
app_icon = "assets/frappe/images/frappe.svg" | |||
app_version = "4.5.2" | |||
app_version = "4.5.3" | |||
app_color = "#3498db" | |||
app_email = "support@frappe.io" | |||
@@ -11,7 +11,7 @@ Syncs a database table to the `DocType` (metadata) | |||
import os | |||
import frappe | |||
from frappe import _ | |||
from frappe.utils import cstr | |||
from frappe.utils import cstr, cint | |||
type_map = { | |||
'Currency': ('decimal', '18,6') | |||
@@ -94,20 +94,23 @@ class DbTable: | |||
get columns from docfields and custom fields | |||
""" | |||
fl = frappe.db.sql("SELECT * FROM tabDocField WHERE parent = %s", self.doctype, as_dict = 1) | |||
precisions = {} | |||
try: | |||
if not frappe.flags.in_install_app: | |||
custom_fl = frappe.db.sql("""\ | |||
SELECT * FROM `tabCustom Field` | |||
WHERE dt = %s AND docstatus < 2""", (self.doctype,), as_dict=1) | |||
if custom_fl: fl += custom_fl | |||
except Exception, e: | |||
if e.args[0]!=1146: # ignore no custom field | |||
raise | |||
# get precision from property setters | |||
for ps in frappe.get_all("Property Setter", fields=["field_name", "value"], | |||
filters={"doc_type": self.doctype, "doctype_or_field": "DocField", "property": "precision"}): | |||
precisions[ps.field_name] = ps.value | |||
for f in fl: | |||
self.columns[f['fieldname']] = DbColumn(self, f['fieldname'], | |||
f['fieldtype'], f.get('length'), f.get('default'), | |||
f.get('search_index'), f.get('options')) | |||
f['fieldtype'], f.get('length'), f.get('default'), f.get('search_index'), | |||
f.get('options'), precisions.get(f['fieldname']) or f.get('precision')) | |||
def get_columns_from_db(self): | |||
self.show_columns = frappe.db.sql("desc `%s`" % self.name) | |||
@@ -212,7 +215,7 @@ class DbTable: | |||
frappe.db.sql("alter table `{}` {}".format(self.name, ", ".join(query))) | |||
class DbColumn: | |||
def __init__(self, table, fieldname, fieldtype, length, default, set_index, options): | |||
def __init__(self, table, fieldname, fieldtype, length, default, set_index, options, precision): | |||
self.table = table | |||
self.fieldname = fieldname | |||
self.fieldtype = fieldtype | |||
@@ -220,9 +223,10 @@ class DbColumn: | |||
self.set_index = set_index | |||
self.default = default | |||
self.options = options | |||
self.precision = precision | |||
def get_definition(self, with_default=1): | |||
ret = get_definition(self.fieldtype) | |||
ret = get_definition(self.fieldtype, self.precision) | |||
if with_default and self.default and (self.default not in default_shortcuts) \ | |||
and not self.default.startswith(":") and ret not in ['text', 'longtext']: | |||
@@ -406,7 +410,7 @@ def remove_all_foreign_keys(): | |||
for f in fklist: | |||
frappe.db.sql("alter table `tab%s` drop foreign key `%s`" % (t[0], f[1])) | |||
def get_definition(fieldtype): | |||
def get_definition(fieldtype, precision=None): | |||
d = type_map.get(fieldtype) | |||
if not d: | |||
@@ -414,12 +418,16 @@ def get_definition(fieldtype): | |||
ret = d[0] | |||
if d[1]: | |||
ret += '(' + d[1] + ')' | |||
length = d[1] | |||
if fieldtype in ["Float", "Currency", "Percent"] and cint(precision) > 6: | |||
length = '18,9' | |||
ret += '(' + length + ')' | |||
return ret | |||
def add_column(doctype, column_name, fieldtype): | |||
def add_column(doctype, column_name, fieldtype, precision=None): | |||
frappe.db.commit() | |||
frappe.db.sql("alter table `tab%s` add column %s %s" % (doctype, | |||
column_name, get_definition(fieldtype))) | |||
column_name, get_definition(fieldtype, precision))) | |||
@@ -4,6 +4,7 @@ | |||
from __future__ import unicode_literals | |||
import frappe, os | |||
from frappe.modules import get_doc_path, load_doctype_module | |||
from jinja2 import Template | |||
no_cache = 1 | |||
no_sitemap = 1 | |||
@@ -22,10 +22,12 @@ def sync_fixtures(app=None): | |||
def export_fixtures(): | |||
for app in frappe.get_installed_apps(): | |||
for fixture in frappe.get_hooks("fixtures", app_name=app): | |||
print "Exporting " + fixture | |||
print "Exporting {0}".format(fixture) | |||
if not os.path.exists(frappe.get_app_path(app, "fixtures")): | |||
os.mkdir(frappe.get_app_path(app, "fixtures")) | |||
if frappe.db.get_value("DocType", fixture, "issingle"): | |||
export_fixture(fixture, fixture, app) | |||
if isinstance(fixture, basestring): | |||
fixture = [fixture]; | |||
if frappe.db.get_value("DocType", fixture[0], "issingle"): | |||
export_fixture(fixture[0], fixture[0], app) | |||
else: | |||
export_csv(fixture, frappe.get_app_path(app, "fixtures", frappe.scrub(fixture) + ".csv")) | |||
export_csv(fixture, frappe.get_app_path(app, "fixtures", frappe.scrub(fixture[0]) + ".csv")) |
@@ -1,7 +1,7 @@ | |||
from setuptools import setup, find_packages | |||
import os | |||
version = "4.5.2" | |||
version = "4.5.3" | |||
with open("requirements.txt", "r") as f: | |||
install_requires = f.readlines() | |||
@@ -2,5 +2,6 @@ | |||
"db_name": "test_frappe", | |||
"db_password": "test_frappe", | |||
"admin_password": "admin", | |||
"auto_email_id": "test@example.com", | |||
"mute_emails": 1 | |||
} |