1 | """ |
---|
2 | Local templates for the qplone3_theme |
---|
3 | """ |
---|
4 | import os |
---|
5 | from ConfigParser import SafeConfigParser |
---|
6 | from paste.script import pluginlib |
---|
7 | |
---|
8 | from zopeskel.base import var |
---|
9 | from zopeskel.localcommands import ZopeSkelLocalTemplate |
---|
10 | |
---|
11 | class QThemeSubTemplate(ZopeSkelLocalTemplate): |
---|
12 | use_cheetah = True |
---|
13 | parent_templates = ['qplone3_theme'] |
---|
14 | |
---|
15 | # Flag for use template composition |
---|
16 | compose = None |
---|
17 | compodir_pref = "_compo" |
---|
18 | # list of 2 item tuple - |
---|
19 | # (compotemplate_name, compo marker), for ex.: |
---|
20 | compo_template_markers = [] |
---|
21 | # list vars names to add in theme_vars egg_info file |
---|
22 | shared_vars = [] |
---|
23 | |
---|
24 | def template_dir(self): |
---|
25 | if self.compose: |
---|
26 | # Prepare |
---|
27 | self._template_dir = os.path.join( \ |
---|
28 | self._template_dir + self.compodir_pref, \ |
---|
29 | self.compose ) |
---|
30 | |
---|
31 | return super(QThemeSubTemplate, self).template_dir() |
---|
32 | |
---|
33 | def pre(self, command, output_dir, vars): |
---|
34 | """ Get all previous template vars |
---|
35 | """ |
---|
36 | for k, v in self.get_template_vars(output_dir, vars).items(): |
---|
37 | if not k in vars.keys(): |
---|
38 | vars[k] = v |
---|
39 | super(QThemeSubTemplate, self).pre(command, output_dir, vars) |
---|
40 | |
---|
41 | def post(self, command, output_dir, vars): |
---|
42 | """ Call write_files function for every subtemplate, |
---|
43 | - change marker name for every subtemplate, |
---|
44 | - set compose prop for change subtemplate path calculation |
---|
45 | """ |
---|
46 | if self.compo_template_markers: |
---|
47 | for cname, cmarker in self.compo_template_markers: |
---|
48 | original_template_dir = self._template_dir |
---|
49 | self.compose = cname |
---|
50 | self.marker_name = cmarker |
---|
51 | self.write_files(command, output_dir, vars) |
---|
52 | self._template_dir = original_template_dir |
---|
53 | |
---|
54 | self.add_template_vars(output_dir, vars) |
---|
55 | super(QThemeSubTemplate, self).post(command, output_dir, vars) |
---|
56 | |
---|
57 | def get_template_vars(self, output_dir, vars): |
---|
58 | |
---|
59 | res = {} |
---|
60 | egg_info = pluginlib.find_egg_info_dir(output_dir) |
---|
61 | theme_vars_fp = os.path.join(egg_info, 'theme_vars.txt') |
---|
62 | |
---|
63 | if egg_info and os.path.exists(theme_vars_fp): |
---|
64 | config = SafeConfigParser() |
---|
65 | config.read(theme_vars_fp) |
---|
66 | |
---|
67 | for section in config.sections(): |
---|
68 | for option in config.options(section): |
---|
69 | key = section + '_' + option |
---|
70 | val = config.get(section, option) |
---|
71 | if section == 'multiple_templates': |
---|
72 | val = val.split(',') |
---|
73 | res[key] = val |
---|
74 | |
---|
75 | return res |
---|
76 | |
---|
77 | def add_template_vars(self, output_dir, vars): |
---|
78 | |
---|
79 | egg_info = pluginlib.find_egg_info_dir(output_dir) |
---|
80 | theme_vars_fp = os.path.join(egg_info, 'theme_vars.txt') |
---|
81 | |
---|
82 | if egg_info and os.path.exists(theme_vars_fp): |
---|
83 | config = SafeConfigParser() |
---|
84 | config.read(theme_vars_fp) |
---|
85 | |
---|
86 | # Update qplone3_theme used_subtemplate option |
---|
87 | sec, opt = 'qplone3_theme', 'used_subtemplates' |
---|
88 | val = filter(None,[st.strip() \ |
---|
89 | for st in config.get(sec,opt).split(',')]) |
---|
90 | val.append(self.name) |
---|
91 | config.set(sec, opt, ','.join(set(val))) |
---|
92 | |
---|
93 | # Add subtemplate vars |
---|
94 | if self.shared_vars: |
---|
95 | thesection = self.name |
---|
96 | if config.has_section(thesection): |
---|
97 | msection = 'multiple_templates' |
---|
98 | moption = self.name |
---|
99 | |
---|
100 | if not config.has_section(msection): |
---|
101 | config.add_section(msection) |
---|
102 | |
---|
103 | val = [] |
---|
104 | if config.has_option(msection, moption): |
---|
105 | val = config.get(msection, moption).split(',') |
---|
106 | else: |
---|
107 | val.append(moption) |
---|
108 | thesection = "%s_%d"%(moption,len(val)) |
---|
109 | val.append(thesection) |
---|
110 | |
---|
111 | config.set(msection, moption, ','.join(val)) |
---|
112 | |
---|
113 | config.add_section(thesection) |
---|
114 | for k in self.shared_vars: |
---|
115 | config.set(thesection, k, vars[k]) |
---|
116 | |
---|
117 | # Save theme_vars.txt file |
---|
118 | theme_file = file(theme_vars_fp,'w') |
---|
119 | config.write(theme_file) |
---|
120 | theme_file.close() |
---|