From 173a0fd4b7d632268eec0f6284f5472ec97b6371 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 14 Dec 2012 16:39:27 +0530 Subject: [PATCH 01/12] refactored web / all-app now linked in app. no wnframework in website --- public/build.json | 5 +- public/js/startup.js | 17 ---- public/js/website_utils.js | 45 +++++++++++ stock/doctype/featured_item/featured_item.py | 22 ++++++ website/__init__.py | 16 +++- website/templates/css/login.css | 1 + website/templates/html/page.html | 22 +----- website/templates/html/product_group.html | 1 + website/templates/js/login.js | 82 +++++++++++--------- website/templates/pages/login.html | 10 +-- website/utils.py | 4 + 11 files changed, 139 insertions(+), 86 deletions(-) create mode 100644 public/js/website_utils.js create mode 100644 stock/doctype/featured_item/featured_item.py create mode 100644 website/templates/html/product_group.html diff --git a/public/build.json b/public/build.json index 95fb8f0b55..375150a6db 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/startup.js b/public/js/startup.js index c90aedd0d3..69151bef29 100644 --- a/public/js/startup.js +++ b/public/js/startup.js @@ -135,23 +135,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 0000000000..eb6363fdaa --- /dev/null +++ b/public/js/website_utils.js @@ -0,0 +1,45 @@ + +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]); +} \ No newline at end of file diff --git a/stock/doctype/featured_item/featured_item.py b/stock/doctype/featured_item/featured_item.py new file mode 100644 index 0000000000..7f48feb2eb --- /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/website/__init__.py b/website/__init__.py index 1a5a338a92..32d7116b9c 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/templates/css/login.css b/website/templates/css/login.css index 1f36e53f0c..b7b7fca1de 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/html/page.html b/website/templates/html/page.html index e2eb6f4824..11d7b0f1c2 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 0000000000..d5e18714b2 --- /dev/null +++ b/website/templates/html/product_group.html @@ -0,0 +1 @@ +{% extends "html/page.html" %} diff --git a/website/templates/js/login.js b/website/templates/js/login.js index eb3a65c9b3..b57db49e0e 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/pages/login.html b/website/templates/pages/login.html index a81b2f5cea..0828f65ae3 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

diff --git a/website/templates/js/blog.js b/website/templates/js/blog.js index 24cdf15ae4..43b2d70a96 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 12dcac139f..2e8de7e90c 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/pages/blog.html b/website/templates/pages/blog.html index c4a5dad3d9..75681d5045 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


-
+
+
+ +
From cdcd15d9e23ceef37a84a003e919e937e9630dc5 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 17 Dec 2012 13:30:51 +0530 Subject: [PATCH 04/12] added font-awesome --- home/page/attributions/attributions.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/page/attributions/attributions.html b/home/page/attributions/attributions.html index 113b969c13..ab879b7d48 100644 --- a/home/page/attributions/attributions.html +++ b/home/page/attributions/attributions.html @@ -59,7 +59,7 @@

Icons

  • The Noun Project
  • -
  • Glyphicons
  • +
  • Font Awesome: http://fortawesome.github.com/Font-Awesome

Web Frameworks

