Skip to content

Commit e4472ca

Browse files
committed
Override some ImportContent method for migration
1 parent adcf760 commit e4472ca

6 files changed

Lines changed: 162 additions & 1 deletion

File tree

base.cfg

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ eggs =
3636
Plone
3737
Pillow
3838
imio.smartweb.core
39+
collective.exportimport
3940
zcml =
4041
imio.smartweb.core
4142
imio.smartweb.core-overrides
@@ -68,4 +69,4 @@ imio.smartweb.core =
6869

6970
[remotes]
7071
imio = https://github.com/IMIO
71-
imio_push = git@github.com:IMIO
72+
imio_push = git@github.com:IMIO

src/imio/smartweb/core/browser/configure.zcml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<include package=".herobanner" />
2323
<include package=".ia" />
2424
<include package=".instancebehaviors" />
25+
<include package=".migration" />
2526
<include package=".minisite" />
2627
<include package=".subsite" />
2728
<include package=".search" />

src/imio/smartweb/core/browser/migration/__init__.py

Whitespace-only changes.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<configure
2+
xmlns="http://namespaces.zope.org/zope"
3+
xmlns:browser="http://namespaces.zope.org/browser">
4+
5+
<browser:page
6+
name="import_content"
7+
for="zope.interface.Interface"
8+
class=".import_content.CustomImportContent"
9+
layer="imio.smartweb.core.interfaces.IImioSmartwebCoreLayer"
10+
permission="cmf.ManagePortal"
11+
/>
12+
13+
<browser:page
14+
name="create_contents"
15+
for="*"
16+
class=".create.CreateContentsForMigration"
17+
permission="cmf.AddPortalContent"
18+
layer="imio.smartweb.core.interfaces.IImioSmartwebCoreLayer"
19+
/>
20+
21+
</configure>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from imio.smartweb.core.behaviors.subsite import IImioSmartwebSubsite
4+
from imio.smartweb.core.contents import IFolder
5+
from imio.smartweb.locales import SmartwebMessageFactory as _
6+
from plone import api
7+
from plone.app.layout.navigation.interfaces import INavigationRoot
8+
from Products.CMFPlone.interfaces.constrains import DISABLED
9+
from Products.CMFPlone.interfaces.constrains import ISelectableConstrainTypes
10+
from Products.Five.browser import BrowserView
11+
from plone.protect.interfaces import IDisableCSRFProtection
12+
from zope.interface import alsoProvides
13+
14+
15+
class CreateContentsForMigration(BrowserView):
16+
17+
def __call__(self):
18+
# Faut lancer la migration depuis /Plone
19+
alsoProvides(self.request, IDisableCSRFProtection)
20+
self.create_content("actualites", "Actualités")
21+
self.create_content("images", "Images")
22+
23+
def create_content(self, id, title):
24+
fr = [obj for obj in self.context.items() if obj[0] == "fr"][0][1]
25+
if id not in [i[0] for i in fr.items()]:
26+
api.content.create(
27+
id=id, title=title, container=fr, type="imio.smartweb.Folder"
28+
)
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
from collective.exportimport.import_content import ImportContent
2+
from imio.smartweb.core.behaviors.minisite import IImioSmartwebMinisite
3+
from imio.smartweb.core.behaviors.minisite import IImioSmartwebMinisiteSettings
4+
from imio.smartweb.core.contents.pages.pages import IDefaultPages
5+
from plone.dexterity.interfaces import IDexterityFTI
6+
from six.moves.urllib.parse import unquote
7+
from six.moves.urllib.parse import urlparse
8+
from zope.component import getUtility
9+
from zope.interface import alsoProvides
10+
from plone import api
11+
12+
import logging
13+
14+
logger = logging.getLogger(__name__)
15+
16+
17+
class CustomImportContent(ImportContent):
18+
19+
def create_container(self, item):
20+
"""Create container for item.
21+
22+
See remarks in get_parent_as_container for some corner cases.
23+
"""
24+
# if (
25+
# item["@id"]
26+
# == "http://localhost:8080/Plone/fr/je-suis/commercant/section-gallery/banner.jpg"
27+
# ):
28+
# import pdb
29+
30+
# pdb.set_trace()
31+
folder = self.context
32+
parent_url = unquote(item["parent"]["@id"])
33+
parent_url_parsed = urlparse(parent_url)
34+
# Get the path part, split it, remove the always empty first element.
35+
parent_path = parent_url_parsed.path.split("/")[1:]
36+
if (
37+
len(parent_url_parsed.netloc.split(":")) > 1
38+
or parent_url_parsed.netloc == "nohost"
39+
):
40+
# For example localhost:8080, or nohost when running tests.
41+
# First element will then be a Plone Site id.
42+
# Get rid of it.
43+
parent_path = parent_path[1:]
44+
45+
# Handle folderish Documents provided by plone.volto
46+
fti = getUtility(IDexterityFTI, name="Document")
47+
# BOULCH
48+
# if "fr/la-boverie/album/section-gallery/logo-laboverie.jpg" in item["@id"]:
49+
# import pdb
50+
51+
# pdb.set_trace()
52+
parent_type = (
53+
"Document"
54+
if fti.klass.endswith("FolderishDocument")
55+
else item["parent"]["@type"]
56+
)
57+
# parent_type = (
58+
# "Document" if fti.klass.endswith("FolderishDocument") else "Folder"
59+
# )
60+
# create original structure for imported content
61+
for element in parent_path:
62+
try:
63+
if element not in folder:
64+
folder = api.content.create(
65+
container=folder,
66+
type=parent_type,
67+
id=element,
68+
title=element,
69+
)
70+
logger.info(
71+
"Created container %s to hold %s",
72+
folder.absolute_url(),
73+
item["@id"],
74+
)
75+
else:
76+
folder = folder[element]
77+
except:
78+
print(f"ERREUR SUR :{element} -- {folder} -- {folder.absolute_url()}")
79+
80+
return folder
81+
82+
def global_obj_hook(self, obj, item):
83+
"""Inspect the content item before serialization data."""
84+
85+
if "cpskin.minisite.interfaces.IMinisiteRoot" in item.get(
86+
"_cpskin_interfaces", []
87+
):
88+
alsoProvides(obj, IImioSmartwebMinisite)
89+
alsoProvides(obj, IImioSmartwebMinisiteSettings)
90+
logger.info(f"Set minisite to {obj.absolute_url()} ")
91+
92+
if "imio.smartweb.core.contents.pages.pages.IDefaultPages" in item.get(
93+
"_smartweb_interfaces", []
94+
):
95+
alsoProvides(obj, IDefaultPages)
96+
logger.info(f"Set default page to {obj.absolute_url()} ")
97+
layout = item.get("layout")
98+
if layout:
99+
try:
100+
obj.setLayout(layout)
101+
logger.info(f"Set layout : {layout} to {obj.absolute_url()} ")
102+
# print(f"setLayout {layout} TO {obj.absolute_url()}")
103+
except AttributeError:
104+
pass
105+
obj.reindexObject()
106+
return obj
107+
108+
# !!! by default, this method remove item layout
109+
def global_dict_hook(self, item):
110+
return item

0 commit comments

Comments
 (0)