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