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()) |
---|