From 8c7e76ba446e8f02e89384c24e5659fa6b6f471c Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 11 Jul 2012 18:40:57 +0530 Subject: [PATCH] RSS for blog Comment addition into blog page's dom --- erpnext/stock/doctype/item/item.py | 2 +- erpnext/website/blog.py | 68 +++++++ erpnext/website/doctype/blog/blog.py | 2 +- erpnext/website/doctype/web_page/web_page.py | 2 +- erpnext/website/product.py | 59 ++++-- erpnext/website/templates/blog/blog.html | 20 +- erpnext/website/templates/blog/blog.js | 199 +++++++++++++------ erpnext/website/templates/blog/comment.html | 14 ++ erpnext/website/web_cache.py | 41 ++-- public/web.py | 6 - 10 files changed, 290 insertions(+), 123 deletions(-) create mode 100644 erpnext/website/blog.py create mode 100644 erpnext/website/templates/blog/comment.html diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py index c8d63923a7..798528734c 100644 --- a/erpnext/stock/doctype/item/item.py +++ b/erpnext/stock/doctype/item/item.py @@ -251,7 +251,7 @@ Total Available Qty: %s # 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 0000000000..56bf8e443c --- /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 89a06d4b0b..bb7b66071f 100644 --- a/erpnext/website/doctype/blog/blog.py +++ b/erpnext/website/doctype/blog/blog.py @@ -34,7 +34,7 @@ class DocType(website.web_page.Page): 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 37e0cee18b..384db4cc84 100644 --- a/erpnext/website/doctype/web_page/web_page.py +++ b/erpnext/website/doctype/web_page/web_page.py @@ -33,5 +33,5 @@ class DocType(website.web_page.Page): 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 7c6603af7b..aff15d95f3 100644 --- a/erpnext/website/product.py +++ b/erpnext/website/product.py @@ -15,12 +15,6 @@ def get_product_list(args=None): 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 @@ def get_product_list(args=None): 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 @@ def get_product_category_list(): @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 @@ def get_similar_product_list(args=None): 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 9132e52be7..d87b128ddc 100644 --- a/erpnext/website/templates/blog/blog.html +++ b/erpnext/website/templates/blog/blog.html @@ -9,19 +9,17 @@
By {{ full_name }} on {{ updated }}

{{ content_html }} -

Comments

-
+
+

Comments


- {% for comment in comment_list %} -
-
- {{ comment.comment_by_fullname }} - {{ comment.comment_date }}: - {{ comment.comment_date_type }} -
-

{{ comment.comment }}

-
+
+

Be the first one to comment

+
- {% endfor %} + + {% include 'blog/comment.html' %} + +
diff --git a/erpnext/website/templates/blog/blog.js b/erpnext/website/templates/blog/blog.js index 3ad1575331..24d5033719 100644 --- a/erpnext/website/templates/blog/blog.js +++ b/erpnext/website/templates/blog/blog.js @@ -23,24 +23,16 @@ wn.pages['{{ name }}'].onload = function(wrapper) { 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('%(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.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 @@ erpnext.blog.adjust_page_height = function(wrapper) { $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("
\ - // %(comment_by_fullname)s | %(comment_date)s:\ - //
\ - //

%(comment)s


", data)) - // }, - // hide_refresh: true, - // }); - // wrapper.comment_list.run(); - // - // // add comment - // $(wrapper).find('.layout-main-section').append('
'); - // $(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('%(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'); + } +} + +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 0000000000..1323e094d2 --- /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 %} +
+
+ {{ comment.comment_by_fullname }} - {{ comment.comment_date }}: +
+

{{ comment.comment }}

+
+
+{% endfor %} \ No newline at end of file diff --git a/erpnext/website/web_cache.py b/erpnext/website/web_cache.py index 5fcae82bc3..2221df3b22 100644 --- a/erpnext/website/web_cache.py +++ b/erpnext/website/web_cache.py @@ -15,7 +15,7 @@ # along with this program. If not, see . # 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 @@ def load_from_web_cache(page_name, comments, template): #, script=None): from webnotes.utils import cstr html += """\n""" % cstr(comments) - # show error in error console - # if script: html += """\n\n""" % 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 @@ def load_into_web_cache(page_name, template, doc_type, doc_name): 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 e70b61cd55..32b3cd57d8 100755 --- a/public/web.py +++ b/public/web.py @@ -55,12 +55,6 @@ def get_html(page_name): '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,