blob: 52a0898a75c11c833918fe2072d54f9abddea221 [file] [log] [blame]
Rushabh Mehta3966f1d2012-02-23 12:35:32 +05301# ERPNext - web based ERP (http://erpnext.com)
2# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
Anand Doshi486f9df2012-07-19 13:40:31 +053017from __future__ import unicode_literals
Rushabh Mehta571377a2012-12-07 11:00:26 +053018
19import os
20import conf
Rushabh Mehtaab1148c2012-01-31 18:01:16 +053021import webnotes
Rushabh Mehta571377a2012-12-07 11:00:26 +053022from webnotes.utils import cstr
23
Rushabh Mehtaa494b882012-12-07 12:44:45 +053024page_map = {
25 'Web Page': webnotes._dict({
26 "template": 'html/web_page.html',
27 "condition_field": "published"
28 }),
29 'Blog': webnotes._dict({
30 "template": 'html/blog_page.html',
31 "condition_field": "published",
32 }),
33 'Item': webnotes._dict({
34 "template": 'html/product_page.html',
35 "condition_field": "show_in_website",
Rushabh Mehta173a0fd2012-12-14 16:39:27 +053036 }),
37 'Item Group': webnotes._dict({
38 "template": "html/product_group.html",
39 "condition_field": "show_in_website"
Rushabh Mehtaa494b882012-12-07 12:44:45 +053040 })
Rushabh Mehta571377a2012-12-07 11:00:26 +053041}
Rushabh Mehtaab1148c2012-01-31 18:01:16 +053042
Rushabh Mehta1b151712012-12-27 16:50:24 +053043page_settings_map = {
44 "about": "About Us Settings"
45}
46
Rushabh Mehta89c7b412012-12-06 14:58:44 +053047def render(page_name):
48 """render html page"""
Rushabh Mehta89c7b412012-12-06 14:58:44 +053049 try:
50 if page_name:
51 html = get_html(page_name)
52 else:
53 html = get_html('index')
54 except Exception, e:
Rushabh Mehtae109fa42012-12-19 10:14:59 +053055 html = get_html('error')
Rushabh Mehta89c7b412012-12-06 14:58:44 +053056
57 from webnotes.handler import eprint, print_zip
58 eprint("Content-Type: text/html")
59 print_zip(html)
60
61def get_html(page_name):
62 """get page html"""
63 page_name = scrub_page_name(page_name)
Rushabh Mehta89c7b412012-12-06 14:58:44 +053064
Rushabh Mehta571377a2012-12-07 11:00:26 +053065 html = ''
66
67 # load from cache, if auto cache clear is falsy
68 if not (hasattr(conf, 'auto_cache_clear') and conf.auto_cache_clear or 0):
69 html = webnotes.cache().get_value("page:" + page_name)
Rushabh Mehtae109fa42012-12-19 10:14:59 +053070 from_cache = True
Rushabh Mehta571377a2012-12-07 11:00:26 +053071
Rushabh Mehtae109fa42012-12-19 10:14:59 +053072 if not html:
Rushabh Mehta571377a2012-12-07 11:00:26 +053073 html = load_into_cache(page_name)
Rushabh Mehtae109fa42012-12-19 10:14:59 +053074 from_cache = False
Rushabh Mehta571377a2012-12-07 11:00:26 +053075
Rushabh Mehtae109fa42012-12-19 10:14:59 +053076 if not html:
77 html = get_html("404")
78
79 if page_name=="error":
Rushabh Mehta7edf8992012-12-25 18:18:17 +053080 html = html.replace("%(error)s", webnotes.getTraceback())
Rushabh Mehtae109fa42012-12-19 10:14:59 +053081 else:
82 comments = "\n\npage:"+page_name+\
83 "\nload status: " + (from_cache and "cache" or "fresh")
84 html += """\n<!-- %s -->""" % webnotes.utils.cstr(comments)
Rushabh Mehta571377a2012-12-07 11:00:26 +053085
Rushabh Mehta89c7b412012-12-06 14:58:44 +053086 return html
Rushabh Mehta89c7b412012-12-06 14:58:44 +053087
Anand Doshi51146c02012-07-12 18:41:12 +053088def scrub_page_name(page_name):
89 if page_name.endswith('.html'):
90 page_name = page_name[:-5]
91
92 return page_name
93
Rushabh Mehtaab1148c2012-01-31 18:01:16 +053094def page_name(title):
Anand Doshi72c945b2012-06-22 20:01:07 +053095 """make page name from title"""
96 import re
97 name = title.lower()
98 name = re.sub('[~!@#$%^&*()<>,."\']', '', name)
99 return '-'.join(name.split()[:4])
Rushabh Mehtadf0b00a2012-12-06 16:15:38 +0530100
101def update_page_name(doc, title):
102 """set page_name and check if it is unique"""
Rushabh Mehtaa2e4cb02012-12-06 17:09:38 +0530103 webnotes.conn.set(doc, "page_name", page_name(title))
Rushabh Mehtadf0b00a2012-12-06 16:15:38 +0530104
Rushabh Mehta1b151712012-12-27 16:50:24 +0530105 standard_pages = get_template_pages()
106 if doc.page_name in standard_pages:
107 webnotes.conn.sql("""Page Name cannot be one of %s""" % ', '.join(standard_pages))
108
Rushabh Mehtadf0b00a2012-12-06 16:15:38 +0530109 res = webnotes.conn.sql("""\
110 select count(*) from `tab%s`
111 where page_name=%s and name!=%s""" % (doc.doctype, '%s', '%s'),
112 (doc.page_name, doc.name))
113 if res and res[0][0] > 0:
114 webnotes.msgprint("""A %s with the same title already exists.
115 Please change the title of %s and save again."""
116 % (doc.doctype, doc.name), raise_exception=1)
Rushabh Mehta571377a2012-12-07 11:00:26 +0530117
118 delete_page_cache(doc.page_name)
119
120def load_into_cache(page_name):
121 args = prepare_args(page_name)
Rushabh Mehtae109fa42012-12-19 10:14:59 +0530122 if not args:
123 return ""
Rushabh Mehta571377a2012-12-07 11:00:26 +0530124 html = build_html(args)
125 webnotes.cache().set_value("page:" + page_name, html)
126 return html
127
128def build_html(args):
129 from jinja2 import Environment, FileSystemLoader
130
131 templates_path = os.path.join(os.path.dirname(conf.__file__),
132 'app', 'website', 'templates')
133
Rushabh Mehta7837d802012-12-25 15:09:14 +0530134 args["len"] = len
135
Rushabh Mehta571377a2012-12-07 11:00:26 +0530136 jenv = Environment(loader = FileSystemLoader(templates_path))
137 html = jenv.get_template(args['template']).render(args)
138
139 return html
140
141def prepare_args(page_name):
142 if page_name == 'index':
143 page_name = get_home_page()
144
145 if page_name in get_template_pages():
Rushabh Mehta1b151712012-12-27 16:50:24 +0530146 args = webnotes._dict({
Rushabh Mehta571377a2012-12-07 11:00:26 +0530147 'template': 'pages/%s.html' % page_name,
148 'name': page_name,
Rushabh Mehta1b151712012-12-27 16:50:24 +0530149 })
150 if page_name in page_settings_map:
151 args.obj = webnotes.model_wrapper(page_settings_map[page_name]).obj
Rushabh Mehta571377a2012-12-07 11:00:26 +0530152 else:
153 args = get_doc_fields(page_name)
154
Rushabh Mehtae109fa42012-12-19 10:14:59 +0530155 if not args:
156 return False
157
Rushabh Mehta571377a2012-12-07 11:00:26 +0530158 args.update(get_outer_env())
159
160 return args
161
Rushabh Mehtaa494b882012-12-07 12:44:45 +0530162def get_template_pages():
Rushabh Mehta571377a2012-12-07 11:00:26 +0530163 pages_path = os.path.join(os.path.dirname(conf.__file__), 'app',
164 'website', 'templates', 'pages')
165 page_list = []
166 for page in os.listdir(pages_path):
167 page_list.append(scrub_page_name(page))
168
169 return page_list
170
171def get_doc_fields(page_name):
172 doc_type, doc_name = get_source_doc(page_name)
Rushabh Mehtae109fa42012-12-19 10:14:59 +0530173 if not doc_type:
174 return False
175
Rushabh Mehta0e9e8482012-12-17 16:00:34 +0530176 obj = webnotes.get_obj(doc_type, doc_name, with_children=True)
Rushabh Mehtaa494b882012-12-07 12:44:45 +0530177
Rushabh Mehta571377a2012-12-07 11:00:26 +0530178 if hasattr(obj, 'prepare_template_args'):
179 obj.prepare_template_args()
Rushabh Mehtaa494b882012-12-07 12:44:45 +0530180
Rushabh Mehta571377a2012-12-07 11:00:26 +0530181 args = obj.doc.fields
Rushabh Mehtaa494b882012-12-07 12:44:45 +0530182 args['template'] = page_map[doc_type].template
Rushabh Mehta0e9e8482012-12-17 16:00:34 +0530183 args['obj'] = obj
Rushabh Mehtafc19f252012-12-20 17:11:51 +0530184 args['int'] = int
Rushabh Mehta571377a2012-12-07 11:00:26 +0530185
186 return args
187
188def get_source_doc(page_name):
189 """get source doc for the given page name"""
Rushabh Mehtaa494b882012-12-07 12:44:45 +0530190 for doctype in page_map:
Rushabh Mehta571377a2012-12-07 11:00:26 +0530191 name = webnotes.conn.sql("""select name from `tab%s` where
Rushabh Mehtaa494b882012-12-07 12:44:45 +0530192 page_name=%s and ifnull(%s, 0)=1""" % (doctype, "%s",
193 page_map[doctype].condition_field), page_name)
Rushabh Mehta571377a2012-12-07 11:00:26 +0530194 if name:
Rushabh Mehtaa494b882012-12-07 12:44:45 +0530195 return doctype, name[0][0]
196
Rushabh Mehta571377a2012-12-07 11:00:26 +0530197 return None, None
198
199def get_outer_env():
200 all_top_items = webnotes.conn.sql("""\
201 select * from `tabTop Bar Item`
202 where parent='Website Settings' and parentfield='top_bar_items'
203 order by idx asc""", as_dict=1)
Rushabh Mehta60cc0cc2012-12-21 10:52:26 +0530204
Rushabh Mehta571377a2012-12-07 11:00:26 +0530205 top_items = [d for d in all_top_items if not d['parent_label']]
206
207 # attach child items to top bar
208 for d in all_top_items:
209 if d['parent_label']:
210 for t in top_items:
211 if t['label']==d['parent_label']:
212 if not 'child_items' in t:
213 t['child_items'] = []
214 t['child_items'].append(d)
215 break
216
Nabin Haitab573ce2012-12-21 11:01:31 +0530217 if top_items and ("products" in [d.url.split(".")[0] for d in top_items if d.url]):
Rushabh Mehtafc19f252012-12-20 17:11:51 +0530218 # product categories
219 products = webnotes.conn.sql("""select t1.item_group as label,
220 concat(t2.page_name, ".html") as url,
221 ifnull(t1.indent,0) as indent
222 from `tabWebsite Product Category` t1, `tabItem Group` t2
223 where t1.item_group = t2.name
224 and ifnull(t2.show_in_website,0)=1 order by t1.idx""", as_dict=1)
Rushabh Mehtabda54e52012-12-24 12:52:15 +0530225 products_item = filter(lambda d: d.url and d.url.split(".")[0]=="products", top_items)[0]
Rushabh Mehtafc19f252012-12-20 17:11:51 +0530226 products_item.child_items = products
227
Rushabh Mehta7edf8992012-12-25 18:18:17 +0530228 ret = webnotes._dict({
Rushabh Mehta571377a2012-12-07 11:00:26 +0530229 'top_bar_items': top_items,
Rushabh Mehta571377a2012-12-07 11:00:26 +0530230 'footer_items': webnotes.conn.sql("""\
231 select * from `tabTop Bar Item`
232 where parent='Website Settings' and parentfield='footer_items'
233 order by idx asc""", as_dict=1),
234
Rushabh Mehtafc19f252012-12-20 17:11:51 +0530235 'int':int
Rushabh Mehta7edf8992012-12-25 18:18:17 +0530236 })
237
238 settings = webnotes.doc("Website Settings", "Website Settings")
Rushabh Mehta5f1d57e2012-12-27 14:05:02 +0530239 for k in ["brand_html", "copyright", "address", "top_bar_background"]:
Rushabh Mehta7edf8992012-12-25 18:18:17 +0530240 if k in settings.fields:
241 ret[k] = settings.fields[k]
242
243 if not ret.brand_html:
244 ret.brand_html = "ERPNext"
Rushabh Mehta5f1d57e2012-12-27 14:05:02 +0530245 if not ret.top_bar_background:
246 ret.top_bar_background = "Black"
Rushabh Mehta7edf8992012-12-25 18:18:17 +0530247 return ret
Rushabh Mehta571377a2012-12-07 11:00:26 +0530248
249def get_home_page():
250 doc_name = webnotes.conn.get_value('Website Settings', None, 'home_page')
251 if doc_name:
252 page_name = webnotes.conn.get_value('Web Page', doc_name, 'page_name')
253 else:
254 page_name = 'login'
255
256 return page_name
257
Rushabh Mehta98b99bd2012-12-07 12:55:06 +0530258def clear_cache(page_name=None):
Rushabh Mehta571377a2012-12-07 11:00:26 +0530259 if page_name:
260 delete_page_cache(page_name)
261 else:
262 webnotes.cache().delete_keys("page:")
263
264def delete_page_cache(page_name):
Rushabh Mehta5f1d57e2012-12-27 14:05:02 +0530265 webnotes.cache().delete_value("page:" + page_name)
266
267def url_for_website(url):
268 if url and not url.lower().startswith("http"):
269 return "files/" + url
270 else:
271 return url