diff --git a/frappe/__init__.py b/frappe/__init__.py index 1e5b7a1602..4623ed438b 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -107,6 +107,7 @@ def init(site, sites_path=None): local.user = None local.role_permissions = {} + local.valid_columns = {} local.jenv = None local.jloader =None diff --git a/frappe/commands.py b/frappe/commands.py index a6f8bb02a3..eaffa36034 100644 --- a/frappe/commands.py +++ b/frappe/commands.py @@ -30,7 +30,8 @@ def pass_context(f): if profile: pr.disable() s = StringIO.StringIO() - ps = pstats.Stats(pr, stream=s).sort_stats('tottime', 'ncalls') + ps = pstats.Stats(pr, stream=s)\ + .sort_stats('cumtime', 'tottime', 'ncalls') ps.print_stats() print s.getvalue() @@ -72,8 +73,12 @@ def _new_site(db_name, site, mariadb_root_username=None, mariadb_root_password=N import frappe.utils.scheduler frappe.init(site=site) - # enable scheduler post install? - enable_scheduler = _is_scheduler_enabled() + + try: + # enable scheduler post install? + enable_scheduler = _is_scheduler_enabled() + except: + enable_scheduler = False install_db(root_login=mariadb_root_username, root_password=mariadb_root_password, db_name=db_name, admin_password=admin_password, verbose=verbose, source_sql=source_sql,force=force, reinstall=reinstall) make_site_dirs() @@ -132,7 +137,7 @@ def reinstall(context): frappe.clear_cache() installed = frappe.get_installed_apps() frappe.clear_cache() - except: + except Exception, e: installed = [] raise finally: diff --git a/frappe/database.py b/frappe/database.py index 416d7b205d..73181f1ed3 100644 --- a/frappe/database.py +++ b/frappe/database.py @@ -247,6 +247,8 @@ class Database: def convert_to_simple_type(self, v, formatted=0): """Format date, time, longint values.""" + return v + from frappe.utils import formatdate, fmt_money if isinstance(v, (datetime.date, datetime.timedelta, datetime.datetime, long)): diff --git a/frappe/geo/doctype/currency/currency.py b/frappe/geo/doctype/currency/currency.py index f56715937a..688303fd50 100644 --- a/frappe/geo/doctype/currency/currency.py +++ b/frappe/geo/doctype/currency/currency.py @@ -9,4 +9,5 @@ from frappe.model.document import Document class Currency(Document): def validate(self): - frappe.clear_cache() + if not frappe.flags.in_install_app: + frappe.clear_cache() diff --git a/frappe/installer.py b/frappe/installer.py index 920aa939fd..149565daf9 100755 --- a/frappe/installer.py +++ b/frappe/installer.py @@ -88,6 +88,7 @@ def make_connection(root_login, root_password): return frappe.database.Database(user=root_login, password=root_password) def install_app(name, verbose=False, set_as_patched=True): + frappe.clear_cache() app_hooks = frappe.get_hooks(app_name=name) installed_apps = frappe.get_installed_apps() diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 4039f63647..c41601da09 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -179,16 +179,22 @@ class BaseDocument(object): if key not in self.__dict__: self.__dict__[key] = None - if self.doctype in ("DocField", "DocPerm") and self.parent in ("DocType", "DocField", "DocPerm"): - from frappe.model.meta import get_table_columns - valid = get_table_columns(self.doctype) - else: - valid = self.meta.get_valid_columns() - - for key in valid: + for key in self.get_valid_columns(): if key not in self.__dict__: self.__dict__[key] = None + def get_valid_columns(self): + if self.doctype not in frappe.local.valid_columns: + if self.doctype in ("DocField", "DocPerm") and self.parent in ("DocType", "DocField", "DocPerm"): + from frappe.model.meta import get_table_columns + valid = get_table_columns(self.doctype) + else: + valid = self.meta.get_valid_columns() + + frappe.local.valid_columns[self.doctype] = valid + + return frappe.local.valid_columns[self.doctype] + def is_new(self): return self.get("__islocal") diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 79f54a54eb..89859a1a97 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -124,6 +124,7 @@ class Meta(Document): self.add_custom_fields() self.apply_property_setters() self.sort_fields() + self.get_valid_columns() def add_custom_fields(self): try: diff --git a/frappe/utils/install.py b/frappe/utils/install.py index b499e084a6..204638e11a 100644 --- a/frappe/utils/install.py +++ b/frappe/utils/install.py @@ -107,7 +107,7 @@ def add_country_and_currency(name, country): "code": country.code, "date_format": country.date_format or "dd-mm-yyyy", "time_zones": "\n".join(country.timezones or []) - }).insert() + }).db_insert() if country.currency and not frappe.db.exists("Currency", country.currency): frappe.get_doc({ @@ -117,5 +117,5 @@ def add_country_and_currency(name, country): "symbol": country.currency_symbol, "fraction_units": country.currency_fraction_units, "number_format": country.number_format - }).insert() + }).db_insert() diff --git a/frappe/utils/redis_wrapper.py b/frappe/utils/redis_wrapper.py index 1548868cd5..4c14ca0f34 100644 --- a/frappe/utils/redis_wrapper.py +++ b/frappe/utils/redis_wrapper.py @@ -35,9 +35,9 @@ class RedisWrapper(redis.Redis): :param generator: Function to be called to generate a value if `None` is returned.""" original_key = key key = self.make_key(key, user) - val = frappe.local.cache.get(key) - if val is None: + if key not in frappe.local.cache: + val = None if not frappe.local.flags.in_install: try: val = self.get(key) @@ -50,7 +50,8 @@ class RedisWrapper(redis.Redis): self.set_value(original_key, val, user=user) else: frappe.local.cache[key] = val - return val + + return frappe.local.cache.get(key) def get_all(self, key): ret = {}