1 | import sys |
---|
2 | import logging |
---|
3 | from zope.component import getSiteManager |
---|
4 | from zope.component import getGlobalSiteManager |
---|
5 | |
---|
6 | from Acquisition import aq_parent |
---|
7 | from Products.CMFCore.utils import getToolByName |
---|
8 | |
---|
9 | from config import SUPPORT_BLAYER |
---|
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 | |
---|
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) |
---|
45 | |
---|
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 | |
---|
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) |
---|
70 | removeConfiglet(site) |
---|
71 | removeBrowserLayer(site) |
---|
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 |
---|
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 | |
---|
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() |
---|
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 | |
---|