diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py index ebc6dd35158..486bc0aad19 100644 --- a/accounts/doctype/sales_invoice/sales_invoice.py +++ b/accounts/doctype/sales_invoice/sales_invoice.py @@ -322,8 +322,9 @@ class DocType(TransactionBase): def pull_project_customer(self): - res = webnotes.conn.sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name) - if res: + res = webnotes.conn.sql("select customer from `tabProject` where name = '%s'" % + self.doc.project_name) + if res and res[0][0]: get_obj('DocType Mapper', 'Project-Sales Invoice').dt_map('Project', 'Sales Invoice', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Sales Invoice']]") def get_company_abbr(self): diff --git a/accounts/page/trial_balance/trial_balance.js b/accounts/page/trial_balance/trial_balance.js index 87f94ca95a4..3d05d49a899 100644 --- a/accounts/page/trial_balance/trial_balance.js +++ b/accounts/page/trial_balance/trial_balance.js @@ -27,7 +27,7 @@ wn.pages['trial-balance'].onload = function(wrapper) { var msgbox = msgprint('

Select To Download:

\

Account Groups

\

Account Ledgers

\ -

'); +

'); var me = this; diff --git a/accounts/page/voucher_import_tool/voucher_import_tool.js b/accounts/page/voucher_import_tool/voucher_import_tool.js index d937436b262..bf6b065b0f4 100644 --- a/accounts/page/voucher_import_tool/voucher_import_tool.js +++ b/accounts/page/voucher_import_tool/voucher_import_tool.js @@ -9,11 +9,11 @@ wn.pages['voucher-import-tool'].onload = function(wrapper) {

Import multiple accounting entries via CSV (spreadsheet) file:

\

1. Download Template


\
\ - \ + \

Import multiple vouchers with one debit and one credit entry

\
\
\ - \ + \

Import multiple vouchers with multiple accounts

\
\
\ diff --git a/home/page/attributions/attributions.html b/home/page/attributions/attributions.html index 113b969c133..ab879b7d48b 100644 --- a/home/page/attributions/attributions.html +++ b/home/page/attributions/attributions.html @@ -59,7 +59,7 @@

Icons

Web Frameworks

diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js index f41c5479622..d1e46efe08c 100644 --- a/home/page/latest_updates/latest_updates.js +++ b/home/page/latest_updates/latest_updates.js @@ -1,4 +1,7 @@ erpnext.updates = [ + ["14th December 2012", [ + "Website Module: Major Refactor - removed framework code from website." + ]], ["12th December 2012", [ "Attachments: Attachments can be set as URLs or File Uploads. This will help if people want to share documents from Google Docs, Dropbox and other such services (esp for the Product listings on websites).", "Global Defaults: Session Expiry can now be set in Global Defaults.", diff --git a/hr/doctype/leave_application/leave_application.js b/hr/doctype/leave_application/leave_application.js index 042cccad8da..7253bdba0a9 100755 --- a/hr/doctype/leave_application/leave_application.js +++ b/hr/doctype/leave_application/leave_application.js @@ -16,6 +16,7 @@ cur_frm.add_fetch('employee','employee_name','employee_name'); + cur_frm.cscript.onload = function(doc, dt, dn) { if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()}); diff --git a/hr/doctype/leave_application/leave_application.py b/hr/doctype/leave_application/leave_application.py index c0a51799fe4..d945367e79c 100755 --- a/hr/doctype/leave_application/leave_application.py +++ b/hr/doctype/leave_application/leave_application.py @@ -104,14 +104,14 @@ def get_leave_balance(employee, leave_type, fiscal_year): leave_all = webnotes.conn.sql("""select total_leaves_allocated from `tabLeave Allocation` where employee = %s and leave_type = %s and fiscal_year = %s and docstatus = 1""", (employee, - leave_type, fiscal_year), debug=1) + leave_type, fiscal_year)) leave_all = leave_all and flt(leave_all[0][0]) or 0 leave_app = webnotes.conn.sql("""select SUM(total_leave_days) from `tabLeave Application` where employee = %s and leave_type = %s and fiscal_year = %s - and docstatus = 1""", (employee, leave_type, fiscal_year), debug=1) + and docstatus = 1""", (employee, leave_type, fiscal_year)) leave_app = leave_app and flt(leave_app[0][0]) or 0 ret = {'leave_balance': leave_all - leave_app} diff --git a/hr/doctype/leave_application/leave_application.txt b/hr/doctype/leave_application/leave_application.txt index 2e4d7c20551..dce8539a51d 100644 --- a/hr/doctype/leave_application/leave_application.txt +++ b/hr/doctype/leave_application/leave_application.txt @@ -2,9 +2,9 @@ { "owner": "Administrator", "docstatus": 0, - "creation": "2012-12-07 18:27:12", + "creation": "2012-12-10 10:25:20", "modified_by": "Administrator", - "modified": "2012-12-07 18:47:48" + "modified": "2012-12-18 11:06:53" }, { "is_submittable": 1, @@ -160,7 +160,7 @@ "search_index": 0, "doctype": "DocField", "label": "Fiscal Year", - "options": "Link:Fiscal Year", + "options": "link:Fiscal Year", "fieldname": "fiscal_year", "fieldtype": "Select", "reqd": 1, @@ -239,5 +239,10 @@ "role": "Leave Approver", "cancel": 0, "permlevel": 2 + }, + { + "doctype": "DocPerm", + "role": "All", + "permlevel": 3 } ] \ No newline at end of file diff --git a/patches/december_2012/clear_web_cache.py b/patches/december_2012/clear_web_cache.py new file mode 100644 index 00000000000..da714928149 --- /dev/null +++ b/patches/december_2012/clear_web_cache.py @@ -0,0 +1,8 @@ +import webnotes +def execute(): + # build wn-web.js and wn-web.css + from website.helpers.make_web_include_files import make + make() + + import website.utils + website.utils.clear_cache() \ No newline at end of file diff --git a/patches/patch_list.py b/patches/patch_list.py index 9162f1983de..9f7344394f1 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -538,4 +538,8 @@ patch_list = [ 'patch_module': 'patches.december_2012', 'patch_file': 'replace_createlocal', }, + { + 'patch_module': 'patches.december_2012', + 'patch_file': 'clear_web_cache', + }, ] \ No newline at end of file diff --git a/public/build.json b/public/build.json index 95fb8f0b554..375150a6db5 100644 --- a/public/build.json +++ b/public/build.json @@ -7,10 +7,11 @@ "app/public/js/startup.css" ], "public/js/all-web.js": [ - "app/public/js/startup.js", - "app/public/js/conf.js" + "app/public/js/website_utils.js" ], "public/js/all-app.js": [ + "app/public/js/startup.js", + "app/public/js/conf.js", "app/public/js/modules.js", "app/public/js/toolbar.js", "app/public/js/feature_setup.js", diff --git a/public/js/kb_common.js b/public/js/kb_common.js index 376e8b78ebb..88d95d013fc 100644 --- a/public/js/kb_common.js +++ b/public/js/kb_common.js @@ -94,7 +94,7 @@ EditableText = function(args) { \

Formatted as markdown
\ - \ + \ Cancel\ ', args)).appendTo(me.parent); diff --git a/public/js/startup.js b/public/js/startup.js index e8e2c727ede..e85840012fb 100644 --- a/public/js/startup.js +++ b/public/js/startup.js @@ -136,23 +136,6 @@ erpnext.startup.set_periodic_updates = function() { wn.updates.id = setInterval(erpnext.update_messages, 60000); } -// subject, sender, description -erpnext.send_message = function(opts) { - if(opts.btn) { - $(opts.btn).start_working(); - } - wn.call({ - method: 'website.send_message', - args: opts, - callback: function(r) { - if(opts.btn) { - $(opts.btn).done_working(); - } - if(opts.callback)opts.callback(r) - } - }); -} - erpnext.hide_naming_series = function() { if(cur_frm.fields_dict.naming_series) { hide_field('naming_series'); diff --git a/public/js/website_utils.js b/public/js/website_utils.js new file mode 100644 index 00000000000..f35ad4cc784 --- /dev/null +++ b/public/js/website_utils.js @@ -0,0 +1,53 @@ + +var erpnext = {}; + +// subject, sender, description +erpnext.send_message = function(opts) { + if(opts.btn) { + $(opts.btn).attr("disabled", "disabled"); + } + + $.ajax({ + method: "POST", + url: "server.py", + data: { + cmd: "website.send_message", + subject: opts.subject, + sender: opts.sender, + message: typeof opts.message == "string" + ? opts.message + : JSON.stringify(opts.message) + }, + dataType: "json", + success: function(data) { + if(opts.btn) { + $(opts.btn).attr("disabled", false); + } + if(opts.callback) + opts.callback(data); + } + }); +} + +function valid_email(id) { + if(id.toLowerCase().search("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")==-1) + return 0; else return 1; } + +function get_url_arg(name) { + name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); + var regexS = "[\\?&]"+name+"=([^&#]*)"; + var regex = new RegExp( regexS ); + var results = regex.exec( window.location.href ); + if(results == null) + return ""; + else + return decodeURIComponent(results[1]); +} + +function repl(s, dict) { + if(s==null)return ''; + for(key in dict) { + s = s.split("%("+key+")s").join(dict[key]); + } + return s; +} diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py index 9d23565d87c..f024efc2a8f 100644 --- a/selling/doctype/sales_order/sales_order.py +++ b/selling/doctype/sales_order/sales_order.py @@ -59,7 +59,7 @@ class DocType(TransactionBase): #------------------------- def pull_project_customer(self): res = sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name) - if res: + if res and res[0][0]: get_obj('DocType Mapper', 'Project-Sales Order').dt_map('Project', 'Sales Order', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Sales Order']]") diff --git a/setup/doctype/item_group/item_group.txt b/setup/doctype/item_group/item_group.txt index 653752b8bbc..411869bf209 100644 --- a/setup/doctype/item_group/item_group.txt +++ b/setup/doctype/item_group/item_group.txt @@ -2,9 +2,9 @@ { "owner": "Administrator", "docstatus": 0, - "creation": "2012-12-06 15:57:00", + "creation": "2012-12-07 15:15:28", "modified_by": "Administrator", - "modified": "2012-12-07 14:55:49" + "modified": "2012-12-17 15:00:01" }, { "in_create": 1, @@ -53,7 +53,6 @@ "description": "Check this if you want to show in website", "no_copy": 0, "search_index": 0, - "colour": "White:FFF", "doctype": "DocField", "label": "Show in Website", "fieldname": "show_in_website", @@ -70,13 +69,19 @@ { "description": "Items Featured on the Item Group Page", "depends_on": "show_in_website", - "colour": "White:FFF", "doctype": "DocField", "label": "Featured Items", "fieldname": "featured_items", "fieldtype": "Table", + "hidden": 1, "options": "Featured Item" }, + { + "doctype": "DocField", + "label": "Page Name", + "fieldname": "page_name", + "fieldtype": "Data" + }, { "doctype": "DocField", "fieldname": "cb0", @@ -88,7 +93,6 @@ "doctype": "DocField", "label": "Parent Item Group", "oldfieldname": "parent_item_group", - "trigger": "Client", "fieldname": "parent_item_group", "fieldtype": "Link", "search_index": 0, @@ -99,7 +103,6 @@ "description": "Only leaf nodes are allowed in transaction", "no_copy": 0, "oldfieldtype": "Select", - "colour": "White:FFF", "doctype": "DocField", "label": "Has Child Node", "oldfieldname": "is_group", @@ -151,6 +154,46 @@ "options": "Item Group", "report_hide": 1 }, + { + "amend": 0, + "create": 0, + "doctype": "DocPerm", + "submit": 0, + "write": 0, + "cancel": 0, + "role": "Material Manager", + "permlevel": 1 + }, + { + "amend": 0, + "create": 0, + "doctype": "DocPerm", + "submit": 0, + "write": 0, + "cancel": 0, + "role": "Material Manager", + "permlevel": 0 + }, + { + "amend": 0, + "create": 0, + "doctype": "DocPerm", + "submit": 0, + "write": 0, + "cancel": 0, + "role": "Material User", + "permlevel": 1 + }, + { + "amend": 0, + "create": 0, + "doctype": "DocPerm", + "submit": 0, + "write": 0, + "cancel": 0, + "role": "Material User", + "permlevel": 0 + }, { "create": 1, "doctype": "DocPerm", @@ -166,45 +209,5 @@ "role": "Material Master Manager", "cancel": 1, "permlevel": 0 - }, - { - "amend": 0, - "create": 0, - "doctype": "DocPerm", - "submit": 0, - "write": 0, - "role": "Material Manager", - "cancel": 0, - "permlevel": 1 - }, - { - "amend": 0, - "create": 0, - "doctype": "DocPerm", - "submit": 0, - "write": 0, - "role": "Material Manager", - "cancel": 0, - "permlevel": 0 - }, - { - "amend": 0, - "create": 0, - "doctype": "DocPerm", - "submit": 0, - "write": 0, - "role": "Material User", - "cancel": 0, - "permlevel": 1 - }, - { - "amend": 0, - "create": 0, - "doctype": "DocPerm", - "submit": 0, - "write": 0, - "role": "Material User", - "cancel": 0, - "permlevel": 0 } ] \ 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 ece99367dd6..ef224377975 100644 --- a/stock/doctype/delivery_note/delivery_note.py +++ b/stock/doctype/delivery_note/delivery_note.py @@ -80,8 +80,8 @@ class DocType(TransactionBase): def pull_project_customer(self): - res = sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name) - if res: + res = sql("select customer from `tabProject` where name = '%s'" % self.doc.project_name) + if res and res[0][0]: get_obj('DocType Mapper', 'Project-Delivery Note').dt_map('Project', 'Delivery Note', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Delivery Note']]") diff --git a/stock/doctype/featured_item/featured_item.py b/stock/doctype/featured_item/featured_item.py new file mode 100644 index 00000000000..7f48feb2ebf --- /dev/null +++ b/stock/doctype/featured_item/featured_item.py @@ -0,0 +1,22 @@ +# 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 webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl \ No newline at end of file diff --git a/stock/doctype/item/item.js b/stock/doctype/item/item.js index 376cf54e2d2..c651456d0d0 100644 --- a/stock/doctype/item/item.js +++ b/stock/doctype/item/item.js @@ -138,4 +138,15 @@ cur_frm.fields_dict.item_customer_details.grid.get_field("customer_name").get_qu erpnext.utils.customer_query; cur_frm.fields_dict.item_supplier_details.grid.get_field("supplier").get_query = - erpnext.utils.supplier_query; \ No newline at end of file + erpnext.utils.supplier_query; + +cur_frm.cscript.on_remove_attachment = function(doc) { + // refresh image list before unsetting image + refresh_field("image"); + if(!inList(cur_frm.fields_dict.image.df.options.split("\n"), doc.image)) { + // if the selected image is removed from attachment, unset it + cur_frm.set_value("image", ""); + msgprint(wn._("Attachment removed. You may need to update: ") + + wn.meta.get_docfield(doc.doctype, "description_html").label); + } +}; diff --git a/stock/doctype/item/item.txt b/stock/doctype/item/item.txt index 82256802a91..ce54443c358 100644 --- a/stock/doctype/item/item.txt +++ b/stock/doctype/item/item.txt @@ -2,9 +2,9 @@ { "owner": "Administrator", "docstatus": 0, - "creation": "2012-12-11 15:58:47", + "creation": "2012-12-17 14:56:32", "modified_by": "Administrator", - "modified": "2012-12-11 16:08:49" + "modified": "2012-12-17 16:02:00" }, { "allow_attach": 1, @@ -459,6 +459,7 @@ "permlevel": 0 }, { + "no_copy": 1, "oldfieldtype": "Table", "doctype": "DocField", "label": "UOM Conversion Details", @@ -779,6 +780,48 @@ "fieldtype": "Select", "permlevel": 0 }, + { + "doctype": "DocField", + "fieldname": "cb72", + "fieldtype": "Column Break", + "permlevel": 0 + }, + { + "description": "Show Price in Website (if set)", + "depends_on": "show_in_website", + "doctype": "DocField", + "label": "Website Price List", + "options": "Price List", + "fieldname": "website_price_list", + "fieldtype": "Link", + "permlevel": 0 + }, + { + "description": "Show \"In Stock\" or \"Not in Stock\" based on stock available in this warehouse.", + "depends_on": "show_in_website", + "doctype": "DocField", + "label": "Website Warehouse", + "options": "Warehouse", + "fieldname": "website_warehouse", + "fieldtype": "Link", + "permlevel": 0 + }, + { + "depends_on": "show_in_website", + "doctype": "DocField", + "fieldname": "sb72", + "fieldtype": "Section Break", + "permlevel": 0 + }, + { + "depends_on": "show_in_website", + "doctype": "DocField", + "label": "Item Website Specifications", + "options": "Item Website Specification", + "fieldname": "item_website_specifications", + "fieldtype": "Table", + "permlevel": 0 + }, { "depends_on": "show_in_website", "doctype": "DocField", @@ -791,7 +834,6 @@ "depends_on": "show_in_website", "doctype": "DocField", "label": "Long Description", - "options": "Markdown", "fieldname": "web_long_description", "fieldtype": "Text Editor", "permlevel": 0 diff --git a/stock/doctype/item_website_specification/item_website_specification.py b/stock/doctype/item_website_specification/item_website_specification.py new file mode 100644 index 00000000000..928aa9ff9f2 --- /dev/null +++ b/stock/doctype/item_website_specification/item_website_specification.py @@ -0,0 +1,8 @@ +# For license information, please see license.txt + +from __future__ import unicode_literals +import webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl \ No newline at end of file diff --git a/stock/doctype/item_website_specification/item_website_specification.txt b/stock/doctype/item_website_specification/item_website_specification.txt index 8dc188d9c3b..db2bc9f07ff 100644 --- a/stock/doctype/item_website_specification/item_website_specification.txt +++ b/stock/doctype/item_website_specification/item_website_specification.txt @@ -4,7 +4,7 @@ "docstatus": 0, "creation": "2012-12-07 15:42:25", "modified_by": "Administrator", - "modified": "2012-12-07 15:44:18" + "modified": "2012-12-17 15:29:37" }, { "istable": 1, diff --git a/utilities/page/messages/messages.js b/utilities/page/messages/messages.js index 6ade603e2b9..1da5bf4a062 100644 --- a/utilities/page/messages/messages.js +++ b/utilities/page/messages/messages.js @@ -28,7 +28,7 @@ wn.pages.messages.onload = function(wrapper) {
\
\ \ -

\ +

\
\
').appendTo($(wrapper).find('.layout-main-section')); @@ -182,7 +182,7 @@ erpnext.Messages = Class.extend({ var $body = $(me.wrapper).find('.layout-side-section'); $('

Users


\
\ - \ + \ Show messages from everyone
\ ').appendTo($body); r.message.sort(function(a, b) { return b.has_session - a.has_session; }); diff --git a/website/__init__.py b/website/__init__.py index 1a5a338a92a..32d7116b9cd 100644 --- a/website/__init__.py +++ b/website/__init__.py @@ -6,6 +6,8 @@ install_docs = [ import webnotes +max_tickets_per_hour = 200 + @webnotes.whitelist(allow_guest=True) def send_message(): from webnotes.model.doc import Document @@ -17,15 +19,21 @@ def send_message(): d.raised_by = webnotes.form_dict.get('sender') if not d.description: - webnotes.msgprint('Please write something', raise_exception=True) + webnotes.response["message"] = 'Please write something' + return if not d.raised_by: - webnotes.msgprint('Please give us your email id so that we can write back to you', raise_exception=True) + webnotes.response["message"] = 'Email Id Required' + return - # make lead or contact + # guest method, cap max writes per hour + if webnotes.conn.sql("""select count(*) from `tabSupport Ticket` + where TIMEDIFF(NOW(), modified) < '01:00:00'""")[0][0] > max_tickets_per_hour: + webnotes.response["message"] = "Sorry: we believe we have received an unreasonably high number of requests of this kind. Please try later" + return d.save() - webnotes.msgprint('Thank you!') + webnotes.response["message"] = 'Thank You' def get_site_address(): from webnotes.utils import get_request_site_address diff --git a/website/helpers/blog.py b/website/helpers/blog.py index 02230dcd348..2bff6e57088 100644 --- a/website/helpers/blog.py +++ b/website/helpers/blog.py @@ -9,8 +9,7 @@ import website.utils def get_blog_list(args=None): """ args = { - 'limit_start': 0, - 'limit_page_length': 10, + 'start': 0, } """ import webnotes @@ -24,11 +23,9 @@ def get_blog_list(args=None): comment_doctype='Blog' and comment_docname=`tabBlog`.name) as comments from `tabBlog` where ifnull(published,0)=1 - order by creation desc, name asc""" - - from webnotes.widgets.query_builder import add_limit_to_query - query, args = add_limit_to_query(query, args) - + order by creation desc, name asc + limit %s, 5""" % args.start + result = webnotes.conn.sql(query, args, as_dict=1) # strip html tags from content @@ -41,38 +38,6 @@ def get_blog_list(args=None): if not res['content']: res['content'] = website.utils.get_html(res['page_name']) res['content'] = split_blog_content(res['content']) - res['content'] = res['content'][:1000] - - return result - -@webnotes.whitelist(allow_guest=True) -def get_recent_blog_list(args=None): - """ - args = { - 'limit_start': 0, - 'limit_page_length': 5, - 'name': '', - } - """ - import webnotes - - if not args: args = webnotes.form_dict - - query = """\ - select name, page_name, title, left(content, 100) as content - from tabBlog - where ifnull(published,0)=1 and - name!=%(name)s order by creation desc""" - - from webnotes.widgets.query_builder import add_limit_to_query - query, args = add_limit_to_query(query, args) - - result = webnotes.conn.sql(query, args, as_dict=1) - - # strip html tags from content - import webnotes.utils - for res in result: - res['content'] = webnotes.utils.strip_html(res['content']) return result diff --git a/website/helpers/product.py b/website/helpers/product.py index 6bafc2b436b..fec462607b2 100644 --- a/website/helpers/product.py +++ b/website/helpers/product.py @@ -4,6 +4,25 @@ from __future__ import unicode_literals import webnotes +@webnotes.whitelist(allow_guest=True) +def get_product_info(item_code): + """get product price / stock info""" + price_list = webnotes.conn.get_value("Item", item_code, "website_price_list") + warehouse = webnotes.conn.get_value("Item", item_code, "website_warehouse") + if warehouse: + in_stock = webnotes.conn.sql("""select actual_qty from tabBin where + item_code=%s and warehouse=%s""", (item_code, warehouse)) + if in_stock: + in_stock = in_stock[0][0] > 0 and 1 or 0 + else: + in_stock = -1 + return { + "price": price_list and webnotes.conn.sql("""select ref_rate, ref_currency from + `tabItem Price` where parent=%s and price_list_name=%s""", + (item_code, price_list), as_dict=1) or [], + "stock": in_stock + } + @webnotes.whitelist(allow_guest=True) def get_product_list(args=None): """ diff --git a/website/templates/css/blog_page.css b/website/templates/css/blog_page.css index 928b8acb373..8f56cd2fec1 100644 --- a/website/templates/css/blog_page.css +++ b/website/templates/css/blog_page.css @@ -6,4 +6,8 @@ .comment-content { margin-left: 20px; } + + input { + width: 240px; + } \ No newline at end of file diff --git a/website/templates/css/login.css b/website/templates/css/login.css index 1f36e53f0c1..b7b7fca1de6 100644 --- a/website/templates/css/login.css +++ b/website/templates/css/login.css @@ -5,6 +5,7 @@ } .layout-wrapper { + background-color: #fff; padding: 10px; box-shadow: 1px 1px 3px 3px #ccc; font-size: 12px; diff --git a/website/templates/css/product_page.css b/website/templates/css/product_page.css index 2708625cf23..2b7c9790ff7 100644 --- a/website/templates/css/product_page.css +++ b/website/templates/css/product_page.css @@ -1,34 +1,12 @@ \ No newline at end of file diff --git a/website/templates/html/blog_page.html b/website/templates/html/blog_page.html index 5421f00615c..87dcfef19ae 100644 --- a/website/templates/html/blog_page.html +++ b/website/templates/html/blog_page.html @@ -2,7 +2,6 @@ {% block javascript %} {% include "js/blog_page.js" %} - {% include "js/blog_subscribe.js" %} {% endblock %} {% block css %} @@ -28,15 +27,32 @@
{% if not comment_list %} -
+

Be the first one to comment

-
{% endif %} {% include 'html/comment.html' %}
- +
+
diff --git a/website/templates/html/page.html b/website/templates/html/page.html index e2eb6f48242..11d7b0f1c2a 100644 --- a/website/templates/html/page.html +++ b/website/templates/html/page.html @@ -5,28 +5,12 @@ {% block header %} {{ super() }} - {% block css %} - {% if insert_style %} - + {% if insert_style %} - {% endif %} {% endblock %} {% endblock %} diff --git a/website/templates/html/product_group.html b/website/templates/html/product_group.html new file mode 100644 index 00000000000..d5e18714b24 --- /dev/null +++ b/website/templates/html/product_group.html @@ -0,0 +1 @@ +{% extends "html/page.html" %} diff --git a/website/templates/html/product_page.html b/website/templates/html/product_page.html index 646bba95011..80108f1820d 100644 --- a/website/templates/html/product_page.html +++ b/website/templates/html/product_page.html @@ -19,30 +19,48 @@ {% block content %}
-
+
+ {% include 'html/product_search.html' %}

{{ item_name }}

-

+
{% if website_image %} - + {% else %}
This is an auto-generated Image {% endif %}

-
- {{ web_description_html }}
+
+
+

Price:

+
+
+
+
+
+

Product Description

+
+ {{ web_long_description or web_short_description }} +
+
+ {% if obj.doclist.get({"doctype":"Item Website Specification"}) %} +

Specifications

+ + {% for d in obj.doclist.get( + {"doctype":"Item Website Specification"}) %} + + + + + {% endfor %} +
{{ d.label }}{{ d.description }}
+ {% endif %} +
+
-
-

More Categories

-
-
-

Similar Products

-
-
-
{% endblock %} \ No newline at end of file diff --git a/website/templates/html/product_search.html b/website/templates/html/product_search.html new file mode 100644 index 00000000000..034ec112f8b --- /dev/null +++ b/website/templates/html/product_search.html @@ -0,0 +1,9 @@ +
+ +
+
\ No newline at end of file diff --git a/website/templates/js/blog.js b/website/templates/js/blog.js index 24cdf15ae48..43b2d70a962 100644 --- a/website/templates/js/blog.js +++ b/website/templates/js/blog.js @@ -15,29 +15,54 @@ // along with this program. If not, see . // js inside blog page -wn.pages['{{ name }}'].onload = function(wrapper) { - erpnext.blog_list = new wn.ui.Listing({ - parent: $(wrapper).find('#blog-list').get(0), - method: 'website.helpers.blog.get_blog_list', - hide_refresh: true, - no_toolbar: true, - render_row: function(parent, data) { - if(!data.comments) { - data.comment_text = 'No comments yet.' - } else if (data.comments===1) { - data.comment_text = '1 comment.' + +$(document).ready(function() { + // make list of blogs + blog.get_list(); + + $("#next-page").click(function() { + blog.get_list(); + }) +}); + +var blog = { + start: 0, + get_list: function() { + $.ajax({ + method: "GET", + url: "server.py", + data: { + cmd: "website.helpers.blog.get_blog_list", + start: blog.start + }, + dataType: "json", + success: function(data) { + blog.render(data.message); + } + }); + }, + render: function(data) { + var $wrap = $("#blog-list"); + $.each(data, function(i, b) { + // comments + if(!b.comments) { + b.comment_text = 'No comments yet.' + } else if (b.comments===1) { + b.comment_text = '1 comment.' } else { - data.comment_text = data.comments + ' comments.' + b.comment_text = b.comments + ' comments.' } - if(data.content && data.content.length==1000) { - data.content += repl('... (read on)', data); - } - parent.innerHTML = repl('

%(title)s

\ + $(repl('

%(title)s

\
%(comment_text)s
\ - %(content)s

', data); - }, - page_length: 10 - }); - erpnext.blog_list.run(); + %(content)s
\ +

Read with comments...

\ +

', b)).appendTo($wrap); + }); + blog.start += data.length; + if(!data.length) { + $("#next-page").toggle(false) + .parent().append("
Nothing more to show.
"); + } + } } \ No newline at end of file diff --git a/website/templates/js/blog_page.js b/website/templates/js/blog_page.js index 12dcac139f2..2e8de7e90c3 100644 --- a/website/templates/js/blog_page.js +++ b/website/templates/js/blog_page.js @@ -16,166 +16,61 @@ // js inside blog page -wn.provide('erpnext.blog'); -wn.pages['{{ name }}'].onload = function(wrapper) { - erpnext.blog.wrapper = wrapper; +$(document).ready(function() { + var n_comments = $(".comment-row").length; - // sidebar - //erpnext.blog.render_recent_list(wrapper); - - // unhide no-result if no comments found - erpnext.blog.toggle_no_result(wrapper); - - // bind add comment button to comment dialog - erpnext.blog.make_comment_dialog(wrapper); - - // hide add comment button after 50 comments - erpnext.blog.toggle_add_comment_btn(wrapper); -} - -erpnext.blog.adjust_page_height = function(wrapper) { - if (!wrapper) { wrapper = erpnext.blog.wrapper; } - if (!wrapper) { return; } - - // adjust page height based on sidebar height - var $main_page = $(wrapper).find('.layout-main-section'); - var $sidebar = $(wrapper).find('.layout-side-section'); - if ($sidebar.height() > $main_page.height()) { - $main_page.height($sidebar.height()); + if(n_comments) { + $(".no_comment").toggle(false); } -} - -erpnext.blog.render_recent_list = function(wrapper) { - if (!wrapper) { wrapper = erpnext.blog.wrapper; } - if (!wrapper) { return; } - - wrapper.recent_list = new wn.ui.Listing({ - parent: $(wrapper).find('.recent-posts'), - no_toolbar: true, - method: 'website.helpers.blog.get_recent_blog_list', - get_args: function() { - return { name: '{{ name }}' } - }, - hide_refresh: true, - render_row: function(parent, data) { - if(data.content && data.content.length>=100) data.content += '...'; - parent.innerHTML = repl('
\ - %(title)s\ -
%(content)s

', data); - - // adjust page height depending on sidebar height - erpnext.blog.adjust_page_height(wrapper); - }, - page_length: 5, - }); - wrapper.recent_list.run(); -} - -erpnext.blog.toggle_no_result = function(wrapper) { - if (!wrapper) { wrapper = erpnext.blog.wrapper; } - if (!wrapper) { return; } - - var $blog_comments = $(wrapper).find('.blog-comments'); - var $comment_rows = $blog_comments.find('.comment-row'); - var $no_result = $blog_comments.find('.no-result'); - - if ($comment_rows.length == 0) { - $no_result.removeClass('hide'); - } else { - $no_result.addClass('hide'); + if(n_comments > 50) { + $(".add-comment").toggle(false) + .parent().append("
Comments are closed.
") } -} - -erpnext.blog.make_comment_dialog = function(wrapper) { - if (!wrapper) { wrapper = erpnext.blog.wrapper; } - if (!wrapper) { return; } - - var $comment_btn = $(wrapper).find('button.add-comment'); - - $comment_btn.click(function() { - if(!erpnext.blog.comment_dialog) { - var d = new wn.ui.Dialog({ - title: 'Add Comment', - fields: [ - { - fieldname: 'comment_by_fullname', label: 'Your Name', - reqd: 1, fieldtype: 'Data' - }, - { - fieldname: 'comment_by', label: 'Email Id', - reqd: 1, fieldtype: 'Data' - }, - { - fieldname: 'comment', label: 'Comment', - reqd: 1, fieldtype: 'Text' - }, - { - fieldname: 'post_comment', label: 'Post Comment', - fieldtype: 'Button' - }, - ], - }); - - erpnext.blog.comment_dialog = d; + $(".add-comment").click(function() { + $("#comment-form").toggle(); + $("#comment-form input, #comment-form, textarea").val(""); + }) + $("#submit-comment").click(function() { + var args = { + comment_by_fullname: $("[name='comment_by_fullname']").val(), + comment_by: $("[name='comment_by']").val(), + comment: $("[name='comment']").val(), + cmd: "website.helpers.blog.add_comment", + comment_doctype: "Blog", + comment_docname: "{{ name }}", + page_name: "{{ page_name }}" } - erpnext.blog.comment_dialog.fields_dict.post_comment - .input.onclick = function() { - erpnext.blog.add_comment(wrapper); + $("#comment-form .alert").toggle(false); + + if(!args.comment_by_fullname || !args.comment_by || !args.comment) { + $("#comment-form .alert") + .html("All fields are necessary to submit the comment.") + .toggle(true); + return false; } - erpnext.blog.comment_dialog.show(); - }); - -} - -erpnext.blog.add_comment = function(wrapper) { - var args = erpnext.blog.comment_dialog.get_values(); - - if(!args) return; - - args.comment_doctype = 'Blog'; - args.comment_docname = '{{ name }}'; - args.page_name = '{{ page_name }}'; - - wn.call({ - method: 'website.helpers.blog.add_comment', - args: args, - btn: this, - callback: function(r) { - if(!r.exc) { - erpnext.blog.add_comment_to_page(wrapper, r.message); - erpnext.blog.comment_dialog.hide(); + + $.ajax({ + method: "POST", + url: "server.py", + data: args, + dataType: "json", + success: function(data) { + if(data.exc) { + $("#comment-form .alert") + .html(data.exc) + .toggle(true) + } else { + $(data.message).appendTo(".blog-comments"); + $(".no_comment").toggle(false); + $(".add-comment").toggle(false); + $("#comment-form") + .replaceWith("
Thank you for your comment!
") + } } - } - }); -} - -erpnext.blog.add_comment_to_page = function(wrapper, comment) { - $blog_comments = $(wrapper).find('.blog-comments'); - $comment_rows = $blog_comments.find('.comment-row'); - - if ($comment_rows.length) { - $blog_comments.append(comment); - } else { - $blog_comments.append(comment); - } - - erpnext.blog.toggle_no_result(wrapper); - erpnext.blog.toggle_add_comment_btn(wrapper); -} - -erpnext.blog.toggle_add_comment_btn = function(wrapper) { - var $wrapper = $(wrapper); - if ($wrapper.find('.blog-comments .comment-row').length > 50) { - var $comment_btn = $wrapper.find('button.add-comment'); - $comment_btn.addClass('hide'); + }) - // show comments are close - $wrapper.find('.blog-comments').append("\ -
\ -

Comments Closed

\ -
\ -
"); - } -} \ No newline at end of file + return false; + }) +}) \ No newline at end of file diff --git a/website/templates/js/login.js b/website/templates/js/login.js index eb3a65c9b39..b57db49e0ee 100644 --- a/website/templates/js/login.js +++ b/website/templates/js/login.js @@ -1,13 +1,13 @@ -wn.provide('erpnext.login'); +var login = {}; $(document).ready(function(wrapper) { - $('#login_btn').click(erpnext.login.doLogin) + $('#login_btn').click(login.do_login) $('#password').keypress(function(ev){ if(ev.which==13 && $('#password').val()) { $('form').submit(function() { - erpnext.login.doLogin(); + login.do_login(); return false; }); } @@ -16,54 +16,60 @@ $(document).ready(function(wrapper) { }) // Login -erpnext.login.doLogin = function(){ +login.do_login = function(){ var args = {}; args['usr']=$("#login_id").val(); args['pwd']=$("#password").val(); if(!args.usr || !args.pwd) { - msgprint("Sorry, you can't login if you don't enter both the email id and password.") + login.set_message("Both login and password required."); } - $('#login_btn').set_working(); - $('#login_message').empty(); + $('#login_btn').attr("disabled", "disabled"); + $('#login_message').toggle(false); + + $.ajax({ + type: "POST", + url: "server.py", + data: {cmd:"login", usr:args.usr, pwd: args.pwd}, + dataType: "json", + success: function(data) { + $('#login_btn').attr("disabled", false); + if(data.message=="Logged In") { + window.location.href = "app.html"; + } else { + login.set_message(data.message); + } + } + }) - $c("login", args, function(r, rtext) { - $('#login_btn').done_working(); - if(r.message=="Logged In"){ - window.location.href='app.html' + (get_url_arg('page') - ? ('?page='+get_url_arg('page')) : ''); - } else { - $i('login_message').innerHTML = '' - +(r.message)+''; - } - }); - return false; } - -erpnext.login.show_forgot_password = function(){ +login.show_forgot_password = function(){ // create dialog - var d = new wn.ui.Dialog({ - title:"Forgot Password", - fields: [ - {'label':'Email Id', 'fieldname':'email_id', 'fieldtype':'Data', 'reqd':true}, - {'label':'Email Me A New Password', 'fieldname':'run', 'fieldtype':'Button'} - ] - }); + var login_id = $("#login_id").val(); + if(!login_id || !valid_email(login_id)) { + login.set_message("Please set your login id (which is your email where the password will be sent);"); + return; + } + login.set_message("Sending email with new password..."); + $("#forgot-password").remove(); - $(d.fields_dict.run.input).click(function() { - var values = d.get_values(); - if(!values) return; - wn.call({ - method:'reset_password', - args: { user: values.email_id }, - callback: function() { - d.hide(); - } - }) + $.ajax({ + method: "POST", + url: "server.py", + data: { + cmd: "reset_password", + user: login_id + }, + success: function(data) { + login.set_message("A new password has been sent to your email id.", "GREEN"); + } }) - d.show(); +} + +login.set_message = function(message, color) { + $('#login_message').html(message).toggle(true); } \ No newline at end of file diff --git a/website/templates/js/product_page.js b/website/templates/js/product_page.js index f4620336e83..653cfa32390 100644 --- a/website/templates/js/product_page.js +++ b/website/templates/js/product_page.js @@ -14,79 +14,30 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -{% include "js/product_category.js" %} - -wn.pages['{{ name }}'].onload = function(wrapper) { - wrapper.product_group = "{{ item_group }}"; - wrapper.product_name = "{{ name }}"; - erpnext.products.make_product_categories(wrapper); - erpnext.products.make_similar_products(wrapper); - - // if website image missing, autogenerate one - var $img = $(wrapper).find('.product-page-content .img-area'); - if ($img && $img.length > 0) { - $img.append(wn.dom.placeholder(160, "{{ item_name }}")); - } - - erpnext.products.adjust_page_height(wrapper); - -} - -erpnext.products.adjust_page_height = function(wrapper) { - if (!wrapper) { wrapper = erpnext.products.wrapper; } - if (!wrapper) { return; } - - // adjust page height based on sidebar height - var $main_page = $(wrapper).find('.layout-main-section'); - var $sidebar = $(wrapper).find('.layout-side-section'); - if ($sidebar.height() > $main_page.height()) { - $main_page.height($sidebar.height()); - } -} - -erpnext.products.make_similar_products = function(wrapper) { - if (!wrapper) { wrapper = erpnext.products.wrapper; } - if (!wrapper) { return; } - - // similar products - wrapper.similar = new wn.ui.Listing({ - parent: $(wrapper).find('.similar-products').get(0), - hide_refresh: true, - page_length: 5, - method: 'website.helpers.product.get_similar_product_list', - get_args: function() { - return { - product_group: wrapper.product_group, - product_name: wrapper.product_name - } +$(document).ready(function() { + $.ajax({ + method: "GET", + url:"server.py", + dataType: "json", + data: { + cmd: "website.helpers.product.get_product_info", + item_code: "{{ name }}" }, - render_row: function(parent, data) { - if (!data.web_short_description) { - data.web_short_description = data.description; + success: function(data) { + if(data.message) { + if(data.message.price) { + $("

").html(data.message.price[0].ref_currency + " " + + data.message.price[0].ref_rate).appendTo(".item-price"); + $(".item-price").toggle(true); + } + if(data.message.stock==0) { + $(".item-stock").html("
Not in stock
") + } + else if(data.message.stock==1) { + $(".item-stock").html("
\ + Available (in stock)
") + } } - if(data.web_short_description.length > 100) { - data.web_short_description = - data.web_short_description.substr(0,100) + '...'; - } - parent.innerHTML = repl('\ -
\ -
\ -
%(item_name)s
\ - %(web_short_description)s\ -
\ -
', data); - - if(data.website_image) { - $(parent).find('.img-area').append(repl( - '', data)) - } else { - $(parent).find('.img-area').append(wn.dom.placeholder(55, - data.item_name)); - } - - // adjust page height, if sidebar height keeps increasing - erpnext.products.adjust_page_height(wrapper); } - }); - wrapper.similar.run(); -} \ No newline at end of file + }) +}) \ No newline at end of file diff --git a/website/templates/pages/blog.html b/website/templates/pages/blog.html index c4a5dad3d93..75681d5045f 100644 --- a/website/templates/pages/blog.html +++ b/website/templates/pages/blog.html @@ -2,7 +2,6 @@ {% block javascript %} {% include "js/blog.js" %} - {% include "js/blog_subscribe.js" %} {% endblock %} {% block css %} @@ -18,9 +17,12 @@

Blog


-
+
+
+ +

diff --git a/website/templates/pages/login.html b/website/templates/pages/login.html index a81b2f5ceac..0828f65ae3d 100644 --- a/website/templates/pages/login.html +++ b/website/templates/pages/login.html @@ -14,6 +14,7 @@ {% block body %}
+

Login

@@ -33,15 +34,12 @@ class="btn btn-small btn-primary">Login - - - -
-

Forgot Password

+
+

Forgot Password