Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
12 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import conf
  5. import webnotes
  6. from webnotes import _
  7. import webnotes.utils
  8. class PageNotFoundError(Exception): pass
  9. def render(page_name):
  10. """render html page"""
  11. try:
  12. html = render_page(page_name or "index")
  13. except PageNotFoundError:
  14. html = render_page("404")
  15. except Exception:
  16. html = render_page('error')
  17. from webnotes.handler import eprint, print_zip
  18. eprint("Content-Type: text/html; charset: utf-8")
  19. print_zip(html)
  20. def render_page(page_name):
  21. """get page html"""
  22. page_name = scrub_page_name(page_name)
  23. html = ''
  24. if not (hasattr(conf, 'auto_cache_clear') and conf.auto_cache_clear or 0):
  25. html = webnotes.cache().get_value("page:" + page_name)
  26. from_cache = True
  27. if not html:
  28. from webnotes.auth import HTTPRequest
  29. webnotes.http_request = HTTPRequest()
  30. html = build_page(page_name)
  31. from_cache = False
  32. if not html:
  33. raise PageNotFoundError
  34. if page_name=="error":
  35. html = html.replace("%(error)s", webnotes.getTraceback())
  36. else:
  37. comments = "\n\npage:"+page_name+\
  38. "\nload status: " + (from_cache and "cache" or "fresh")
  39. html += """\n<!-- %s -->""" % webnotes.utils.cstr(comments)
  40. return html
  41. def build_page(page_name):
  42. from jinja2 import Environment, FileSystemLoader
  43. if not webnotes.conn:
  44. webnotes.connect()
  45. sitemap = get_website_sitemap()
  46. page_options = sitemap.get(page_name)
  47. if not page_options:
  48. if page_name=="index":
  49. # page not found, try home page
  50. home_page = get_home_page()
  51. page_options = sitemap.get(home_page)
  52. if not page_options:
  53. raise PageNotFoundError
  54. page_options["page_name"] = home_page
  55. else:
  56. raise PageNotFoundError
  57. else:
  58. page_options["page_name"] = page_name
  59. basepath = webnotes.utils.get_base_path()
  60. module = None
  61. no_cache = False
  62. if page_options.get("controller"):
  63. module = webnotes.get_module(page_options["controller"])
  64. no_cache = getattr(module, "no_cache", False)
  65. # if generator, then load bean, pass arguments
  66. if page_options.get("is_generator"):
  67. if not module:
  68. raise Exception("Generator controller not defined")
  69. name = webnotes.conn.get_value(module.doctype, {"page_name": page_options["page_name"]})
  70. obj = webnotes.get_obj(module.doctype, name, with_children=True)
  71. if hasattr(obj, 'get_context'):
  72. obj.get_context()
  73. context = webnotes._dict(obj.doc.fields)
  74. context["obj"] = obj
  75. else:
  76. # page
  77. context = webnotes._dict({ 'name': page_name })
  78. if module and hasattr(module, "get_context"):
  79. context.update(module.get_context())
  80. context.update(get_website_settings())
  81. jenv = Environment(loader = FileSystemLoader(basepath))
  82. context["base_template"] = jenv.get_template(webnotes.get_config().get("base_template"))
  83. template_name = page_options['template']
  84. html = jenv.get_template(template_name).render(context)
  85. if not no_cache:
  86. webnotes.cache().set_value("page:" + page_name, html)
  87. return html
  88. def build_sitemap():
  89. sitemap = {}
  90. config = webnotes.cache().get_value("website_sitemap_config", build_website_sitemap_config)
  91. sitemap.update(config["pages"])
  92. # generators
  93. for g in config["generators"].values():
  94. g["is_generator"] = True
  95. module = webnotes.get_module(g["controller"])
  96. for name in webnotes.conn.sql_list("""select page_name from `tab%s` where
  97. ifnull(%s, 0)=1""" % (module.doctype, module.condition_field)):
  98. sitemap[name] = g
  99. return sitemap
  100. def get_home_page():
  101. if not webnotes.conn:
  102. webnotes.connect()
  103. doc_name = webnotes.conn.get_value('Website Settings', None, 'home_page')
  104. if doc_name:
  105. page_name = webnotes.conn.get_value('Web Page', doc_name, 'page_name')
  106. else:
  107. page_name = 'login'
  108. return page_name
  109. def build_website_sitemap_config():
  110. import os
  111. config = {"pages": {}, "generators":{}}
  112. basepath = webnotes.utils.get_base_path()
  113. def get_options(path, fname):
  114. name = fname[:-5]
  115. options = webnotes._dict({
  116. "link_name": name,
  117. "template": os.path.relpath(os.path.join(path, fname), basepath),
  118. })
  119. controller_path = os.path.join(path, name + ".py")
  120. if os.path.exists(controller_path):
  121. options.controller = os.path.relpath(controller_path[:-3], basepath).replace(os.path.sep, ".")
  122. options.controller = ".".join(options.controller.split(".")[1:])
  123. return options
  124. for path, folders, files in os.walk(basepath):
  125. if os.path.basename(path)=="pages" and os.path.basename(os.path.dirname(path))=="templates":
  126. for fname in files:
  127. if fname.endswith(".html"):
  128. options = get_options(path, fname)
  129. config["pages"][options.link_name] = options
  130. if os.path.basename(path)=="generators" and os.path.basename(os.path.dirname(path))=="templates":
  131. for fname in files:
  132. if fname.endswith(".html"):
  133. options = get_options(path, fname)
  134. config["generators"][fname] = options
  135. return config
  136. def get_website_settings():
  137. from webnotes.utils import get_request_site_address, encode, cint
  138. from urllib import quote
  139. all_top_items = webnotes.conn.sql("""\
  140. select * from `tabTop Bar Item`
  141. where parent='Website Settings' and parentfield='top_bar_items'
  142. order by idx asc""", as_dict=1)
  143. top_items = [d for d in all_top_items if not d['parent_label']]
  144. # attach child items to top bar
  145. for d in all_top_items:
  146. if d['parent_label']:
  147. for t in top_items:
  148. if t['label']==d['parent_label']:
  149. if not 'child_items' in t:
  150. t['child_items'] = []
  151. t['child_items'].append(d)
  152. break
  153. context = webnotes._dict({
  154. 'top_bar_items': top_items,
  155. 'footer_items': webnotes.conn.sql("""\
  156. select * from `tabTop Bar Item`
  157. where parent='Website Settings' and parentfield='footer_items'
  158. order by idx asc""", as_dict=1),
  159. "webnotes": webnotes,
  160. "utils": webnotes.utils,
  161. "post_login": [
  162. {"label": "Logout", "url": "server.py?cmd=web_logout", "icon": "icon-signout"},
  163. ]
  164. })
  165. settings = webnotes.doc("Website Settings", "Website Settings")
  166. for k in ["banner_html", "brand_html", "copyright", "twitter_share_via",
  167. "favicon", "facebook_share", "google_plus_one", "twitter_share", "linked_in_share",
  168. "disable_signup"]:
  169. if k in settings.fields:
  170. context[k] = settings.fields.get(k)
  171. if settings.address:
  172. context["footer_address"] = settings.address
  173. for k in ["facebook_share", "google_plus_one", "twitter_share", "linked_in_share",
  174. "disable_signup"]:
  175. context[k] = cint(context.get(k) or 0)
  176. context.url = quote(str(get_request_site_address(full_address=True)), str(""))
  177. context.encoded_title = quote(encode(context.title or ""), str(""))
  178. try:
  179. import startup.webutils
  180. if hasattr(startup.webutils, "get_website_settings"):
  181. startup.webutils.get_website_settings(context)
  182. except:
  183. pass
  184. return context
  185. def clear_cache(page_name=None):
  186. if page_name:
  187. delete_page_cache(page_name)
  188. else:
  189. cache = webnotes.cache()
  190. for p in get_all_pages():
  191. cache.delete_value("page:" + p)
  192. cache.delete_value("website_sitemap")
  193. cache.delete_value("website_sitemap_config")
  194. def get_website_sitemap():
  195. return webnotes.cache().get_value("website_sitemap", build_sitemap)
  196. def get_all_pages():
  197. return get_website_sitemap().keys()
  198. def delete_page_cache(page_name):
  199. if page_name:
  200. webnotes.cache().delete_value("page:" + page_name)
  201. def get_hex_shade(color, percent):
  202. def p(c):
  203. v = int(c, 16) + int(int('ff', 16) * (float(percent)/100))
  204. if v < 0:
  205. v=0
  206. if v > 255:
  207. v=255
  208. h = hex(v)[2:]
  209. if len(h) < 2:
  210. h = "0" + h
  211. return h
  212. r, g, b = color[0:2], color[2:4], color[4:6]
  213. avg = (float(int(r, 16) + int(g, 16) + int(b, 16)) / 3)
  214. # switch dark and light shades
  215. if avg > 128:
  216. percent = -percent
  217. # stronger diff for darker shades
  218. if percent < 25 and avg < 64:
  219. percent = percent * 2
  220. return p(r) + p(g) + p(b)
  221. def scrub_page_name(page_name):
  222. if page_name.endswith('.html'):
  223. page_name = page_name[:-5]
  224. return page_name
  225. _is_signup_enabled = None
  226. def is_signup_enabled():
  227. global _is_signup_enabled
  228. if _is_signup_enabled is None:
  229. _is_signup_enabled = True
  230. if webnotes.utils.cint(webnotes.conn.get_value("Website Settings",
  231. "Website Settings", "disable_signup")):
  232. _is_signup_enabled = False
  233. return _is_signup_enabled
  234. def update_page_name(doc, title):
  235. """set page_name and check if it is unique"""
  236. webnotes.conn.set(doc, "page_name", page_name(title))
  237. if doc.page_name in get_all_pages():
  238. webnotes.throw("%s: %s. %s: %s" % (doc.page_name, _("Page already exists"),
  239. _("Please change the value"), title))
  240. delete_page_cache(doc.page_name)
  241. def page_name(title):
  242. """make page name from title"""
  243. import re
  244. name = title.lower()
  245. name = re.sub('[~!@#$%^&*()<>,."\']', '', name)
  246. name = re.sub('[:/]', '-', name)
  247. name = '-'.join(name.split())
  248. # replace repeating hyphens
  249. name = re.sub(r"(-)\1+", r"\1", name)
  250. return name