source: trunk/Extensions/Install.py @ 1197

Revision 1197, 32.5 KB checked in by tarmo, 13 years ago (diff)

Added author recalculation into migration.

Line 
1# Copyright 2006 by the LeMill Team (see AUTHORS)
2#
3# This file is part of Calibrate LeMill.
4#
5# Calibrate LeMill is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 2 of the License, or
8# (at your option) any later version.
9#
10# Calibrate LeMill is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with Calibrate LeMill; if not, write to the Free Software
17# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
19"""Plone product installer script"""
20
21from Products.CMFCore.utils import getToolByName
22from Products.Archetypes.Extensions.utils import install_subskin, installTypes
23from Products.Archetypes.public import listTypes
24
25from StringIO import StringIO
26import string
27from itertools import chain
28
29from Products.LeMill.config import GLOBALS, PROJECTNAME, MEMBER_PROPERTIES, MATERIAL_TYPES, CONTENT_TYPES, TOOLS_TYPES, ACTIVITY_TYPES, COMMUNITY_TYPES
30from Products.LeMill.Resources import Resource
31
32def install(self):
33        """Installs this Plone product. Called by the quick_installer tool."""
34        # HOOK: This is executed when the Plone site with LeMill customization
35        # is created, or when a reinstall for the LeMill product is called from
36        # quick_installer.
37       
38        out = StringIO()
39        # Don't install the skin layer here - the configuration methods setup a
40        # whole new skin for us.
41
42        # Check whether we're upgrading or not
43        qi=getToolByName(self, 'portal_quickinstaller')
44        p=qi._getOb(PROJECTNAME, None)
45        if p:
46                oldVersion=p.getInstalledVersion()
47        else:
48                oldVersion="0"
49        newVersion=qi.getProductVersion(PROJECTNAME)
50
51
52        print >>out,"Installing content archetypes..."
53        installTypes(self, out, listTypes(PROJECTNAME), PROJECTNAME)
54
55        print >>out,"Installing portal tools..."
56        if not hasattr(self, 'lemill_search'):
57                addTool = self.manage_addProduct[PROJECTNAME].manage_addTool
58                # Add the tool by its meta_type
59                addTool('LeMillSearch')
60        if not hasattr(self, 'lemill_tool'):
61                addTool = self.manage_addProduct[PROJECTNAME].manage_addTool
62                # Add the tool by its meta_type
63                addTool('LeMillTool')
64        if not hasattr(self, 'lemill_usertool'):
65                addTool = self.manage_addProduct[PROJECTNAME].manage_addTool
66                # Add the tool by its meta_type
67                addTool('LeMillUserTool')
68
69
70        print >>out,"Registering remote search preference panel..."
71        # Register lemill_search_conf under controlpanel.
72        # admins can register additional search locations there.
73        # ticket #107
74        cp = getToolByName( self, 'portal_controlpanel')
75        REMOTE_SEARCH_ID='lemill_remote_search'
76        cp.unregisterConfiglet(REMOTE_SEARCH_ID)
77        cp.addAction(REMOTE_SEARCH_ID,
78                'LeMill search',
79                'string:${portal_url}/prefs_lemill_search_form',
80                permission='Manage portal',
81                category='Products',
82                appId='LeMill')
83
84        # Call migration script
85        migrate(self,out,oldVersion,newVersion)
86
87        print >>out,"Installation completed."
88        # Done, return whatever messages we got
89        return out.getvalue()
90
91def migrate(self,out,old,new):
92        """Migrate existing content. If we're installing a newer version
93        of LeMill over an existing one, we may need to alter the existing
94        content so that it's compatible with the new version."""
95
96        # Note that versions are strings, not numbers.
97       
98        if not old: return
99        if new==old: return
100        if new<old:
101                print >>out,"Can't downgrade content from %s to %s!" % (old,new)
102                return
103
104        print >>out,"Migrating from %s to %s" % (old,new)
105
106        # NB: All setupXXX methods from ConfigurationMethods are executed when
107        # running a reinstall from quick_installer.
108
109        # Example iteration, changing all content objects
110        # Adapt this to change objects so they are compatible with the
111        # changes made into the system
112        if 1 == 0: # Let's not really run it...
113                for ob in self.content.objectValues(('Piece','Material')):
114                        ob.edit(title=ob.Title()+"!")
115
116        if old<"0.3":
117                print >>out, "Migration not supported for versions below 0.3"
118                return
119
120        # Add migration stuff here, in ascending order of version
121        # NOTE: If you make a syntax error here, portal_quickinstaller
122        # will just report LeMill as "removed from Products folder"
123        # (running "python Extensions/Install.py" will report syntax errors)
124        if old<="0.3":
125                print >>out, "Starting migration from 0.3..."
126                # Migrate from 0.3
127                # Member information is no longer stored in memberdata tool
128                # This is the old property list:
129                old=(
130                        ('firstname', 'string',''),
131                        ('lastname', 'string',''),
132                        ('fullname', 'string','hidden'),
133                        ('nickname', 'string',''),
134                        ('messenger1', 'string',''),
135                        ('messenger2', 'string',''),
136                        ('messenger3', 'string',''),
137                        ('home_page', 'string',''),
138                        ('location_country', 'string',''),
139                        ('location_area', 'string',''),
140                        ('language_skills', 'lines',''),
141                        ('skills', 'lines',''),
142                        ('interests', 'lines',''),
143                        ('tags', 'lines','hidden'),
144                        ('used_content', 'lines','hidden'),
145                        )
146                # This is the current list:
147                current = MEMBER_PROPERTIES
148                mdat_tool = getToolByName(self, 'portal_memberdata')
149                # Remove any properties not in the current list
150                deleteThese=[]
151                for prop in old:
152                        if not prop[0] in [x[0] for x in current]:
153                                deleteThese.append(prop[0])
154                print >>out,"Removing these obsolete member properties: %s" % ", ".join(deleteThese)
155                mdat_tool.manage_delProperties(deleteThese)
156                print >>out,"Migration from 0.3 complete."
157               
158        if old<="0.3.1":
159                # Migrate from 0.3.1
160                # Add initial history entry to all objects
161                print >>out,"Starting migration from 0.3.1..."
162                def initiateHistory(objs):
163                        for ob in objs:
164                                if not ob.getHistory():
165                                        ob.storeInHistory(fields=(),summary='History information started.',storeAuthor=False)
166                print >>out,"Adding initial history entry to learning resources..."
167                initiateHistory(self.content.objectValues(('Material',)))
168                initiateHistory(self.activities.objectValues(('Activity',)))
169                initiateHistory(self.tools.objectValues(('Tool',)))
170                print >>out,"Updating left slots and state..."
171                for ob in self.community.objectValues(('GroupBlog','MemberFolder')) + \
172                        self.activities.objectValues(('Activity',)) + \
173                        self.tools.objectValues(('Tool',)):
174                    ob.content_status_modify(workflow_action='publish', msg='silent')
175                    if not hasattr(ob.aq_base, 'left_slots'):
176                        ob._setProperty('left_slots', ['here/portlet_%s_actions/macros/portlet' % ob.meta_type.lower(),], 'lines')
177
178                print >>out,"Migration from 0.3.1 complete."
179        if old<="0.3.2":
180            # Migrate from 0.3.2
181            # move history from LearningResource class to Resource class
182            print >>out,"Starting migration from 0.3.2..."
183            def moveHistory(objs):
184                for obj in objs:
185                    if hasattr(obj, '_LearningResource__history'):
186                        setattr(obj, '_Resource__history', getattr(obj, '_LearningResource__history'))
187                        del obj._LearningResource__history
188                    if not obj.getHistory():
189                        obj.storeInHistory(fields=(),summary='History information started.',storeAuthor=False)
190            print >>out,"Moving history information to Resource class"
191            moveHistory(self.content.objectValues(('Material', 'Piece')))
192            moveHistory(self.activities.objectValues(('Activity',)))
193            moveHistory(self.tools.objectValues(('Tool',)))
194        if old<="0.4":
195            print >>out, "Starting migration from 0.4"
196            for x in self.content.objectValues(('Material', 'Piece')):
197                tags = x.getTags()
198                x.setTags(', '.join(tags))
199            print >>out, "Attaching license"
200            for x in self.content.objectValues(('Piece',)):
201                x.setRights('CreativeCommons')
202            print >>out, "Migration from 0.4 complete"
203        if old<='0.4.1':
204            print >>out, "Starting migration from 0.4.1"
205            groupdatatool=getToolByName(self,"portal_groupdata")
206            for prop in ['tags','email','scope']:
207                if groupdatatool.hasProperty(prop):
208                    groupdatatool.manage_delProperties([prop])
209                print >>out, "Migration from 0.4.1 complete"
210        if old<='0.4.2':
211                print >>out, "Starting migration from 0.4.2"
212                for group in self.community.objectValues(('GroupBlog',)):
213                    for post in group.objectValues(('BlogPost',)):
214                        if hasattr(post.aq_base, 'left_slots'):
215                            post._updateProperty('left_slots', ['here/portlet_groupblog_actions/macros/portlet',])
216                        else:
217                            post._setProperty('left_slots', ['here/portlet_groupblog_actions/macros/portlet',], 'lines')
218                print >>out, "Migration from 0.4.2 complete"
219        if old<='0.5':
220            print >>out, "Starting migration from 0.5"
221            print >>out, "Converting Material to other types"
222            rtool = getToolByName(self, 'reference_catalog')
223            wftool = getToolByName(self, 'portal_workflow')
224            wftool.setChainForPortalTypes(MATERIAL_TYPES+('GroupBlog',), 'group_workflow')
225            new_ids = []
226            for m in self.content.objectValues('Material'):
227                print "Object:", m.meta_type, m.getId()
228                m_meta_type = m.meta_type
229                m_review_state = wftool.getInfoFor(m, 'review_state')
230                #print "review state::", m_review_state
231                m_id = m.getId()
232                m_Title = m.Title()
233                m_schema = m.Schema()
234                m_owner = m.getOwnerTuple()
235                m_creators = m.getAuthors()
236                m_local_roles = m.get_local_roles()
237                old_uid = m.UID()
238                m_fields = m_schema.fields()
239                template_id = m.getTemplateId()
240                if not template_id:
241                    print >>out, "Deleting Material %s" % m_id
242                    self.content._delObject(m_id)
243                    continue
244               
245                # templates to handle: presentation, text-and-images, simple-tex
246                obj = None
247                if template_id in ['text-and-images', 'simple-text']:
248                    obj = self.content._lemill_invokeFactory(self.content, 'MultimediaMaterial', m_id+'c', m_Title)
249                elif template_id == 'presentation':
250                    obj = self.content._lemill_invokeFactory(self.content, 'PresentationMaterial', m_id+'c', m_Title)
251                o_schema = obj.Schema()
252                o_fields = o_schema.fields()
253
254                for f in m_fields:
255                    if f.getName() == 'id': continue
256                    m_accessor = f.getAccessor(m)
257                    if m_accessor is None: # field that was but now is removed from schema. eg. age_group
258                        continue
259                    target_f = obj.getField(f.getName())
260                    if target_f and f.getName() not in ['refsToImages', 'refsToSlides']:
261                        mutator = target_f.getMutator(obj)
262                        mutator(m_accessor())
263                    else:
264                        if f.getName() in ['parentVersion', 'file', 'source', 'audio', 'templateId']:
265                            continue
266                        if template_id == 'presentation':
267                            # refsToSlides
268                            target_f = obj.getField('refsToImages')
269                            mutator = target_f.getMutator(obj)
270                            mutator(m_accessor())
271                        elif template_id == 'text-and-images':
272                            # refsToImages
273                            target_f = obj.getField('bodyText')
274                            chap_nr = target_f.getFirstChapter(obj)
275                            value = m_accessor()
276                            vv = []
277                            for x in value:
278                                vv.append(x.UID())
279                            target_f.setPieces(obj, ';'.join(vv), chap_nr)
280                    #print f.getName(), m_accessor(), obj.getField(f.getName())
281                # bodyText mutator appends modifying user to creators, so revert creators back to its old state
282                t_creators=obj.getField('creators')
283                t_creators.set(obj,m_creators) 
284       
285                new_ids.append([m_id, obj.getId()])
286                new_uid = obj.UID()
287                # get and change references to old uid
288                for r in rtool.getBackReferences(m):
289                    s = r.getSourceObject()
290                    if s.meta_type == 'Collection':
291                        old_uid_value = s.getRefsToResources()
292                        new_uid_value = []
293                        for o in old_uid_value:
294                            if o.UID() == old_uid:
295                                new_uid_value.append(new_uid)
296                            else:
297                                new_uid_value.append(o.UID())
298                        s.addRefsToResources(new_uid_value, empty=1)
299                    if s.meta_type == 'Story':
300                        fi = s.getField('relatedContent')
301                        acc = fi.getAccessor(s)
302                        mut = fi.getMutator(s)
303                        old_uid_value = acc()
304                        new_uid_value = []
305                        for o in old_uid_value:
306                            if o.UID() == old_uid:
307                                new_uid_value.append(new_uid)
308                            else:
309                                new_uid_value.append(o.UID())
310                        mut(new_uid_value)
311                # giving object back to user
312                acl_obj = self
313                acl_user = None
314                while 1:
315                    if hasattr(acl_obj, 'acl_users'):
316                        if acl_obj.acl_users.getUser(m_owner[1]):
317                           acl_user = acl_obj.acl_users.getUser(m_owner[1])
318                           break
319                    try:
320                        acl_obj = acl_obj.aq_parent
321                    except AttributeError:
322                        break
323                obj.changeOwnership(acl_user.__of__(self.acl_users))
324                for del_role in obj.get_local_roles():
325                    obj.manage_delLocalRoles((del_role[0],))
326                for user_role in m_local_roles:
327                    obj.manage_setLocalRoles(user_role[0], user_role[1])
328                rev_state = wftool.getInfoFor(obj, 'review_state')
329                if rev_state != m_review_state and m_review_state != 'draft':
330                    #print rev_state, m_review_state
331                    if m_review_state == 'hidden':
332                        wftool.doActionFor(obj, 'hide')
333                    if m_review_state == 'public':
334                        wftool.doActionFor(obj, 'publish')
335                # delete material
336                self.content._delObject(m_id)
337        if old<='0.6':
338            print >>out, "Migrating coverImages"
339            for x in self.content.objectValues(CONTENT_TYPES):
340                if x.meta_type == 'Piece':
341                    c = x.getCoverImage()
342                    embedded = x.embedIcon(c)
343                    coverImage = x.getField('coverImage')
344                    coverImage.set(x, embedded)
345                else:
346                    x.updateCoverImage()
347            print >> out, "Moving slide captions"
348            for x in self.content.objectValues('PresentationMaterial'):
349                f = x.getField('slide_captions')
350                for p in x.getRefsToSlides():
351                    caption = p.getDescription()
352                    uid = p.UID()
353                    f.setValue(x, uid, caption)
354            print >> out, "Adding order for collections"
355            for m in self.community.objectValues('MemberFolder'):
356                for cf in m.objectValues('CollectionsFolder'):
357                    for c in cf.objectValues('Collection'):
358                        objs = c.getRefsToResources()
359                        f = c.getField('refsToResources')
360                        f.set(c, [])
361                        i = 1001
362                        prev = []
363                        for o in objs:
364                            prev.append(o)
365                            f.set(c, prev, collection_position=i)
366                            i += 100
367            print >>out, "Migration from 0.6 complete"
368        if old<='0.8.1':
369            for (oid,m) in self.content.objectItems('MultimediaMaterial'):
370                print >>out, "Converting %s/%s..." % (oid,m.getId())
371                print "Converting %s/%s..." % (oid,m.getId())
372                try:
373                    field = m.getField('bodyText')
374                except AttributeError:
375                    print >>out, "Deleting invalid object %s" % oid
376                    self.content._delObject(oid)
377                    continue
378                try:
379                    chaps = field.getChapters(m)
380                except TypeError:
381                    print >>out, "Deleting invalid object %s" % oid
382                    self.content._delObject(oid)
383                    continue
384                chaps.sort()
385                texts = {}
386                pieces = {}
387                for c in chaps:
388                    texts[c] = field.getChapter(m, c)
389                    pieces[c] = field.getPieces(m, c)
390                m.setBodyText("")
391                m._updateSchema()
392                field = m.getField('bodyText')
393                for c in chaps:
394                    text = texts[c]
395                    if text:
396                        index = field.add_new_chapter(m)
397                        field.setChapter(m,text,index)
398                    for uid in pieces[c]:
399                        if uid:
400                            index = field.add_new_mediapiece(m)
401                            field.setPieces(m,uid,index)
402            print >>out, "Migration from 0.8.1 complete"
403
404        if old<='0.9':
405            for (oid,m) in self.content.objectItems('PresentationMaterial'):
406                print >>out, "Converting %s/%s..." % (oid,m.getId())
407                print "Converting %s/%s..." % (oid,m.getId())
408                try:
409                    description = m.getField('bodyText')
410                    image_ref_field = m.getField('refsToImages')
411                    captions = m.getField('slide_captions')
412                except AttributeError:
413                    print >>out, "Deleting invalid object %s" % oid
414                    print "Deleting invalid object %s" % oid
415                    self.content._delObject(oid)
416                    continue
417                if image_ref_field==None and captions==None:
418                    print >>out, "This object is using current schema. Skip."
419                    continue
420                try:
421                    image_refs = m.getRefsToSlides()
422                except TypeError:
423                    print >>out, "Deleting invalid object %s" % oid
424                    print "Deleting invalid object %s" % oid
425                    self.content._delObject(oid)
426                    continue
427                new_slides =[]
428                for slideRef in image_refs:
429                    slideUID=slideRef.UID()
430                    slide_caption=m.getSlideCaptionFor(slideRef)
431                    new_slides=new_slides+[slideUID, slide_caption]
432                # Wish me luck.
433                m.setBodyText("")
434                m._updateSchema()
435                m.setBodyText(new_slides)
436                try:
437                    m.setDescription(str(description))
438                except:
439                    print >>out, "Setting description for %s failed, tried to give value %s" % (oid, description)
440                    print "Setting description for %s failed, tried to give value %s" % (oid, description)
441            print >>out, "Migration from 0.9 complete"
442
443        #if old<='1.0.3':
444        if old<='1.0.1':
445            print >>out, "Rebuilding cover images for all resource types (this will take time)"
446
447            print >>out, "*** MEMBERS"
448            for x in self.community.objectValues('MemberFolder'):
449                if not hasattr(x, 'getHasCoverImage'):
450                    print >>out, "skipped %s" % x.getId()
451                    continue
452                if x.getHasCoverImage()==False:
453                    print >>out, "skipped %s" % x.getId()
454                    continue
455                old=None
456                try:
457                    old=getattr(self.portal_memberdata.portraits, x.getId(), None)
458                except:
459                    print >>out, "Getting portrait failed for %s" % x.getId()
460                    x.flagCoverImageOff()
461                if old!=None:
462                    x.resize_portrait(old, x.getId())
463                    x.flagCoverImageOn()
464                    print >>out, "Portrait resized for %s" % x.getId()
465
466            print >>out, "*** MATERIALS"
467            for x in self.content.objectValues(MATERIAL_TYPES):
468                if not hasattr(x, 'getOriginalCoverImage'): continue
469                if not hasattr(x, 'getHasCoverImage'):
470                    print >>out, "skipped %s" % x.getId()
471                    continue
472                if x.getHasCoverImage()==False:
473                    print >>out, "skipped %s" % x.getId()
474                    continue
475                print >>out, "%s.. has coverimage %s" % (x.getId(), x.getHasCoverImage())               
476                org=None
477                old=None
478                if hasattr(x, 'originalCoverImage'): org=x.originalCoverImage
479                if hasattr(x, 'coverImage'): old=x.coverImage
480                if org != None:
481                    print >>out, "%s resets to OriginalCoverImage" % x.getId()
482                    x.setCoverImage(org)               
483                if org==None and old != None:
484                    print >>out, "%s has coverimage but no original." % x.getId()
485                    print >>out, "Set coverimage as original."
486                    x.setOriginalCoverImage(old)
487                    x.setCoverImage(old)
488                if org==None and old==None:
489                    x.delCoverImage()
490                    print >>out, "Turned off flag hasCoverImage for: %s" % x.getId()
491            print >>out, "*** PIECES"
492            for x in self.content.objectValues('Piece'):
493                if x.isImage():
494                    print >>out, "Setting image to coverimage for piece %s" % x.getId()
495                    cover=x.getField('coverImage')
496                    x.setCoverImage(x.file)
497                else:
498                    if x.getHasCoverImage()==True:
499                        print >>out, "Piece %s is not image" % x.getId()
500                        x.delCoverImage()
501
502            print >>out, "*** TOOLS"
503            for x in self.tools.objectValues(TOOLS_TYPES):
504                if not hasattr(x, 'getOriginalCoverImage'): continue
505                if not hasattr(x, 'getHasCoverImage'):
506                    print >>out, "skipped %s" % x.getId()
507                    continue
508                if x.getHasCoverImage()==False:
509                    print >>out, "skipped %s" % x.getId()
510                    continue
511                print >>out, "%s.. has coverimage %s" % (x.getId(), x.getHasCoverImage())               
512                org=None
513                old=None
514                if hasattr(x, 'originalCoverImage'): org=x.originalCoverImage
515                if hasattr(x, 'coverImage'): old=x.coverImage
516                if org != None:
517                    print >>out, "%s resets to OriginalCoverImage" % x.getId()
518                    x.setCoverImage(org)               
519                if org==None and old != None:
520                    print >>out, "%s has coverimage but no original." % x.getId()
521                    print >>out, "Set coverimage as original."
522                    x.setOriginalCoverImage(old)
523                    x.setCoverImage(old)
524                if org==None and old==None:
525                    x.delCoverImage()
526                    print >>out, "Turned off flag hasCoverImage for: %s" % x.getId()
527
528            print >>out, "*** ACTIVITIES"
529            for x in self.activities.objectValues(ACTIVITY_TYPES):
530                if not hasattr(x, 'getOriginalCoverImage'): continue
531                if not hasattr(x, 'getHasCoverImage'):
532                    print >>out, "skipped %s" % x.getId()
533                    continue
534                if x.getHasCoverImage()==False:
535                    print >>out, "skipped %s" % x.getId()
536                    continue
537                print >>out, "%s.. has coverimage %s" % (x.getId(), x.getHasCoverImage())               
538                org=None
539                old=None
540                if hasattr(x, 'originalCoverImage'): org=x.originalCoverImage
541                if hasattr(x, 'coverImage'): old=x.coverImage
542                if org != None:
543                    print >>out, "%s resets to OriginalCoverImage" % x.getId()
544                    x.setCoverImage(org)               
545                if org==None and old != None:
546                    print >>out, "%s has coverimage but no original." % x.getId()
547                    print >>out, "Set coverimage as original."
548                    x.setOriginalCoverImage(old)
549                    x.setCoverImage(old)
550                if org==None and old==None:
551                    x.delCoverImage()
552                    print >>out, "Turned off flag hasCoverImage for: %s" % x.getId()
553
554            print >>out, "Cover image fixes complete"
555#        if old<='1.1':      # moved to 1.2.3
556        if old<='1.12':
557            print >>out, "Starting migration from 1.12"
558            print >>out, "Renaming categories in existing groups and posts"
559            for group in self.community.objectValues('GroupBlog'):
560                gcats=list(group.getCategories())
561                change=0
562                if 'blog post' in gcats:
563                    gcats[gcats.index('blog post')]='General'
564                    change=1
565                if 'collaboration proposal' in gcats:
566                    gcats[gcats.index('collaboration proposal')]='Collaboration proposal'
567                    change=1
568                if change==1:
569                    group.setCategories(gcats)
570
571                for b in group.objectValues('BlogPost'):
572                    bcats=b.getCategory()
573                    if type(bcats)==str:
574                        change=0
575                        if bcats=='blog post':
576                            bcats='General'
577                            change=1
578                        if bcats=='collaboration proposal':
579                            bcats='Collaboration proposal'
580                            change=1
581                        if change==1:
582                            b.setCategory([bcats])                   
583                    else:   
584                        bcats=list(b.getCategory())
585                        change=0
586                        if 'blog post' in bcats:
587                            bcats[bcats.index('blog post')]='General'
588                            change=1
589                        if 'collaboration proposal' in bcats:
590                            bcats[bcats.index('collaboration proposal')]='Collaboration proposal'
591                            change=1
592                        if change==1:
593                            b.setCategory(bcats)
594
595            print >>out, "Migration from 1.12 complete"
596        if old<='1.2':
597            print >>out, "Starting migration from 1.2"
598            print >>out, "Moving tips to new location..."
599            for member in self.community.objectValues('MemberFolder'):
600                storyfolder = member.getStoriesFolder()
601                for story in member.objectValues('Story'):
602                    member._delObject(story.getId())
603                    storyfolder._setObject(story.getId(),story)
604            print >>out, "Migration from 1.2 complete"
605        if old<='1.2.1':
606            print >>out, "Starting migration from 1.2.1"
607            print >>out, "Syncing ownership and author information..."
608            for x in chain(self.content.objectValues(CONTENT_TYPES),
609                           self.community.objectValues(COMMUNITY_TYPES),
610                           self.tools.objectValues(TOOLS_TYPES),
611                           self.activities.objectValues(ACTIVITY_TYPES)):
612                if isinstance(x, Resource):
613                    oldOwner = str(x.getOwner())
614                    newOwner = x.getField('creators').get(x)[0]
615                    x.changeOwnership(getattr(self.community,newOwner))
616                    x.manage_delLocalRoles([oldOwner,])
617                    x.manage_addLocalRoles(newOwner, ['Owner',])
618            print >>out, "Migration from 1.2.1 complete"
619
620        if old<='1.2.2':
621            print >>out, "Starting migration from 1.2.2"
622            print >>out, "Fixing categories for groups..."
623            for x in self.community.objectValues('GroupBlog'):
624                if x.getField('categories').get(x)[0]=='general, collaboration proposal':
625                    print >>out, "fixing group %s" % x.getId()
626                    gcats=list(x.getField('categories').get(x))
627                    newcats=['General','Collaboration proposal']+gcats[1:]
628                    x.setCategories(newcats)
629        if old<='1.3':
630            print >>out, "Starting migration from 1.2.3"
631            for x in chain(self.content.objectValues(CONTENT_TYPES),
632                           self.community.objectValues(COMMUNITY_TYPES),
633                           self.tools.objectValues(TOOLS_TYPES),
634                           self.activities.objectValues(ACTIVITY_TYPES)):
635                if isinstance(x, Resource):
636                    print x.getId()
637                    x.recalculateAuthors()
638            print >>out, "Migration from 1.2.3 complete"
639        if old<='1.3.01':
640            for x in self.community.objectValues('MemberFolder'):
641                if not hasattr(x.aq_base, 'left_slots'):
642                    x._setProperty('left_slots', ['here/portlet_member/macros/portlet',], 'lines')
643                else:
644                    x._updateProperty('left_slots', ['here/portlet_member/macros/portlet',])
645        if old<='1.3.2':
646            print >>out, "Starting migration from 1.3.01"
647            for x in chain(self.content.objectValues(CONTENT_TYPES),
648                           self.community.objectValues(COMMUNITY_TYPES),
649                           self.tools.objectValues(TOOLS_TYPES),
650                           self.activities.objectValues(ACTIVITY_TYPES)):
651                if isinstance(x, Resource):
652                    x.migrate_history()
653            print >>out, "Migration from 1.3.01 complete"
654        if old<='1.3.4':
655            print >>out, "Starting migration to 1.3.4"
656            for x in chain(self.content.objectValues(CONTENT_TYPES),
657                           self.community.objectValues(COMMUNITY_TYPES),
658                           self.tools.objectValues(TOOLS_TYPES),
659                           self.activities.objectValues(ACTIVITY_TYPES)):
660                if isinstance(x, Resource):
661                    print x.getId()
662                    x.recalculateAuthors()
663            print >>out, "Migration to 1.3.4 complete"
664
665        print >>out,"Migration completed."
666
667
668def uninstall(self):
669        """ uninstall """
670        out = StringIO()
671        # We don't have any way of uninstalling, at this point.
672        return out.getvalue()
673
Note: See TracBrowser for help on using the repository browser.