def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) savepoint_counter = 0 # Groups are no longer allowed as members of a section. groups = findObjectsProviding(root, IGroup) for group in groups: targets = getRelatedObjects(group, URIGroup, rel_type=URIMembership) group_members = getRelatedObjects(group, URIMember, rel_type=URIMembership) for target in targets: target_members = getRelatedObjects(target, URIMember, rel_type=URIMembership) for member in group_members: if member not in target_members: relate(URIMembership, (member, URIMember), (target, URIGroup)) savepoint_counter += 1 unrelate(URIMembership, (group, URIMember), (target, URIGroup)) if savepoint_counter % 2000 == 0: transaction.savepoint(optimistic=True) # Courses gained several new attributes, fill in their course_id courses = findObjectsProviding(root, ICourse) for course in courses: if getattr(course, 'course_id', None) is None: course.course_id = course.__name__
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) savepoint_counter = 0 # Groups are no longer allowed as members of a section. groups = findObjectsProviding(root, IGroup) for group in groups: targets = getRelatedObjects( group, URIGroup, rel_type=URIMembership) group_members = getRelatedObjects( group, URIMember, rel_type=URIMembership) for target in targets: target_members = getRelatedObjects( target, URIMember, rel_type=URIMembership) for member in group_members: if member not in target_members: relate(URIMembership, (member, URIMember), (target, URIGroup)) savepoint_counter += 1 unrelate(URIMembership, (group, URIMember), (target, URIGroup)) if savepoint_counter % 2000 == 0: transaction.savepoint(optimistic=True) # Courses gained several new attributes, fill in their course_id courses = findObjectsProviding(root, ICourse) for course in courses: if getattr(course, 'course_id', None) is None: course.course_id = course.__name__
def evolve(context): """Setup catalog and indices for fulltext search.""" root = getRootFolder(context) for site in findObjectsProviding(root, IWorldCookerySite): sm = site.getSiteManager() if u'catalog' not in sm: setupCatalogAndIndices(ObjectEvent(site)) setSite(site) for recipe in findObjectsProviding(site, IRecipe): addIntIdSubscriber(recipe, ObjectEvent(recipe)) indexDocSubscriber(ObjectEvent(recipe)) setSite(None)
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) old_site = getSite() apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: setSite(app) timetables = findObjectsProviding(root, ITimetable) for tt in timetables: event = ObjectModifiedEvent(tt) update = UpdateSelectedPeriodsSchedules(event, tt) update() setSite(old_site)
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) old_site = getSite() apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: setSite(app) # vivify person contact information persons = findObjectsProviding(app, IPerson) for person in persons: contact = IContact(person, None) setSite(old_site)
def evolve(context): """Evolve the ZODB from a Zope 3.1 to a 3.2 compatible format. - Converts all internal principals to use new password managers. """ root = getRootFolder(context) for site in findObjectsProviding(root, ISite): sm = site.getSiteManager() for principal in findObjectsProviding(sm, IInternalPrincipal): if not hasattr(principal, "_passwordManagerName"): principal._passwordManagerName = "Plain Text" if not hasattr(principal, "_password"): principal._password = principal.__dict__["password"] del principal.__dict__["password"]
def evolve(context): u""" convert object from hard coded oid1 and oid2 to list of addresses """ root = getRootFolder(context) # the Zope-Root-Folders for iksnmpvalue in findObjectsProviding(root, ISnmpValue): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "SNMP Value(%s): " % iksnmpvalue.ikName + evolve_msg if iksnmpvalue.oid1 is not None: if iksnmpvalue.oid2 is not None: if iksnmpvalue.oid1 == iksnmpvalue.oid2: iksnmpvalue.inp_addrs = [iksnmpvalue.oid1] else: iksnmpvalue.inp_addrs = [iksnmpvalue.oid1, iksnmpvalue.oid2] else: iksnmpvalue.inp_addrs = [iksnmpvalue.oid1] else: if iksnmpvalue.oid2 is not None: iksnmpvalue.inp_addrs = [iksnmpvalue.oid2] else: iksnmpvalue.inp_addrs = [] if iksnmpvalue.checktype == u"oid": iksnmpvalue.checktype = u"address" del iksnmpvalue.oid1 del iksnmpvalue.oid2 iksnmpvalue.appendHistoryEntry(evolve_msg)
def evolve(context): """ Add a commentary folder and its relation catalog.""" root = getRootFolder(context) site = None for s in findObjectsProviding(root, IQuotationtoolSite): site = s break if site is None: raise Exception('No quotationtool site') hooks.setSite(site) sm = site.getSiteManager() container = site['aboutreferences'] = CommentAboutReferenceContainer() sm.registerUtility(container, ICommentAboutReferenceContainer) IWriteZopeDublinCore(container).title = u"Comments about References" IWriteZopeDublinCore( container ).description = u"""Comments about references in the referatory are stored here.""" cat = sm['default'][ 'commentaboutreference_relation_catalog'] = zc.relation.catalog.Catalog( dump, load) cat.addValueIndex(ICommentAboutReference['reference'], dump, load) sm.registerUtility(cat, zc.relation.interfaces.ICatalog, name='commentsaboutreferences')
def evolve(context): u""" event stores dynamic host group """ convertDict = { u'dns': u'DNS-Server', u'file': u'File-Server', u'misc': u'Miscellaneous-Server', u'smtp': u'SMTP-Server', u'terminal': u'Terminal-Server', u'util': u'Utility-Server', u'workstation': u'Workstation', } root = getRootFolder(context) # the Zope-Root-Folders sitemanager = root.getSiteManager() default = sitemanager['default'] eventUtil = default[u'AdmUtilEventCrossbar'] for obj in findObjectsProviding(eventUtil, IAdmUtilEvent): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) if convertDict.has_key(event.hostGroup): event.hostGroup = None event._p_changed = True print "Object(%s): " % obj.ikName + evolve_msg obj.appendHistoryEntry(evolve_msg)
def evolve(context): root = getRootFolder(context) site = None for s in findObjectsProviding(root, IQuotationtoolSite): site = s break if site is None: raise Exception('No quotationtool site') hooks.setSite(site) sm = site.getSiteManager() # a container for unified comments was added container = site['comments'] = CommentContainer() sm.registerUtility(container, ICommentContainer) IWriteZopeDublinCore(container).title = u"Comments" IWriteZopeDublinCore( container).description = u"""Comments are stored here.""" # relation catalog has changed because of unified comments cat = zope.component.getUtility(zc.relation.interfaces.ICatalog, context=site) cat.removeValueIndex('icommentaboutfigure-figure') cat.removeValueIndex('icommentaboutreference-reference') cat.addValueIndex(IComment['about'], dump=dump, load=load, name='icomment-about')
def evolve(context): u""" host stores dynamic host groups """ convertDict = { u'dns': u'DNS-Server', u'file': u'File-Server', u'misc': u'Miscellaneous-Server', u'smtp': u'SMTP-Server', u'terminal': u'Terminal-Server', u'util': u'Utility-Server', u'workstation': u'Workstation', } root = getRootFolder(context) # the Zope-Root-Folders for host in findObjectsProviding(root, IHost): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "Host(%s): " % host.ikName + evolve_msg toDelete = [] for oldHostGroup in host.hostGroups: if convertDict.has_key(oldHostGroup): print "delete host group ", oldHostGroup toDelete.append(oldHostGroup) for i_index in toDelete: host.hostGroups.remove(i_index) host._p_changed = True host.appendHistoryEntry(evolve_msg)
def evolve(context): """Setup client ID manager and session data container.""" root = getRootFolder(context) for site in findObjectsProviding(root, IWorldCookerySite): sm = site.getSiteManager() if u'session_data' not in sm: setUpClientIdAndSessionDataContainer(ObjectEvent(site))
def evolve(context): """Evolve the ZODB. - Remove sessionLanguage from INegotiator utilities - Convert _offeredLangauges attribute to offeredLangauges property """ root = getRootFolder(context) for site in findObjectsProviding(root, ISite): # check if we got the right object obj = zope.component.queryUtility(INegotiator, context=site) if interfaces.INegotiatorManager.providedBy(obj): # remove old unused ``sessionLanguages`` attr from all objects delattr(obj, '_sessionLanguages') # migrate ``_serverLanguage`` to ``serverLanguage`` serverLanguage = getattr(obj, '_serverLanguage') if not serverLanguage: serverLanguage = u'en' setattr(obj, 'serverLanguage', serverLanguage) delattr(obj, '_serverLanguage') # migrate ``_offeredLanguages`` to ``offeredLanguages`` offeredLanguages = getattr(obj, '_offeredLanguages') setattr(obj, 'offeredLanguages', offeredLanguages) delattr(obj, '_offeredLanguages')
def evolve(context): root = getRootFolder(context) site = None for s in findObjectsProviding(root, IQuotationtoolSite): site = s break if site is None: raise Exception('No quotationtool site') hooks.setSite(site) sm = site.getSiteManager() # a container for unified comments was added categorizable_items = site[ 'categorizableitems'] = CategorizableItemDescriptions() sm.registerUtility(categorizable_items, ICategorizableItemDescriptions) IWriteZopeDublinCore( categorizable_items).title = u"Categorizable Item Descriptions" IWriteZopeDublinCore( categorizable_items ).description = u"""Mapping of ZOPE-Interfaces to user friendly identifiers.""" categories = site['categories'] = CategoriesContainer() sm.registerUtility(categories, ICategoriesContainer) IWriteZopeDublinCore(categorizable_items).title = u"Categories" IWriteZopeDublinCore( categorizable_items ).description = u"""User defined categories for classifying user content."""
def evolve(context): """Add tzinfo to timestamp of ratings""" for ratable in findObjectsProviding(getRootFolder(context), IRatable): manager = IRatingsManager(ratable) for d in manager._storage.values(): for rating in d.values(): if rating._timestamp.tzinfo is None: rating._timestamp = rating._timestamp.replace(tzinfo=UTC)
def evolve(context): root = context.connection.root().get(ZopePublication.root_name, None) old_site = getSite() apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: for year in ISchoolYearContainer(app).values(): fixYear(year, app) setSite(old_site)
def evolve(context): u""" convert object to new standard """ root = getRootFolder(context) # the Zope-Root-Folders for host in findObjectsProviding(root, IHostRouterGeneral): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "Host(%s): " % host.ikName + evolve_msg host.appendHistoryEntry(evolve_msg)
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) for app in findObjectsProviding(root, ISchoolToolApplication): persons = app['persons'] for person in persons.values(): del person.email del person.phone if hasattr(person, 'gradeclass'): del person.gradeclass
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: container = IEmailContainer(app, None) if container is None: continue if getattr(container, 'enabled', None) is None: container.enabled = bool(container.hostname)
def evolve(context): u""" initial generation """ root = getRootFolder(context) # the Zope-Root-Folders for obj in findObjectsProviding(root, IAdmUtilCategories): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "Object(%s): " % obj.ikName + evolve_msg obj.appendHistoryEntry(evolve_msg)
def evolve(context): u""" convert object to new standard """ root = getRootFolder(context) # the Zope-Root-Folders for service in findObjectsProviding(root, IServiceHttp): evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "Service(%s): " % service.ikName + evolve_msg service.appendHistoryEntry(evolve_msg)
def evolve(context): u""" ssh service object now supports port number """ root = getRootFolder(context) # the Zope-Root-Folders for service in findObjectsProviding(root, IServiceSsh): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "Service(%s): " % service.ikName + evolve_msg # todo .... service.appendHistoryEntry(evolve_msg)
def evolve(context): u""" net object now with shortName ipnet """ root = getRootFolder(context) # the Zope-Root-Folders for net in findObjectsProviding(root, IIpNet): # convert this object evolve_msg = u"gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) net.shortName = "ipnet" net.appendHistoryEntry(evolve_msg)
def evolve(context): linkcatalogs.ensureEvolved(context) root = getRootFolder(context) old_site = getSite() apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: setSite(app) for person in app['persons'].values(): evolvePerson(person) setSite(old_site)
def evolve(context): u""" convert object to new standard """ root = getRootFolder(context) # the Zope-Root-Folders for ikobj in findObjectsProviding(root, IDevice): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) ikobj.appendHistoryEntry(evolve_msg)
def evolve(context): u""" convert object to new standard """ root = getRootFolder(context) # the Zope-Root-Folders for iklatency in findObjectsProviding(root, ILatency): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "Latency Check(%s): " % iklatency.ikName + evolve_msg iklatency.appendHistoryEntry(evolve_msg)
def evolve(context): u""" convert object to new standard """ root = getRootFolder(context) # the Zope-Root-Folders for ikobj in findObjectsProviding(root, IOrganisationalUnit): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "OrganisationalUnit(%s): " % ikobj.ikName + evolve_msg ikobj.appendHistoryEntry(evolve_msg)
def evolve(context): u""" new ikdate1 """ root = getRootFolder(context) for ikslave in findObjectsProviding(root, ISlave): ikslave.ikdate1 = None evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "Slave(%s): " % ikslave.ikName + evolve_msg ikslave.appendHistoryEntry(evolve_msg)
def evolve(context): u""" site update with some bootstraps """ root = getRootFolder(context) # the Zope-Root-Folders for site in findObjectsProviding(root, ISite): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print u"Site(%s): " % site.ikName + evolve_msg createSupervisorUtils(site) site.appendHistoryEntry(evolve_msg)
def evolve(context): u""" net with inward relaying shutdown events """ root = getRootFolder(context) # the Zope-Root-Folders for net in findObjectsProviding(root, IIpNet): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "IpNet(%s): " % net.ikName + evolve_msg net.eventInpObjs_inward_relaying_shutdown = set([]) net.appendHistoryEntry(evolve_msg)
def evolve(context): u""" convert object to new standard """ root = getRootFolder(context) # the Zope-Root-Folders for iksnmpvalue in findObjectsProviding(root, ISnmpValue): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print "SNMP Value(%s): " % iksnmpvalue.ikName + evolve_msg iksnmpvalue.appendHistoryEntry(evolve_msg)
def evolveToSimpleScoreSystem(context): """This is a help to migrate existing rating definitions. It only works if you use a score system which is compatible with SimpleScoreSystem. It is meant to be used from your application evolve script. """ for definition in findObjectsProviding( getRootFolder(context), IRatingDefinition): old = definition.scoreSystem new = SimpleScoreSystem( old.__name__, old.title, old.description, old.scores) definition.scoreSystem = new
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) old_site = getSite() apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: setSite(app) levels = guessMostRecentLevels(app) if levels is not None: del app[LEVELS_APP_KEY] app[LEVELS_APP_KEY] = levels setSite(old_site)
def evolve(context): u""" service object now supports ip-protocol and product value """ root = getRootFolder(context) # the Zope-Root-Folders for service in findObjectsProviding(root, IService): # convert this object evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) service.product = u"" service.ipprotocol = None print "Service(%s): " % service.ikName + evolve_msg service.appendHistoryEntry(evolve_msg)
def evolve(context): u""" site with OOBTree for items data """ root = getRootFolder(context) # the Zope-Root-Folders for site in findObjectsProviding(root, ISite): # convert this object if not hasattr(site, 'data'): evolve_msg = "gen. %d (%s)" % \ (generation, evolve.__doc__.strip()) print u"Site(%s): " % site.ikName + evolve_msg site.data = site._SampleContainer__data site.appendHistoryEntry(evolve_msg)
def evolveZopeAppFile(root): """Evolves all files in the containment hierarchy.""" for file in findObjectsProviding(root, IFile): if isinstance(file, zope.app.file.Image): replace(file, z3c.blobfile.image.Image) elif isinstance(file, zope.app.file.File): replace(file, z3c.blobfile.file.File) else: logging.getLogger('z3c.blobfile.generations').warn( 'Unknown zope.app.file.interfaces.IFile implementation %s.%s' % ( file.__class__.__module__, file.__class__.__name__)) file._p_changed = 1 # trigger persistence transaction.savepoint(optimistic=True)
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: if DEMOGRAPHICS_FIELDS_KEY not in app: continue fields = app[DEMOGRAPHICS_FIELDS_KEY] for field in fields.values(): if not IEnumFieldDescription.providedBy(field): continue for n, item in enumerate(field.items): if item == u'Native Hawaiian or Other Pasific Islander': field.items[n] = u'Native Hawaiian or Other Pacific Islander'
def read(self, app, context): self.builders = [] candidates = findObjectsProviding(app, IAnnotatable) for candidate in candidates: assert_not_broken(candidate) annotations = IAnnotations(candidate, None) if annotations is None: continue calendar = annotations.get(ST_CALENDAR_KEY) if calendar is None: continue assert_not_broken(calendar) builder = CalendarBuilder() builder.read(calendar, context(app=app)) self.builders.append(builder)
def read(self, app, context): self.builders = [] # Find objects that may have provided IOwnTimetables candidates = findObjectsProviding(app, IAnnotatable) for candidate in candidates: assert_not_broken(candidate) annotations = IAnnotations(candidate, None) if annotations is None: continue timetable_dict = annotations.get(TIMETABLE_DICT_KEY) if timetable_dict is None: continue assert_not_broken(timetable_dict) builder = SchedulesBuilder() builder.read(timetable_dict, context(app=app)) self.builders.append(builder)
def evolve(context): root = getRootFolder(context) for obj in findObjectsProviding(root, IAnnotatable): dc = IWriteZopeDublinCore(obj) if isinstance(dc, ZDCAnnotatableAdapter): # simply mark the ZDCAnnotationData object as dirty so # that it gets repickled dc._mapping._p_activate() dc._mapping._p_changed = True # also mark the object holding a reference to it (the # annotations mapping) as dirty. It contains a reference # to the old class path for ghosts annotations = IAnnotations(obj) if DCkey in annotations: annotations[DCkey] = annotations[DCkey]
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) # Invalidate connection cache # Earlier evolutions (like evolve34) may have cached broken # persistent objects and we'll want to reload them. cache = context.connection._cache cache.invalidate(cache.cache_data.keys()) old_site = getSite() apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: setSite(app) evolveTimetables(app) setSite(old_site)
def evolve(context): linkcatalogs.ensureEvolved(context) root = context.connection.root().get(ZopePublication.root_name, None) # Mock the renaming of zope.app.catalog and zope.app.intid to # zope.catalog and zope.intid. # This is for Critical Links deployments only - this part of Zope's evolution # was missed somehow. modules = ModulesSnapshot() modules.mock_module('zope.app.catalog') modules.mock_module('zope.app.catalog.interfaces') modules.mock_module('zope.app.catalog.catalog') modules.mock_module('zope.app.intid') modules.mock_module('zope.app.intid.interfaces') modules.mock_attr('zope.app.catalog.catalog', 'Catalog', zope.catalog.catalog.Catalog) modules.mock_attr('zope.app.catalog.interfaces', 'ICatalog', zope.catalog.interfaces.ICatalog) modules.mock_attr('zope.app.intid', 'IntIds', zope.intid.IntIds) modules.mock_attr('zope.app.intid.interfaces', 'IIntIds', zope.intid.interfaces.IIntIds) # Proceed with normal evolution now. old_site = getSite() apps = findObjectsProviding(root, ISchoolToolApplication) for app in apps: setSite(app) sm = app.getSiteManager() default = traverse(app, '++etc++site/default') intids = getUtility(zope.intid.interfaces.IIntIds) intids._p_changed = True for key in CATALOG_KEYS: util = queryUtility(ICatalog, name=key, default=None) if util is None: continue name = util.__name__ sm.unregisterUtility(util, ICatalog, key) del default[name] setSite(old_site) modules.restore()
def evolve(context): root = getRootFolder(context) for site in findObjectsProviding(root, ISite): sm = site.getSiteManager() pau = component.queryUtility(IAuthentication, context = sm) if pau is not None and IPluggableAuthentication.providedBy(pau): if OLD_CRED_NAME in pau: plugins = list(pau.credentialsPlugins) if OLD_CRED_NAME in plugins: plugins.remove(OLD_CRED_NAME) pau.credentialsPlugins = tuple(plugins) del pau[OLD_CRED_NAME] setSite(site) factory = component.getUtility(ICredentialsPluginFactory, 'default.credentials') factory.install() factory.activate() setSite(None)
def evolve(context): """Evolve the ZODB from a Zope X3.0 to a X3.1 compatible format. - The Principal Annotation Service was replaced by the Principal Annotation Utility. Thus all service registrations have to be changed to utility registrations. - The Error Reporting Service was replaced by the Error Reporting Utility. Thus, all service registrations have to be changed to utility registrations. - Component-based registrations used to keep track of their components via the component's path. Now it stores the component directly. All registrations are updated to this new format. - Converts all service registrations to utility registrations providing IService, which is the method used to simulate the old service API. - Remove 'RegistrationManager' object from all site management folders. - Remove all local adapter and utility service instances. """ root = getRootFolder(context) for site in findObjectsProviding(root, ISite): sm = site.getSiteManager() # Remove old registration manager instances for rm in findObjectsProviding(sm, IRegistrationManager): # Make sure that we called the new registration manager # which will retrieve the old one, if necessary zapi.getParent(rm).registrationManager = rm # Do a hard core delete, because I want no whining and complaining container = zapi.getParent(rm) del container._SampleContainer__data[zapi.getName(rm)] # Make sure the new registration manager has the correct name: rm.__name__ = '++registrations++' rm.__parent__ = container for reg_container in findObjectsProviding(sm, IRegisterableContainer): manager = reg_container.registrationManager # Iterate through each registration and fix it up. for reg in tuple(manager.values()): # Regardless of registration type, we want to convert the # component path to component if ('_BBB_componentPath' in reg.__dict__ and reg._BBB_componentPath is not None): reg.component = reg.getComponent() del reg.__dict__['_BBB_componentPath'] # Fixup and convert service registrations if IServiceRegistration.providedBy(reg): if reg.name == 'ErrorLogging': fixupErrorLogging(reg_container, reg) elif reg.name == 'PrincipalAnnotation': fixupPrincipalAnnotation(reg_container, reg) elif reg.name in ('Utilities', 'Adapters'): # Delete the registration reg.status = InactiveStatus del manager[zapi.name(reg)] # Delete the component c = reg.component del zapi.getParent(c)[zapi.name(c)] else: # Handle all outstanding service registrations # Create a new utility registration new_reg = UtilityRegistration(reg.name, IService, reg.component) manager.addRegistration(new_reg) new_reg.status = ActiveStatus # Delete the old registration reg.status = InactiveStatus del manager[zapi.getName(reg)] # Fixup utility registrations else: # Getting the provided interface converts the utility # registration automatically from 'interface' -> 'provided' reg.provided # Now let's reactivate the utility, so it will be # available within the new framework orig = reg.status reg.status = InactiveStatus reg.status = orig
def evolve(context): """Evolve existing PAUs and group folders. - Group folders should no longer be registered. - PAUs that use group folders should use their contents name, not their (formerly) registered name. Group folders used by multiple PAUs were not supported, and are not supported with this evolution. """ root = getRootFolder(context) for site in findObjectsProviding(root, ISite): sm = site.getSiteManager() for pau in findObjectsProviding( sm, zope.app.authentication.interfaces.IPluggableAuthentication): for nm, util in component.getUtilitiesFor( zope.app.authentication.interfaces.IAuthenticatorPlugin, context=pau): if groupfolder.IGroupFolder.providedBy(util): if util.__parent__ is not pau: raise RuntimeError( "I don't know how to migrate your database: " "each group folder should only be within the " "Pluggable Authentication utility that uses it") # we need to remove this registration regs = registration.Registered(util).registrations() if len(regs) != 1: raise RuntimeError( "I don't know how to migrate your database: " "you should only have registered your group " "folder as an IAuthenticatorPlugin, but it looks " "like it's registered for something additional " "that I don't expect") r = regs[0] r.registry.unregisterUtility( util, zope.app.authentication.interfaces.IAuthenticatorPlugin, nm) if r.name in pau.authenticatorPlugins: if util.__name__ != r.name: # else no-op plugins = list(pau.authenticatorPlugins) if util.__name__ in pau.authenticatorPlugins: # argh! another active plugin's name is # the same as this group folder's # __name__. That means we need to choose # a new name that is also not in # authenticatorPlugins and not in # pau.keys()... ct = 0 nm = '%s_%d' % (util.__name__, ct) while (nm in pau.authenticatorPlugins or nm in pau): ct += 1 nm = '%s_%d' % (util.__name__, ct) IObjectMover(util).moveTo(pau, nm) plugins[plugins.index(r.name)] = util.__name__ pau.authenticatorPlugins = tuple(plugins) for k, r in pau.registrationManager.items(): if groupfolder.IGroupFolder.providedBy(r.component): del pau.registrationManager[k]