source: products/quintagroup.themetemplate/trunk/quintagroup/themetemplate/localcommands/subtemplates.py @ 3221

Last change on this file since 3221 was 1360, checked in by mylan, 15 years ago

#110: Updated doctests for css_dtml_skin subtemplate

File size: 10.8 KB
Line 
1"""
2Local templates for the qplone3_theme
3"""
4import os, sys, re, datetime, copy
5from ConfigParser import SafeConfigParser
6from paste.script import pluginlib
7
8from zopeskel.base import var
9from zopeskel.localcommands import ZopeSkelLocalTemplate
10
11from quintagroup.themetemplate import getEggInfo
12from quintagroup.themetemplate import getThemeVarsFP
13from quintagroup.themetemplate.localcommands import QThemeSubTemplate
14
15RESP = re.compile("\s+")
16REBAN = re.compile("[\\\/\,\.\+\-\*\%\~\@\#\$\^\&\|\;\:\?\(\)\=\[\]\{\}\_]+")
17
18
19class SkinLayerSubTemplate(QThemeSubTemplate):
20    """
21    A Plone Skin layer skeleton
22    """
23    _template_dir = 'templates/skinlayer'
24    summary = "A Plone 3 Skin Layer"
25
26    compo_template_markers = [
27        ('layer4Skin',   'extra layer stuff goes here'),
28    ]
29
30    vars = [
31      var('layer_name', 'Skin Layer name (should not contain spaces)',
32           default="skin_layer"),
33      var('insert_type', 'Where insert the layer ("after" or "before")', default="after"),
34      var('insert_control_layer',
35          'Layer after or before which your layer will be inserted, "*" accepted, which mean all',
36          default='custom'),
37           ]
38
39
40class CSSSubTemplate(QThemeSubTemplate):
41    """
42    A Plone CSS resource skeleton
43    """
44    _template_dir = 'templates/cssresource'
45    summary = "A Plone 3 CSS resource template"
46   
47    vars = [
48      var('css_resource_name', 'Name of CSS resource',
49           default="main.css"),
50      var('css_file_path', 'Path to CSS file. If no path-empty file will be created.',
51           default=''),
52      var('cssreg_media', 'Optional.Possible values:screen,print,projection,handheld',
53           default="screen", ),
54      var('cssreg_rel', 'Optional', default="stylesheet"),
55      var('cssreg_rendering', 'Optional.Possible values:import,link,inline', default="inline"),
56      var('cssreg_cacheable', '', default="True"),
57      var('cssreg_compression', 'Compression type', default="safe"),
58      var('cssreg_cookable', 'Boolean, aka merging allowed', default="True"),
59      var('cssreg_enables', 'Optional.Boolean', default="1"),
60      var('cssreg_expression', 'Optional.A tal condition.', default=""),
61           ]
62
63    def pre(self, command, output_dir, vars):
64        """ Set 'css_resource_content' value from css_file_path
65        """
66        super(CSSSubTemplate, self).pre(command, output_dir, vars)
67
68        vars['css_resource_content'] = ''
69        if os.path.isfile(vars['css_file_path']):
70            vars['css_resource_content'] = file(vars['css_file_path'],'rb').read()
71
72
73class CSSSkinLayerSubTemplate(CSSSubTemplate):
74    """
75    A Plone CSS resource, placed as DTML-file in a skin layer
76    """
77    _template_dir = 'templates/cssskinresource'
78    summary = "A DTML file in skin layer with CSS registration"
79   
80    vars = [
81      var('layer_name', 'Layer name for css resource add to',
82          default="skin_layer"),
83    ] + copy.deepcopy(CSSSubTemplate.vars)
84
85    def pre(self, command, output_dir, vars):
86        """ Remove trailing spaces from layer name
87        """
88        super(CSSSkinLayerSubTemplate, self).pre(command, output_dir, vars)
89        vars['layer_name'] = vars['layer_name'].strip()
90
91
92class JSSubTemplate(QThemeSubTemplate):
93    """
94    A Plone JS resource skeleton
95    """
96    _template_dir = 'templates/jsresource'
97    summary = "A Plone 3 JS resource template"
98   
99    vars = [
100      var('js_resource_name', 'Name of JS resource', default="foo.js"),
101      var('js_file_path', 'Path to JS file. If no path - empty file will be created',
102          default=''),
103      var('jsreg_inline', 'Optional.Boolean', default="False"),
104      var('jsreg_cacheable', '', default="True"),
105      var('jsreg_compression', 'Compression type.Possible:none,safe,full,safe-encode,full-encode',
106          default="safe"),
107      var('jsreg_cookable', 'Boolean, aka merging allowed', default="True"),
108      var('jsreg_enables', 'Optional.Boolean', default="1"),
109      var('jsreg_expression', 'Optional.A tal condition.', default=""),
110           ]
111
112    def pre(self, command, output_dir, vars):
113        """ Set 'js_resource_content' value from js_file_path
114        """
115        super(JSSubTemplate, self).pre(command, output_dir, vars)
116       
117        vars['js_resource_content'] = ''
118        if os.path.isfile(vars['js_file_path']):
119            vars['js_resource_content'] = file(vars['js_file_path'],'rb').read()
120
121
122class ViewletOrderSubTemplate(QThemeSubTemplate):
123    """
124    A Plone Order Viewlet skeleton
125    """
126    _template_dir = 'templates/viewlet'
127    summary = "A Plone 3 Order Viewlet template"
128   
129    # list of 2 item tuple -
130    # (compotemplate_name, compo marker), for ex.:
131    compo_template_markers = []
132
133    shared_vars = ['viewlet_profile_marker',]
134
135    vars = [
136      var('viewlet_name', "Viewlet name", default='example'),
137      var('viewlet_manager_interface', "Viewlet manager interface",
138          default="plone.app.layout.viewlets.interfaces.IPortalHeader"),
139      var('viewlet_manager_name', "Viewlet manager name", default='plone.portalheader'),
140      var('viewlet_permission', "Viewlet permission", default="zope2.View"),
141
142
143      var('insert_type', 'Where insert the viewlet ("after" or "before")', default="after"),
144      var('insert_control_viewlet', 'Viewlet after or before which your viewlet will be inserted, ' \
145          '"*" accepted, which mean all', default='*'),
146
147      var('layer_interface', "Layer interface for registry this viewlet on", 
148          default=".interfaces.IThemeSpecific"),
149      var('layer_name', "Layer name for registry this viewlet on", default=""),
150      #var('skinname', "Skin name, for bind viewlet to, '*' - mean for all", default=""),
151      #var('skinbase', "Base skin, for get viewlets from", default=""),
152           ]
153
154    def pre(self, command, output_dir, vars):
155        """ Set 'css_resource_content' value from css_file_path
156        """
157        super(ViewletOrderSubTemplate, self).pre(command, output_dir, vars)
158
159        vn_lower_nospc = RESP.sub('',vars['viewlet_name']).lower()
160        vn_lower_under = RESP.sub('_',vars['viewlet_name']).lower()
161        VnCamel = ''.join([i.capitalize() for i in REBAN.sub(' ',vars['viewlet_name']).split()])
162        vars['viewlet_class_name'] = VnCamel
163        vars['viewlet_interface_name'] = "I"+VnCamel
164        vars['viewlet_template_name'] = vn_lower_nospc+'_viewlet.pt'
165
166        viewlet_profile_marker = "[order_%s] viewlet stuff goes here" % \
167            '.'.join([vars['viewlet_manager_name'], vars['qplone3_theme_skinname'], 
168                      vars['qplone3_theme_skinbase']])
169       
170        vars['add_order_tag'] = self.add_order_tag(output_dir, vars, viewlet_profile_marker)
171        vars['viewlet_profile_marker'] = viewlet_profile_marker
172        self.compo_template_markers.append(
173            ('viewlet_profiles',viewlet_profile_marker))
174
175
176    def add_order_tag(self, output_dir, vars, pmarker):
177        need_update = True
178        egg_info = getEggInfo(output_dir)
179        theme_vars_fp = getThemeVarsFP(egg_info)
180
181        if os.path.exists(theme_vars_fp):
182            config = SafeConfigParser()
183            config.read(theme_vars_fp)
184
185            sec, opt = 'qplone3_theme', 'used_subtemplates'
186            used_subtemplates = filter(None,[st.strip() \
187                         for st in config.get(sec,opt).split(',')])
188           
189            if self.name in used_subtemplates:
190                sections = [self.name,]
191                if config.has_section('multiple_templates') and \
192                  config.has_option('multiple_templates',self.name):
193                    ms_sections = config.get('multiple_templates',self.name)
194                    sections = [s.strip() for s in ms_sections.split(',')]
195
196                pmarkers = [config.get(sec, 'viewlet_profile_marker') \
197                            for sec in sections]
198                if pmarker in pmarkers:
199                    need_update = False
200
201        return need_update
202
203
204class ViewletHiddenSubTemplate(QThemeSubTemplate):
205    """
206    A Plone Hidden Viewlet skeleton
207    """
208    _template_dir = 'templates/viewlet_hidden'
209    summary = "A Plone 3 Hidden Viewlet template"
210
211    shared_vars = ['viewlet_profile_marker',]
212
213    compo_template_markers = []
214   
215    vars = [
216      var('viewlet_name', "Viewlet name", default='plone.global_sections'),
217      var('viewlet_manager_name', "Viewlet manager name", default='plone.portalheader'),
218      #var('skinname', "Skin name, for bind viewlet to, may be '*'", default=""),
219           ]
220
221    def pre(self, command, output_dir, vars):
222        """ Set 'css_resource_content' value from css_file_path
223        """
224        super(ViewletHiddenSubTemplate, self).pre(command, output_dir, vars)
225         
226        viewlet_profile_marker = "[hidden_%s] viewlet stuff goes here" % \
227            '.'.join([vars['viewlet_manager_name'], vars['qplone3_theme_skinname']])
228
229        vars['add_hidden_tag'] = self.add_hidden_tag(output_dir, vars, viewlet_profile_marker)
230        vars['viewlet_profile_marker'] = viewlet_profile_marker
231        self.compo_template_markers.append(
232            ('viewlet_hidden_profiles',viewlet_profile_marker))
233
234
235    def add_hidden_tag(self, output_dir, vars, pmarker):
236        add_hidden = True
237        egg_info = getEggInfo(output_dir)
238        theme_vars_fp = getThemeVarsFP(egg_info)
239
240        if os.path.exists(theme_vars_fp):
241            config = SafeConfigParser()
242            config.read(theme_vars_fp)
243
244            sec, opt = 'qplone3_theme', 'used_subtemplates'
245            used_subtemplates = filter(None,[st.strip() \
246                         for st in config.get(sec,opt).split(',')])
247           
248            if self.name in used_subtemplates:
249                sections = [self.name,]
250                if config.has_section('multiple_templates') and \
251                  config.has_option('multiple_templates',self.name):
252                    ms_sections = config.get('multiple_templates',self.name)
253                    sections = [s.strip() for s in ms_sections.split(',')]
254
255                pmarkers = [config.get(sec, 'viewlet_profile_marker') \
256                            for sec in sections]
257                if pmarker in pmarkers:
258                    add_hidden = False
259        return add_hidden
260
261class ImportSubTemplate(QThemeSubTemplate):
262    """
263    A skeleton for importing zexp objects into portal on theme installation
264    """
265    _template_dir = 'templates/importing'
266    summary = "A template for importing zexp-objects into portal on installation"
267   
268    def pre(self, command, output_dir, vars):
269        """ Set timestamp var for generate import_steps profile id
270        """
271        super(ImportSubTemplate, self).pre(command, output_dir, vars)
272
273        vars['timestamp'] = datetime.date.today().strftime("%Y%m%d")
274        vars['already_used'] = self.already_used(vars)
275
276    def already_used(self, vars):
277        used = vars.get('qplone3_theme_used_subtemplates','').split(',')
278        return self.name in filter(None,[st.strip() for st in used])
Note: See TracBrowser for help on using the repository browser.