root/qPloneSkinDump/branches/multipleslots/generatingTemplate.py

Revision 936 (checked in by koval, 1 year ago)

now dumped skin product will add layer with generated main_template.pt after custom if required

Line 
1 from Products.CMFCore.utils import getToolByName
2 from AccessControl import ModuleSecurityInfo
3 import re
4
5 security = ModuleSecurityInfo('Products.qPloneSkinDump.generatingTemplate')
6
7 tags = {'default'   : '<td id="portal-columns-%s" colspan="3">\n%s\n</td>',
8         'tableless' : '<div id="portal-columns-%s">\n%s\n</div>'}
9 div = '<div metal:use-macro="%s">Some content from macro</div>'
10 span = '<span tal:replace="structure python:path(\'%s\')" />'
11 pattern = re.compile(r"<([^< ]*)[^<]*extract_portlets\('(.*?)'\).*?>", re.DOTALL)
12
13 p_sheet_id = 'generation_properties'
14 p_id = 'subfolder_name'
15
16 security.declarePublic('generate')
17 def generate(context, skin_name, layer_name, subfolder_name):
18     # add property sheet on plone site object which will store subfolder name with generated main_template.pt
19     pp = getToolByName(context, 'portal_properties')
20     if not p_sheet_id in pp.objectIds():
21         pp.addPropertySheet(id=p_sheet_id, title=p_sheet_id)
22     else:
23         pp.manage_delObjects(ids=[p_sheet_id])
24         pp.addPropertySheet(id=p_sheet_id, title=p_sheet_id)
25     p_sheet = pp[p_sheet_id]
26     if p_sheet.hasProperty(p_id):
27         p_sheet._updateProperty(p_id, subfolder_name)
28     else:
29         p_sheet._setProperty(p_id, subfolder_name, 'string')
30     ps = getToolByName(context, 'portal_skins')
31     # get the most specific main_template, which is contained in current skin's layers
32     paths = ps.getSkinPath(skin_name).split(',')
33     for path in paths:
34         if 'main_template' in ps[path].objectIds():
35             break
36     mt = ps[path].main_template.document_src()
37     # find all slots which must be expand
38     finded_slots = pattern.findall(mt)
39     for tag, slot_name in finded_slots:
40         # now we'll use qMultipleSlots product's extract_portlets function and create replacement string
41         slots = context.extract_portlets(slot_name)
42         replacement = []
43         for k, v in slots:
44             if v: replacement.append(div % k)
45             else: replacement.append(span % k)
46         replacement = '\n'.join(replacement)
47         # next find the part of main_template which will be replaced
48         m = pattern.search(mt)
49         closing_tag = "</%s>" % tag
50         start = m.start()
51         end = mt[start:].find(closing_tag) + start + len(closing_tag)
52         string_to_replace = mt[start:end]
53         # next is needed for placing replacement in <div> or <td> tags
54         if slot_name.startswith('columns'):
55             outer_tag = '</div>' in string_to_replace and tags['tableless'] or tags['default']
56             replacement = replacement and outer_tag % (slot_name.split('_')[1], replacement)
57         mt = mt.replace(string_to_replace, replacement)
58     # create template object in portal_skins
59     ps[layer_name].manage_addFolder(id=subfolder_name)
60     subfolder = getattr(ps[layer_name], subfolder_name)
61     subfolder.manage_addProduct['PageTemplates'].manage_addPageTemplate(id='main_template', text=mt)
62
63 security.declarePublic('available')
64 def available(context):
65     ps = getToolByName(context, 'portal_skins')
66     skin_name = context.getCurrentSkinName()
67     paths = ps.getSkinPath(skin_name).split(',')
68     return 'qmultipleslots' in paths
69
70 security.apply(globals())
Note: See TracBrowser for help on using the browser.