[Plone-IT] CMFCore import content and .preserve

SauZheR at gOOgle sauzher a gmail.com
Mer 14 Maggio 2008 15:14:37 UTC


Salve a tutti.
Vorrei che deste un'occhiata al pezzettino di codice del metodo import_
della classe StructureFolderWalkingAdapter del modulo
CMFCore/exportimport/content.py

Questa classe, in particolare questo medoto, gestisce l'import di una
struttura di contenuti di un profilo generic setup per poter popolare un
plone in fase di installazione di un prodotto con directory, document ed
altri oggetti marshallabili . Fin qui, tutto ok ed e' abbastanza comodo.

Pero' il comportamento di default prevede che se il profilo viene
reimportato, magari per un update di prodotto, tutti i contenuti specificati
nella stucture vengano cancellati e ricreati. Cio' non e' sembre bene in
quanto i contenuti di default potrebbero essere stati modificati durante
l'esercizio del portale prima di questo update di prodotto.

CMFCore ci viene incontro, dandoci la possibilita' di specificare all'uopo,
all'interno di un file .preserve, tutti quelli ID di oggetti da appunto
preservare.

Questo, pero', di fatto non accade: i contenuti vengono brutalmente
 sovrascritti nonostante siano .preservati.


Ho debuggato il codice della classe in oggetto che riporto.

def import_(self, import_context, subdir, root=False):
        """ See IFilesystemImporter.
        """
        context = self.context

        if not root:
            subdir = '%s/%s' % (subdir, context.getId())

        objects = import_context.readDataFile('.objects', subdir)
        if objects is None:
            return

        dialect = 'excel'
        stream = StringIO(objects)
        rowiter = reader(stream, dialect)
        ours = tuple(rowiter)
        our_ids = set([item[0] for item in ours])

        prior = set(context.contentIds())

        preserve = import_context.readDataFile('.preserve', subdir)
        import pdb; pdb.set_trace()
        if not preserve:
            preserve = set()
        else:
            preservable = prior.intersection(our_ids)
            preserve = set(_globtest(preserve, preservable))

        delete = import_context.readDataFile('.delete', subdir)
        if not delete:
            delete= set()
        else:
            deletable = prior.difference(our_ids)
            delete = set(_globtest(delete, deletable))

        # if it's in our_ids and NOT in preserve, or if it's not in
        # our_ids but IS in delete, we're gonna delete it
        delete = our_ids.difference(preserve).union(delete)

        for id in prior.intersection(delete):
            context._delObject(id)

### FINO a questo punto il funzionamento e' coerente con quanto dichiarato
nella docsring e i contenuti di .preserve NON son cancellati... MA...

        existing = context.objectIds()

        for object_id, portal_type in ours:

            if object_id not in existing:
                object = self._makeInstance(object_id, portal_type,
                                            subdir, import_context)
                if object is None:
                    logger = import_context.getLogger('SFWA')
                    logger.warning("Couldn't make instance: %s/%s" %
                                   (subdir, object_id))
                    continue
*
            wrapped = context._getOb(object_id) # questa istruzione viene
eseguita ugualmente (ma non fa male)

            IFilesystemImporter(wrapped).import_(import_context, subdir)** #
questa istruzione viene eseguita ugualmente (e fa malissimo)**
*

MA, poi si cicla tra tutti gli object_id del profilo e SE NON esistenti gia'
nel portale vengono creati.... il problema e' che le istruzioni in grassetto
vengono eseguite comunque perche' fuori dal blocco if e
*IFilesystemImporter(wrapped).import_(import_context,
subdir)* sovrascrive alla grande l'oggetto gia' presente nel portale con
quello che risiede nel profilo su filesystem.

Io credo che queste due righe debbano essere indentate. Sbaglio?

alessandro.

-- 
bye
SauZheR
************************************
l'iterazione è umana...
la ricorsione, Divina!
************************************
reply to: sauzher AT gmail DOT com
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.plone.org/pipermail/plone-plone-it/attachments/20080514/50727c58/attachment.html>


Maggiori informazioni sulla lista Plone-IT