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"""
diff --git a/public/web.py b/public/web.py
index e70b61c..32b3cd5 100755
--- a/public/web.py
+++ b/public/web.py
@@ -55,12 +55,6 @@
'comments': """error: %s""" % traceback,
'template': '404.html',
}
- # 'script': """(function() {
- # var error = "ERROR: %s";
- # console.log(error);
- # })();""" % traceback.replace('"', '\\"').replace('\n', ' \\\n'),
- # }
-
else:
args = {
'comments': """page: %s""" % page_name,