source: products/quintagroup.seoptimizer/branches/refactoring2.3.0/quintagroup/seoptimizer/upgrades.py @ 1930

Last change on this file since 1930 was 1930, checked in by liebster, 14 years ago

Add seo_canonical property migration

File size: 5.6 KB
Line 
1import logging
2from zope.component import queryMultiAdapter
3from Products.CMFCore.utils import getToolByName
4
5from quintagroup.canonicalpath.interfaces  import ICanonicalLink
6from quintagroup.canonicalpath.adapters import PROPERTY_LINK
7
8logger = logging.getLogger('quintagroup.seoptimizer')
9FIX_PTYPES_DOMAIN = ['Document', 'File', 'News Item']
10REMOVE_SEOPROPERTIES = ['additional_keywords', 'settings_use_keywords_sg',
11                        'settings_use_keywords_lg', 'filter_keywords_by_content',
12                       ]
13
14def changeDomain(plone_tools):
15    """ Fix i18n_domain bug for some portal_types,
16    which present in earlier versions of the package.
17    """
18    types_tool = plone_tools.types()
19    for ptype in [ptypes for ptypes in types_tool.objectValues()
20                         if ptypes.id in FIX_PTYPES_DOMAIN]:
21        if ptype.i18n_domain == 'quintagroup.seoptimizer':
22            ptype.i18n_domain = 'plone'
23            logger.log(logging.INFO, "I18n Domain of the type \'%s\' "
24                       "changed to \'plone\'." % ptype.id)
25
26def changeMetatagsOrderList(plone_tools):
27    """ Change format metatags order list from "metaname accessor" to "metaname".
28    """
29    types_tool = plone_tools.types()
30    setup_tool = plone_tools.url().getPortalObject().portal_setup
31    seoprops_tool = plone_tools.properties().seo_properties
32    if seoprops_tool.hasProperty('metatags_order'):
33        mto = seoprops_tool.getProperty('metatags_order', [])
34        mto_new = [line.split(' ')[0].strip() for line in mto]
35        if not list(mto) == mto_new:
36            logger.log(logging.INFO, "Changed format metatags order list in "
37                       "configlet from \"metaname accessor\" to \"metaname\".")
38            seoprops_tool.manage_changeProperties(metatags_order=mto_new)
39    else:
40        setup_tool.runImportStepFromProfile('profile-quintagroup.seoptimizer:default',
41                                            'propertiestool')
42
43
44def migrationActions(plone_tools):
45    """ Migration actions from portal_types action to seoproperties tool
46    (for seoaction in portal_actions).
47    """
48    types_tool = plone_tools.types()
49    seoprops_tool = plone_tools.properties().seo_properties
50    ctws = list(seoprops_tool.getProperty('content_types_with_seoproperties', []))
51    flag = False
52    for ptype in types_tool.objectValues():
53        idxs = [idx_act[0] for idx_act in enumerate(ptype.listActions())
54                           if idx_act[1].id == 'seo_properties']
55        if idxs:
56            if ptype.id not in ctws:
57                ctws.append(ptype.id)
58                flag = True
59            ptype.deleteActions(idxs)
60            logger.log(logging.INFO, "Moved \"SEO Properties\" action from %s "
61                       "type in portal actions." % ptype.id)
62    if flag:
63        seoprops_tool.manage_changeProperties(content_types_with_seoproperties=ctws)
64
65def removeNonUseSeoProperties(plone_tools):
66    """ Revome properties used in earlier versions of the package
67    """
68    seoprops_tool = plone_tools.properties().seo_properties
69    remove_properties = []
70    for pr in REMOVE_SEOPROPERTIES:
71      if seoprops_tool.hasProperty(pr):
72          remove_properties.append(pr)
73          logger.log(logging.INFO, "Removed %s property in seoproperties tool." % pr)
74    if not remove_properties:
75        seoprops_tool.manage_delProperties(remove_properties)
76
77def removeSkin(plone_tools):
78    """ Remove layers.
79    """
80    layer = 'quintagroup.seoptimizer'
81    skins_tool = plone_tools.url().getPortalObject().portal_skins
82    for skinName in skins_tool.getSkinSelections():
83        skin_paths = skins_tool.getSkinPath(skinName).split(',') 
84        paths = [l.strip() for l in skin_paths if not (l == layer or l.startswith(layer+'/'))]
85        logger.log(logging.INFO, "Removed layers from %s skin." % skinName)
86        skins_tool.addSkinSelection(skinName, ','.join(paths))
87
88def migrateCanonical(plone_tools):
89    """ Rename qSEO_canonical property into PROPERTY_LINK
90        for all portal objects, which use SEO
91    """
92    types = plone_tools.types()
93    portal = plone_tools.url().getPortalObject()
94    allCTTypes = types.listContentTypes()
95    obj_metatypes =  [m.content_meta_type for m in types.objectValues() \
96                      if m.getId() in allCTTypes]
97    portal.ZopeFindAndApply(
98                            portal,
99                            obj_metatypes=','.join(obj_metatypes),
100                            apply_func=renameProperty
101                            )
102
103def renameProperty(obj, path):
104    """ Rename qSEO_canonical property into PROPERTY_LINK
105        for obj, which use SEO
106    """
107    if obj.hasProperty('qSEO_canonical'):
108        value = obj.getProperty('qSEO_canonical')
109
110        level, msg = logging.INFO, "For %(url)s object 'qSEO_canonical' "\
111                     "property renamed to '%(name)s'."
112        try:
113            ICanonicalLink(obj).canonical_link = value
114        except e:
115            level, msg = logging.ERROR, "%s on renaming 'qSEO_canonical' " \
116                         "property for %%(url)s object" % str(e)
117
118        logger.log(level, msg % {'url':obj.absolute_url(), 'name':PROPERTY_LINK} )
119        obj.manage_delProperties(['qSEO_canonical'])
120
121def upgrade_2_to_3(setuptool):
122    """ Upgrade quintagroup.seoptimizer from version 2.x.x to 3.0.0.
123    """
124    plone_tools = queryMultiAdapter((setuptool, setuptool.REQUEST), name="plone_tools")
125    setuptool.runAllImportStepsFromProfile('profile-quintagroup.seoptimizer:upgrade_2_to_3')
126    migrationActions(plone_tools)
127    changeDomain(plone_tools)
128    changeMetatagsOrderList(plone_tools)
129    removeNonUseSeoProperties(plone_tools)
130    removeSkin(plone_tools)
131    migrateCanonical(plone_tools)
Note: See TracBrowser for help on using the repository browser.