Changeset 4965


Ignore:
Timestamp:
1 Feb 2010, 16:29:02 (15 years ago)
Author:
uli
Message:

Remove tests of quick-import functionality.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.sirp/trunk/src/waeup/sirp/utils/importexport.txt

    r4920 r4965  
    141141    >>> import os
    142142    >>> os.unlink('myexport.xml')
    143 
    144 
    145 Importing CSV data
    146 ==================
    147 
    148 The WAeUP portal supports import of CSV data for several different
    149 data types like faculties, students, and the like.
    150 
    151 For our purposes we define CSV imports as tuples, containing a CSV
    152 source and a CSV receiver:
    153 
    154   ``CSV Import := <CSVSource, CSVReceiver>``
    155 
    156 CSV sources
    157 -----------
    158 
    159 CSV sources build a plugin framework inside the WAeUP portal (that
    160 might be factored out one day). See `waeup.sirp.csvfile` to learn more
    161 about that.
    162 
    163 A `waeup.sirp.csvfile.CSVFile` plugin cares for a special kind of CSV file.
    164 
    165 To make clear what that means, we start by creating a simple CSV
    166 file.
    167 
    168 CSVFile objects are abstractions of simple .csv-files. But as not
    169 every CSV file contains the same kind of data, we can create different
    170 flavours of it, for instance to import departments or faculties. As
    171 each kind of import needs different kind of data, we have different
    172 kinds of CSV sources.
    173 
    174 CSV sources can check their associated files for consistency,
    175 importability, etc.
    176 
    177 We create a simple CSV file with cave data:
    178 
    179     >>> open('mycavedata.csv', 'wb').write(
    180     ... """size,owner
    181     ... 42,Manfred
    182     ... """)
    183 
    184 We have a very simple CSVFile available, which is registered as an
    185 adapter for strings. To make this work, the string should be a path to
    186 a file:
    187 
    188     >>> from waeup.sirp.csvfile import getCSVFile
    189     >>> mysource = getCSVFile('mycavedata.csv')
    190     >>> mysource
    191     <waeup.sirp.csvfile.csvfile.CSVFile object at 0x...>
    192 
    193 We define caves like this:
    194 
    195     >>> class Cave(object):
    196     ...   def __init__(self, size, owner):
    197     ...     self.size = size
    198     ...     self.owner = owner
    199     ...   def __repr__(self):
    200     ...     return '<Cave object [size: %s, owner: %s]>' % (
    201     ...       self.size, self.owner)
    202 
    203 Let's assume, we have a container for caves:
    204 
    205     >>> from zope.interface import Interface
    206     >>> class ICaveContainer(Interface):
    207     ...   """A container for caves."""
    208 
    209     >>> class CaveContainer(object):
    210     ...   grok.implements(ICaveContainer)
    211     ...   caves = []
    212     ...   def addCave(self, cave):
    213     ...     self.caves.append(cave)
    214 
    215     >>> mycaves = CaveContainer()
    216 
    217 Now, if we want to import caves from CSV files, we also need an
    218 importer, that imports data to the container:
    219 
    220     >>> from waeup.sirp.csvfile.interfaces import ICSVFile
    221     >>> from waeup.sirp.utils.importexport import CSVImporter
    222     >>> from waeup.sirp.interfaces import IWAeUPCSVImporter
    223     >>> class CaveImporter(CSVImporter):
    224     ...   # Tell, what kinds of objects we connect...
    225     ...   grok.adapts(ICSVFile, ICaveContainer)
    226     ...   # Tell the world, that we are an importer...
    227     ...   grok.provides(IWAeUPCSVImporter)
    228     ...   # The datatype can be used by UI components and is required
    229     ...   # by the interface...
    230     ...   datatype = u'Cave Importer'
    231     ...   def doImport(self):
    232     ...     # CSVImporter instances have a `csvfile` and a `receiver`
    233     ...     # object defined which refer to the CSV file and the container.
    234     ...     for row in self.csvfile.getData():
    235     ...       cave = Cave(size = row['size'],
    236     ...                   owner = row['owner'])
    237     ...       self.receiver.addCave(cave)
    238 
    239 
    240 An CSV importer must be grokked before we can use it. In real life,
    241 this is normally done on startup automatically:
    242 
    243     >>> grok.testing.grok_component('CaveImporter', CaveImporter)
    244     True
    245 
    246 Importers are multi-adapters, so we need to ask for one:
    247 
    248     >>> from zope.component import getMultiAdapter
    249     >>> myimporter = getMultiAdapter((mysource, mycaves), IWAeUPCSVImporter)
    250 
    251 Now we can finally do the import:
    252 
    253     >>> myimporter.doImport()
    254 
    255 The import was really done:
    256 
    257     >>> mycaves.caves
    258     [<Cave object [size: 42, owner: Manfred]>]
    259 
    260 **Important note**:
    261 
    262   This importer adapts ICSVFile and ICaveContainer, which means that
    263   the type of data receiver is specified correctly. For the CSV
    264   source, however, the importer cannot be sure to find a column
    265   ``size`` or ``owner`` in the file.
    266 
    267   This can be prevented, by defining a more special CSVFile type and
    268   adapting this instead of ICSVData.
    269 
    270   In the `waeup.sirp.csvfile` subpackage's README it is shown, how this can
    271   be accomplished.
    272 
    273   Summing up we would define an ICaveCSVFile type, provide an
    274   appropriate CSV file wrapper and then let our importer adapt::
    275 
    276     (ICaveCSVFile, ICaveContainer)
    277 
    278 **Another note**:
    279 
    280   The importer we defined above does not support the ``clear_old_data``
    281   and ``overwrite`` keywords as would be required by the
    282   IWAeUPImporter interface.
    283 
    284   In real life this keywords should be supported.
    285 
    286 Clean up:
    287 
    288    >>> import os
    289    >>> os.unlink('mycavedata.csv')
Note: See TracChangeset for help on using the changeset viewer.