source: products/quintagroup.transmogrifier/branches/plone-2.1/quintagroup.transmogrifier/quintagroup/transmogrifier/exportimport.py @ 1237

Last change on this file since 1237 was 690, checked in by chervol, 17 years ago

retagging

File size: 4.8 KB
Line 
1import tempfile
2
3from zope.interface import implements
4from zope.app.annotation.interfaces import IAnnotations
5
6from collective.transmogrifier.interfaces import ITransmogrifier
7from collective.transmogrifier.transmogrifier import _load_config, constructPipeline
8from collective.transmogrifier.transmogrifier import configuration_registry
9
10try:
11    from Products.GenericSetup import context as gscontext
12except ImportError:
13    from Products.CMFSetup import context as gscontext
14
15from quintagroup.transmogrifier.writer import WriterSection
16from quintagroup.transmogrifier.reader import ReaderSection
17from quintagroup.transmogrifier.configview import ANNOKEY
18
19EXPORT_CONFIG = 'export'
20IMPORT_CONFIG = 'import'
21
22CONFIGFILE = None
23def registerPersistentConfig(site, type_):
24    """ Try to get persistent pipeline configuration of given type (export or import)
25        and register it for use with transmogrifier.
26    """
27    global CONFIGFILE
28    anno = IAnnotations(site)
29    key = '%s.%s' % (ANNOKEY, type_)
30    config = anno.has_key(key) and anno[key] or None
31
32    # unregister old config
33    name = 'persitent-%s' % type_
34    if name in configuration_registry._config_ids:
35        configuration_registry._config_ids.remove(name)
36        del configuration_registry._config_info[name]
37
38    # register new
39    if config is not None:
40        title = description = u'Persistent %s pipeline'
41        tf = tempfile.NamedTemporaryFile('w+t', suffix='.cfg')
42        tf.write(config)
43        tf.seek(0)
44        CONFIGFILE = tf
45        configuration_registry.registerConfiguration(name, title, description, tf.name)
46        return name
47    else:
48        return None
49
50def exportSiteStructure(context):
51    transmogrifier = ITransmogrifier(context.getSite())
52
53    # we don't use transmogrifer's __call__ method, because we need to do
54    # some modification in pipeline sections
55
56    config_name = registerPersistentConfig(context.getSite(), 'export')
57    if config_name is None:
58        transmogrifier._raw = _load_config(EXPORT_CONFIG)
59    else:
60        transmogrifier._raw = _load_config(config_name)
61        global CONFIGFILE
62        CONFIGFILE = None
63    transmogrifier._data = {}
64
65    options = transmogrifier._raw['transmogrifier']
66    sections = options['pipeline'].splitlines()
67    pipeline = constructPipeline(transmogrifier, sections)
68
69    last_section = pipeline.gi_frame.f_locals['self']
70
71    # if 'quintagroup.transmogrifier.writer' section's export context is
72    # tarball replace it with given function argument
73    while hasattr(last_section, 'previous'):
74        if isinstance(last_section, WriterSection) and \
75            isinstance(last_section.export_context, gscontext.TarballExportContext):
76            last_section.export_context = context
77        last_section = last_section.previous
78        # end cycle if we get empty starter section
79        if type(last_section) == type(iter(())):
80            break
81        last_section = last_section.gi_frame.f_locals['self']
82
83    # Pipeline execution
84    for item in pipeline:
85        pass # discard once processed
86
87def importSiteStructure(context):
88    # this function is also called when adding Plone site, so call standard handler
89    if not context.readDataFile('.objects.xml', subdir='structure'):
90        try:
91            from Products.GenericSetup.interfaces import IFilesystemImporter
92            IFilesystemImporter(context.getSite()).import_(context, 'structure', True)
93        except ImportError:
94            pass
95        return
96
97    transmogrifier = ITransmogrifier(context.getSite())
98
99    # we don't use transmogrifer's __call__ method, because we need to do
100    # some modification in pipeline sections
101
102    config_name = registerPersistentConfig(context.getSite(), 'import')
103    if config_name is None:
104        transmogrifier._raw = _load_config(IMPORT_CONFIG)
105    else:
106        transmogrifier._raw = _load_config(config_name)
107        global CONFIGFILE
108        CONFIGFILE = None
109    transmogrifier._data = {}
110
111    options = transmogrifier._raw['transmogrifier']
112    sections = options['pipeline'].splitlines()
113    pipeline = constructPipeline(transmogrifier, sections)
114
115    last_section = pipeline.gi_frame.f_locals['self']
116
117    # if 'quintagroup.transmogrifier.writer' section's export context is
118    # tarball replace it with given function argument
119    while hasattr(last_section, 'previous'):
120        if isinstance(last_section, ReaderSection) and \
121            isinstance(last_section.import_context, gscontext.TarballImportContext):
122            last_section.import_context = context
123        last_section = last_section.previous
124        # end cycle if we get empty starter section
125        if type(last_section) == type(iter(())):
126            break
127        last_section = last_section.gi_frame.f_locals['self']
128
129    # Pipeline execution
130    for item in pipeline:
131        pass # discard once processed
Note: See TracBrowser for help on using the repository browser.