From 1b8918a19290dca94b399ffa280452ccddb8234e Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 17 Dec 2012 14:12:47 +0530 Subject: [PATCH 05/12] do not copy uom details in item --- stock/doctype/item/item.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/stock/doctype/item/item.txt b/stock/doctype/item/item.txt index 82256802a9..1b9bfcac22 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:10:03", "modified_by": "Administrator", - "modified": "2012-12-11 16:08:49" + "modified": "2012-12-17 14:12:10" }, { "allow_attach": 1, @@ -459,6 +459,7 @@ "permlevel": 0 }, { + "no_copy": 1, "oldfieldtype": "Table", "doctype": "DocField", "label": "UOM Conversion Details", @@ -802,8 +803,8 @@ "doctype": "DocPerm", "submit": 0, "write": 0, - "cancel": 0, "role": "Material Manager", + "cancel": 0, "permlevel": 1 }, { @@ -812,8 +813,8 @@ "doctype": "DocPerm", "submit": 0, "write": 0, - "cancel": 0, "role": "Material Manager", + "cancel": 0, "permlevel": 0 }, { @@ -822,8 +823,8 @@ "doctype": "DocPerm", "submit": 0, "write": 0, - "cancel": 0, "role": "Material User", + "cancel": 0, "permlevel": 1 }, { @@ -832,8 +833,8 @@ "doctype": "DocPerm", "submit": 0, "write": 0, - "cancel": 0, "role": "Material User", + "cancel": 0, "permlevel": 0 }, { From 0e9e848cfca38bcbe93bce72cbee66222eff3fad Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 17 Dec 2012 16:00:34 +0530 Subject: [PATCH 06/12] added item specification, bugfix for form grid --- setup/doctype/item_group/item_group.txt | 95 ++++++++++--------- stock/doctype/item/item.txt | 51 ++++++++-- .../item_website_specification.py | 8 ++ .../item_website_specification.txt | 2 +- website/templates/css/product_page.css | 31 +----- website/templates/html/product_page.html | 30 +++--- website/utils.py | 3 +- 7 files changed, 125 insertions(+), 95 deletions(-) create mode 100644 stock/doctype/item_website_specification/item_website_specification.py diff --git a/setup/doctype/item_group/item_group.txt b/setup/doctype/item_group/item_group.txt index 653752b8bb..411869bf20 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/item/item.txt b/stock/doctype/item/item.txt index 1b9bfcac22..7ab40bd0bc 100644 --- a/stock/doctype/item/item.txt +++ b/stock/doctype/item/item.txt @@ -2,9 +2,9 @@ { "owner": "Administrator", "docstatus": 0, - "creation": "2012-12-17 14:10:03", + "creation": "2012-12-17 14:56:32", "modified_by": "Administrator", - "modified": "2012-12-17 14:12:10" + "modified": "2012-12-17 15:59:19" }, { "allow_attach": 1, @@ -780,6 +780,44 @@ "fieldtype": "Select", "permlevel": 0 }, + { + "doctype": "DocField", + "fieldname": "cb72", + "fieldtype": "Column Break", + "permlevel": 0 + }, + { + "default": "Show Price in Website (if set)", + "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.", + "doctype": "DocField", + "label": "Website Warehouse", + "options": "Warehouse", + "fieldname": "website_warehouse", + "fieldtype": "Link", + "permlevel": 0 + }, + { + "doctype": "DocField", + "fieldname": "sb72", + "fieldtype": "Section Break", + "permlevel": 0 + }, + { + "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", @@ -792,7 +830,6 @@ "depends_on": "show_in_website", "doctype": "DocField", "label": "Long Description", - "options": "Markdown", "fieldname": "web_long_description", "fieldtype": "Text Editor", "permlevel": 0 @@ -803,8 +840,8 @@ "doctype": "DocPerm", "submit": 0, "write": 0, - "role": "Material Manager", "cancel": 0, + "role": "Material Manager", "permlevel": 1 }, { @@ -813,8 +850,8 @@ "doctype": "DocPerm", "submit": 0, "write": 0, - "role": "Material Manager", "cancel": 0, + "role": "Material Manager", "permlevel": 0 }, { @@ -823,8 +860,8 @@ "doctype": "DocPerm", "submit": 0, "write": 0, - "role": "Material User", "cancel": 0, + "role": "Material User", "permlevel": 1 }, { @@ -833,8 +870,8 @@ "doctype": "DocPerm", "submit": 0, "write": 0, - "role": "Material User", "cancel": 0, + "role": "Material User", "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 0000000000..928aa9ff9f --- /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 8dc188d9c3..db2bc9f07f 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/website/templates/css/product_page.css b/website/templates/css/product_page.css index 2708625cf2..bf893caf98 100644 --- a/website/templates/css/product_page.css +++ b/website/templates/css/product_page.css @@ -1,34 +1,9 @@ \ No newline at end of file diff --git a/website/templates/html/product_page.html b/website/templates/html/product_page.html index 646bba9501..709c3ead11 100644 --- a/website/templates/html/product_page.html +++ b/website/templates/html/product_page.html @@ -19,30 +19,36 @@ {% block content %}
-
+

{{ item_name }}



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

