RSS for blog
Comment addition into blog page's dom
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index c8d6392..7985287 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -251,7 +251,7 @@
 	
 		# no need to check for uniqueness, as name is unique
 		
-	def get_html(self):
+	def prepare_template_args(self):
 		import markdown2
 		self.doc.web_description_html = markdown2.markdown(self.doc.description or '',
 										extras=["wiki-tables"])
diff --git a/erpnext/website/blog.py b/erpnext/website/blog.py
new file mode 100644
index 0000000..56bf8e4
--- /dev/null
+++ b/erpnext/website/blog.py
@@ -0,0 +1,68 @@
+import webnotes
+
+@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, 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
+
+@webnotes.whitelist(allow_guest=True)
+def add_comment(args=None):
+	"""
+		args = {
+			'comment': '',
+			'comment_by': '',
+			'comment_by_fullname': '',
+			'comment_doctype': '',
+			'comment_docname': '',
+			'page_name': '',
+		}
+	"""
+	import webnotes
+	
+	if not args: args = webnotes.form_dict
+	
+	import webnotes.widgets.form.comments
+	comment = webnotes.widgets.form.comments.add_comment(args)
+	
+	# since comments are embedded in the page, clear the web cache
+	import website.web_cache
+	website.web_cache.clear_web_cache(
+		args.get('comment_doctype'), args.get('comment_docname'),
+		args.get('page_name'))
+	
+	import webnotes.utils
+	
+	comment['comment_date'] = webnotes.utils.pretty_date(comment['creation'])
+	template_args = { 'comment_list': [comment] }
+	
+	# get html of comment row
+	comment_html = website.web_cache.build_html(template_args, 'blog/comment.html')
+
+	return comment_html
+	
\ No newline at end of file
diff --git a/erpnext/website/doctype/blog/blog.py b/erpnext/website/doctype/blog/blog.py
index 89a06d4..bb7b660 100644
--- a/erpnext/website/doctype/blog/blog.py
+++ b/erpnext/website/doctype/blog/blog.py
@@ -34,7 +34,7 @@
 		if not webnotes.utils.cint(self.doc.published):
 			self.delete_web_cache(self.doc.page_name)
 
-	def get_html(self):
+	def prepare_template_args(self):
 		import webnotes.utils
 		
 		# this is for double precaution. usually it wont reach this code if not published
diff --git a/erpnext/website/doctype/web_page/web_page.py b/erpnext/website/doctype/web_page/web_page.py
index 37e0cee..384db4c 100644
--- a/erpnext/website/doctype/web_page/web_page.py
+++ b/erpnext/website/doctype/web_page/web_page.py
@@ -33,5 +33,5 @@
 			from webnotes.session_cache import clear_cache
 			clear_cache('Guest')
 			
-	def get_html(self):
+	def prepare_template_args(self):
 		self.markdown_to_html(['head_section','main_section', 'side_section'])
\ No newline at end of file
diff --git a/erpnext/website/product.py b/erpnext/website/product.py
index 7c6603a..aff15d9 100644
--- a/erpnext/website/product.py
+++ b/erpnext/website/product.py
@@ -15,12 +15,6 @@
 	
 	if not args: args = webnotes.form_dict
 	
-	# dict to be passed to sql function
-	query_args = {
-		'limit_start': cint(args.get('limit_start')),
-		'limit_page_length': cint(args.get('limit_page_length'))
-	}
-	
 	# base query
 	query = """\
 		select name, item_name, page_name, website_image,
@@ -40,36 +34,48 @@
 				item_name like %(search)s or
 				name like %(search)s
 			)"""
-		query_args['search'] = "%" + cstr(args.get('search')) + "%"
+		args['search'] = "%" + cstr(args.get('search')) + "%"
 	
 	# product group condition
 	if args.get('product_group') and args.get('product_group') != 'All Products':
 		query += """
 			and item_group = %(product_group)s"""
-		query_args['product_group'] = args.get('product_group')
 	
 	# order by
 	query += """
 		order by item_name asc, name asc"""
-	
-	if args.get('limit_page_length'):
-		query += """
-			limit %(limit_start)s, %(limit_page_length)s"""
-			
-	return webnotes.conn.sql(query, query_args, as_dict=1)
+
+	from webnotes.widgets.query_builder import add_limit_to_query
+	query, args = add_limit_to_query(query, args)
+
+	return webnotes.conn.sql(query, args, as_dict=1)
 
 @webnotes.whitelist(allow_guest=True)
-def get_product_category_list():
+def get_product_category_list(args=None):
+	"""
+		args = {
+			'limit_start': 0,
+			'limit_page_length': 5,
+		}
+	"""
 	import webnotes
 	
