| 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 |
|
|---|
| 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 |
|
|---|
| 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 |
|
|---|
| 38 |
finded_slots = pattern.findall(mt) |
|---|
| 39 |
for tag, slot_name in finded_slots: |
|---|
| 40 |
|
|---|
| 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 |
|
|---|
| 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 |
|
|---|
| 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 |
|
|---|
| 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()) |
|---|