-
- {{ web_description_html }} +

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/utils.py b/website/utils.py index 0fc5f984e1..198746f20a 100644 --- a/website/utils.py +++ b/website/utils.py @@ -156,13 +156,14 @@ def get_template_pages(): def get_doc_fields(page_name): doc_type, doc_name = get_source_doc(page_name) - obj = webnotes.get_obj(doc_type, doc_name) + 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 return args From a93ba77918b4469e07bb3eeaf8f482710232158c Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 17 Dec 2012 16:02:04 +0530 Subject: [PATCH 07/12] added item specification, bugfix for form grid --- stock/doctype/item/item.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/stock/doctype/item/item.txt b/stock/doctype/item/item.txt index 7ab40bd0bc..ce54443c35 100644 --- a/stock/doctype/item/item.txt +++ b/stock/doctype/item/item.txt @@ -4,7 +4,7 @@ "docstatus": 0, "creation": "2012-12-17 14:56:32", "modified_by": "Administrator", - "modified": "2012-12-17 15:59:19" + "modified": "2012-12-17 16:02:00" }, { "allow_attach": 1, @@ -787,7 +787,8 @@ "permlevel": 0 }, { - "default": "Show Price in Website (if set)", + "description": "Show Price in Website (if set)", + "depends_on": "show_in_website", "doctype": "DocField", "label": "Website Price List", "options": "Price List", @@ -797,6 +798,7 @@ }, { "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", @@ -805,12 +807,14 @@ "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", From 56359f06f674e6b5a55a069678fcb2c3141b8b89 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 17 Dec 2012 16:14:08 +0530 Subject: [PATCH 08/12] patch to clear web cache --- patches/december_2012/clear_web_cache.py | 8 ++++++++ patches/patch_list.py | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 patches/december_2012/clear_web_cache.py diff --git a/patches/december_2012/clear_web_cache.py b/patches/december_2012/clear_web_cache.py new file mode 100644 index 0000000000..da71492814 --- /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 2e8fc5e4fe..90f908e3ca 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -741,4 +741,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 From e93150bf264a17b573ab8b02b61f77bc8684c659 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 18 Dec 2012 10:33:04 +0530 Subject: [PATCH 09/12] sales order linked with project --- selling/doctype/sales_order/sales_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py index 9d23565d87..f024efc2a8 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']]") From 5c2bb9d9ed458477b48cf6faa398235f253ac6fa Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 18 Dec 2012 10:44:01 +0530 Subject: [PATCH 10/12] sales order linked with project --- accounts/doctype/sales_invoice/sales_invoice.py | 5 +++-- stock/doctype/delivery_note/delivery_note.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py index ebc6dd3515..486bc0aad1 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/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py index ece99367dd..ef22437797 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']]") From ee472b0926a3087d7f767e411bb22373284b4cfe Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 18 Dec 2012 11:47:13 +0530 Subject: [PATCH 11/12] upgraded to bootstrap 2.2 --- accounts/page/trial_balance/trial_balance.js | 2 +- .../voucher_import_tool.js | 4 +- public/js/kb_common.js | 2 +- utilities/page/messages/messages.js | 4 +- website/helpers/product.py | 19 ++++ website/templates/css/product_page.css | 5 +- website/templates/html/product_page.html | 46 +++++---- website/templates/html/product_search.html | 9 ++ website/templates/js/product_page.js | 97 +++++-------------- 9 files changed, 91 insertions(+), 97 deletions(-) create mode 100644 website/templates/html/product_search.html diff --git a/accounts/page/trial_balance/trial_balance.js b/accounts/page/trial_balance/trial_balance.js index 87f94ca95a..3d05d49a89 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 d937436b26..bf6b065b0f 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/public/js/kb_common.js b/public/js/kb_common.js index ae80acf4f8..032d2db143 100644 --- a/public/js/kb_common.js +++ b/public/js/kb_common.js @@ -95,7 +95,7 @@ EditableText = function(args) { \

Formatted as markdown
\ - \ + \ Cancel\
', args)).appendTo(me.parent); diff --git a/utilities/page/messages/messages.js b/utilities/page/messages/messages.js index 6ade603e2b..1da5bf4a06 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


\ \ ').appendTo($body); r.message.sort(function(a, b) { return b.has_session - a.has_session; }); diff --git a/website/helpers/product.py b/website/helpers/product.py index 6bafc2b436..fec462607b 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/product_page.css b/website/templates/css/product_page.css index bf893caf98..2b7c9790ff 100644 --- a/website/templates/css/product_page.css +++ b/website/templates/css/product_page.css @@ -1,6 +1,9 @@