HelpDetailView object cache
Created a cache for the object (target of the help request) in a HelpDetailView. This reduces the call of DetailView.get_object by three or four times. Which also reduces the number of DetailView.get_queryset calls by the same amount. Unit test created. To verify requesting a new object does not return the result from a previous request.
This commit is contained in:
parent
b42456c83c
commit
7336957e9d
2 changed files with 39 additions and 3 deletions
|
|
@ -5,6 +5,9 @@ from django.urls import reverse
|
||||||
from evennia.utils import class_from_module
|
from evennia.utils import class_from_module
|
||||||
from evennia.utils.create import create_help_entry
|
from evennia.utils.create import create_help_entry
|
||||||
from evennia.utils.test_resources import EvenniaTest
|
from evennia.utils.test_resources import EvenniaTest
|
||||||
|
from evennia.help import filehelp
|
||||||
|
|
||||||
|
_FILE_HELP_ENTRIES = None
|
||||||
|
|
||||||
|
|
||||||
class EvenniaWebTest(EvenniaTest):
|
class EvenniaWebTest(EvenniaTest):
|
||||||
|
|
@ -140,20 +143,46 @@ class HelpListTest(EvenniaWebTest):
|
||||||
url_name = "help"
|
url_name = "help"
|
||||||
|
|
||||||
|
|
||||||
|
HELP_ENTRY_DICTS = [
|
||||||
|
{
|
||||||
|
"key": "unit test file entry",
|
||||||
|
"category": "General",
|
||||||
|
"text": "cache test file entry text"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
class HelpDetailTest(EvenniaWebTest):
|
class HelpDetailTest(EvenniaWebTest):
|
||||||
url_name = "help-entry-detail"
|
url_name = "help-entry-detail"
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUp()
|
super().setUp()
|
||||||
create_help_entry('unit test entry', 'unit test entry text', category="General")
|
|
||||||
|
# create a db help entry
|
||||||
|
create_help_entry('unit test db entry', 'unit test db entry text', category="General")
|
||||||
|
|
||||||
def get_kwargs(self):
|
def get_kwargs(self):
|
||||||
return {"category": slugify("general"),
|
return {"category": slugify("general"),
|
||||||
"topic": slugify('unit test entry')}
|
"topic": slugify('unit test db entry')}
|
||||||
|
|
||||||
def test_view(self):
|
def test_view(self):
|
||||||
response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs()), follow=True)
|
response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs()), follow=True)
|
||||||
self.assertEqual(response.context["entry_text"], 'unit test entry text')
|
self.assertEqual(response.context["entry_text"], 'unit test db entry text')
|
||||||
|
|
||||||
|
def test_object_cache(self):
|
||||||
|
# clear file help entries, use local HELP_ENTRY_DICTS to recreate new entries
|
||||||
|
global _FILE_HELP_ENTRIES
|
||||||
|
if _FILE_HELP_ENTRIES is None:
|
||||||
|
from evennia.help.filehelp import FILE_HELP_ENTRIES as _FILE_HELP_ENTRIES
|
||||||
|
help_module = 'evennia.web.website.tests'
|
||||||
|
self.file_help_store = _FILE_HELP_ENTRIES.__init__(help_file_modules=[help_module])
|
||||||
|
|
||||||
|
# request access to an entry
|
||||||
|
response = self.client.get(reverse(self.url_name, kwargs=self.get_kwargs()), follow=True)
|
||||||
|
self.assertEqual(response.context["entry_text"], 'unit test db entry text')
|
||||||
|
# request a second entry, verifing the cached object is not provided on a new topic request
|
||||||
|
entry_two_args = {"category": slugify("general"), "topic": slugify('unit test file entry')}
|
||||||
|
response = self.client.get(reverse(self.url_name, kwargs=entry_two_args), follow=True)
|
||||||
|
self.assertEqual(response.context["entry_text"], 'cache test file entry text')
|
||||||
|
|
||||||
|
|
||||||
class HelpLockedDetailTest(EvenniaWebTest):
|
class HelpLockedDetailTest(EvenniaWebTest):
|
||||||
|
|
|
||||||
|
|
@ -283,6 +283,10 @@ class HelpDetailView(HelpMixin, DetailView):
|
||||||
entry (HelpEntry, FileHelpEntry or Command): HelpEntry requested in the URL.
|
entry (HelpEntry, FileHelpEntry or Command): HelpEntry requested in the URL.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if hasattr(self, 'obj'):
|
||||||
|
return getattr(self, 'obj', None)
|
||||||
|
|
||||||
# Get the queryset for the help entries the user can access
|
# Get the queryset for the help entries the user can access
|
||||||
if not queryset:
|
if not queryset:
|
||||||
queryset = self.get_queryset()
|
queryset = self.get_queryset()
|
||||||
|
|
@ -309,5 +313,8 @@ class HelpDetailView(HelpMixin, DetailView):
|
||||||
return HttpResponseBadRequest(
|
return HttpResponseBadRequest(
|
||||||
f"No ({category}/{topic})s found matching the query."
|
f"No ({category}/{topic})s found matching the query."
|
||||||
)
|
)
|
||||||
|
else:
|
||||||
|
# cache the object if one was found
|
||||||
|
self.obj = obj
|
||||||
|
|
||||||
return obj
|
return obj
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue