source: products/quintagroup.plonegooglesitemaps/branches/migratioin_product/quintagroup/plonegooglesitemaps/setuphandlers.py @ 2838

Last change on this file since 2838 was 2838, checked in by mylan, 14 years ago

#230: Added tests of migration from qPloneGoogleSitemap to quintagroup.plonegooglesitemap.

  • Property svn:eol-style set to native
File size: 5.1 KB
Line 
1import sys
2import logging
3from zope.component import getSiteManager
4from zope.component import getGlobalSiteManager
5
6from Acquisition import aq_parent
7from Products.CMFCore.utils import getToolByName
8
9from config import SUPPORT_BLAYER
10from quintagroup.plonegooglesitemaps.content.newsextender import NewsExtender
11
12logger = logging.getLogger('quintagroup.plonegooglesitemaps')
13
14def unregisterSchemaExtenderAdapters(site):
15    """ Unregister news schema extender adapters
16        from local component registry.
17    """
18    lsm = getSiteManager(site)
19    gsm = getGlobalSiteManager()
20    if lsm == gsm:
21        logger.warning("Not found local component registry")
22        return
23
24    unregistered = []
25    registrations = tuple(lsm.registeredAdapters())
26    for registration in registrations:
27        factory = registration.factory
28        if factory == NewsExtender:
29            required = registration.required
30            provided = registration.provided
31            name = registration.name
32            lsm.unregisterAdapter(factory=factory,
33                required=required, provided=provided, name=name)
34            unregistered.append(str(required))
35    logger.info("Unregistered news schema extender adapters for: %s" % unregistered)
36
37def removeConfiglet(site):
38    """ Remove configlet.
39    """
40    conf_id = 'GoogleSitemaps'
41    controlpanel_tool = getToolByName(site, 'portal_controlpanel')
42    if controlpanel_tool:
43        controlpanel_tool.unregisterConfiglet(conf_id)
44        logger.log(logging.INFO, "Unregistered \"%s\" configlet." % conf_id)
45
46def removeBrowserLayer(site):
47    """ Remove browser layer.
48    """
49    if not SUPPORT_BLAYER:
50        return
51
52    from plone.browserlayer.utils import unregister_layer
53    from plone.browserlayer.interfaces import ILocalBrowserLayerType
54
55    name="quintagroup.plonegooglesitemaps"
56    site = getSiteManager(site)
57    registeredLayers = [r.name for r in site.registeredUtilities()
58                        if r.provided == ILocalBrowserLayerType]
59    if name in registeredLayers:
60        unregister_layer(name, site_manager=site)
61        logger.log(logging.INFO, "Unregistered \"%s\" browser layer." % name)
62
63def uninstall(context):
64    """ Do customized uninstallation.
65    """
66    if context.readDataFile('gsm_uninstall.txt') is None:
67        return
68    site = context.getSite()
69    unregisterSchemaExtenderAdapters(site)
70    removeConfiglet(site)
71    removeBrowserLayer(site)
72
73
74def cleanup(site):
75    """Clean-up qPloneGoogleSitemaps artefacts."""
76    old_product = "qPloneGoogleSitemaps"
77    # Get plone tools
78    pp = getToolByName(site, 'portal_properties')
79    skins = getToolByName(site, 'portal_skins')
80    controlpanel = getToolByName(site, 'portal_controlpanel')
81    # Remove old configlet from controlpanel
82    configlet_ids = [ai['id'] for ai in controlpanel.listActionInfos()]
83    if old_product in configlet_ids:
84        controlpanel.unregisterConfiglet(old_product)
85        logger.info("Unregistered '%s' configlet from "\
86                    "portal_controlpanel tool." % old_product)
87    # Remove qPloneGoogleSitemaps skin layer
88    for skinName in skins.getSkinSelections():
89        skin_paths = skins.getSkinPath(skinName).split(',') 
90        paths = [l.strip() for l in skin_paths if not l == old_product]
91        if len(paths) < len(skin_paths):
92            logger.info("Removed '%s' from '%s' skin." % (old_product, skinName))
93        skins.addSkinSelection(skinName, ','.join(paths))
94
95def recriateSitemaps(smaps):
96    msg = "Recriation Sitemaps: "
97    if smaps:
98        logger.info(msg + "Process %s sitemaps." % (
99                [sm.getPath() for sm in smaps]))
100        fields = ['id', 'sitemapType', 'portalTypes', 'states',
101                  'blackout_list','reg_exp', 'urls', 'pingTransitions']
102        for smb in smaps:
103            # get sitemap properties
104            sm_path = smb.getPath()
105            sm = smb.getObject()
106            container = aq_parent(sm)
107            data = {}
108            for fn in fields:
109                data[fn] = sm.getField(fn).getAccessor(sm)()
110            # Replace old GoogleSitemap by new one with
111            # previous properties
112            container.manage_delObjects(data['id'])
113            container.invokeFactory("Sitemap", id=data['id'])
114            new_sm = getattr(container, data['id'])
115            new_sm.update(**data)
116            new_sm.at_post_create_script()
117            logger.info("Successfully replaced '%s' Sitemap" % sm_path)
118
119def getOldGSitemaps(site):
120    catalog = getToolByName(site, 'portal_catalog')
121    smaps = catalog(portal_type="Sitemap")
122    old_smb = [smb for smb in smaps \
123               if 'qPloneGoogleSitemaps' in str(smb.getObject().__class__)]
124    return old_smb
125   
126def migrate_qPGSM(context):
127    """ Clean-up qPloneGoogleSitemaps product artefacts and
128        recriate sitemaps from quintagroup.plonegooglesitemaps
129        package version 1.0.
130    """
131    if context.readDataFile('gsm_migration.txt') is None:
132        return
133
134    site = context.getSite()
135    cleanup(site)
136    old_gsmaps = getOldGSitemaps(site)
137    if old_gsmaps:
138        recriateSitemaps(old_gsmaps)
139        logger.info("Successfully migrated old GoogleSitemaps.")
140    else:
141        logger.info("No old GoogleSitemaps found.")
142
143
Note: See TracBrowser for help on using the repository browser.