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 |
---|