diff --git a/accounts/doctype/sales_invoice_item/sales_invoice_item.txt b/accounts/doctype/sales_invoice_item/sales_invoice_item.txt index ca5fae49c3..dee0e85d6e 100644 --- a/accounts/doctype/sales_invoice_item/sales_invoice_item.txt +++ b/accounts/doctype/sales_invoice_item/sales_invoice_item.txt @@ -1,8 +1,8 @@ [ { - "creation": "2013-03-25 15:35:04", + "creation": "2013-03-26 11:03:08", "docstatus": 0, - "modified": "2013-03-25 15:35:23", + "modified": "2013-03-28 15:42:14", "modified_by": "Administrator", "owner": "Administrator" }, @@ -210,7 +210,7 @@ "doctype": "DocField", "fieldname": "expense_account", "fieldtype": "Link", - "hidden": 1, + "hidden": 0, "in_filter": 1, "label": "Expense Account", "options": "Account", diff --git a/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js b/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js index b1cbbdcbfc..1e72010f26 100644 --- a/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js +++ b/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js @@ -53,16 +53,14 @@ cur_frm.pformat.other_charges= function(doc){ var new_val = flt(val)/flt(doc.conversion_rate); return new_val; } + + function print_hide(fieldname) { + var doc_field = wn.meta.get_docfield(doc.doctype, fieldname, doc.name); + return doc_field.print_hide; + } + out =''; if (!doc.print_without_amount) { - print_hide_dict = {}; - for(var i in locals['DocField']) { - var doc_field = locals['DocField'][i]; - if(doc_field.fieldname) { - print_hide_dict[doc_field.fieldname] = doc_field.print_hide; - } - } - var cl = getchildren('Sales Taxes and Charges',doc.name,'other_charges'); // outer table @@ -71,7 +69,7 @@ cur_frm.pformat.other_charges= function(doc){ // main table out +=''; - if(!print_hide_dict['net_total']) { + if(!print_hide('net_total')) { out +=make_row('Net Total',convert_rate(doc.net_total),1); } @@ -84,15 +82,15 @@ cur_frm.pformat.other_charges= function(doc){ } // grand total - if(!print_hide_dict['grand_total_export']) { + if(!print_hide('grand_total_export')) { out += make_row('Grand Total',doc.grand_total_export,1); } - if(!print_hide_dict['rounded_total_export']) { + if(!print_hide('rounded_total_export')) { out += make_row('Rounded Total',doc.rounded_total_export,1); } - if(doc.in_words_export && !print_hide_dict['in_words_export']){ + if(doc.in_words_export && !print_hide('in_words_export')){ out +='
'; out += ''; out += '' diff --git a/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.py b/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.py index 953269c50e..6cd2b4ffaa 100644 --- a/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.py +++ b/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.py @@ -24,7 +24,7 @@ class DocType: def get_rate(self, arg): from webnotes.model.code import get_obj - return get_obj('Sales Common').get_rate(arg, self) + return get_obj('Sales Common').get_rate(arg) def update_other_default_charges(self): webnotes.conn.sql("update `tabSales Taxes and Charges Master` set is_default = 0 where ifnull(is_default,0) = 1 and name != '%s' and company = '%s'" % (self.doc.name, self.doc.company)) diff --git a/accounts/report/gross_profit/gross_profit.py b/accounts/report/gross_profit/gross_profit.py index 7f6354b6cc..9ccd320e6d 100644 --- a/accounts/report/gross_profit/gross_profit.py +++ b/accounts/report/gross_profit/gross_profit.py @@ -14,7 +14,8 @@ def execute(filters=None): columns = ["Delivery Note/Sales Invoice::120", "Link::30", "Posting Date:Date", "Posting Time", "Item Code:Link/Item", "Item Name", "Description", "Warehouse:Link/Warehouse", - "Qty:Float", "Selling Rate:Currency", "Selling Amount:Currency", "Buying Amount:Currency", + "Qty:Float", "Selling Rate:Currency", "Avg. Buying Rate:Currency", + "Selling Amount:Currency", "Buying Amount:Currency", "Gross Profit:Currency", "Gross Profit %:Percent", "Project:Link/Project"] data = [] @@ -25,17 +26,18 @@ def execute(filters=None): item_sales_bom.get(row.parenttype, {}).get(row.name, webnotes._dict())) buying_amount = buying_amount > 0 and buying_amount or 0 - + + gross_profit = selling_amount - buying_amount if selling_amount: - gross_profit = selling_amount - buying_amount gross_profit_percent = (gross_profit / selling_amount) * 100.0 else: - gross_profit = gross_profit_percent = 0.0 + gross_profit_percent = 0.0 icon = """""" \ % ("/".join(["#Form", row.parenttype, row.name]),) data.append([row.name, icon, row.posting_date, row.posting_time, row.item_code, row.item_name, - row.description, row.warehouse, row.qty, row.basic_rate, row.amount, buying_amount, + row.description, row.warehouse, row.qty, row.basic_rate, + row.qty and (buying_amount / row.qty) or 0, row.amount, buying_amount, gross_profit, gross_profit_percent, row.project]) return columns, data diff --git a/accounts/utils.py b/accounts/utils.py index 92173ab8ee..d6b20431f8 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -294,18 +294,18 @@ def create_stock_in_hand_jv(reverse=False): jv.submit() def get_stock_rbnb_value(company): - total_received_amount = webnotes.conn.sql("""select sum(valuation_amount) + total_received_amount = webnotes.conn.sql("""select sum(valuation_rate*qty) from `tabPurchase Receipt Item` pr_item where docstatus=1 and exists(select name from `tabItem` where name = pr_item.item_code and is_stock_item='Yes') - and exist(select name from `tabPurchase Receipt` + and exists(select name from `tabPurchase Receipt` where name = pr_item.parent and company = %s)""", company) - total_billed_amount = webnotes.conn.sql("""select sum(valuation_amount) + total_billed_amount = webnotes.conn.sql("""select sum(valuation_rate*qty) from `tabPurchase Invoice Item` pi_item where docstatus=1 and exists(select name from `tabItem` where name = pi_item.item_code and is_stock_item='Yes') - and exist(select name from `tabPurchase Invoice` + and exists(select name from `tabPurchase Invoice` where name = pi_item.parent and company = %s)""", company) return flt(total_received_amount[0][0]) - flt(total_billed_amount[0][0]) diff --git a/patches/april_2013/__init__.py b/patches/april_2013/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/patches/april_2013/p01_update_serial_no_valuation_rate.py b/patches/april_2013/p01_update_serial_no_valuation_rate.py new file mode 100644 index 0000000000..2ea0c26a55 --- /dev/null +++ b/patches/april_2013/p01_update_serial_no_valuation_rate.py @@ -0,0 +1,35 @@ +import webnotes +from webnotes.utils import cstr +from stock.stock_ledger import update_entries_after + +def execute(): + webnotes.conn.auto_commit_on_many_writes = 1 + + pr_items = webnotes.conn.sql("""select item_code, warehouse, serial_no, valuation_rate, name + from `tabPurchase Receipt Item` where ifnull(serial_no, '') != '' and docstatus = 1""", + as_dict=True) + + item_warehouse = [] + + for item in pr_items: + serial_nos = cstr(item.serial_no).strip().split("\n") + serial_nos = map(lambda x: x.strip(), serial_nos) + + if cstr(item.serial_no) != "\n".join(serial_nos): + webnotes.conn.sql("""update `tabPurchase Receipt Item` set serial_no = %s + where name = %s""", ("\n".join(serial_nos), item.name)) + + if [item.item_code, item.warehouse] not in item_warehouse: + item_warehouse.append([item.item_code, item.warehouse]) + + webnotes.conn.sql("""update `tabSerial No` set purchase_rate = %s + where name in (%s)""" % ('%s', ', '.join(['%s']*len(serial_nos))), + tuple([item.valuation_rate] + serial_nos)) + + for d in item_warehouse: + try: + update_entries_after({"item_code": d[0], "warehouse": d[1] }) + except: + continue + + webnotes.conn.auto_commit_on_many_writes = 0 \ No newline at end of file diff --git a/patches/march_2013/p07_update_valuation_rate.py b/patches/march_2013/p07_update_valuation_rate.py index 51e556b328..7cc3e1137a 100644 --- a/patches/march_2013/p07_update_valuation_rate.py +++ b/patches/march_2013/p07_update_valuation_rate.py @@ -8,6 +8,6 @@ def execute(): pi.update_raw_material_cost() pi.update_valuation_rate("entries") for item in pi.doclist.get({"parentfield": "entries"}): - webnotes.conn.set_value("Purchase Invoice Item", item.name, "valuation_rate", - item.valuation_rate) + webnotes.conn.sql("""update `tabPurchase Invoice Item` set valuation_rate = %s + where name = %s""", (item.valuation_rate, item.name)) \ No newline at end of file diff --git a/patches/march_2013/p10_update_against_expense_account.py b/patches/march_2013/p10_update_against_expense_account.py new file mode 100644 index 0000000000..3506ac4936 --- /dev/null +++ b/patches/march_2013/p10_update_against_expense_account.py @@ -0,0 +1,11 @@ +def execute(): + import webnotes + from webnotes import get_obj + pi_list = webnotes.conn.sql("""select name from `tabPurchase Invoice` + where docstatus = 1 and ifnull(against_expense_account, '') = ''""") + + for pi in pi_list: + pi_obj = get_obj("Purchase Invoice", pi[0], with_children=1) + pi_obj.set_against_expense_account() + webnotes.conn.sql("""update `tabPurchase Invoice` set against_expense_account = %s + where name = %s""", (pi_obj.doc.against_expense_account, pi[0])) \ No newline at end of file diff --git a/patches/march_2013/p11_update_attach_files.py b/patches/march_2013/p11_update_attach_files.py index 769463a590..ef39ce89f8 100644 --- a/patches/march_2013/p11_update_attach_files.py +++ b/patches/march_2013/p11_update_attach_files.py @@ -11,6 +11,6 @@ def execute(): else: webnotes.conn.sql("""update `tab%(parent)s` set %(fieldname)s = - if(substr(%(fieldname)s,0,4)='http' or substr(%(fieldname)s, 0, 5)='files', + if(substr(%(fieldname)s,1,4)='http' or substr(%(fieldname)s,1,5)='files', %(fieldname)s, concat('files/', %(fieldname)s))""" % f) \ No newline at end of file diff --git a/patches/march_2013/p12_set_item_tax_rate_in_json.py b/patches/march_2013/p12_set_item_tax_rate_in_json.py new file mode 100644 index 0000000000..de47c67d92 --- /dev/null +++ b/patches/march_2013/p12_set_item_tax_rate_in_json.py @@ -0,0 +1,19 @@ +import webnotes +import json + +def execute(): + """replace item_tax_rate stored as string with a json string""" + webnotes.conn.auto_commit_on_many_writes = 1 + for dt in ["Quotation Item", "Sales Order Item", "Sales Invoice Item", + "Delivery Note Item", "Supplier Quotation Item", "Purchase Order Item", + "Purchase Invoice Item", "Purchase Receipt Item"]: + for d in webnotes.conn.sql("""select name, item_tax_rate from `tab%s` + where ifnull(item_tax_rate, '')!=''""" % (dt,), as_dict=1): + try: + json.loads(d["item_tax_rate"]) + except ValueError, e: + webnotes.conn.sql("""update `tab%s` set item_tax_rate=%s + where name=%s""" % (dt, "%s", "%s"), + (json.dumps(eval(d["item_tax_rate"])), d["name"])) + + webnotes.conn.auto_commit_on_many_writes = 0 \ No newline at end of file diff --git a/patches/patch_list.py b/patches/patch_list.py index 5502385b2f..544fc957e9 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -224,5 +224,8 @@ patch_list = [ "execute:webnotes.conn.set_value('Email Settings', None, 'send_print_in_body_and_attachment', 1)", "patches.march_2013.p09_unset_user_type_partner", "patches.march_2013.p10_set_fiscal_year_for_stock", + "patches.march_2013.p10_update_against_expense_account", "patches.march_2013.p11_update_attach_files", + "patches.march_2013.p12_set_item_tax_rate_in_json", + "patches.april_2013.p01_update_serial_no_valuation_rate", ] \ No newline at end of file diff --git a/setup/doctype/global_defaults/global_defaults.py b/setup/doctype/global_defaults/global_defaults.py index 4b6707f506..3f8de1de20 100644 --- a/setup/doctype/global_defaults/global_defaults.py +++ b/setup/doctype/global_defaults/global_defaults.py @@ -45,7 +45,7 @@ keydict = { 'session_expiry': 'session_expiry', 'disable_rounded_total': 'disable_rounded_total', "update_stock": "update_stock", - # "auto_inventory_accounting": "auto_inventory_accounting", + "auto_inventory_accounting": "auto_inventory_accounting", } class DocType: diff --git a/setup/doctype/global_defaults/global_defaults.txt b/setup/doctype/global_defaults/global_defaults.txt index ac1671e402..7f81618469 100644 --- a/setup/doctype/global_defaults/global_defaults.txt +++ b/setup/doctype/global_defaults/global_defaults.txt @@ -1,8 +1,8 @@ [ { - "creation": "2013-02-21 12:28:24", + "creation": "2013-03-25 11:08:14", "docstatus": 0, - "modified": "2013-03-21 15:42:59", + "modified": "2013-03-28 15:41:03", "modified_by": "Administrator", "owner": "Administrator" }, @@ -27,6 +27,8 @@ "permlevel": 0 }, { + "amend": 0, + "cancel": 0, "create": 1, "doctype": "DocPerm", "name": "__common__", @@ -48,19 +50,22 @@ "doctype": "DocField", "fieldname": "general", "fieldtype": "Section Break", - "label": "General" + "label": "General", + "read_only": 0 }, { "description": "Session Expiry in Hours e.g. 06:00", "doctype": "DocField", "fieldname": "session_expiry", "fieldtype": "Data", - "label": "Session Expiry" + "label": "Session Expiry", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "column_break_3", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "read_only": 0 }, { "description": "For Server Side Print Formats", @@ -68,13 +73,15 @@ "fieldname": "print_style", "fieldtype": "Select", "label": "Print Format Style", - "options": "Standard\nClassic\nModern\nSpartan" + "options": "Standard\nClassic\nModern\nSpartan", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "company", "fieldtype": "Section Break", - "label": "Company" + "label": "Company", + "read_only": 0 }, { "doctype": "DocField", @@ -82,6 +89,7 @@ "fieldtype": "Link", "label": "Default Company", "options": "Company", + "read_only": 0, "reqd": 0 }, { @@ -90,6 +98,7 @@ "fieldtype": "Link", "label": "Current Fiscal Year", "options": "Fiscal Year", + "read_only": 0, "reqd": 1 }, { @@ -97,12 +106,14 @@ "fieldname": "date_format", "fieldtype": "Select", "label": "Date Format", - "options": "yyyy-mm-dd\ndd-mm-yyyy\ndd/mm/yyyy\nmm/dd/yyyy\nmm-dd-yyyy" + "options": "yyyy-mm-dd\ndd-mm-yyyy\ndd/mm/yyyy\nmm/dd/yyyy\nmm-dd-yyyy", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "column_break1", "fieldtype": "Column Break", + "read_only": 0, "width": "50%" }, { @@ -111,7 +122,8 @@ "fieldname": "hide_currency_symbol", "fieldtype": "Select", "label": "Hide Currency Symbol", - "options": "\nNo\nYes" + "options": "\nNo\nYes", + "read_only": 0 }, { "default": "INR", @@ -120,6 +132,7 @@ "fieldtype": "Link", "label": "Default Currency", "options": "Currency", + "read_only": 0, "reqd": 1 }, { @@ -128,7 +141,8 @@ "fieldname": "number_format", "fieldtype": "Select", "label": "Number Format", - "options": "\n#,###.##\n#.###,##\n# ###.##\n#,###.###\n#,##,###.##\n#.###\n#,###" + "options": "\n#,###.##\n#.###,##\n# ###.##\n#,###.###\n#,##,###.##\n#.###\n#,###", + "read_only": 0 }, { "description": "Precision for Float fields (quantities, discounts, percentages etc) only for display. Floats will still be calculated up to 6 decimals.", @@ -136,18 +150,21 @@ "fieldname": "float_precision", "fieldtype": "Select", "label": "Float Precision", - "options": "\n2\n3\n4\n5\n6" + "options": "\n2\n3\n4\n5\n6", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "stock", "fieldtype": "Section Break", - "label": "Stock" + "label": "Stock", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "column_break2", "fieldtype": "Column Break", + "read_only": 0, "width": "50%" }, { @@ -155,54 +172,62 @@ "fieldname": "default_item_group", "fieldtype": "Link", "label": "Default Item Group", - "options": "Item Group" + "options": "Item Group", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "ighelp", "fieldtype": "HTML", "label": "IGHelp", - "options": "To manage Item Groups, click here" + "options": "To manage Item Groups, click here", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "default_stock_uom", "fieldtype": "Link", "label": "Default Stock UOM", - "options": "UOM" + "options": "UOM", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "default_valuation_method", "fieldtype": "Select", "label": "Default Valuation Method", - "options": "FIFO\nMoving Average" + "options": "FIFO\nMoving Average", + "read_only": 0 }, { "description": "Applicable only if valuation method is moving average", "doctype": "DocField", "fieldname": "allow_negative_stock", "fieldtype": "Check", - "label": "Allow Negative Stock" + "label": "Allow Negative Stock", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "default_warehouse_type", "fieldtype": "Link", "label": "Default Warehouse Type", - "options": "Warehouse Type" + "options": "Warehouse Type", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "auto_indent", "fieldtype": "Check", - "label": "Raise Material Request when stock reaches re-order level" + "label": "Raise Material Request when stock reaches re-order level", + "read_only": 0 }, { "default": "1", "doctype": "DocField", "fieldname": "column_break3", "fieldtype": "Column Break", + "read_only": 0, "width": "50%" }, { @@ -210,14 +235,16 @@ "doctype": "DocField", "fieldname": "tolerance", "fieldtype": "Float", - "label": "Allowance Percent" + "label": "Allowance Percent", + "read_only": 0 }, { "description": "Stock level frozen up to this date, nobody can do / modify entry except authorized person", "doctype": "DocField", "fieldname": "stock_frozen_upto", "fieldtype": "Date", - "label": "Stock Frozen Upto" + "label": "Stock Frozen Upto", + "read_only": 0 }, { "description": "Users with this role are allowed to do / modify stock entry before frozen date", @@ -225,20 +252,32 @@ "fieldname": "stock_auth_role", "fieldtype": "Link", "label": "Authorized Role (Frozen Entry)", - "options": "Role" + "options": "Role", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "accounts", "fieldtype": "Section Break", - "label": "Accounts" + "label": "Accounts", + "read_only": 0 + }, + { + "description": "If enabled, the system will post accounting entries for inventory automatically", + "doctype": "DocField", + "fieldname": "auto_inventory_accounting", + "fieldtype": "Check", + "label": "Auto Inventory Accounting", + "no_copy": 0, + "print_hide": 1 }, { "description": "Accounting entry frozen up to this date, nobody can do / modify entry except authorized person", "doctype": "DocField", "fieldname": "acc_frozen_upto", "fieldtype": "Date", - "label": "Accounts Frozen Upto" + "label": "Accounts Frozen Upto", + "read_only": 0 }, { "description": "Users with this role are allowed to do / modify accounting entry before frozen date", @@ -246,39 +285,45 @@ "fieldname": "bde_auth_role", "fieldtype": "Link", "label": "Authourized Role (Frozen Entry)", - "options": "Role" + "options": "Role", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "credit_controller", "fieldtype": "Link", "label": "Credit Controller", - "options": "Role" + "options": "Role", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "column_break4", - "fieldtype": "Column Break" + "fieldtype": "Column Break", + "read_only": 0 }, { "description": "If checked, then in POS Sales Invoice, Update Stock gets checked by default", "doctype": "DocField", "fieldname": "update_stock", "fieldtype": "Check", - "label": "Update Stock when using POS Sales Invoice" + "label": "Update Stock when using POS Sales Invoice", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "account_info", "fieldtype": "HTML", "label": "Account Info", - "options": "
For more accounting defaults, Open Company
" + "options": "
For more accounting defaults, Open Company
", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "selling", "fieldtype": "Section Break", - "label": "Selling" + "label": "Selling", + "read_only": 0 }, { "default": "Customer Name", @@ -286,40 +331,46 @@ "fieldname": "cust_master_name", "fieldtype": "Select", "label": "Customer Master created by ", - "options": "Customer Name\nNaming Series" + "options": "Customer Name\nNaming Series", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "default_customer_group", "fieldtype": "Link", "label": "Default Customer Group", - "options": "Customer Group" + "options": "Customer Group", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "cghelp", "fieldtype": "HTML", "label": "CGHelp", - "options": "To manage Customer Groups, click here" + "options": "To manage Customer Groups, click here", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "default_territory", "fieldtype": "Link", "label": "Default Territory", - "options": "Territory" + "options": "Territory", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "territoryhelp", "fieldtype": "HTML", "label": "TerritoryHelp", - "options": "To manage Territory, click here" + "options": "To manage Territory, click here", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "column_break5", "fieldtype": "Column Break", + "read_only": 0, "width": "50%" }, { @@ -327,14 +378,16 @@ "fieldname": "default_price_list", "fieldtype": "Link", "label": "Default Price List", - "options": "Price List" + "options": "Price List", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "default_price_list_currency", "fieldtype": "Link", "label": "Default Price List Currency", - "options": "Currency" + "options": "Currency", + "read_only": 0 }, { "default": "No", @@ -342,7 +395,8 @@ "fieldname": "so_required", "fieldtype": "Select", "label": "Sales Order Required", - "options": "No\nYes" + "options": "No\nYes", + "read_only": 0 }, { "default": "No", @@ -350,27 +404,31 @@ "fieldname": "dn_required", "fieldtype": "Select", "label": "Delivery Note Required", - "options": "No\nYes" + "options": "No\nYes", + "read_only": 0 }, { "description": "If disable, 'Rounded Total' field will not be visible in any transaction", "doctype": "DocField", "fieldname": "disable_rounded_total", "fieldtype": "Check", - "label": "Disable Rounded Total" + "label": "Disable Rounded Total", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "buying", "fieldtype": "Section Break", - "label": "Buying" + "label": "Buying", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "default_supplier_type", "fieldtype": "Link", "label": "Default Supplier Type", - "options": "Supplier Type" + "options": "Supplier Type", + "read_only": 0 }, { "default": "Supplier Name", @@ -378,12 +436,14 @@ "fieldname": "supp_master_name", "fieldtype": "Select", "label": "Supplier Master created by ", - "options": "Supplier Name\nNaming Series" + "options": "Supplier Name\nNaming Series", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "column_break6", "fieldtype": "Column Break", + "read_only": 0, "width": "50%" }, { @@ -392,7 +452,8 @@ "fieldname": "po_required", "fieldtype": "Select", "label": "Purchase Order Required", - "options": "No\nYes" + "options": "No\nYes", + "read_only": 0 }, { "default": "No", @@ -400,20 +461,23 @@ "fieldname": "pr_required", "fieldtype": "Select", "label": "Purchase Receipt Required", - "options": "No\nYes" + "options": "No\nYes", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "maintain_same_rate", "fieldtype": "Check", - "label": "Maintain same rate throughout purchase cycle" + "label": "Maintain same rate throughout purchase cycle", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "hr", "fieldtype": "Section Break", "label": "HR", - "options": "
HR
" + "options": "
HR
", + "read_only": 0 }, { "description": "Employee record is created using selected field. ", @@ -421,24 +485,22 @@ "fieldname": "emp_created_by", "fieldtype": "Select", "label": "Employee Records to be created by ", - "options": "Naming Series\nEmployee Number" + "options": "Naming Series\nEmployee Number", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "system", "fieldtype": "Section Break", - "label": "System" + "label": "System", + "read_only": 0 }, { "doctype": "DocField", "fieldname": "sms_sender_name", "fieldtype": "Data", - "label": "SMS Sender Name" - }, - { - "amend": 0, - "cancel": 0, - "doctype": "DocPerm" + "label": "SMS Sender Name", + "read_only": 0 }, { "doctype": "DocPerm" diff --git a/setup/doctype/item_group/item_group.py b/setup/doctype/item_group/item_group.py index ba4ea77504..1445f3999f 100644 --- a/setup/doctype/item_group/item_group.py +++ b/setup/doctype/item_group/item_group.py @@ -35,13 +35,13 @@ class DocType(DocTypeNestedSet): if self.doc.show_in_website: - from website.utils import update_page_name + from webnotes.webutils import update_page_name # webpage updates page_name = self.doc.name if webnotes.conn.get_value("Product Settings", None, "default_product_category")==self.doc.name: page_name = "products" - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache() update_page_name(self.doc, page_name) @@ -51,7 +51,7 @@ class DocType(DocTypeNestedSet): elif self.doc.page_name: # if unchecked show in website - from website.utils import delete_page_cache + from webnotes.webutils import delete_page_cache delete_page_cache(self.doc.page_name) invalidate_cache_for(self.doc.name) @@ -74,7 +74,7 @@ class DocType(DocTypeNestedSet): for d in self.doc.sub_groups: d.count = get_group_item_count(d.name) - self.doc.items = get_product_list_for_group(product_group = self.doc.name, limit=20) + self.doc.items = get_product_list_for_group(product_group = self.doc.name, limit=100) self.parent_groups = get_parent_item_groups(self.doc.name) self.doc.title = self.doc.name diff --git a/setup/doctype/item_group/item_group.txt b/setup/doctype/item_group/item_group.txt index d9c6ffedda..a8da12c8f3 100644 --- a/setup/doctype/item_group/item_group.txt +++ b/setup/doctype/item_group/item_group.txt @@ -1,8 +1,8 @@ [ { - "creation": "2013-01-23 20:00:16", + "creation": "2013-03-28 10:35:29", "docstatus": 0, - "modified": "2013-03-20 15:09:28", + "modified": "2013-04-01 12:06:52", "modified_by": "Administrator", "owner": "Administrator" }, @@ -124,6 +124,7 @@ "label": "Description" }, { + "depends_on": "show_in_website", "doctype": "DocField", "fieldname": "item_website_specifications", "fieldtype": "Table", @@ -181,20 +182,6 @@ "no_copy": 1, "print_hide": 1 }, - { - "cancel": 1, - "create": 1, - "doctype": "DocPerm", - "role": "System Manager", - "write": 1 - }, - { - "cancel": 1, - "create": 1, - "doctype": "DocPerm", - "role": "Material Master Manager", - "write": 1 - }, { "amend": 0, "cancel": 0, @@ -210,5 +197,19 @@ "doctype": "DocPerm", "role": "Material User", "write": 0 + }, + { + "cancel": 1, + "create": 1, + "doctype": "DocPerm", + "role": "System Manager", + "write": 1 + }, + { + "cancel": 1, + "create": 1, + "doctype": "DocPerm", + "role": "Material Master Manager", + "write": 1 } ] \ No newline at end of file diff --git a/setup/page/setup/setup.js b/setup/page/setup/setup.js index e59a18ab99..4ab7578850 100644 --- a/setup/page/setup/setup.js +++ b/setup/page/setup/setup.js @@ -199,6 +199,18 @@ wn.module_page["Setup"] = [ }, ] }, + { + title: wn._("Update Manager"), + icon: "icon-magnet", + right: true, + items: [ + { + "page":"update-manager", + label: wn._("Update This Application"), + "description":wn._("Apply latest updates and patches to this app") + }, + ] + }, ] pscript['onload_Setup'] = function(wrapper) { diff --git a/startup/website.py b/startup/website.py new file mode 100644 index 0000000000..1041039d0e --- /dev/null +++ b/startup/website.py @@ -0,0 +1,114 @@ +import webnotes, conf, os + + +def get_templates_path(): + return os.path.join(os.path.dirname(conf.__file__), "app", "website", "templates") + +standard_pages = [ + "404", "about", "account", "attributions", "blog", "contact", "error", "index", + "login", "message", "order", "orders", "print", "product_search", "profile", + "ticket", "tickets", "writers" +] + +page_map = { + 'Web Page': webnotes._dict({ + "template": 'html/web_page.html', + "condition_field": "published" + }), + 'Blog Post': webnotes._dict({ + "template": 'html/blog_page.html', + "condition_field": "published", + }), + 'Item': webnotes._dict({ + "template": 'html/product_page.html', + "condition_field": "show_in_website", + }), + 'Item Group': webnotes._dict({ + "template": "html/product_group.html", + "condition_field": "show_in_website" + }) +} + +page_settings_map = { + "about": "website.doctype.about_us_settings.about_us_settings.get_args", + "contact": "Contact Us Settings", + "blog": "website.helpers.blog.get_blog_template_args", + "writers": "website.helpers.blog.get_writers_args", + "print": "core.doctype.print_format.print_format.get_args", + "orders": "selling.doctype.sales_order.sales_order.get_currency_and_number_format", + "order": "selling.doctype.sales_order.sales_order.get_website_args", + "ticket": "support.doctype.support_ticket.support_ticket.get_website_args" +} + +no_cache = ["message", "print", "order", "ticket"] + +def get_home_page(): + doc_name = webnotes.conn.get_value('Website Settings', None, 'home_page') + if doc_name: + page_name = webnotes.conn.get_value('Web Page', doc_name, 'page_name') + else: + page_name = 'login' + + return page_name + +def update_template_args(page_name, args): + + from webnotes.utils import get_request_site_address + from urllib import quote + + all_top_items = webnotes.conn.sql("""\ + select * from `tabTop Bar Item` + where parent='Website Settings' and parentfield='top_bar_items' + order by idx asc""", as_dict=1) + + top_items = [d for d in all_top_items if not d['parent_label']] + + # attach child items to top bar + for d in all_top_items: + if d['parent_label']: + for t in top_items: + if t['label']==d['parent_label']: + if not 'child_items' in t: + t['child_items'] = [] + t['child_items'].append(d) + break + + if top_items and ("products" in [d.url.split(".")[0] for d in top_items if d.url]): + # product categories + products = webnotes.conn.sql("""select t1.item_group as label, + t2.page_name as url, + ifnull(t1.indent,0) as indent + from `tabWebsite Product Category` t1, `tabItem Group` t2 + where t1.item_group = t2.name + and ifnull(t2.show_in_website,0)=1 order by t1.idx""", as_dict=1) + products_item = filter(lambda d: d.url and d.url.split(".")[0]=="products", top_items)[0] + products_item.child_items = products + + ret = webnotes._dict({ + 'top_bar_items': top_items, + 'footer_items': webnotes.conn.sql("""\ + select * from `tabTop Bar Item` + where parent='Website Settings' and parentfield='footer_items' + order by idx asc""", as_dict=1), + + 'int':int, + "webnotes": webnotes, + "utils": webnotes.utils + }) + + args.update(ret) + + settings = webnotes.doc("Website Settings", "Website Settings") + for k in ["banner_html", "brand_html", "copyright", "address", "twitter_share_via", + "favicon", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share"]: + if k in settings.fields: + args[k] = settings.fields.get(k) + + for k in ["facebook_share", "google_plus_one", "twitter_share", "linked_in_share"]: + args[k] = int(args.get(k) or 0) + + args.url = quote(str(get_request_site_address(full_address=True)), str("")) + args.encoded_title = quote(str(args.title or ""), str("")) + + return args + \ No newline at end of file diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py index ded689734f..daf7d61519 100644 --- a/stock/doctype/delivery_note/delivery_note.py +++ b/stock/doctype/delivery_note/delivery_note.py @@ -366,6 +366,7 @@ class DocType(SellingController): # Reduce actual qty from warehouse self.make_sl_entry(d, d['warehouse'], - flt(d['qty']) , 0, update_stock) + get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values) diff --git a/stock/doctype/delivery_note_item/delivery_note_item.txt b/stock/doctype/delivery_note_item/delivery_note_item.txt index 1961e6cfa8..fb3dd413ef 100644 --- a/stock/doctype/delivery_note_item/delivery_note_item.txt +++ b/stock/doctype/delivery_note_item/delivery_note_item.txt @@ -1,8 +1,8 @@ [ { - "creation": "2013-03-25 11:55:16", + "creation": "2013-03-26 11:03:09", "docstatus": 0, - "modified": "2013-03-25 15:43:04", + "modified": "2013-03-28 15:42:41", "modified_by": "Administrator", "owner": "Administrator" }, @@ -248,7 +248,7 @@ "doctype": "DocField", "fieldname": "expense_account", "fieldtype": "Link", - "hidden": 1, + "hidden": 0, "label": "Expense Account", "no_copy": 1, "options": "Account", @@ -260,11 +260,12 @@ "doctype": "DocField", "fieldname": "cost_center", "fieldtype": "Link", - "hidden": 1, + "hidden": 0, "label": "Cost Center", "no_copy": 1, "options": "Cost Center", "print_hide": 1, + "read_only": 0, "width": "120px" }, { diff --git a/stock/doctype/item/item.py b/stock/doctype/item/item.py index 802771cce1..43bae2c9e7 100644 --- a/stock/doctype/item/item.py +++ b/stock/doctype/item/item.py @@ -86,7 +86,7 @@ class DocType(DocListController): self.doclist.get({"doctype":"Website Item Group"})] if self.doc.show_in_website: - from website.utils import update_page_name + from webnotes.webutils import update_page_name if self.doc.name==self.doc.item_name: page_name_from = self.doc.name else: @@ -98,7 +98,7 @@ class DocType(DocListController): elif self.doc.page_name: # if unchecked show in website - from website.utils import delete_page_cache + from webnotes.webutils import delete_page_cache delete_page_cache(self.doc.page_name) _invalidate_cache() @@ -112,7 +112,7 @@ class DocType(DocListController): where item_code=%s and is_cancelled='Yes' """, self.doc.item_code) if self.doc.page_name: - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache(self.doc.page_name) # Check whether Ref Rate is not entered twice for same Price List and Currency @@ -231,7 +231,7 @@ class DocType(DocListController): def on_rename(self,newdn,olddn): sql("update tabItem set item_code = %s where name = %s", (newdn, olddn)) if self.doc.page_name: - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache(self.doc.page_name) def prepare_template_args(self): diff --git a/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/stock/doctype/landed_cost_wizard/landed_cost_wizard.py index 1fb7b9a016..e5fd12ca62 100644 --- a/stock/doctype/landed_cost_wizard/landed_cost_wizard.py +++ b/stock/doctype/landed_cost_wizard/landed_cost_wizard.py @@ -212,7 +212,8 @@ class DocType: if flt(d.qty): d.valuation_rate = (flt(d.purchase_rate) + (flt(d.rm_supp_cost)/flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor) d.save() - self.update_serial_no(d.serial_no, d.valuation_rate) + if d.serial_no: + self.update_serial_no(d.serial_no, d.valuation_rate) sql("update `tabStock Ledger Entry` set incoming_rate = '%s' where voucher_detail_no = '%s'"%(flt(d.valuation_rate), d.name)) res = sql("""select item_code, warehouse, posting_date, posting_time @@ -226,10 +227,10 @@ class DocType: def update_serial_no(self, sr_no, rate): """ update valuation rate in serial no""" - sr_no = cstr(sr_no).split('\n') - for d in sr_no: - sql("update `tabSerial No` set purchase_rate = %s where name = %s", (rate, d)) - + sr_no = map(lambda x: x.strip(), cstr(sr_no).split('\n')) + + webnotes.conn.sql("""update `tabSerial No` set purchase_rate = %s where name in (%s)""" % + ('%s', ', '.join(['%s']*len(sr_no))), tuple([rate] + sr_no)) def update_landed_cost(self): """ diff --git a/stock/doctype/stock_entry/stock_entry.js b/stock/doctype/stock_entry/stock_entry.js index 9b89d7859b..3e21207eaa 100644 --- a/stock/doctype/stock_entry/stock_entry.js +++ b/stock/doctype/stock_entry/stock_entry.js @@ -205,25 +205,27 @@ erpnext.stock.StockEntry = erpnext.stock.StockController.extend({ }, make_return_jv: function() { - this.frm.call({ - method: "make_return_jv", - args: { - stock_entry: this.frm.doc.name - }, - callback: function(r) { - if(!r.exc) { - var jv_name = wn.model.make_new_doc_and_get_name('Journal Voucher'); - var jv = locals["Journal Voucher"][jv_name]; - $.extend(jv, r.message[0]); - $.each(r.message.slice(1), function(i, jvd) { - var child = wn.model.add_child(jv, "Journal Voucher Detail", "entries"); - $.extend(child, jvd); - }); - loaddoc("Journal Voucher", jv_name); + if(this.get_doctype_docname()) { + this.frm.call({ + method: "make_return_jv", + args: { + stock_entry: this.frm.doc.name + }, + callback: function(r) { + if(!r.exc) { + var jv_name = wn.model.make_new_doc_and_get_name('Journal Voucher'); + var jv = locals["Journal Voucher"][jv_name]; + $.extend(jv, r.message[0]); + $.each(r.message.slice(1), function(i, jvd) { + var child = wn.model.add_child(jv, "Journal Voucher Detail", "entries"); + $.extend(child, jvd); + }); + loaddoc("Journal Voucher", jv_name); + } + } - - } - }); + }); + } }, }); @@ -358,6 +360,8 @@ cur_frm.cscript.uom = function(doc, cdt, cdn) { cur_frm.cscript.validate = function(doc, cdt, cdn) { cur_frm.cscript.validate_items(doc); + if($.inArray(cur_frm.doc.purpose, ["Purchase Return", "Sales Return"])!==-1) + validated = cur_frm.cscript.get_doctype_docname() ? true : false; } cur_frm.cscript.validate_items = function(doc) { diff --git a/stock/doctype/stock_ledger/stock_ledger.py b/stock/doctype/stock_ledger/stock_ledger.py index fcb4a54a47..469c94bb2f 100644 --- a/stock/doctype/stock_ledger/stock_ledger.py +++ b/stock/doctype/stock_ledger/stock_ledger.py @@ -38,10 +38,10 @@ class DocType: for d in getlist(obj.doclist, table_name): if d.serial_no: - d.serial_no = cstr(d.serial_no).strip().replace(',', '\n') + serial_nos = cstr(d.serial_no).strip().replace(',', '\n').split('\n') + d.serial_no = "\n".join(map(lambda x: x.strip(), serial_nos)) d.save() - def validate_serial_no_warehouse(self, obj, fname): for d in getlist(obj.doclist, fname): wh = d.warehouse or d.s_warehouse @@ -84,6 +84,7 @@ class DocType: item_details = webnotes.conn.sql("""select item_group, warranty_period from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now()) """ %(d.item_code), as_dict=1) + webnotes.errprint([d.item_code, d.valuation_rate]) s.purchase_document_type = obj.doc.doctype s.purchase_document_no = obj.doc.name diff --git a/stock/utils.py b/stock/utils.py index d75c1d438b..a2541dc69e 100644 --- a/stock/utils.py +++ b/stock/utils.py @@ -171,7 +171,7 @@ def get_buying_amount(item_code, warehouse, qty, voucher_type, voucher_no, vouch buying_amount = 0.0 for bom_item in item_sales_bom[item_code]: if bom_item.get("parent_detail_docname")==voucher_detail_no: - buying_amount += _get_buying_amount(voucher_type, voucher_no, "[** No Item Row **]", + buying_amount += _get_buying_amount(voucher_type, voucher_no, voucher_detail_no, bom_item.item_code, bom_item.warehouse or warehouse, bom_item.total_qty or (bom_item.qty * qty), stock_ledger_entries) return buying_amount @@ -187,8 +187,7 @@ def _get_buying_amount(voucher_type, voucher_no, item_row, item_code, warehouse, for i, sle in enumerate(relevant_stock_ledger_entries): if sle.voucher_type == voucher_type and sle.voucher_no == voucher_no and \ - ((sle.voucher_detail_no == item_row) or (sle.voucher_type != "Stock Reconciliation" - and flt(sle.qty) == qty)): + sle.voucher_detail_no == item_row: previous_stock_value = len(relevant_stock_ledger_entries) > i+1 and \ flt(relevant_stock_ledger_entries[i+1].stock_value) or 0.0 diff --git a/website/doctype/about_us_settings/about_us_settings.py b/website/doctype/about_us_settings/about_us_settings.py index fb3dcc915d..0872015f5e 100644 --- a/website/doctype/about_us_settings/about_us_settings.py +++ b/website/doctype/about_us_settings/about_us_settings.py @@ -8,7 +8,7 @@ class DocType: self.doc, self.doclist = d, dl def on_update(self): - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache("about") def get_args(): diff --git a/website/doctype/blog_category/blog_category.py b/website/doctype/blog_category/blog_category.py index c8c369c4c0..41f8fb0996 100644 --- a/website/doctype/blog_category/blog_category.py +++ b/website/doctype/blog_category/blog_category.py @@ -9,6 +9,6 @@ class DocType: def on_update(self): # for blog footer - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache() \ No newline at end of file diff --git a/website/doctype/blog_post/blog_post.py b/website/doctype/blog_post/blog_post.py index 90f72f205b..05236a1ca2 100644 --- a/website/doctype/blog_post/blog_post.py +++ b/website/doctype/blog_post/blog_post.py @@ -17,7 +17,7 @@ from __future__ import unicode_literals import webnotes -import website.utils +import webnotes.webutils from webnotes import _ class DocType: @@ -25,7 +25,7 @@ class DocType: self.doc, self.doclist = d, dl def autoname(self): - from website.utils import page_name + from webnotes.webutils import page_name self.doc.name = page_name(self.doc.title) def validate(self): @@ -38,8 +38,8 @@ class DocType: where name=%s""", self.doc.blogger) def on_update(self): - website.utils.update_page_name(self.doc, self.doc.title) - website.utils.delete_page_cache("writers") + webnotes.webutils.update_page_name(self.doc, self.doc.title) + webnotes.webutils.delete_page_cache("writers") def send_emails(self): """send emails to subscribers""" diff --git a/website/doctype/blogger/blogger.txt b/website/doctype/blogger/blogger.txt index 7f741c523c..f56df1f2b3 100644 --- a/website/doctype/blogger/blogger.txt +++ b/website/doctype/blogger/blogger.txt @@ -1,8 +1,8 @@ [ { - "creation": "2013-03-08 11:36:52", + "creation": "2013-03-25 16:00:51", "docstatus": 0, - "modified": "2013-03-11 14:00:37", + "modified": "2013-03-29 10:37:37", "modified_by": "Administrator", "owner": "Administrator" }, @@ -50,6 +50,7 @@ "doctype": "DocField", "fieldname": "full_name", "fieldtype": "Data", + "in_list_view": 1, "label": "Full Name", "reqd": 1 }, @@ -77,6 +78,7 @@ "doctype": "DocField", "fieldname": "posts", "fieldtype": "Int", + "in_list_view": 1, "label": "Posts", "read_only": 1 }, diff --git a/website/doctype/contact_us_settings/contact_us_settings.py b/website/doctype/contact_us_settings/contact_us_settings.py index 8716e60724..37e49a6da1 100644 --- a/website/doctype/contact_us_settings/contact_us_settings.py +++ b/website/doctype/contact_us_settings/contact_us_settings.py @@ -17,5 +17,5 @@ class DocType: self.address = webnotes.bean("Address", self.doc.address).doc def on_update(self): - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache("contact") \ No newline at end of file diff --git a/website/doctype/product_settings/product_settings.py b/website/doctype/product_settings/product_settings.py index 980f1238da..0cb4b7bc95 100644 --- a/website/doctype/product_settings/product_settings.py +++ b/website/doctype/product_settings/product_settings.py @@ -9,7 +9,7 @@ class DocType: def on_update(self): """clear web cache""" - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache() if self.doc.default_product_category: diff --git a/website/doctype/style_settings/style_settings.py b/website/doctype/style_settings/style_settings.py index 58dca7b6a0..ddfcf5c52a 100644 --- a/website/doctype/style_settings/style_settings.py +++ b/website/doctype/style_settings/style_settings.py @@ -27,7 +27,7 @@ class DocType: def validate(self): """make custom css""" from jinja2 import Template - from website.utils import get_hex_shade + from webnotes.webutils import get_hex_shade import os self.validate_colors() @@ -46,7 +46,7 @@ class DocType: from webnotes.sessions import clear_cache clear_cache('Guest') - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache() for f in ["small_font_size", "at_import", "heading_text_style"]: diff --git a/website/doctype/web_page/web_page.py b/website/doctype/web_page/web_page.py index d90274409d..d43bcb4e3d 100644 --- a/website/doctype/web_page/web_page.py +++ b/website/doctype/web_page/web_page.py @@ -22,11 +22,11 @@ class DocType(): self.doc, self.doclist = d, dl def autoname(self): - from website.utils import page_name + from webnotes.webutils import page_name self.doc.name = page_name(self.doc.title) def on_update(self): - from website.utils import update_page_name + from webnotes.webutils import update_page_name update_page_name(self.doc, self.doc.title) self.if_home_clear_cache() @@ -36,7 +36,7 @@ class DocType(): from webnotes.sessions import clear_cache clear_cache('Guest') - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache(self.doc.page_name) clear_cache('index') diff --git a/website/doctype/website_settings/website_settings.py b/website/doctype/website_settings/website_settings.py index 714b75a75d..77eb1c5025 100644 --- a/website/doctype/website_settings/website_settings.py +++ b/website/doctype/website_settings/website_settings.py @@ -28,7 +28,7 @@ class DocType: make() # clear web cache (for menus!) - from website.utils import clear_cache + from webnotes.webutils import clear_cache clear_cache() def set_home_page(self): diff --git a/website/helpers/blog.py b/website/helpers/blog.py index 404435332c..fb85e0dfe7 100644 --- a/website/helpers/blog.py +++ b/website/helpers/blog.py @@ -3,15 +3,15 @@ from __future__ import unicode_literals import webnotes -import website.utils +import webnotes.webutils from webnotes import _ def clear_blog_cache(): for blog in webnotes.conn.sql_list("""select page_name from `tabBlog Post` where ifnull(published,0)=1"""): - website.utils.delete_page_cache(blog) + webnotes.webutils.delete_page_cache(blog) - website.utils.delete_page_cache("writers") + webnotes.webutils.delete_page_cache("writers") @webnotes.whitelist(allow_guest=True) def get_blog_list(start=0, by=None, category=None): @@ -44,7 +44,7 @@ def get_blog_list(start=0, by=None, category=None): from webnotes.utils import global_date_format, get_fullname res['published'] = global_date_format(res['creation']) if not res['content']: - res['content'] = website.utils.get_html(res['page_name']) + res['content'] = webnotes.webutils.get_html(res['page_name']) res['content'] = res['content'][:140] return result @@ -71,13 +71,13 @@ def add_comment(args=None): comment = webnotes.widgets.form.comments.add_comment(args) # since comments are embedded in the page, clear the web cache - website.utils.clear_cache(args.get('page_name')) + webnotes.webutils.clear_cache(args.get('page_name')) comment['comment_date'] = webnotes.utils.global_date_format(comment['creation']) template_args = { 'comment_list': [comment], 'template': 'html/comment.html' } # get html of comment row - comment_html = website.utils.build_html(template_args) + comment_html = webnotes.webutils.build_html(template_args) # notify commentors commentors = [d[0] for d in webnotes.conn.sql("""select comment_by from tabComment where @@ -115,8 +115,8 @@ def add_subscriber(name, email_id): lead.save() def get_blog_content(blog_page_name): - import website.utils - content = website.utils.get_html(blog_page_name) + import webnotes.webutils + content = webnotes.webutils.get_html(blog_page_name) import webnotes.utils content = webnotes.utils.escape_html(content) return content diff --git a/website/helpers/make_web_include_files.py b/website/helpers/make_web_include_files.py index 62b8c66cd2..fe6f05c86c 100644 --- a/website/helpers/make_web_include_files.py +++ b/website/helpers/make_web_include_files.py @@ -3,14 +3,14 @@ import os import webnotes -import website.utils +import webnotes.webutils def make(): if not webnotes.conn: webnotes.connect() - home_page = website.utils.get_home_page() + home_page = webnotes.webutils.get_home_page() fname = 'js/wn-web.js' if os.path.basename(os.path.abspath('.'))!='public': diff --git a/website/helpers/product.py b/website/helpers/product.py index f79d2070c3..4a1cd40e4d 100644 --- a/website/helpers/product.py +++ b/website/helpers/product.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import webnotes from webnotes.utils import cstr -from website.utils import build_html, delete_page_cache +from webnotes.webutils import build_html, delete_page_cache @webnotes.whitelist(allow_guest=True) diff --git a/website/helpers/sitemap.py b/website/helpers/sitemap.py index d35ee56294..201865a074 100644 --- a/website/helpers/sitemap.py +++ b/website/helpers/sitemap.py @@ -13,7 +13,7 @@ def generate(domain): global frame_xml, link_xml import urllib, os import webnotes - import website.utils + import webnotes.webutils # settings max_doctypes = 10 @@ -24,8 +24,8 @@ def generate(domain): if domain: # list of all pages in web cache - for doctype in website.utils.page_map: - d = website.utils.page_map[doctype]; + for doctype in webnotes.webutils.page_map: + d = webnotes.webutils.page_map[doctype]; pages = webnotes.conn.sql("""select page_name, `modified` from `tab%s` where ifnull(%s,0)=1 order by modified desc""" % (doctype, d.condition_field)) diff --git a/website/page/website_home/website_home.js b/website/page/website_home/website_home.js index e1122071dd..71f2f4d2cd 100644 --- a/website/page/website_home/website_home.js +++ b/website/page/website_home/website_home.js @@ -93,6 +93,7 @@ wn.module_page["Website"] = [ { title: wn._("Advanced Scripting"), icon: "icon-wrench", + right: true, items: [ { "route":"Form/Website Script", diff --git a/website/settings.py b/website/settings.py deleted file mode 100644 index 3fff19ede5..0000000000 --- a/website/settings.py +++ /dev/null @@ -1,33 +0,0 @@ -import webnotes - -page_map = { - 'Web Page': webnotes._dict({ - "template": 'html/web_page.html', - "condition_field": "published" - }), - 'Blog Post': webnotes._dict({ - "template": 'html/blog_page.html', - "condition_field": "published", - }), - 'Item': webnotes._dict({ - "template": 'html/product_page.html', - "condition_field": "show_in_website", - }), - 'Item Group': webnotes._dict({ - "template": "html/product_group.html", - "condition_field": "show_in_website" - }) -} - -page_settings_map = { - "about": "website.doctype.about_us_settings.about_us_settings.get_args", - "contact": "Contact Us Settings", - "blog": "website.helpers.blog.get_blog_template_args", - "writers": "website.helpers.blog.get_writers_args", - "print": "core.doctype.print_format.print_format.get_args", - "orders": "selling.doctype.sales_order.sales_order.get_currency_and_number_format", - "order": "selling.doctype.sales_order.sales_order.get_website_args", - "ticket": "support.doctype.support_ticket.support_ticket.get_website_args" -} - -no_cache = ["message", "print", "order", "ticket"] diff --git a/website/templates/html/product_group.html b/website/templates/html/product_group.html index 2e80c43c58..510f9946ac 100644 --- a/website/templates/html/product_group.html +++ b/website/templates/html/product_group.html @@ -29,8 +29,8 @@ {{ item }} {% endfor %} - {% if len(items)==20 %} -
Showing top 20
+ {% if len(items)==100 %} +
Showing top 100 items.
{% endif %} {% else %}
No items listed.
diff --git a/website/templates/html/product_in_list.html b/website/templates/html/product_in_list.html index 97de596366..bc6260795b 100644 --- a/website/templates/html/product_in_list.html +++ b/website/templates/html/product_in_list.html @@ -1,10 +1,12 @@
- {% if website_image %} + + {%- if website_image -%} - {% else %} + {%- else -%} {% include 'html/product_missing_image.html' %} - {% endif %} + {%- endif -%} +

{{ item_name }}

diff --git a/website/utils.py b/website/utils.py deleted file mode 100644 index 252885983b..0000000000 --- a/website/utils.py +++ /dev/null @@ -1,311 +0,0 @@ -# ERPNext - web based ERP (http://erpnext.com) -# Copyright (C) 2012 Web Notes Technologies Pvt Ltd -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from __future__ import unicode_literals - -import os -import conf -from website.settings import * -import webnotes -import webnotes.utils - -def render(page_name): - """render html page""" - try: - if page_name: - html = get_html(page_name) - else: - html = get_html('index') - except Exception: - html = get_html('error') - - from webnotes.handler import eprint, print_zip - eprint("Content-Type: text/html") - print_zip(html) - -def get_html(page_name): - """get page html""" - page_name = scrub_page_name(page_name) - - html = '' - - # load from cache, if auto cache clear is falsy - if not (hasattr(conf, 'auto_cache_clear') and conf.auto_cache_clear or 0): - if not page_name in no_cache: - html = webnotes.cache().get_value("page:" + page_name) - from_cache = True - - if not html: - from webnotes.auth import HTTPRequest - webnotes.http_request = HTTPRequest() - - #webnotes.connect() - html = load_into_cache(page_name) - from_cache = False - - if not html: - html = get_html("404") - - if page_name=="error": - html = html.replace("%(error)s", webnotes.getTraceback()) - else: - comments = "\n\npage:"+page_name+\ - "\nload status: " + (from_cache and "cache" or "fresh") - html += """\n""" % webnotes.utils.cstr(comments) - - return html - -def scrub_page_name(page_name): - if page_name.endswith('.html'): - page_name = page_name[:-5] - - return page_name - -def page_name(title): - """make page name from title""" - import re - name = title.lower() - name = re.sub('[~!@#$%^&*()<>,."\']', '', name) - name = re.sub('[:/]', '-', name) - - name = '-'.join(name.split()) - - # replace repeating hyphens - name = re.sub(r"(-)\1+", r"\1", name) - - return name - -def update_page_name(doc, title): - """set page_name and check if it is unique""" - webnotes.conn.set(doc, "page_name", page_name(title)) - - standard_pages = get_template_pages() - if doc.page_name in standard_pages: - webnotes.conn.sql("""Page Name cannot be one of %s""" % ', '.join(standard_pages)) - - res = webnotes.conn.sql("""\ - select count(*) from `tab%s` - where page_name=%s and name!=%s""" % (doc.doctype, '%s', '%s'), - (doc.page_name, doc.name)) - if res and res[0][0] > 0: - webnotes.msgprint("""A %s with the same title already exists. - Please change the title of %s and save again.""" - % (doc.doctype, doc.name), raise_exception=1) - - delete_page_cache(doc.page_name) - -def load_into_cache(page_name): - args = prepare_args(page_name) - if not args: - return "" - html = build_html(args) - webnotes.cache().set_value("page:" + page_name, html) - return html - -def build_html(args): - from jinja2 import Environment, FileSystemLoader - - templates_path = os.path.join(os.path.dirname(conf.__file__), - 'app', 'website', 'templates') - - args["len"] = len - - jenv = Environment(loader = FileSystemLoader(templates_path)) - html = jenv.get_template(args['template']).render(args) - - return html - -def prepare_args(page_name): - if page_name == 'index': - page_name = get_home_page() - - if page_name in get_template_pages(): - args = webnotes._dict({ - 'template': 'pages/%s.html' % page_name, - 'name': page_name, - }) - if page_name in page_settings_map: - target = page_settings_map[page_name] - if "." in target: - args.update(webnotes.get_method(target)()) - else: - args.obj = webnotes.bean(page_settings_map[page_name]).obj - - else: - args = get_doc_fields(page_name) - - if not args: - return False - - get_outer_env(page_name, args) - - return args - -def get_template_pages(): - pages_path = os.path.join(os.path.dirname(conf.__file__), 'app', - 'website', 'templates', 'pages') - page_list = [] - for page in os.listdir(pages_path): - page_list.append(scrub_page_name(page)) - - return page_list - -def get_doc_fields(page_name): - doc_type, doc_name = get_source_doc(page_name) - if not doc_type: - return False - - obj = webnotes.get_obj(doc_type, doc_name, with_children=True) - - if hasattr(obj, 'prepare_template_args'): - obj.prepare_template_args() - - args = obj.doc.fields - args['template'] = page_map[doc_type].template - args['obj'] = obj - args['int'] = int - - return args - -def get_source_doc(page_name): - """get source doc for the given page name""" - for doctype in page_map: - name = webnotes.conn.sql("""select name from `tab%s` where - page_name=%s and ifnull(%s, 0)=1""" % (doctype, "%s", - page_map[doctype].condition_field), page_name) - if name: - return doctype, name[0][0] - - return None, None - -def get_outer_env(page_name, args): - - from webnotes.utils import get_request_site_address - from urllib import quote - - all_top_items = webnotes.conn.sql("""\ - select * from `tabTop Bar Item` - where parent='Website Settings' and parentfield='top_bar_items' - order by idx asc""", as_dict=1) - - top_items = [d for d in all_top_items if not d['parent_label']] - - # attach child items to top bar - for d in all_top_items: - if d['parent_label']: - for t in top_items: - if t['label']==d['parent_label']: - if not 'child_items' in t: - t['child_items'] = [] - t['child_items'].append(d) - break - - if top_items and ("products" in [d.url.split(".")[0] for d in top_items if d.url]): - # product categories - products = webnotes.conn.sql("""select t1.item_group as label, - t2.page_name as url, - ifnull(t1.indent,0) as indent - from `tabWebsite Product Category` t1, `tabItem Group` t2 - where t1.item_group = t2.name - and ifnull(t2.show_in_website,0)=1 order by t1.idx""", as_dict=1) - products_item = filter(lambda d: d.url and d.url.split(".")[0]=="products", top_items)[0] - products_item.child_items = products - - ret = webnotes._dict({ - 'top_bar_items': top_items, - 'footer_items': webnotes.conn.sql("""\ - select * from `tabTop Bar Item` - where parent='Website Settings' and parentfield='footer_items' - order by idx asc""", as_dict=1), - - 'int':int, - "webnotes": webnotes, - "utils": webnotes.utils - }) - - args.update(ret) - - settings = webnotes.doc("Website Settings", "Website Settings") - for k in ["banner_html", "brand_html", "copyright", "address", "twitter_share_via", - "favicon", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share"]: - if k in settings.fields: - args[k] = settings.fields.get(k) - - for k in ["facebook_share", "google_plus_one", "twitter_share", "linked_in_share"]: - args[k] = int(args.get(k) or 0) - - args.url = quote(str(get_request_site_address(full_address=True)), str("")) - args.encoded_title = quote(str(args.title or ""), str("")) - - return args - -def get_home_page(): - doc_name = webnotes.conn.get_value('Website Settings', None, 'home_page') - if doc_name: - page_name = webnotes.conn.get_value('Web Page', doc_name, 'page_name') - else: - page_name = 'login' - - return page_name - -def clear_cache(page_name=None): - if page_name: - delete_page_cache(page_name) - else: - cache = webnotes.cache() - for p in get_all_pages(): - cache.delete_value("page:" + p) - -def get_all_pages(): - all_pages = get_template_pages() - all_pages += page_settings_map.keys() - for doctype in page_map: - all_pages += [p[0] for p in webnotes.conn.sql("""select distinct page_name - from `tab%s`""" % doctype) if p[0]] - - return all_pages - -def delete_page_cache(page_name): - if page_name: - webnotes.cache().delete_value("page:" + page_name) - -def get_hex_shade(color, percent): - - def p(c): - v = int(c, 16) + int(int('ff', 16) * (float(percent)/100)) - if v < 0: - v=0 - if v > 255: - v=255 - h = hex(v)[2:] - if len(h) < 2: - h = "0" + h - return h - - r, g, b = color[0:2], color[2:4], color[4:6] - - avg = (float(int(r, 16) + int(g, 16) + int(b, 16)) / 3) - # switch dark and light shades - if avg > 128: - percent = -percent - - # stronger diff for darker shades - if percent < 25 and avg < 64: - percent = percent * 2 - - return p(r) + p(g) + p(b) - - \ No newline at end of file
In Words