template based web page loading using web.py
diff --git a/erpnext/website/web_cache.py b/erpnext/website/web_cache.py
new file mode 100644
index 0000000..30e3f00
--- /dev/null
+++ b/erpnext/website/web_cache.py
@@ -0,0 +1,154 @@
+# 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 <http://www.gnu.org/licenses/>.
+
+# used by web.py
+def load_from_web_cache(page_name, comments, template):
+ """
+ * search for page in cache
+ * if html exists, return
+ * if not, build html, store it in cache, return
+ """
+ import webnotes
+ import conf
+
+ if page_name == 'index':
+ page_name = get_index_page()[0]
+
+ res = webnotes.conn.sql("""\
+ select html, doc_type, doc_name from `tabWeb Cache`
+ where name = %s""", page_name)
+
+ # if page doesn't exist, raise exception
+ if not res and page_name not in ['404', 'index']:
+ raise Exception, "Page %s not found" % page_name
+
+ html, doc_type, doc_name = res and res[0] or (None, None, None)
+ auto_cache_clear = hasattr(conf, 'auto_cache_clear') and conf.auto_cache_clear or 0
+ if not html or auto_cache_clear:
+ comments += "\n\npage load status: fresh"
+ html = load_into_web_cache(page_name, template, doc_type, doc_name)
+ else:
+ comments += "\n\npage load status: cached"
+
+ from webnotes.utils import cstr
+ html += """\n<!-- %s -->""" % cstr(comments)
+ 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 == '404':
+ args = outer_env_dict
+ 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)
+ obj.get_html()
+ args = obj.doc.fields
+ args.update(outer_env_dict)
+
+ if doc_type == 'Blog':
+ template = 'blog.html'
+ args['insert_code'] = 1
+ elif doc_type == 'Web Page':
+ template = 'web_page.html'
+
+ html = build_html(args, template)
+
+ # save html in web cache
+ webnotes.conn.begin()
+ webnotes.conn.set_value('Web Cache', page_name, 'html', html)
+ webnotes.conn.commit()
+
+ return html
+
+def build_html(args, template):
+ """build html using jinja2 templates"""
+ from jinja2 import Environment, FileSystemLoader
+ jenv = Environment(loader = FileSystemLoader('../erpnext/website/templates'))
+ html = jenv.get_template(template).render(args)
+ return html
+
+def get_outer_env():
+ """env dict for outer template"""
+ import webnotes
+ return {
+ 'top_bar_items': webnotes.conn.sql("""select * from `tabTop Bar Item`
+ where parent='Website Settings' and parentfield='top_bar_items'
+ order by idx asc""", as_dict=1),
+
+ 'footer_items': webnotes.conn.sql("""select * from `tabTop Bar Item`
+ where parent='Website Settings' and parentfield='footer_items'
+ order by idx asc""", as_dict=1),
+
+ 'brand': webnotes.conn.get_value('Website Settings', None, 'brand_html'),
+ 'copyright': webnotes.conn.get_value('Website Settings', None, 'copyright'),
+ }
+
+def get_index_page():
+ import webnotes
+ doc_type = 'Web Page'
+ doc_name = webnotes.conn.get_value('Website Settings', None, 'home_page')
+ page_name = webnotes.conn.get_value(doc_type, doc_name, 'page_name')
+ return page_name, doc_type, doc_name
+
+# cache management
+def clear_web_cache(doc_type, doc_name, page_name):
+ """
+ * check if a record corresponding to (type, name) exists
+ * if exists, just clear html column
+ * if does not exist, create a record for (type, name)
+ * if a record like (some other type, name) exists, raise exception that the page name is not unique
+ """
+ import webnotes
+ res = webnotes.conn.get_value('Web Cache', page_name, 'doc_type')
+ if not res:
+ import webnotes.model.doc
+ d = webnotes.model.doc.Document('Web Cache')
+ d.name = page_name
+ d.doc_type = doc_type
+ d.doc_name = doc_name
+ d.html = None
+ d.save()
+ elif res == doc_type:
+ webnotes.conn.set_value('Web Cache', page_name, 'html', None)
+ else:
+ webnotes.msgprint("""Page with name "%s" already exists as a %s.
+ Please save it with another name.""" % (page_name, res), raise_exception=1)
+
+def clear_all_web_cache():
+ import webnotes
+ webnotes.conn.sql("update `tabWeb Cache` set html = NULL")
+
+def delete_web_cache(page_name):
+ """
+ delete entry of page_name from Web Cache
+ used when:
+ * web page is deleted
+ * blog is un-published
+ """
+ import webnotes
+ webnotes.conn.sql("""\
+ delete from `tabWeb Cache`
+ where name=%s""", page_name)
+
+def build_web_cache():
+ """build web cache so that pages can load faster"""
+ pass
\ No newline at end of file