From e2fe8de637d0f17e1715dc256ac3b6cc46b2bf76 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 28 Mar 2013 15:30:41 +0530 Subject: [PATCH 01/19] patch: update against expense_account in purchase invoice --- .../march_2013/p10_update_against_expense_account.py | 11 +++++++++++ patches/patch_list.py | 1 + 2 files changed, 12 insertions(+) create mode 100644 patches/march_2013/p10_update_against_expense_account.py 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..d1bad5cfed --- /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.set_value("Purchase Invoice", pi[0], + "against_expense_account", pi_obj.doc.against_expense_account) \ No newline at end of file diff --git a/patches/patch_list.py b/patches/patch_list.py index 0c5427b52b..5eff17075c 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -219,4 +219,5 @@ patch_list = [ "execute:webnotes.bean('Style Settings').save() #2013-03-25", "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_update_against_expense_account", ] \ No newline at end of file From 8c45420f19dbce12a343bb5edffef32fed1f9d8a Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 28 Mar 2013 16:40:30 +0530 Subject: [PATCH 02/19] fixes in gross profit report --- accounts/report/gross_profit/gross_profit.py | 6 +++--- stock/doctype/delivery_note/delivery_note.py | 1 + stock/utils.py | 5 ++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/accounts/report/gross_profit/gross_profit.py b/accounts/report/gross_profit/gross_profit.py index 7f6354b6cc..9300548550 100644 --- a/accounts/report/gross_profit/gross_profit.py +++ b/accounts/report/gross_profit/gross_profit.py @@ -25,12 +25,12 @@ 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]),) 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/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 From acfab66239681e7adcc53d46cb7e1ac8c6d02527 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 28 Mar 2013 16:47:47 +0530 Subject: [PATCH 03/19] [patch] [fix] substr starts with 1 --- patches/march_2013/p11_update_attach_files.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 7ab3267886eb57087ad43ebfe92f2ae37e53a195 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Thu, 28 Mar 2013 17:09:23 +0530 Subject: [PATCH 04/19] updated item group limit to 100 --- setup/doctype/item_group/item_group.py | 2 +- website/templates/html/product_group.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup/doctype/item_group/item_group.py b/setup/doctype/item_group/item_group.py index ba4ea77504..827eed4f3e 100644 --- a/setup/doctype/item_group/item_group.py +++ b/setup/doctype/item_group/item_group.py @@ -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/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.
From 7bfa40fdd31b0b4c898d55bdcf6cfcf0d666d108 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Thu, 28 Mar 2013 18:48:04 +0530 Subject: [PATCH 05/19] sales return validate before save/submit --- stock/doctype/stock_entry/stock_entry.js | 39 +++++++++++++----------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/stock/doctype/stock_entry/stock_entry.js b/stock/doctype/stock_entry/stock_entry.js index 9b89d7859b..c54f619735 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,7 @@ cur_frm.cscript.uom = function(doc, cdt, cdn) { cur_frm.cscript.validate = function(doc, cdt, cdn) { cur_frm.cscript.validate_items(doc); + validated = cur_frm.cscript.get_doctype_docname() ? true : false; } cur_frm.cscript.validate_items = function(doc) { From 10a209d405bdc6e5e9b193919b8a5013dd48dbc3 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Fri, 29 Mar 2013 12:26:47 +0530 Subject: [PATCH 06/19] [gross profit] [request] added Avg. Buying Rate column --- accounts/report/gross_profit/gross_profit.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/accounts/report/gross_profit/gross_profit.py b/accounts/report/gross_profit/gross_profit.py index 9300548550..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 = [] @@ -35,7 +36,8 @@ def execute(filters=None): 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 From fe7a53bca326a020fef1b61db2387869f1f5cc70 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sat, 30 Mar 2013 11:56:13 +0530 Subject: [PATCH 07/19] [data-import] [fix] changed template to remove -- separators that get removed for some reason --- website/doctype/blogger/blogger.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 }, From d270559fa974e3fc93ac49d5a4d581ae9bd46154 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 30 Mar 2013 17:48:37 +0530 Subject: [PATCH 08/19] minor fixes in stock entry --- stock/doctype/stock_entry/stock_entry.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stock/doctype/stock_entry/stock_entry.js b/stock/doctype/stock_entry/stock_entry.js index c54f619735..3e21207eaa 100644 --- a/stock/doctype/stock_entry/stock_entry.js +++ b/stock/doctype/stock_entry/stock_entry.js @@ -360,7 +360,8 @@ cur_frm.cscript.uom = function(doc, cdt, cdn) { cur_frm.cscript.validate = function(doc, cdt, cdn) { cur_frm.cscript.validate_items(doc); - validated = cur_frm.cscript.get_doctype_docname() ? true : false; + 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) { From 9f43fc50ad5b8b8026e5be7a6b33e076b983a3f9 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 1 Apr 2013 12:12:47 +0530 Subject: [PATCH 09/19] [website] [product list] image clickable --- setup/doctype/item_group/item_group.txt | 33 +++++++++++---------- website/templates/html/product_in_list.html | 8 +++-- 2 files changed, 22 insertions(+), 19 deletions(-) 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/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 @@

{{ item_name }}

From 1013e779577e25b0bd855123b630e76ab99d4b6a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 1 Apr 2013 12:18:36 +0530 Subject: [PATCH 10/19] fixes in checking print_hide property in standard print format --- .../sales_taxes_and_charges_master.js | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) 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 += '' From eaeb50effa304dea870285640840396a96c208e3 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 1 Apr 2013 15:40:50 +0530 Subject: [PATCH 11/19] [fixes] small issue fixed in sales taxes and charges --- .../sales_taxes_and_charges_master.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)) From 72b28807d2265f68bb6943fde4a592e5347efdab Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 1 Apr 2013 16:40:19 +0530 Subject: [PATCH 12/19] [setup] [feature] Update Manager for self hosted applications based on wnframework --- setup/page/setup/setup.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/setup/page/setup/setup.js b/setup/page/setup/setup.js index e59a18ab99..4a97b345a2 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-this-app", + label: wn._("Update This Application"), + "description":wn._("Apply latest updates and patches to this app") + }, + ] + }, ] pscript['onload_Setup'] = function(wrapper) { From bdedd555caa35374f4446b8de414e485378e933a Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 1 Apr 2013 16:51:33 +0530 Subject: [PATCH 13/19] [setup] [update manager] renamed update-this-app page to update-manager --- setup/page/setup/setup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/page/setup/setup.js b/setup/page/setup/setup.js index 4a97b345a2..4ab7578850 100644 --- a/setup/page/setup/setup.js +++ b/setup/page/setup/setup.js @@ -205,7 +205,7 @@ wn.module_page["Setup"] = [ right: true, items: [ { - "page":"update-this-app", + "page":"update-manager", label: wn._("Update This Application"), "description":wn._("Apply latest updates and patches to this app") }, From 2f20a7ac96c4ff5621815e8566966e29715297e5 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 1 Apr 2013 17:23:43 +0530 Subject: [PATCH 14/19] [patch][serial no] for striped serial nos --- patches/april_2013/__init__.py | 0 .../p01_update_serial_no_valuation_rate.py | 26 +++++++++++++++++++ .../march_2013/p07_update_valuation_rate.py | 4 +-- .../p10_update_against_expense_account.py | 8 +++--- patches/patch_list.py | 1 + .../landed_cost_wizard/landed_cost_wizard.py | 11 ++++---- stock/doctype/stock_ledger/stock_ledger.py | 5 ++-- 7 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 patches/april_2013/__init__.py create mode 100644 patches/april_2013/p01_update_serial_no_valuation_rate.py 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..1058473478 --- /dev/null +++ b/patches/april_2013/p01_update_serial_no_valuation_rate.py @@ -0,0 +1,26 @@ +import webnotes +from webnotes.utils import cstr +from stock.stock_ledger import update_entries_after + +def execute(): + 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) + + webnotes.conn.sql("""update `tabPurchase Receipt Item` set serial_no = %s + where name = %s""", ("\n".join(serial_nos), item.name)) + + 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)) + + if [item.item_code, item.warehouse] not in item_warehouse: + item_warehouse.append([item.item_code, item.warehouse]) + + for d in item_warehouse: + update_entries_after({"item_code": d[0], "warehouse": d[1] }) \ 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 index d1bad5cfed..3506ac4936 100644 --- a/patches/march_2013/p10_update_against_expense_account.py +++ b/patches/march_2013/p10_update_against_expense_account.py @@ -5,7 +5,7 @@ def execute(): 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.set_value("Purchase Invoice", pi[0], - "against_expense_account", pi_obj.doc.against_expense_account) \ No newline at end of file + 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/patch_list.py b/patches/patch_list.py index 905ea290c9..544fc957e9 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -227,4 +227,5 @@ patch_list = [ "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/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_ledger/stock_ledger.py b/stock/doctype/stock_ledger/stock_ledger.py index fcb4a54a47..a90ed9041b 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_nos = ", ".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 From 94d162269156cb0504b7ce50db95afbf1580f8ae Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 1 Apr 2013 17:25:28 +0530 Subject: [PATCH 15/19] [patch][serial no] for striped serial nos --- stock/doctype/stock_ledger/stock_ledger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock/doctype/stock_ledger/stock_ledger.py b/stock/doctype/stock_ledger/stock_ledger.py index a90ed9041b..80eaaeace3 100644 --- a/stock/doctype/stock_ledger/stock_ledger.py +++ b/stock/doctype/stock_ledger/stock_ledger.py @@ -39,7 +39,7 @@ class DocType: for d in getlist(obj.doclist, table_name): if d.serial_no: serial_nos = cstr(d.serial_no).strip().replace(',', '\n').split('\n') - d.serial_nos = ", ".join(map(lambda x: x.strip(), serial_nos)) + d.serial_nos = "\n".join(map(lambda x: x.strip(), serial_nos)) d.save() def validate_serial_no_warehouse(self, obj, fname): From 2a8b2c13565260c9741be3cf5d5deb8ba3b6ad56 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 1 Apr 2013 17:49:15 +0530 Subject: [PATCH 16/19] [patch][serial no] for striped serial nos --- .../p01_update_serial_no_valuation_rate.py | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/patches/april_2013/p01_update_serial_no_valuation_rate.py b/patches/april_2013/p01_update_serial_no_valuation_rate.py index 1058473478..2ea0c26a55 100644 --- a/patches/april_2013/p01_update_serial_no_valuation_rate.py +++ b/patches/april_2013/p01_update_serial_no_valuation_rate.py @@ -3,6 +3,8 @@ 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) @@ -13,14 +15,21 @@ def execute(): serial_nos = cstr(item.serial_no).strip().split("\n") serial_nos = map(lambda x: x.strip(), serial_nos) - webnotes.conn.sql("""update `tabPurchase Receipt Item` set serial_no = %s - where name = %s""", ("\n".join(serial_nos), item.name)) + 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)) - - 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: - update_entries_after({"item_code": d[0], "warehouse": d[1] }) \ No newline at end of file + 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 From 1a5d97e6b654bebddb32a88ef336cdb0b70a18c7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 1 Apr 2013 18:46:42 +0530 Subject: [PATCH 17/19] fixes in stock ledger --- stock/doctype/stock_ledger/stock_ledger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock/doctype/stock_ledger/stock_ledger.py b/stock/doctype/stock_ledger/stock_ledger.py index 80eaaeace3..469c94bb2f 100644 --- a/stock/doctype/stock_ledger/stock_ledger.py +++ b/stock/doctype/stock_ledger/stock_ledger.py @@ -39,7 +39,7 @@ class DocType: for d in getlist(obj.doclist, table_name): if d.serial_no: serial_nos = cstr(d.serial_no).strip().replace(',', '\n').split('\n') - d.serial_nos = "\n".join(map(lambda x: x.strip(), serial_nos)) + d.serial_no = "\n".join(map(lambda x: x.strip(), serial_nos)) d.save() def validate_serial_no_warehouse(self, obj, fname): From 4b6052b57b4d82f5ceb9e180f2fb213e88baf5fc Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 1 Apr 2013 18:52:47 +0530 Subject: [PATCH 18/19] [stock] [fix] serial nos scrub method --- stock/doctype/stock_ledger/stock_ledger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock/doctype/stock_ledger/stock_ledger.py b/stock/doctype/stock_ledger/stock_ledger.py index 80eaaeace3..469c94bb2f 100644 --- a/stock/doctype/stock_ledger/stock_ledger.py +++ b/stock/doctype/stock_ledger/stock_ledger.py @@ -39,7 +39,7 @@ class DocType: for d in getlist(obj.doclist, table_name): if d.serial_no: serial_nos = cstr(d.serial_no).strip().replace(',', '\n').split('\n') - d.serial_nos = "\n".join(map(lambda x: x.strip(), serial_nos)) + d.serial_no = "\n".join(map(lambda x: x.strip(), serial_nos)) d.save() def validate_serial_no_warehouse(self, obj, fname): From 9db1a68d89c048959f739b02bd4863c5ed2529d2 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 2 Apr 2013 10:41:37 +0530 Subject: [PATCH 19/19] [website] [cleanup] moved website generic utils to framework --- setup/doctype/item_group/item_group.py | 6 +- startup/website.py | 114 +++++++ stock/doctype/item/item.py | 8 +- .../about_us_settings/about_us_settings.py | 2 +- .../doctype/blog_category/blog_category.py | 2 +- website/doctype/blog_post/blog_post.py | 8 +- .../contact_us_settings.py | 2 +- .../product_settings/product_settings.py | 2 +- .../doctype/style_settings/style_settings.py | 4 +- website/doctype/web_page/web_page.py | 6 +- .../website_settings/website_settings.py | 2 +- website/helpers/blog.py | 16 +- website/helpers/make_web_include_files.py | 4 +- website/helpers/product.py | 2 +- website/helpers/sitemap.py | 6 +- website/page/website_home/website_home.js | 1 + website/settings.py | 33 -- website/utils.py | 311 ------------------ 18 files changed, 150 insertions(+), 379 deletions(-) create mode 100644 startup/website.py delete mode 100644 website/settings.py delete mode 100644 website/utils.py diff --git a/setup/doctype/item_group/item_group.py b/setup/doctype/item_group/item_group.py index 827eed4f3e..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) 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/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/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/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/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