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

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

#230: Added uninstallation browserlayer and updated install/uninstall tests

  • Property svn:eol-style set to native
File size: 5.0 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    controlpanel.unregisterConfiglet(old_product)
83    logger.info("Unregistered '%s' configlet from "\
84                "portal_controlpanel tool" % old_product)
85    # Remove qPloneGoogleSitemaps skin layer
86    for skinName in skins.getSkinSelections():
87        skin_paths = skins.getSkinPath(skinName).split(',') 
88        paths = [l.strip() for l in skin_paths if not l == old_product]
89        logger.info("Removed '%s' from '%s' skin." % (old_product, skinName))
90        skins.addSkinSelection(skinName, ','.join(paths))
91
92def recriateSitemaps(smaps):
93    msg = "Recriation Sitemaps: "
94    if smaps:
95        logger.info(msg + "Process %s sitemaps." % (
96                [sm.getPath() for sm in smaps]))
97        fields = ['id', 'sitemapType', 'portalTypes', 'states',
98                  'blackout_list','reg_exp', 'urls', 'pingTransitions']
99        for smb in smaps:
100            # get sitemap properties
101            sm_path = smb.getPath()
102            sm = smb.getObject()
103            container = aq_parent(sm)
104            data = {}
105            for fn in fields:
106                data[fn] = sm.getField(fn).getAccessor(sm)()
107            # Replace old GoogleSitemap by new one with
108            # previous properties
109            container.manage_delObjects(data['id'])
110            container.invokeFactory("Sitemap", id=data['id'])
111            new_sm = getattr(container, data['id'])
112            new_sm.update(**data)
113            new_sm.at_post_create_script()
114            logger.info("Successfully replaced '%s' Sitemap" % sm_path)
115    else:
116        logger.info(msg + "No sitemaps found")
117
118def getOldGSitemaps(site):
119    catalog = getToolByName(site, 'portal_catalog')
120    smaps = catalog(portal_type="Sitemap")
121    old_smb = [smb for smb in smaps \
122               if 'qPloneGoogleSitemaps' in str(smb.getObject().__class__)]
123    return old_smb
124   
125def migrate_qPGSM(context):
126    """ Clean-up qPloneGoogleSitemaps product artefacts and
127        recriate sitemaps from quintagroup.plonegooglesitemaps
128        package version 1.0.
129    """
130    if context.readDataFile('gsm_migration.txt') is None:
131        return
132
133    site = context.getSite()
134    old_gsmaps = getOldGSitemaps(site)
135    if old_gsmaps:
136        cleanup(site)
137        recriateSitemaps(old_gsmaps)
138        logger.info("Successfully migrated old GoogleSitemaps.")
139    else:
140        logger.info("No old GoogleSitemaps found.")
141
142
Note: See TracBrowser for help on using the repository browser.