From c5c8a54d1a4203239a8b2feeb98ae19026b63b8a Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 28 Oct 2014 17:23:27 +0530 Subject: [PATCH] [fixes] website templating & naming fixes --- .gitignore | 1 + frappe/auth.py | 20 +++--- frappe/model/naming.py | 76 ++++++++++----------- frappe/sessions.py | 4 +- frappe/utils/jinja.py | 3 +- frappe/website/context.py | 2 +- frappe/website/doctype/web_page/web_page.py | 20 ++++-- frappe/website/website_generator.py | 4 ++ 8 files changed, 74 insertions(+), 56 deletions(-) diff --git a/.gitignore b/.gitignore index a45a03de15..27b2369dab 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ locale *.egg-info dist/ build/ +docs/ diff --git a/frappe/auth.py b/frappe/auth.py index 2f4ae51f24..eb41671799 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -73,6 +73,9 @@ class HTTPRequest: class LoginManager: def __init__(self): self.user = None + self.info = None + self.full_name = None + if frappe.local.form_dict.get('cmd')=='login' or frappe.local.request.path=="/api/method/login": self.login() else: @@ -85,6 +88,10 @@ class LoginManager: self.post_login() def post_login(self): + self.info = frappe.db.get_value("User", self.user, + ["user_type", "first_name", "last_name", "user_image"], as_dict=1) + self.full_name = " ".join(filter(None, [self.info.first_name, self.info.last_name])) + self.run_trigger('on_login') self.validate_ip_address() self.validate_hour() @@ -95,24 +102,21 @@ class LoginManager: # set sid again frappe.local.cookie_manager.init_cookies() - info = frappe.db.get_value("User", self.user, - ["user_type", "first_name", "last_name", "user_image"], as_dict=1) - if info.user_type=="Website User": + if self.info.user_type=="Website User": frappe.local.cookie_manager.set_cookie("system_user", "no") frappe.local.response["message"] = "No App" else: frappe.local.cookie_manager.set_cookie("system_user", "yes") frappe.local.response['message'] = 'Logged In' - full_name = " ".join(filter(None, [info.first_name, info.last_name])) - frappe.response["full_name"] = full_name - frappe.local.cookie_manager.set_cookie("full_name", full_name) + frappe.response["full_name"] = self.full_name + frappe.local.cookie_manager.set_cookie("full_name", self.full_name) frappe.local.cookie_manager.set_cookie("user_id", self.user) - frappe.local.cookie_manager.set_cookie("user_image", info.user_image or "") + frappe.local.cookie_manager.set_cookie("user_image", self.info.user_image or "") def make_session(self, resume=False): # start session - frappe.local.session_obj = Session(user=self.user, resume=resume) + frappe.local.session_obj = Session(user=self.user, resume=resume, full_name=self.full_name) # reset user if changed to Guest self.user = frappe.local.session_obj.user diff --git a/frappe/model/naming.py b/frappe/model/naming.py index 4f1f827758..55d95a6071 100644 --- a/frappe/model/naming.py +++ b/frappe/model/naming.py @@ -8,58 +8,54 @@ from frappe.utils import now_datetime, cint def set_new_name(doc): if doc.name: - return + pass - # amendments - if getattr(doc, "amended_from", None): - return _get_amended_name(doc) + elif getattr(doc, "amended_from", None): + _set_amended_name(doc) - elif hasattr(doc, "run_method"): + elif hasattr(doc, "autoname"): doc.run_method("autoname") - if doc.name: - return - autoname = frappe.get_meta(doc.doctype).autoname + if not doc.name: + autoname = frappe.get_meta(doc.doctype).autoname - # based on a field - if autoname: - if autoname.startswith('field:'): - n = doc.get(autoname[6:]) - if not n: - raise Exception, 'Name is required' - doc.name = n.strip() + # based on a field + if autoname: + if autoname.startswith('field:'): + n = doc.get(autoname[6:]) + if not n: + raise Exception, 'Name is required' + doc.name = n.strip() - elif autoname.startswith("naming_series:"): - if not doc.naming_series: - doc.naming_series = get_default_naming_series(doc.doctype) + elif autoname.startswith("naming_series:"): + if not doc.naming_series: + doc.naming_series = get_default_naming_series(doc.doctype) - if not doc.naming_series: - frappe.msgprint(frappe._("Naming Series mandatory"), raise_exception=True) - doc.name = make_autoname(doc.naming_series+'.#####') + if not doc.naming_series: + frappe.msgprint(frappe._("Naming Series mandatory"), raise_exception=True) + doc.name = make_autoname(doc.naming_series+'.#####') - # call the method! - elif autoname=='Prompt': - # set from __newname in save.py - if not doc.name: - frappe.throw(frappe._("Name not set via Prompt")) + # call the method! + elif autoname=='Prompt': + # set from __newname in save.py + if not doc.name: + frappe.throw(frappe._("Name not set via Prompt")) - else: - doc.name = make_autoname(autoname, doc.doctype) + else: + doc.name = make_autoname(autoname, doc.doctype) - # default name for table - elif doc.meta.istable: - doc.name = make_autoname('hash', doc.doctype) + # default name for table + elif doc.meta.istable: + doc.name = make_autoname('hash', doc.doctype) - elif doc.meta.issingle: - doc.name = doc.doctype - - # unable to determine a name, use global series - if not doc.name: - doc.name = make_autoname('hash', doc.doctype) + elif doc.meta.issingle: + doc.name = doc.doctype - doc.name = doc.name.strip() + # unable to determine a name, use global series + if not doc.name: + doc.name = make_autoname('hash', doc.doctype) - validate_name(doc.doctype, doc.name) + doc.name = validate_name(doc.doctype, doc.name) def make_autoname(key, doctype=''): """ @@ -159,7 +155,7 @@ def validate_name(doctype, name, case=None, merge=False): return name -def _get_amended_name(doc): +def _set_amended_name(doc): am_id = 1 am_prefix = doc.amended_from if frappe.db.get_value(doc.doctype, doc.amended_from, "amended_from"): diff --git a/frappe/sessions.py b/frappe/sessions.py index 667cdcb05e..24756727a1 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -118,9 +118,10 @@ def get(): return bootinfo class Session: - def __init__(self, user, resume=False): + def __init__(self, user, resume=False, full_name=None): self.sid = cstr(frappe.form_dict.get('sid') or unquote(frappe.request.cookies.get('sid', 'Guest'))) self.user = user + self.full_name = full_name self.data = frappe._dict({'data': frappe._dict({})}) self.time_diff = None if resume: @@ -146,6 +147,7 @@ class Session: if self.user != "Guest": self.data['data']['last_updated'] = frappe.utils.now() self.data['data']['session_expiry'] = get_expiry_period() + self.data['data']['full_name'] = self.full_name self.data['data']['session_country'] = get_geo_ip_country(frappe.get_request_header('REMOTE_ADDR')) # insert session diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py index 371370d09d..1d6291eda2 100644 --- a/frappe/utils/jinja.py +++ b/frappe/utils/jinja.py @@ -62,7 +62,8 @@ def get_allowed_functions_for_jenv(): "utils": datautils, "user": frappe.local.session.user, "date_format": frappe.db.get_default("date_format") or "yyyy-mm-dd", - "get_gravatar": frappe.utils.get_gravatar + "get_gravatar": frappe.utils.get_gravatar, + "full_name": frappe.local.session.data.full_name }, "get_visible_columns": \ frappe.get_attr("frappe.templates.pages.print.get_visible_columns"), diff --git a/frappe/website/context.py b/frappe/website/context.py index 942285fbd2..38f6111f19 100644 --- a/frappe/website/context.py +++ b/frappe/website/context.py @@ -73,7 +73,7 @@ def build_context(sitemap_options): if ret: context.update(ret) if hasattr(module, "get_children"): - context.get_children = module.get_children + context.children = module.get_children(context) add_metatags(context) diff --git a/frappe/website/doctype/web_page/web_page.py b/frappe/website/doctype/web_page/web_page.py index 404f333a2d..752094647c 100644 --- a/frappe/website/doctype/web_page/web_page.py +++ b/frappe/website/doctype/web_page/web_page.py @@ -2,7 +2,7 @@ # MIT License. See license.txt from __future__ import unicode_literals -import frappe, re, os +import frappe, re, os, json import requests, requests.exceptions from frappe.website.website_generator import WebsiteGenerator from frappe.website.router import resolve_route @@ -53,7 +53,8 @@ class WebPage(WebsiteGenerator): context.header = self.title # for sidebar - context.children = self.get_children() + if not context.children: + context.children = self.get_children() return context @@ -69,10 +70,12 @@ class WebPage(WebsiteGenerator): pass def get_dynamic_context(self, context): + "update context from `.py` and load sidebar from `_sidebar.json` if either exists" template_path_base = self.template_path.rsplit(".", 1)[0] - template_module = os.path.dirname(os.path.relpath(self.template_path, - os.path.join(frappe.get_app_path("frappe"),"..", "..")))\ - .replace(os.path.sep, ".") + "." + frappe.scrub(template_path_base.rsplit(os.path.sep, 1)[1]) + template_module_path = os.path.dirname(os.path.relpath(self.template_path, + os.path.join(frappe.get_app_path("frappe"),"..", ".."))) + template_module = template_module_path.replace(os.path.sep, ".") \ + + "." + frappe.scrub(template_path_base.rsplit(os.path.sep, 1)[1]) try: method = template_module.split(".", 1)[1] + ".get_context" @@ -81,6 +84,13 @@ class WebPage(WebsiteGenerator): if ret: context = ret except ImportError: pass + + # sidebar? + sidebar_path = os.path.join(os.path.dirname(self.template_path), "_sidebar.json") + if os.path.exists(sidebar_path): + with open(sidebar_path, "r") as f: + context.children = json.loads(f.read()) + return context def set_metatags(self, context): diff --git a/frappe/website/website_generator.py b/frappe/website/website_generator.py index e143233e85..6585ecd300 100644 --- a/frappe/website/website_generator.py +++ b/frappe/website/website_generator.py @@ -116,6 +116,10 @@ class WebsiteGenerator(Document): route.public_read = 1 def get_parents(self, context): + # already set + if context.parents: + return context.parents + parents = [] parent = self while parent: