diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py index 7d56122de20..c435efb9440 100644 --- a/erpnext/config/accounts.py +++ b/erpnext/config/accounts.py @@ -30,6 +30,15 @@ data = [ "name": "Supplier", "description": _("Supplier database.") }, + { + "type": "page", + "name": "Accounts Browser", + "icon": "icon-sitemap", + "label": _("Chart of Accounts"), + "route": "Accounts Browser/Account", + "description": _("Tree of finanial accounts."), + "doctype": "Account", + }, ] }, { diff --git a/erpnext/home/doctype/feed/feed.json b/erpnext/home/doctype/feed/feed.json index 755b8b83c74..151366102a5 100644 --- a/erpnext/home/doctype/feed/feed.json +++ b/erpnext/home/doctype/feed/feed.json @@ -1,61 +1,71 @@ { - "autoname": "hash", - "creation": "2012-07-03 13:29:42.000000", - "docstatus": 0, - "doctype": "DocType", + "autoname": "hash", + "creation": "2012-07-03 13:29:42", + "docstatus": 0, + "doctype": "DocType", "fields": [ { - "fieldname": "feed_type", - "fieldtype": "Select", - "label": "Feed Type", + "fieldname": "feed_type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Feed Type", "permlevel": 0 - }, + }, { - "fieldname": "doc_type", - "fieldtype": "Data", - "label": "Doc Type", + "fieldname": "doc_type", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Doc Type", "permlevel": 0 - }, + }, { - "fieldname": "doc_name", - "fieldtype": "Data", - "label": "Doc Name", + "fieldname": "doc_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Doc Name", "permlevel": 0 - }, + }, { - "fieldname": "subject", - "fieldtype": "Data", - "label": "Subject", + "fieldname": "subject", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Subject", "permlevel": 0 - }, + }, { - "fieldname": "color", - "fieldtype": "Data", - "label": "Color", + "fieldname": "color", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Color", "permlevel": 0 - }, + }, { - "fieldname": "full_name", - "fieldtype": "Data", - "label": "Full Name", + "fieldname": "full_name", + "fieldtype": "Data", + "label": "Full Name", "permlevel": 0 } - ], - "icon": "icon-rss", - "idx": 1, - "modified": "2013-12-20 19:24:05.000000", - "modified_by": "Administrator", - "module": "Home", - "name": "Feed", - "owner": "Administrator", + ], + "icon": "icon-rss", + "idx": 1, + "modified": "2014-05-02 08:27:23.936733", + "modified_by": "Administrator", + "module": "Home", + "name": "Feed", + "owner": "Administrator", "permissions": [ { - "email": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, + "email": 1, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, "role": "System Manager" + }, + { + "permlevel": 0, + "read": 1, + "role": "All" } ] -} +} \ No newline at end of file diff --git a/erpnext/home/doctype/feed/feed.py b/erpnext/home/doctype/feed/feed.py index 45d8ea1ac40..40c05f82e4a 100644 --- a/erpnext/home/doctype/feed/feed.py +++ b/erpnext/home/doctype/feed/feed.py @@ -3,15 +3,42 @@ from __future__ import unicode_literals import frappe - +import frappe.defaults from frappe.model.document import Document class Feed(Document): pass - + def on_doctype_update(): - if not frappe.db.sql("""show index from `tabFeed` + if not frappe.db.sql("""show index from `tabFeed` where Key_name="feed_doctype_docname_index" """): frappe.db.commit() - frappe.db.sql("""alter table `tabFeed` - add index feed_doctype_docname_index(doc_type, doc_name)""") \ No newline at end of file + frappe.db.sql("""alter table `tabFeed` + add index feed_doctype_docname_index(doc_type, doc_name)""") + +def get_permission_query_conditions(): + restrictions = frappe.defaults.get_restrictions() + can_read = frappe.user.get_can_read() + + can_read_doctypes = ['"{}"'.format(doctype) for doctype in + list(set(can_read) - set(restrictions.keys()))] + + if not can_read_doctypes: + return "" + + conditions = ["tabFeed.doc_type in ({})".format(", ".join(can_read_doctypes))] + + if restrictions: + can_read_docs = [] + for doctype, names in restrictions.items(): + for n in names: + can_read_docs.append('"{}|{}"'.format(doctype, n)) + + if can_read_docs: + conditions.append("concat_ws('|', tabFeed.doc_type, tabFeed.doc_name) in ({})".format( + ", ".join(can_read_docs))) + + return "(" + " or ".join(conditions) + ")" + +def has_permission(doc): + return frappe.has_permission(doc.doc_type, "read", doc.doc_name) diff --git a/erpnext/hooks.py b/erpnext/hooks.py index 5d5adc6aec4..4dcfdb0d326 100644 --- a/erpnext/hooks.py +++ b/erpnext/hooks.py @@ -25,6 +25,15 @@ before_tests = "erpnext.setup.utils.before_tests" standard_queries = "Customer:erpnext.selling.doctype.customer.customer.get_customer_list" +permission_query_conditions = { + "Feed": "erpnext.home.doctype.feed.feed.get_permission_query_conditions", + } + +has_permission = { + "Feed": "erpnext.home.doctype.feed.feed.has_permission", + } + + doc_events = { "*": { "on_update": "erpnext.home.update_feed", diff --git a/erpnext/setup/doctype/item_group/item_group.json b/erpnext/setup/doctype/item_group/item_group.json index 592673edcb2..8ab7262de1f 100644 --- a/erpnext/setup/doctype/item_group/item_group.json +++ b/erpnext/setup/doctype/item_group/item_group.json @@ -3,7 +3,7 @@ "allow_import": 1, "allow_rename": 1, "autoname": "field:item_group_name", - "creation": "2013-03-28 10:35:29.000000", + "creation": "2013-03-28 10:35:29", "description": "Item Classification", "docstatus": 0, "doctype": "DocType", @@ -12,6 +12,7 @@ { "fieldname": "item_group_name", "fieldtype": "Data", + "in_list_view": 1, "label": "Item Group Name", "no_copy": 0, "oldfieldname": "item_group_name", @@ -23,6 +24,7 @@ { "fieldname": "page_name", "fieldtype": "Data", + "in_list_view": 1, "label": "Page Name", "permlevel": 0, "read_only": 1 @@ -30,6 +32,7 @@ { "fieldname": "cb0", "fieldtype": "Column Break", + "in_list_view": 1, "permlevel": 0 }, { @@ -37,6 +40,7 @@ "fieldname": "parent_item_group", "fieldtype": "Link", "ignore_restrictions": 1, + "in_list_view": 1, "label": "Parent Item Group", "no_copy": 0, "oldfieldname": "parent_item_group", @@ -50,6 +54,7 @@ "description": "Only leaf nodes are allowed in transaction", "fieldname": "is_group", "fieldtype": "Select", + "in_list_view": 1, "label": "Has Child Node", "no_copy": 0, "oldfieldname": "is_group", @@ -157,7 +162,7 @@ "in_create": 1, "issingle": 0, "max_attachments": 3, - "modified": "2014-02-20 18:29:57.000000", + "modified": "2014-05-04 00:06:26.075492", "modified_by": "Administrator", "module": "Setup", "name": "Item Group", @@ -194,7 +199,7 @@ { "cancel": 0, "create": 1, - "delete": 0, + "delete": 1, "email": 1, "permlevel": 0, "print": 1, diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.js b/erpnext/setup/page/setup_wizard/setup_wizard.js index a66cb796c38..b2af9506749 100644 --- a/erpnext/setup/page/setup_wizard/setup_wizard.js +++ b/erpnext/setup/page/setup_wizard/setup_wizard.js @@ -365,7 +365,7 @@ frappe.wiz.Wizard = Class.extend({ this.parent = $('
').appendTo(this.parent); }, get_message: function(html) { - return $(repl('
\ + return $(repl('
\
%(html)s
\
', {html:html})) }, @@ -430,7 +430,9 @@ frappe.wiz.Wizard = Class.extend({ frappe.wiz.WizardSlide = Class.extend({ init: function(opts) { $.extend(this, opts); - this.$wrapper = $("
").appendTo(this.wiz.parent); + this.$wrapper = $("
") + .appendTo(this.wiz.parent) + .attr("data-slide-id", this.id); }, make: function() { var me = this; diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.py b/erpnext/setup/page/setup_wizard/setup_wizard.py index 36ef3450498..42c85d7101d 100644 --- a/erpnext/setup/page/setup_wizard/setup_wizard.py +++ b/erpnext/setup/page/setup_wizard/setup_wizard.py @@ -15,6 +15,7 @@ import install_fixtures @frappe.whitelist() def setup_account(args=None): + if frappe.db.sql("select name from tabCompany"): frappe.throw(_("Setup Already Complete!!")) @@ -260,16 +261,22 @@ def create_taxes(args): # replace % in case someone also enters the % symbol tax_rate = (args.get("tax_rate_" + str(i)) or "").replace("%", "") - frappe.get_doc({ - "doctype":"Account", - "company": args.get("company_name"), - "parent_account": "Duties and Taxes - " + args.get("company_abbr"), - "account_name": args.get("tax_" + str(i)), - "group_or_ledger": "Ledger", - "report_type": "Balance Sheet", - "account_type": "Tax", - "tax_rate": flt(tax_rate) if tax_rate else None - }).insert() + try: + frappe.get_doc({ + "doctype":"Account", + "company": args.get("company_name"), + "parent_account": "Duties and Taxes - " + args.get("company_abbr"), + "account_name": args.get("tax_" + str(i)), + "group_or_ledger": "Ledger", + "report_type": "Balance Sheet", + "account_type": "Tax", + "tax_rate": flt(tax_rate) if tax_rate else None + }).insert() + except frappe.NameError, e: + if e.args[2][0]==1062: + pass + else: + raise def create_items(args): for i in xrange(1,6): diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js index c4f034155a2..15c87932c7a 100644 --- a/erpnext/stock/doctype/item/item.js +++ b/erpnext/stock/doctype/item/item.js @@ -184,6 +184,8 @@ cur_frm.cscript.copy_from_item_group = function(doc) { cur_frm.cscript.image = function() { refresh_field("image_view"); + if(!cur_frm.doc.image) return; + if(!cur_frm.doc.description_html) cur_frm.cscript.add_image(cur_frm.doc); else { diff --git a/erpnext/stock/doctype/serial_no/serial_no.js b/erpnext/stock/doctype/serial_no/serial_no.js index 10b20f9647e..bb131f35c1a 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.js +++ b/erpnext/stock/doctype/serial_no/serial_no.js @@ -13,4 +13,8 @@ cur_frm.cscript.onload = function() { cur_frm.set_query("item_code", function() { return erpnext.queries.item({"is_stock_item": "Yes", "has_serial_no": "Yes"}) }); -} +}; + +frappe.ui.form.on("Serial No", "refresh", function(frm) { + frm.toggle_enable("item_code", frm.doc.__islocal); +}); diff --git a/erpnext/stock/doctype/serial_no/serial_no.json b/erpnext/stock/doctype/serial_no/serial_no.json index 76955780c7e..ee7cea4ff20 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.json +++ b/erpnext/stock/doctype/serial_no/serial_no.json @@ -3,7 +3,7 @@ "allow_import": 1, "allow_rename": 1, "autoname": "field:serial_no", - "creation": "2013-05-16 10:59:15.000000", + "creation": "2013-05-16 10:59:15", "description": "Distinct unit of an Item", "docstatus": 0, "doctype": "DocType", @@ -24,7 +24,7 @@ "read_only": 0 }, { - "default": "In Store", + "default": "Not Available", "description": "Only Serial Nos with status \"Available\" can be delivered.", "fieldname": "status", "fieldtype": "Select", @@ -34,9 +34,9 @@ "no_copy": 1, "oldfieldname": "status", "oldfieldtype": "Select", - "options": "\nAvailable\nNot Available\nDelivered\nPurchase Returned\nSales Returned", + "options": "Not Available\nAvailable\nDelivered\nPurchase Returned\nSales Returned", "permlevel": 0, - "read_only": 0, + "read_only": 1, "reqd": 1, "search_index": 1 }, @@ -418,7 +418,7 @@ "icon": "icon-barcode", "idx": 1, "in_create": 0, - "modified": "2014-01-20 17:49:26.000000", + "modified": "2014-05-04 00:47:20.443476", "modified_by": "Administrator", "module": "Stock", "name": "Serial No", diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index b7dc54574df..dbbc3efdc6d 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -262,7 +262,7 @@ def update_serial_nos(sle, item_det): sr = frappe.get_doc("Serial No", serial_no) sr.via_stock_ledger = True sr.warehouse = sle.warehouse if sle.actual_qty > 0 else None - sr.save() + sr.save(ignore_permissions=True) elif sle.actual_qty > 0: make_serial_no(serial_no, sle) @@ -277,6 +277,7 @@ def get_serial_nos(serial_no): def make_serial_no(serial_no, sle): sr = frappe.new_doc("Serial No") + sr.ignore_permissions = True sr.serial_no = serial_no sr.item_code = sle.item_code sr.warehouse = None diff --git a/erpnext/templates/utils.py b/erpnext/templates/utils.py index 7ba4a9d911e..d3c93eb24c5 100644 --- a/erpnext/templates/utils.py +++ b/erpnext/templates/utils.py @@ -7,8 +7,9 @@ import frappe @frappe.whitelist(allow_guest=True) def send_message(subject="Website Query", message="", sender="", status="Open"): from frappe.templates.pages.contact import send_message as website_send_message + res = website_send_message(subject, message, sender) - if not website_send_message(subject, message, sender): + if not res: return if subject=="Support": @@ -21,3 +22,4 @@ def send_message(subject="Website Query", message="", sender="", status="Open"): add_sales_communication(subject or "Website Query", message, sender, sender, mail=None, status=status) + return res diff --git a/erpnext/tests/sel_tests.py b/erpnext/tests/sel_tests.py index b1db9bbcded..8ff0b0ea313 100644 --- a/erpnext/tests/sel_tests.py +++ b/erpnext/tests/sel_tests.py @@ -14,11 +14,89 @@ from __future__ import unicode_literals import frappe from frappe.utils import sel +import time def start(): - sel.start(verbose=True) + try: + run() + finally: + sel.close() + +def run(): + def next_slide(idx, selector="next-btn"): + sel.find('[data-slide-id="{0}"] .{1}'.format(idx, selector))[0].click() + sel.wait_for_ajax() + + + sel.start(verbose=True, driver="Firefox") + sel.input_wait = 0.2 sel.login("#page-setup-wizard") + # slide 1 + next_slide("0") + + sel.set_field("first_name", "Test") + sel.set_field("last_name", "User") + sel.set_field("email", "test@erpnext.com") + sel.set_field("password", "test") + + next_slide("1") + + sel.set_select("country", "India") + + next_slide("2") + + sel.set_field("company_name", "Wind Power LLC") + sel.set_field("fy_start_date", "01-04-2014") + sel.set_field("company_tagline", "Wind Power For Everyone") + + next_slide("3") + next_slide("4") + + sel.set_field("tax_1", "VAT") + sel.set_field("tax_rate_1", "12.5") + + sel.set_field("tax_2", "Service Tax") + sel.set_field("tax_rate_2", "10.36") + + next_slide("5") + + sel.set_field("customer_1", "Asian Junction") + sel.set_field("customer_contact_1", "January Vaclavik") + sel.set_field("customer_2", "Life Plan Counselling") + sel.set_field("customer_contact_2", "Jana Tobeolisa") + sel.set_field("customer_3", "Two Pesos") + sel.set_field("customer_contact_3", "Satomi Shigeki") + sel.set_field("customer_4", "Intelacard") + sel.set_field("customer_contact_4", "Hans Rasmussen") + + next_slide("6") + + sel.set_field("item_1", "Wind Turbine A") + sel.set_field("item_2", "Wind Turbine B") + sel.set_field("item_3", "Wind Turbine C") + + next_slide("7") + + sel.set_field("supplier_1", "Helios Air") + sel.set_field("supplier_contact_1", "Quimey Osorio") + sel.set_field("supplier_2", "Ks Merchandise") + sel.set_field("supplier_contact_2", "Edgarda Salcedo") + sel.set_field("supplier_3", "Eagle Hardware") + sel.set_field("supplier_contact_3", "Hafsteinn Bjarnarsonar") + + next_slide("8") + + sel.set_field("item_buy_1", "Bearing Pipe") + sel.set_field("item_buy_2", "Bearing Assembly") + sel.set_field("item_buy_3", "Base Plate") + sel.set_field("item_buy_4", "Coil") + + next_slide("9", "complete-btn") + + sel.wait('[data-state="setup-complete"]') + + w = raw_input("quit?") # complete setup # new customer diff --git a/erpnext/utilities/doctype/note/note_list.js b/erpnext/utilities/doctype/note/note_list.js new file mode 100644 index 00000000000..b188941bc4f --- /dev/null +++ b/erpnext/utilities/doctype/note/note_list.js @@ -0,0 +1,5 @@ +frappe.listview_settings['Note'] = { + set_title_left: function() { + frappe.set_route(); + } +}