[2830] | 1 | import sys |
---|
[2408] | 2 | import logging |
---|
| 3 | from zope.component import getSiteManager |
---|
| 4 | from zope.component import getGlobalSiteManager |
---|
[2830] | 5 | |
---|
| 6 | from Acquisition import aq_parent |
---|
[2595] | 7 | from Products.CMFCore.utils import getToolByName |
---|
[2830] | 8 | |
---|
[2833] | 9 | from config import SUPPORT_BLAYER |
---|
[2408] | 10 | from quintagroup.plonegooglesitemaps.content.newsextender import NewsExtender |
---|
| 11 | |
---|
| 12 | logger = logging.getLogger('quintagroup.plonegooglesitemaps') |
---|
| 13 | |
---|
| 14 | def 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 | |
---|
[2595] | 37 | def 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) |
---|
[2408] | 45 | |
---|
[2833] | 46 | def 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 | |
---|
[2408] | 63 | def 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) |
---|
[2595] | 70 | removeConfiglet(site) |
---|
[2833] | 71 | removeBrowserLayer(site) |
---|
[2830] | 72 | |
---|
| 73 | |
---|
| 74 | def 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 |
---|
[2836] | 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) |
---|
[2830] | 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] |
---|
[2836] | 91 | if len(paths) < len(skin_paths): |
---|
| 92 | logger.info("Removed '%s' from '%s' skin." % (old_product, skinName)) |
---|
[2830] | 93 | skins.addSkinSelection(skinName, ','.join(paths)) |
---|
| 94 | |
---|
| 95 | def 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 | |
---|
| 119 | def 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 | |
---|
| 126 | def 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() |
---|
[2836] | 135 | cleanup(site) |
---|
[2830] | 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 | |
---|