-	result = webnotes.conn.sql("""\
+	if not args: args = webnotes.form_dict
+	
+	query = """\
 		select count(name) as items, item_group
 		from `tabItem`
 		where is_sales_item = 'Yes'
 		and docstatus = 0
 		and show_in_website = 1
 		group by item_group
-		order by items desc""", as_dict=1)
+		order by items 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)
 
 	# add All Products link
 	total_count = sum((r.get('items') or 0 for r in result))
@@ -79,11 +85,19 @@
 	
 @webnotes.whitelist(allow_guest=True)
 def get_similar_product_list(args=None):
+	"""
+		args = {
+			'limit_start': 0,
+			'limit_page_length': 5,
+			'product_name': '',
+			'product_group': '',
+		}
+	"""
 	import webnotes
 	
 	if not args: args = webnotes.form_dict
-
-	result = webnotes.conn.sql("""\
+	
+	query = """\
 		select name, item_name, page_name, website_image,
 		description, web_short_description
 		from `tabItem`
@@ -92,6 +106,11 @@
 		and show_in_website = 1
 		and name != %(product_name)s
 		and item_group = %(product_group)s
-		order by item_name""", args, as_dict=1)
+		order by item_name"""
+	
+	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)
 		
 	return result
\ No newline at end of file
diff --git a/erpnext/website/templates/blog/blog.html b/erpnext/website/templates/blog/blog.html
index 9132e52..d87b128 100644
--- a/erpnext/website/templates/blog/blog.html
+++ b/erpnext/website/templates/blog/blog.html
@@ -9,19 +9,17 @@
 				<div class="help">By {{ full_name }} on {{ updated }}</div>
 				<br>
 				{{ content_html }}
-				<hr><h3>Comments</h3>
-				<br>
+				<hr>
+				<h3>Comments</h3><br>
 				<div class="blog-comments">
-					{% for comment in comment_list %}
-					<div class="comment-row">
-						<div class="comment-title">
-							{{ comment.comment_by_fullname }} - {{ comment.comment_date }}:
-							{{ comment.comment_date_type }}
-						</div>
-						<p class="comment-content">{{ comment.comment }}</p>
-						<hr>
+					<div class="no-result help hide">
+						<p>Be the first one to comment</p>
+						<br />
 					</div>
-					{% endfor %}
+
+					{% include 'blog/comment.html' %}
+
+					<button class="btn add-comment">Add Comment</button>
 				</div>
 			</div>
 
diff --git a/erpnext/website/templates/blog/blog.js b/erpnext/website/templates/blog/blog.js
index 3ad1575..24d5033 100644
--- a/erpnext/website/templates/blog/blog.js
+++ b/erpnext/website/templates/blog/blog.js
@@ -23,24 +23,16 @@
 	erpnext.blog.wrapper = wrapper;
 	
 	// sidebar
-	wrapper.recent_list = new wn.ui.Listing({
-		parent: $(wrapper).find('.recent-posts'),
-		no_toolbar: true,
-		query: 'select name, title, left(content, 100) as content from tabBlog\
-			where ifnull(published,0)=1 and name!="{{ name }}" order by creation desc',
-		hide_refresh: true,
-		render_row: function(parent, data) {
-			//console.log(data);
-			if(data.content && data.content.length==100) data.content += '...';
-			parent.innerHTML = repl('<a href="%(name)s.html">%(title)s</a>\
-				<div class="comment">%(content)s</div><br>', data);
-			
-			// adjust page height depending on sidebar height
-			erpnext.blog.adjust_page_height(wrapper);
-		},
-		page_length: 5,
-	});
-	wrapper.recent_list.run();
+	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) {
@@ -54,52 +46,131 @@
 		$main_page.height($sidebar.height());
 	}
 }
-	// wrapper.comment_list = new wn.ui.Listing({
-	// 	parent: $(wrapper).find('.blog-comments').get(0),
-	// 	no_toolbar: true,
-	// 	query: 'select comment, comment_by_fullname, creation\
-	// 		from `tabComment` where comment_doctype="Page"\
-	// 		and comment_docname="{{ name }}" order by creation desc',
-	// 	no_result_message: 'Be the first one to comment',
-	// 	render_row: function(parent, data) {
-	// 		data.comment_date = prettyDate(data.creation);
-	// 		$(parent).html(repl("<div style='color:#777'>\
-	// 			%(comment_by_fullname)s | %(comment_date)s:\
-	// 			</div>\
-	// 			<p style='margin-left: 20px;'>%(comment)s</p><br>", data))
-	// 	},
-	// 	hide_refresh: true,
-	// });
-	// wrapper.comment_list.run();
-	// 
-	// // add comment
-	// $(wrapper).find('.layout-main-section').append('<br><button class="btn add-comment">\
-	// 	Add Comment</button>');
-	// $(wrapper).find('button.add-comment').click(function(){
-	// 	d = new wn.widgets.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', label:'Post', fieldtype:'Button'}
-	// 		]
-	// 	});
-	// 	d.fields_dict.post.input.onclick = function() {
-	// 		var btn = this;
-	// 		var args = d.get_values();
-	// 		if(!args) return;
-	// 		args.comment_doctype = 'Page';
-	// 		args.comment_docname = '{{ name }}';
-	// 		$(btn).set_working();
-	// 		$c('webnotes.widgets.form.comments.add_comment', args, function(r) {
-	// 			$(btn).done_working();
-	// 			d.hide();
-	// 			wrapper.comment_list.refresh();
-	// 		})
-	// 	}
-	// 	d.show();
-	// })
 
+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.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('<a href="%(name)s.html">%(title)s</a>\
+				<div class="comment">%(content)s</div><br>', 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');
+	}
+}
+
+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.widgets.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;
+		}
+		
+		erpnext.blog.comment_dialog.fields_dict.post_comment
+				.input.onclick = function() {
+			erpnext.blog.add_comment(wrapper);
+		}
+		
+		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.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();
+			}
+		}
+	});
+}
+
+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) {
+		$comment_rows.last().after(comment);
+	} else {
+		$blog_comments.find('.no-result').after(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');
+	}
+}
 
 {% endblock %}
diff --git a/erpnext/website/templates/blog/comment.html b/erpnext/website/templates/blog/comment.html
new file mode 100644
index 0000000..1323e09
--- /dev/null
+++ b/erpnext/website/templates/blog/comment.html
@@ -0,0 +1,14 @@
+{#
+	this template generates comment rows for a blog
+	it is to be included in the blog/blog.html template
+#}
+
+{% for comment in comment_list %}
+<div class="comment-row">
+	<div class="comment-title">
+		{{ comment.comment_by_fullname }} - {{ comment.comment_date }}:
+	</div>
+	<p class="comment-content">{{ comment.comment }}</p>
+	<hr>
+</div>
+{% endfor %}
\ No newline at end of file
diff --git a/erpnext/website/web_cache.py b/erpnext/website/web_cache.py
index 5fcae82..2221df3 100644
--- a/erpnext/website/web_cache.py
+++ b/erpnext/website/web_cache.py
@@ -15,7 +15,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # used by web.py
-def load_from_web_cache(page_name, comments, template): #, script=None):
+def load_from_web_cache(page_name, comments, template):
 	"""
 		* search for page in cache
 		* if html exists, return
