1
1
from pathlib import Path
2
2
3
3
from django .core .management .base import BaseCommand
4
+ from django .template .loader import render_to_string
4
5
from django .test .client import RequestFactory
5
6
7
+ from pattern_library import get_base_template_names , get_pattern_base_template_name
6
8
from pattern_library .utils import (
7
- get_pattern_templates , render_pattern
9
+ get_pattern_templates , get_pattern_context , get_template_ancestors , render_pattern
8
10
)
9
11
10
12
@@ -27,10 +29,16 @@ def add_arguments(self, parser):
27
29
action = 'store_true' ,
28
30
help = "Render the patterns without writing them to disk." ,
29
31
)
32
+ parser .add_argument (
33
+ '--wrap-fragments' ,
34
+ action = 'store_true' ,
35
+ help = "Render fragment patterns wrapped in the base template." ,
36
+ )
30
37
31
38
def handle (self , ** options ):
32
39
self .verbosity = options ['verbosity' ]
33
40
self .dry_run = options ['dry_run' ]
41
+ self .wrap_fragments = options ['wrap_fragments' ]
34
42
self .output_dir = options ['output_dir' ]
35
43
36
44
templates = get_pattern_templates ()
@@ -44,6 +52,10 @@ def handle(self, **options):
44
52
else :
45
53
self .stderr .write (f'Target directory: { self .output_dir } ' )
46
54
55
+ if self .wrap_fragments :
56
+ self .stderr .write ('Writing fragment patterns wrapped in base template' )
57
+
58
+
47
59
# Resolve the output dir according to the directory the command is run from.
48
60
parent_dir = Path .cwd ().joinpath (self .output_dir )
49
61
@@ -60,7 +72,7 @@ def render_group(self, request, parent_dir: Path, pattern_templates):
60
72
self .stderr .write (template .origin .template_name )
61
73
62
74
render_path = parent_dir .joinpath (template .pattern_name )
63
- rendered_pattern = render_pattern (request , template .origin .template_name )
75
+ rendered_pattern = self . render_pattern (request , template .origin .template_name )
64
76
65
77
if self .dry_run :
66
78
if self .verbosity >= 2 :
@@ -78,3 +90,24 @@ def render_group(self, request, parent_dir: Path, pattern_templates):
78
90
if not self .dry_run :
79
91
group_parent .mkdir (exist_ok = True )
80
92
self .render_group (request , group_parent , pattern_templates )
93
+
94
+ def render_pattern (self , request , pattern_template_name ):
95
+ rendered_pattern = render_pattern (request , pattern_template_name )
96
+
97
+ # If we don’t wrap fragments in the base template, we can simply render the pattern and return as-is.
98
+ if not self .wrap_fragments :
99
+ return rendered_pattern
100
+
101
+ pattern_template_ancestors = get_template_ancestors (
102
+ pattern_template_name ,
103
+ context = get_pattern_context (pattern_template_name ),
104
+ )
105
+ pattern_is_fragment = set (pattern_template_ancestors ).isdisjoint (set (get_base_template_names ()))
106
+
107
+ if pattern_is_fragment :
108
+ base_template = get_pattern_base_template_name ()
109
+ context = get_pattern_context (base_template )
110
+ context ['pattern_library_rendered_pattern' ] = rendered_pattern
111
+ return render_to_string (base_template , request = request , context = context )
112
+ else :
113
+ return rendered_pattern
0 commit comments