[1] | 1 | import sys |
---|
| 2 | from Products.CMFCore.utils import getToolByName |
---|
| 3 | import transaction, traceback |
---|
| 4 | |
---|
| 5 | processed = [] |
---|
| 6 | brakes = [] |
---|
| 7 | |
---|
| 8 | def clean(blog, id): |
---|
| 9 | if hasattr(blog,id): |
---|
| 10 | delattr(blog,id) |
---|
| 11 | if blog.__dict__.has_key(id): |
---|
| 12 | del blog.__dict__[id] |
---|
| 13 | |
---|
| 14 | def migrate2Btree(migrated_ob): |
---|
| 15 | global processed, brakes |
---|
| 16 | |
---|
| 17 | try: |
---|
| 18 | migrated_ob._initBTrees() |
---|
| 19 | obs = list(migrated_ob._objects) |
---|
| 20 | for o in obs: |
---|
| 21 | if o['meta_type']=='BlogFolder': |
---|
| 22 | oo=getattr(migrated_ob, o['id'], None) |
---|
| 23 | oo._initBTrees() |
---|
| 24 | while obs: |
---|
| 25 | ob_data = obs.pop() |
---|
| 26 | ob_id, ob_meta = map(lambda i:ob_data[i], ['id','meta_type']) |
---|
| 27 | object = getattr(migrated_ob, ob_id, None) |
---|
| 28 | clean(migrated_ob, ob_id) |
---|
| 29 | if object is not None: |
---|
| 30 | if object.meta_type == 'BlogFolder': |
---|
| 31 | migrate2Btree(object) |
---|
| 32 | migrated_ob._setOb(ob_id, object) |
---|
| 33 | be = migrated_ob._getOb(ob_id,None) |
---|
| 34 | if be is None: |
---|
| 35 | raise Exception("Not set '%s' object on '%s' blog" % (ob_id, blog.getId())) |
---|
| 36 | be._p_changed = 1 |
---|
| 37 | be.reindexObject() |
---|
| 38 | else: |
---|
| 39 | raise str("%s - not exist in %s" % (ob_id, self.blog.absolute_url())) |
---|
| 40 | processed.append(ob_id) |
---|
| 41 | migrated_ob._objects = () |
---|
| 42 | migrated_ob._p_changed = 1 |
---|
| 43 | migrated_ob.reindexObject() |
---|
| 44 | except: |
---|
| 45 | err_type, err_val, traces = sys.exc_info() |
---|
| 46 | brakes.append({'url':migrated_ob.absolute_url(), "err_type":str(err_type), "err_val":str(err_val),\ |
---|
| 47 | 'traces':'\n'.join(traceback.format_exception(err_type, err_val, traces))}) |
---|
| 48 | return processed, brakes |
---|
| 49 | |
---|
| 50 | def migrateBlogs(self): |
---|
| 51 | """ Migration all portal's blogs to BTreeFoolder base. """ |
---|
| 52 | global processed, brakes |
---|
| 53 | |
---|
| 54 | res = "" |
---|
| 55 | catalog = getToolByName(self, 'portal_catalog') |
---|
| 56 | |
---|
| 57 | # add 'EntryCategory' to portal_catalog Metadata. |
---|
| 58 | # Update cataloged object perform on 2nd migration step |
---|
| 59 | if not 'EntryCategory' in catalog._catalog.names: |
---|
| 60 | catalog.addColumn('EntryCategory') |
---|
| 61 | |
---|
| 62 | # migrate old-fashion blog to btree-based |
---|
| 63 | blogs = [b.getObject() for b in catalog(portal_type="Blog")] |
---|
| 64 | for blog in blogs: |
---|
| 65 | p,b = migrate2Btree(blog) |
---|
| 66 | processed.extend(p) |
---|
| 67 | brakes.extend(b) |
---|
| 68 | |
---|
| 69 | res += 'processed: %d blogs with %d objects, brakes - %d objects.' % (len(blogs),len(processed),len(brakes)) |
---|
| 70 | res += "%s\n\n%s\n\n%s" % (str(blogs),str(processed),str(brakes)) |
---|
| 71 | |
---|
| 72 | return res |
---|