from __future__ import unicode_literals import os import conf from startup.website import * import webnotes import webnotes.utils def render(page_name): """render html page""" try: if page_name: html = get_html(page_name) else: html = get_html('index') except Exception: html = get_html('error') from webnotes.handler import eprint, print_zip eprint("Content-Type: text/html") print_zip(html) def get_html(page_name): """get page html""" page_name = scrub_page_name(page_name) html = '' # load from cache, if auto cache clear is falsy if not (hasattr(conf, 'auto_cache_clear') and conf.auto_cache_clear or 0): if not get_page_settings().get("page_name", {}).get("no_cache", None): html = webnotes.cache().get_value("page:" + page_name) from_cache = True if not html: from webnotes.auth import HTTPRequest webnotes.http_request = HTTPRequest() #webnotes.connect() html = load_into_cache(page_name) from_cache = False if not html: html = get_html("404") if page_name=="error": html = html.replace("%(error)s", webnotes.getTraceback()) else: comments = "\n\npage:"+page_name+\ "\nload status: " + (from_cache and "cache" or "fresh") html += """\n""" % webnotes.utils.cstr(comments) return html def scrub_page_name(page_name): if page_name.endswith('.html'): page_name = page_name[:-5] return page_name def page_name(title): """make page name from title""" import re name = title.lower() name = re.sub('[~!@#$%^&*()<>,."\']', '', name) name = re.sub('[:/]', '-', name) name = '-'.join(name.split()) # replace repeating hyphens name = re.sub(r"(-)\1+", r"\1", name) return name def update_page_name(doc, title): """set page_name and check if it is unique""" webnotes.conn.set(doc, "page_name", page_name(title)) if doc.page_name in get_standard_pages(): webnotes.conn.sql("""Page Name cannot be one of %s""" % ', '.join(get_standard_pages())) res = webnotes.conn.sql("""\ select count(*) from `tab%s` where page_name=%s and name!=%s""" % (doc.doctype, '%s', '%s'), (doc.page_name, doc.name)) if res and res[0][0] > 0: webnotes.msgprint("""A %s with the same title already exists. Please change the title of %s and save again.""" % (doc.doctype, doc.name), raise_exception=1) delete_page_cache(doc.page_name) def load_into_cache(page_name): args = prepare_args(page_name) if not args: return "" html = build_html(args) webnotes.cache().set_value("page:" + page_name, html) return html def build_html(args): from jinja2 import Environment, FileSystemLoader args["len"] = len jenv = Environment(loader = FileSystemLoader(webnotes.utils.get_base_path())) template_name = args['template'] if not template_name.endswith(".html"): template_name = template_name + ".html" html = jenv.get_template(template_name).render(args) return html def get_standard_pages(): return webnotes.get_config()["web"]["pages"].keys() def prepare_args(page_name): if page_name == 'index': page_name = get_home_page() pages = get_page_settings() if page_name in pages: page_info = pages[page_name] args = webnotes._dict({ 'template': page_info["template"], 'name': page_name, }) # additional args if "args_method" in page_info: args.update(webnotes.get_method(page_info["args_method"])()) elif "args_doctype" in page_info: args.obj = webnotes.bean(page_info["args_doctype"]).obj else: args = get_doc_fields(page_name) if not args: return False update_template_args(page_name, args) return args def get_doc_fields(page_name): doc_type, doc_name = get_source_doc(page_name) if not doc_type: return False obj = webnotes.get_obj(doc_type, doc_name, with_children=True) if hasattr(obj, 'prepare_template_args'): obj.prepare_template_args() args = obj.doc.fields args['template'] = get_generators()[doc_type]["template"] args['obj'] = obj args['int'] = int return args def get_source_doc(page_name): """get source doc for the given page name""" for doctype in get_generators(): name = webnotes.conn.sql("""select name from `tab%s` where page_name=%s and ifnull(%s, 0)=1""" % (doctype, "%s", get_generators()[doctype]["condition_field"]), page_name) if name: return doctype, name[0][0] return None, None def clear_cache(page_name=None): if page_name: delete_page_cache(page_name) else: cache = webnotes.cache() for p in get_all_pages(): cache.delete_value("page:" + p) def get_all_pages(): all_pages = get_standard_pages() for doctype in get_generators(): all_pages += [p[0] for p in webnotes.conn.sql("""select distinct page_name from `tab%s`""" % doctype) if p[0]] return all_pages def delete_page_cache(page_name): if page_name: webnotes.cache().delete_value("page:" + page_name) def get_hex_shade(color, percent): def p(c): v = int(c, 16) + int(int('ff', 16) * (float(percent)/100)) if v < 0: v=0 if v > 255: v=255 h = hex(v)[2:] if len(h) < 2: h = "0" + h return h r, g, b = color[0:2], color[2:4], color[4:6] avg = (float(int(r, 16) + int(g, 16) + int(b, 16)) / 3) # switch dark and light shades if avg > 128: percent = -percent # stronger diff for darker shades if percent < 25 and avg < 64: percent = percent * 2 return p(r) + p(g) + p(b) def get_standard_pages(): return webnotes.get_config()["web"]["pages"].keys() def get_generators(): return webnotes.get_config()["web"]["generators"] def get_page_settings(): return webnotes.get_config()["web"]["pages"]