Merge branch 'master' into cms2
diff --git a/erpnext/patches/june_2012/cms2.py b/erpnext/patches/june_2012/cms2.py
new file mode 100644
index 0000000..fb9c72c
--- /dev/null
+++ b/erpnext/patches/june_2012/cms2.py
@@ -0,0 +1,11 @@
+def execute():
+ import webnotes
+ from webnotes.model.doclist import DocList
+ import webnotes.model.sync
+
+ # sync web page doctype
+ webnotes.model.sync.sync('website', 'web_page')
+
+ # save all web pages to create content
+ for p in webnotes.conn.sql("""select name from `tabWeb Page` where docstatus=0"""):
+ DocList('Web Page', p[0]).save()
\ No newline at end of file
diff --git a/erpnext/website/doctype/web_page/template.html b/erpnext/website/doctype/web_page/template.html
index c6d4b40..f46113c 100644
--- a/erpnext/website/doctype/web_page/template.html
+++ b/erpnext/website/doctype/web_page/template.html
@@ -8,21 +8,11 @@
<div class="layout-main">
{% endif %}
{{ doc.main_section_html }}
- {% if doc.next_page_html %}
- {{ doc.next_page_html }}
- {% endif %}
-
</div>
{% if doc.layout and doc.layout.startswith('Two column') %}
<div class="layout-side-section">
{{ doc.side_section_html }}
- {% if doc.see_also %}
- <div class="info-box">
- <h4>See Also</h4>
- {{ doc.see_also }}
- </div>
- {% endif %}
</div>
{% endif %}
<div style="clear: both"></div>
diff --git a/erpnext/website/doctype/web_page/web_page.py b/erpnext/website/doctype/web_page/web_page.py
index 27ce5c0..3f4a39c 100644
--- a/erpnext/website/doctype/web_page/web_page.py
+++ b/erpnext/website/doctype/web_page/web_page.py
@@ -28,63 +28,32 @@
def on_update(self):
"""make page for this product"""
from jinja2 import Template
- from webnotes.utils import global_date_format
- from webnotes.model.code import get_obj
import os
# we need the name for the templates
if self.doc.name.startswith('New Web Page'):
self.autoname()
- if self.doc.page_name:
- webnotes.conn.sql("""delete from tabPage where name=%s""", self.doc.page_name)
-
- p = website.utils.add_page(self.doc.name)
- self.doc.page_name = p.name
+ # page name updates with the title
+ self.doc.page_name = website.utils.page_name(self.doc.title)
- self.doc.updated = global_date_format(self.doc.modified)
+ # markdown
website.utils.markdown(self.doc, ['head_section','main_section', 'side_section'])
-
+
+ # make page layout
with open(os.path.join(os.path.dirname(__file__), 'template.html'), 'r') as f:
- p.content = Template(f.read()).render(doc=self.doc)
-
- p.title = self.doc.title
- p.web_page = 'Yes'
+ self.doc.content = Template(f.read()).render(doc=self.doc)
- if self.doc.insert_code:
- p.script = self.doc.javascript
-
- if self.doc.insert_style:
- p.style = self.doc.css
-
- p.save()
- get_obj(doc=p).write_cms_page()
-
- website.utils.add_guest_access_to_page(p.name)
self.cleanup_temp()
self.doc.save()
self.if_home_clear_cache()
-
- def add_page_links(self):
- """add links for next_page and see_also"""
- if self.doc.next_page:
- self.doc.next_page_html = """<div class="info-box round" style="text-align: right">
- <b>Next:</b>
- <a href="#!%(name)s">%(title)s</a></div>""" % {"name":self.doc.next_page, \
- "title": webnotes.conn.get_value("Page", self.doc.next_page, "title")}
-
- self.doc.see_also = ''
- for d in self.doclist:
- if d.doctype=='Related Page':
- tmp = {"page":d.page, "title":webnotes.conn.get_value('Page', d.page, 'title')}
- self.doc.see_also += """<div><a href="#!%(page)s">%(title)s</a></div>""" % tmp
def cleanup_temp(self):
"""cleanup temp fields"""
- fl = ['main_section_html', 'side_section_html', 'see_also', \
- 'next_page_html', 'head_section_html', 'updated']
+ fl = ['main_section_html', 'side_section_html', \
+ 'head_section_html']
for f in fl:
if f in self.doc.fields:
del self.doc.fields[f]
diff --git a/erpnext/website/doctype/web_page/web_page.txt b/erpnext/website/doctype/web_page/web_page.txt
index c40caff..9fba41a 100644
--- a/erpnext/website/doctype/web_page/web_page.txt
+++ b/erpnext/website/doctype/web_page/web_page.txt
@@ -5,7 +5,7 @@
{
'creation': '2012-04-02 16:02:43',
'docstatus': 0,
- 'modified': '2012-05-02 15:24:31',
+ 'modified': '2012-06-15 17:18:59',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -88,6 +88,17 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'Page url name (auto-generated) ',
+ 'doctype': u'DocField',
+ 'fieldname': u'page_name',
+ 'fieldtype': u'Data',
+ 'label': u'Page Name',
+ 'permlevel': 1
+ },
+
+ # DocField
+ {
'doctype': u'DocField',
'fieldname': u'cb1',
'fieldtype': u'Column Break',
@@ -101,7 +112,7 @@
'fieldname': u'layout',
'fieldtype': u'Select',
'label': u'Layout',
- 'options': u'Two column with header\nTwo column\nSingle column',
+ 'options': u'Single column\nTwo column\nTwo column with header',
'permlevel': 0
},
@@ -155,6 +166,17 @@
# DocField
{
'colour': u'White:FFF',
+ 'doctype': u'DocField',
+ 'fieldname': u'content',
+ 'fieldtype': u'Code',
+ 'hidden': 1,
+ 'label': u'Content',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
'description': u'Link to other pages in the side bar and next section',
'doctype': u'DocField',
'fieldname': u'sb2',
@@ -176,6 +198,7 @@
# DocField
{
'colour': u'White:FFF',
+ 'description': u'Add code as <script>',
'doctype': u'DocField',
'fieldname': u'insert_code',
'fieldtype': u'Check',
@@ -215,15 +238,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'page_name',
- 'fieldtype': u'Data',
- 'label': u'Page Name',
- 'permlevel': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'file_list',
'fieldtype': u'Text',
'hidden': 1,
diff --git a/erpnext/website/templates/404.html b/erpnext/website/templates/404.html
new file mode 100644
index 0000000..8a30892
--- /dev/null
+++ b/erpnext/website/templates/404.html
@@ -0,0 +1,12 @@
+{% extends "outer.html" %}
+
+{% block content %}
+<div class="content">
+ <div class="layout-wrapper layout-main">
+ <h3>Page missing or moved</h3>
+ <br>
+ <p>We are very sorry for this, but the page you are looking for is missing
+ (this could be because of a typo in the address) or moved.</p>
+ </div>
+</div>
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/website/templates/__init__.py b/erpnext/website/templates/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/website/templates/__init__.py
diff --git a/erpnext/website/templates/base.html b/erpnext/website/templates/base.html
new file mode 100644
index 0000000..cd64139
--- /dev/null
+++ b/erpnext/website/templates/base.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<head>
+ <meta charset="utf-8">
+ <title>{% block title %}{% endblock %}</title>
+ <meta name="generator" content="wnframework">
+ <link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
+ <link rel="icon" href="images/favicon.ico" type="image/x-icon">
+ <script type="text/javascript" src="js/lib/jquery/jquery.min.js"></script>
+ <script type="text/javascript" src="js/all-web.js"></script>
+ <script type="text/javascript" src="js/wn-web.js"></script>
+ <link type="text/css" rel="stylesheet" href="css/all-web.css">
+ <link type="text/css" rel="stylesheet" href="css/wn-web.css">
+
+ {% block header %}
+ {% endblock %}
+</head>
+<body>
+ {% block body %}
+ {% endblock %}
+</body>
\ No newline at end of file
diff --git a/erpnext/website/templates/blog.html b/erpnext/website/templates/blog.html
new file mode 100644
index 0000000..d0b9a13
--- /dev/null
+++ b/erpnext/website/templates/blog.html
@@ -0,0 +1,58 @@
+{% extends "outer.html" %}
+
+{% block title %}{{ title }}{% endblock %}
+
+
+{% block content %}
+<div class="layout-wrapper layout-wrapper-background">
+ <div class="web-content" id="content-blog">
+ <div class="layout-main-section">
+ <h1>Blog</h1>
+ <br>
+ <div id="blog-list">
+ <!-- blog list will be generated dynamically -->
+ </div>
+ </div>
+ <div class="layout-side-section">
+ <!-- for later
+ <h4>Get Updates</h4>
+ <p>
+ <input name="blog-subscribe">
+ <button class="btn" id="blog-subscribe">Subscribe</button>
+ </p>-->
+ <h4>Subscribe</h4>
+ <p>
+ <img src="images/feed.png" style="margin-right: 4px; margin-bottom: -4px">
+ <a href="rss.xml" target="_blank">RSS Feed</a>
+ </p>
+ </div>
+ <div style="clear: both"></div>
+ </div>
+</div>
+
+<script>
+
+// if not a specific blog, show listing
+erpnext.blog_list = new wn.ui.Listing({
+ parent: $(wrapper).find('#blog-list').get(0),
+ query: 'select tabBlog.name, title, left(content, 1000) as content, tabBlog.creation, \
+ ifnull(first_name, "") as first_name, ifnull(last_name, "") as last_name \
+ from tabProfile, tabBlog\
+ where ifnull(published,0)=1 and tabBlog.owner = tabProfile.name \
+ order by tabBlog.creation desc',
+ hide_refresh: true,
+ no_toolbar: true,
+ render_row: function(parent, data) {
+ if(data.content && data.content.length==1000) data.content += '... (read on)';
+ data.content = wn.markdown(data.content);
+ if(data.last_name) data.last_name = ' ' + data.last_name;
+ data.date = prettyDate(data.creation);
+ parent.innerHTML = repl('<h2>%(title)s</h2>\
+ <p><div class="help">By %(first_name)s%(last_name)s, %(date)s</div></p>\
+ <p>%(content)s</p>\
+ <a href="%(name)s.html">Read Full Text</a><br>', data);
+ },
+ page_length: 10
+});
+erpnext.blog_list.run();
+</script>
\ No newline at end of file
diff --git a/erpnext/website/templates/outer.html b/erpnext/website/templates/outer.html
new file mode 100644
index 0000000..4b8c04d
--- /dev/null
+++ b/erpnext/website/templates/outer.html
@@ -0,0 +1,57 @@
+{#
+ requires, brand, top_bar_items, footer_items, copyright, content
+#}
+
+{% extends "base.html" %}
+
+{% block body %}
+
+ <header>
+ <div class="navbar navbar-fixed-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="brand" href="index.html">{{ brand }}</a>
+ <ul class="nav">
+ {% for page in top_bar_items %}
+ {% if not page.parent_label %}
+ <li data-label="{{ page.label }}">
+ <a href="{{ page.url }}" {{ page.target }}>
+ {{ page.label }}
+ {% if page.child_items %}
+ <ul class="dropdown-menu">
+ {% for child in page.child_items %}
+ <li data-label="{{ child.label }}">
+ <a href="{{ child.url }}" {{ child.target }}>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ </a></li>
+ {% endif %}
+ {% endfor %}
+ </ul>
+ <img src="images/lib/ui/spinner.gif" id="spinner"/>
+ <ul class="nav pull-right">
+ <li id="login-topbar-item"><a href="login-page.html">Login</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </header>
+ <div id="body_div">
+ <div class="content" id="page-{{ name }}" style="display: block;">
+ {% block content %}
+ {% endblock %}
+ </div>
+ </div>
+ <footer><div class="web-footer">
+ <div class="web-footer-menu"><ul>
+ {% for item in footer_items %}
+ <li><a href="{{ item.url }}" {{ item.target }}
+ data-label="{{ item.label }}">{{ item.label }}</a></li>
+ {% endfor %}
+ </ul></div>
+ <div class="web-footer-copyright">© {{ copyright }}
+ </div>
+ </footer>
+
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/website/templates/page.html b/erpnext/website/templates/page.html
new file mode 100644
index 0000000..97a309a
--- /dev/null
+++ b/erpnext/website/templates/page.html
@@ -0,0 +1,32 @@
+{% extends "outer.html" %}
+
+{% block title %}{{ title }}{% endblock %}
+
+{% block header %}
+ {{ super() }}
+ {% if insert_code %}
+ <script>
+ window.page_name = "{{ name }}";
+
+ $(document).bind('app_ready', function() {
+ var _page = new wn.views.Page(window.page_name);
+
+ // page script
+ {{ javascript }}
+
+ // trigger onload
+ _page.trigger('onload');
+
+ // activate page
+ wn.container.change_to(window.page_name);
+ });
+ </script>
+ {% endif %}
+ {% if insert_style %}
+ <style>{{ css }}</style>
+ {% endif %}
+{% endblock %}
+
+{% block content %}
+ {{ content }}
+{% endblock %}
\ No newline at end of file
diff --git a/public/js/all-app.js b/public/js/all-app.js
index 8e26724..5e3f8f2 100644
--- a/public/js/all-app.js
+++ b/public/js/all-app.js
@@ -390,7 +390,7 @@
/*
* lib/js/wn/request.js
*/
-wn.provide('wn.request');wn.request.url='index.cgi';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts)
+wn.provide('wn.request');wn.request.url='server.py';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts)
throw"Incomplete Request";}}
wn.request.cleanup=function(opts,r){if(opts.btn)$(opts.btn).done_working();if(opts.show_spinner)hide_loading();if(opts.freeze)unfreeze();if(wn.boot&&wn.boot.sid&&wn.get_cookie('sid')!=wn.boot.sid){if(!wn.app.logged_out){msgprint('Session Expired. Logging you out');wn.app.logout();}
return;}
diff --git a/public/js/all-web.js b/public/js/all-web.js
index c4cc240..a549dc9 100644
--- a/public/js/all-web.js
+++ b/public/js/all-web.js
@@ -277,7 +277,7 @@
/*
* lib/js/wn/request.js
*/
-wn.provide('wn.request');wn.request.url='index.cgi';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts)
+wn.provide('wn.request');wn.request.url='server.py';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts)
throw"Incomplete Request";}}
wn.request.cleanup=function(opts,r){if(opts.btn)$(opts.btn).done_working();if(opts.show_spinner)hide_loading();if(opts.freeze)unfreeze();if(wn.boot&&wn.boot.sid&&wn.get_cookie('sid')!=wn.boot.sid){if(!wn.app.logged_out){msgprint('Session Expired. Logging you out');wn.app.logout();}
return;}
diff --git a/public/index.cgi b/public/server.py
similarity index 100%
rename from public/index.cgi
rename to public/server.py
diff --git a/public/web.py b/public/web.py
new file mode 100755
index 0000000..751d762
--- /dev/null
+++ b/public/web.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+
+"""
+return a dynamic page from website templates
+
+all html pages except login-page.html get generated here
+"""
+
+import cgi, cgitb, os, sys
+cgitb.enable()
+
+# import libs
+sys.path.append('..')
+import conf
+sys.path.append('../lib/py')
+sys.path.append(conf.modules_path)
+
+def init():
+ import webnotes
+ webnotes.form = cgi.FieldStorage(keep_blank_values=True)
+ for key in webnotes.form.keys():
+ webnotes.form_dict[key] = webnotes.form.getvalue(key)
+ webnotes.connect()
+
+def respond():
+ html = get_html()
+ print "Content-Type: text/html"
+ print
+ print html.encode('utf-8')
+
+def get_html():
+ import webnotes
+ from webnotes.model.doc import Document
+ # Get web page
+ outer_env_dict = get_outer_env()
+ try:
+ if 'page' in webnotes.form_dict:
+ page_name = webnotes.form_dict['page']
+ if page_name.endswith('.html'):
+ page_name = page_name[:-5]
+
+ if page_name.startswith('blog'):
+ raise Exception
+ #page_name =
+ else:
+ page_name = get_web_page_name(page_name)
+ else:
+ from webnotes.cms import get_home_page
+ page_name = get_home_page('Guest')
+
+ page = Document('Web Page', page_name)
+ page.fields.update(outer_env_dict)
+
+ return build_html(page.fields, "page: %s" % page_name)
+
+ except Exception, e:
+ return build_html(outer_env_dict, "error: %s" % webnotes.getTraceback(), '404.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 build_html(args, comments, template='page.html'):
+ """build html using jinja2 templates"""
+ from webnotes.utils import cstr
+ from jinja2 import Environment, FileSystemLoader
+ jenv = Environment(loader = FileSystemLoader('../erpnext/website/templates'))
+
+ html = jenv.get_template(template).render(args)
+ html += "\n<!-- %s -->" % cstr(comments)
+ return html
+
+def get_web_page_name(page_name):
+ """get page by shortname"""
+ import webnotes
+ return webnotes.conn.sql("""select name from `tabWeb Page` where page_name=%s""", page_name)[0][0]
+
+
+if __name__=="__main__":
+ init()
+ respond()