@@ -47,30 +47,13 @@
 	from webnotes.utils import cstr
 	html += """\n<!-- %s -->""" % cstr(comments)
 	
-	# show error in error console
-	# if script: html += """\n\n<script>\n%s\n</script>""" % cstr(script)
 	return html
 
 def load_into_web_cache(page_name, template, doc_type, doc_name):
 	"""build html and store it in web cache"""
 	import webnotes
-	outer_env_dict = get_outer_env()
-	
-	if page_name in ['404', 'blog', 'products', 'login-page']:
-		args = outer_env_dict
-		args.update({
-			'name': page_name,
-		})
-	else:
-		if page_name == 'index':
-			page_name, doc_type, doc_name = get_index_page()
 
-		from webnotes.model.code import get_obj
-		obj = get_obj(doc_type, doc_name)
-		if hasattr(obj, 'get_html'):
-			obj.get_html()
-		args = obj.doc.fields
-		args.update(outer_env_dict)
+	args = prepare_args(page_name, doc_type, doc_name)
 	
 	# decide template and update args
 	if doc_type == 'Web Page':
@@ -96,6 +79,26 @@
 	webnotes.conn.commit()
 	
 	return html
+	
+def prepare_args(page_name, doc_type, doc_name, with_outer_env=1):
+	if page_name in ['404', 'blog', 'products', 'login-page']:
+		args = {
+			'name': page_name,
+		}
+	else:
+		if page_name == 'index':
+			page_name, doc_type, doc_name = get_index_page()
+
+		from webnotes.model.code import get_obj
+		obj = get_obj(doc_type, doc_name)
+		if hasattr(obj, 'prepare_template_args'):
+			obj.prepare_template_args()
+		args = obj.doc.fields
+
+	outer_env_dict = with_outer_env and get_outer_env() or {}
+	args.update(outer_env_dict)
+	
+	return args
 
 def build_html(args, template):
 	"""build html using jinja2 templates"""