source: products/quintagroup.plonegooglesitemaps/tags/1.5.6/quintagroup/plonegooglesitemaps/setuphandlers.py

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

Added support of migration from qPloneGoogleSitemaps product
to quintagroup.plonegooglesitemaps with tests.
Also all views now registered on own browserlayer.

Merged revisions 3865,3867-3872,3874-3878 via svnmerge from
http://svn.quintagroup.com/products/quintagroup.plonegooglesitemaps/branches/migratioin_product

........

r3865 | mylan | 2010-09-15 20:54:50 +0300 (Wed, 15 Sep 2010) | 1 line


#230: Added module aliases - prevent breakage sitemap, created with qPloneGoogleSitemaps

........

r3867 | mylan | 2010-09-17 11:41:35 +0300 (Fri, 17 Sep 2010) | 1 line


#230: Added browserlayer and registered all sitemaps views and configlet view to it

........

r3868 | mylan | 2010-09-17 13:12:09 +0300 (Fri, 17 Sep 2010) | 1 line


#230: remove module aliases

........

r3869 | mylan | 2010-09-17 13:13:14 +0300 (Fri, 17 Sep 2010) | 1 line


#230: Added migration from qPloneGoogleSitemaps to quintagroup.plonegooglesitemaps

........

r3870 | mylan | 2010-09-17 14:02:47 +0300 (Fri, 17 Sep 2010) | 1 line


#230: Added upgrade/migration step by step reference.

........

r3871 | mylan | 2010-09-17 14:41:04 +0300 (Fri, 17 Sep 2010) | 1 line


#230: Fix tests after registering all views to the browser layer

........

r3872 | mylan | 2010-09-17 14:55:43 +0300 (Fri, 17 Sep 2010) | 1 line


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

........

r3874 | mylan | 2010-09-20 13:12:26 +0300 (Mon, 20 Sep 2010) | 1 line


#230: Added test for browser layer uninstallation

........

r3875 | mylan | 2010-09-20 15:37:00 +0300 (Mon, 20 Sep 2010) | 1 line


#230: Fix cleanup during migration from the qPloneGoogleSitemaps

........

r3876 | mylan | 2010-09-20 15:38:18 +0300 (Mon, 20 Sep 2010) | 1 line


#230: Fix typos in GS profile and import step

........

r3877 | mylan | 2010-09-20 18:23:20 +0300 (Mon, 20 Sep 2010) | 1 line


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

........

r3878 | mylan | 2010-09-22 14:17:07 +0300 (Wed, 22 Sep 2010) | 1 line


#230: some upgrade tests reorganization

........

  • 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.