seitime-frappe/py/webnotes/widgets/page.py
Rushabh Mehta f253fa8e0b version 2
2011-09-07 16:44:57 +05:30

119 lines
2.9 KiB
Python

import webnotes
import webnotes.model.doc
import webnotes.model.code
conn = webnotes.conn
class Page:
"""
A page class helps in loading a Page in the system. On loading
* Page will import Client Script from other pages where specified by `$import(page_name)`
* Execute dynamic HTML if the `content` starts with `#python`
"""
def __init__(self, name):
self.name = name
def get_from_files(self, doc, module):
"""
Loads page info from files in module
"""
# load js
doc.fields['__script'] = module.get_doc_file('page',doc.name,'.js').read() or doc.script
doc.script = None
# load css
css = module.get_doc_file('page',doc.name,'.css').read()
if css: doc.style = css
# html
doc.content = module.get_doc_file('page',doc.name,'.html').read() or doc.content
def get_template(self, template):
"""
Returns the page template content
"""
ret = '%(content)s'
# load code from template
if template:
from webnotes.modules import Module
ret = Module(webnotes.conn.get_value('Page Template', template, 'module'))\
.get_doc_file('Page Template', template, '.html').read()
if not ret:
ret = webnotes.conn.get_value('Page Template', template, 'template')
return ret
def process_content(self, doc):
"""
Put in template and generate dynamic if starts with #!python
"""
template = self.get_template(doc.template)
content = ''
# eval content
if doc.content and doc.content.startswith('#!python'):
from webnotes.model.code import execute
content = template % {'content': execute(doc.content).get('content')}
else:
content = template % {'content': doc.content or ''}
doc.__content = content
def load(self):
"""
Returns :term:`doclist` of the `Page`
"""
from webnotes.modules import Module
doclist = webnotes.model.doc.get('Page', self.name)
doc = doclist[0]
# load from module
if doc.module:
module = Module(doc.module)
self.get_from_files(doc, module)
# process
self.process_content(doc)
# add stylesheet
if doc.stylesheet:
doclist += self.load_stylesheet(doc.stylesheet)
return doclist
def load_stylesheet(self, stylesheet):
import webnotes
# load stylesheet
loaded = eval(webnotes.form_dict.get('stylesheets') or '[]')
if not stylesheet in loaded:
import webnotes.model.doc
from webnotes.modules import Module
# doclist
sslist = webnotes.model.doc.get('Stylesheet', stylesheet)
# stylesheet from file
css = Module(sslist[0].module).get_doc_file('Stylesheet', stylesheet, '.css').read()
if css: sslist[0].stylesheet = css
return sslist
else:
return []
def get(name):
"""
Return the :term:`doclist` of the `Page` specified by `name`
"""
return Page(name).load()
def getpage():
"""
Load the page from `webnotes.form` and send it via `webnotes.response`
"""
doclist = get(webnotes.form.getvalue('name'))
# send
webnotes.response['docs'] = doclist