fix: introduce frappe.controllers; clear global if cache is cleared; replace old references

This commit is contained in:
Sagar Vora 2021-01-07 10:57:08 +05:30
parent bc305dab10
commit 34ad0cf331
5 changed files with 20 additions and 14 deletions

View file

@ -27,6 +27,7 @@ __version__ = '13.0.0-dev'
__title__ = "Frappe Framework"
local = Local()
controllers = {}
class _dict(dict):
"""dict like object that exposes keys as attributes"""

View file

@ -72,6 +72,7 @@ def clear_document_cache():
frappe.cache().delete_key("document_cache")
def clear_doctype_cache(doctype=None):
clear_controller_cache(doctype)
cache = frappe.cache()
if getattr(frappe.local, 'meta_cache') and (doctype in frappe.local.meta_cache):
@ -104,6 +105,15 @@ def clear_doctype_cache(doctype=None):
# Clear all document's cache. To clear documents of a specific DocType document_cache should be restructured
clear_document_cache()
def clear_controller_cache(doctype=None):
if not doctype:
del frappe.controllers
frappe.controllers = {}
return
for site_controllers in frappe.controllers.values():
site_controllers.pop(doctype, None)
def get_doctype_map(doctype, name, filters=None, order_by=None):
cache = frappe.cache()
cache_key = frappe.scrub(doctype) + '_map'

View file

@ -5,7 +5,7 @@
from __future__ import unicode_literals
import re, copy, os, shutil
import json
from frappe.cache_manager import clear_user_cache
from frappe.cache_manager import clear_user_cache, clear_controller_cache
# imports - third party imports
import six
@ -408,13 +408,11 @@ class DocType(Document):
if not frappe.flags.in_patch:
self.rename_files_and_folders(old, new)
for site in frappe.utils.get_sites():
frappe.cache().delete(f"{site}:doctype_classes", old)
clear_controller_cache(old)
def after_delete(self):
if not self.custom:
for site in frappe.utils.get_sites():
frappe.cache().delete(f"{site}:doctype_classes", self.name)
clear_controller_cache(self.name)
def rename_files_and_folders(self, old, new):
# move files

View file

@ -26,14 +26,11 @@ max_positive_value = {
DOCTYPES_FOR_DOCTYPE = ('DocType', 'DocField', 'DocPerm', 'DocType Action', 'DocType Link')
_classes = {}
def get_controller(doctype):
"""Returns the **class** object of the given DocType.
For `custom` type, returns `frappe.model.document.Document`.
:param doctype: DocType name as string."""
global _classes
def _get_controller():
from frappe.model.document import Document
@ -73,11 +70,11 @@ def get_controller(doctype):
if frappe.local.dev_server:
return _get_controller()
site_classes = _classes.setdefault(frappe.local.site, {})
if doctype not in site_classes:
site_classes[doctype] = _get_controller()
site_controllers = frappe.controllers.setdefault(frappe.local.site, {})
if doctype not in site_controllers:
site_controllers[doctype] = _get_controller()
return site_classes[doctype]
return site_controllers[doctype]
class BaseDocument(object):
ignore_in_getter = ("doctype", "_meta", "meta", "_table_fields", "_valid_columns")

View file

@ -5,6 +5,7 @@ from __future__ import unicode_literals
import unittest
import frappe
from frappe.desk.doctype.todo.todo import ToDo
from frappe.cache_manager import clear_controller_cache
class TestHooks(unittest.TestCase):
def test_hooks(self):
@ -18,7 +19,6 @@ class TestHooks(unittest.TestCase):
def test_override_doctype_class(self):
from frappe import hooks
from frappe.model import base_document
# Set hook
hooks.override_doctype_class = {
@ -27,7 +27,7 @@ class TestHooks(unittest.TestCase):
# Clear cache
frappe.cache().delete_value('app_hooks')
base_document._classes = {}
clear_controller_cache('ToDo')
todo = frappe.get_doc(doctype='ToDo', description='asdf')
self.assertTrue(isinstance(todo, CustomToDo))