Skip to content

Commit 3b043de

Browse files
authored
#287 Use global context for display organization (#288)
1 parent 0e9e213 commit 3b043de

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

pages/display.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
"""
66
import typing
77

8+
from collections import defaultdict
9+
810

911
class Page:
1012
"""It's python Descriptor."""
@@ -20,14 +22,19 @@ def __init__(self, page: 'pages.models.Page'=None, context: typing.Dict[str, typ
2022
because client code wants the same context for many different cases.
2123
"""
2224
self._page = page
23-
self._context = context or {}
25+
self._global_context = defaultdict(dict)
26+
if context:
27+
self._global_context[page.id] = context
2428

2529
def __get__(self, instance: 'pages.models.Page', type_):
26-
return Page(instance, {'page': instance, **self._context})
30+
return Page(
31+
instance,
32+
{'page': instance, **self._global_context[instance.id]}
33+
)
2734

2835
def __set__(self, instance: 'pages.models.Page', value: typing.Dict[str, typing.Any]):
2936
self._page = instance
30-
self._context = value
37+
self._global_context[instance.id] = value
3138

3239
def __getattr__(self, item):
3340
if item in self.STORED:
@@ -37,7 +44,9 @@ def __getattr__(self, item):
3744

3845
def render(self, field: str):
3946
return (
40-
self._page.template.render_field(field, self._context)
47+
self._page.template.render_field(
48+
field, context=self._global_context[self._page.id]
49+
)
4150
if self._page.template
4251
else getattr(self._page, field)
4352
)

tests/pages/test_models.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import unittest
2-
31
from django.test import TestCase
42

53
from pages.models import ModelPage, CustomPage, FlatPage, Page, PageTemplate
@@ -136,7 +134,6 @@ def test_display_attribute_uses_template(self):
136134

137135
# @todo #SE742:30m Fix display issue with shared context.
138136
# See the test below for details.
139-
@unittest.expectedFailure
140137
def test_display_has_unique_context(self):
141138
"""Two different pages should contain not overlapping display contexts."""
142139
left_template = PageTemplate.objects.create(name='left', h1='{{ tag }}')

0 commit comments

Comments
 (0)