[1] | 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()) |
---|