Bonjour,

Avec les versions actuels de CPS, il n'y a pas besoin de remonter au datamodel pour importer les contenus. La méthode edit du doc fait ça plus simplement et plus complétement (pas besoin de réindexer, par exemple). Il faut lui passer un dico avec les différentes valeurs. Le script de Cédric devient un truc du genre :
            wTool.invokeFactoryFor(ws, 'File', fileId)
            logStringBuffer.append('  created...')
            document = getattr(ws, fileId)
            documentRepository = document.getContent()
            #CMA Getting file data
            #CMA Be careful to open the file in binary mode ;-)
            diskFile = open(os.path.join(path, objectName), 'rb')
            ofsFile = File('file', '%s.doc'%(fileId), diskFile)
            diskFile.close()
            dico = {'file': ofsFile, 'Title': objectName }
            documentRepository.edit(dico)
            logStringBuffer.append('  uploaded...')
            #CMA Reindexing file
            documentRepository.reindexObject()
            logStringBuffer.append('  reindexed...')

Il faut aussi faire attention à éviter de mettre trop de document dans un même folder (pas plus d'une centaine) pour des questions de performance. Il faut donc que ton script génère une arborescence en créant selon le même principe des workspaces ou des sections.

En pièce jointe un script qui crée des docs à partir de lignes d'un fichier csv en organisant une arborescence par année/mois/domaine. Il y a en plus une gestion de transaction pour éviter de consommer trop de mémoire.

Bon courage
Pierre Maris
Architecte
Capgemini Est
04 72 21 31 29


ALBAR, Jean-victor (CAP-GEMINI) a écrit :
Bonjour Cédric,
merci beaucoup, c'est super sympa.
J'essai de comprendre et je fais un test et... je te recontacte si soucis...
 
Maintenant que j'ai l'import, il me reste plus qu'a trouver comment faire l'export (il me faut pouvoir restituer tous les documents mis sous CPS).
 
@Pierre Maris : oui bien sur pour de l'aide et 1 script je suis tout a fait pret à patienter ;-)
 
Cordialement,
 
JVA
 
 
-----Message d'origine-----
De : Cédric Marfil [mailto:[EMAIL PROTECTED]]
Envoyé : mardi 23 janvier 2007 19:36
À : ALBAR, Jean-victor (CAP-GEMINI); cedric MARFIL
Cc : [email protected]
Objet : Re: [CPS-users-fr] Stockage de documents Office

Bonsoir,
Comme convenu, voici le script que nous utilisions en External Method dans la ZMI pour réaliser l'import de fichiers en ZODB dans des Workspaces bien définis. Il se nomme "integrateFormations.py".
Ce Script permet d'importer les fichiers situés dans des répertoires du fileSystem vers des Workspaces CPS:
    - INSTANCE_HOME/Products/Tipi/Formations --> portal.workspaces.offre_formation
    - INSTANCE_HOME/Products/Tipi/Fiches --> portal.workspaces.offre_formation.fiches_formation
Il commence par supprimer tous les objets de type "CPS Proxy Document" présent dans le workspace de destination.
Puis, il crée les nouveau objets en calculant tout d'abord l'identifiant par rapport au workspace (de façon à éviter de créer un objet de type "File" qui aurait le même ID, ce qui ferait planter le script).
Ensuite, il crée un objet de type "File".
Puis il lit le fichier du fileSystem et l'ajoute à la structure (datamodel) de l'objet "File" (avec un nom particulier, libre à toi de modifier le script pour l'adapter bien sûr).
Il termine en committant le datamodel et en réindexant l'objet "File" dans la ZODB.
A la fin de l'exécution, l'external method renvoi une page Html comprenant la liste des fichiers uploadés avec les opérations successives et enfin, le nombre de fichiers uploadés.
 
L'idée, d'après ce que j'ai cru comprendre du CPS Disk File Field, serait de conserver le même script en prenant soin tout d'abord de modifier le schéma "File" dans portal_schemas pour y faire intervenir un champ de type "CPS Disk File Field" à la place du champs de type "File". Le mieux serait même de créer un nouveau type, basé sur un nouveau schéma, mais l'explication par mail risque d'être assez longue.
 
Essayes déjà çà pour voir.
 
Cordialement
Cédric
----- Original Message -----
Sent: Tuesday, January 23, 2007 5:06 PM
Subject: RE: [CPS-users-fr] Stockage de documents Office

Re Cédric et la liste,
pour répondre à tes questions, il va y avoir des documents en rubrique qui eux ne bougeront pas (normal) et la gande majorité des documents en espace de travail qui eux devront gerer le versionning car en évolution constante (je dirais 40% statiques et 60% en espace de travail).
 
Nous avons besoin d'une 1ere initialisation de l'outil avec les 2000 documents (à n'executer qu'une fois) et, si on n'utilise pas le Disk File Field, un script d'exportation de tous les documents vers un FS (nous devons etre capables de restituer tous les documents).
Si nous utilisons le CPS Disk File Field, à priori nous n'avons pas besoin de l'exportation car nous aurons nos documents directement dans un répertoire c'est ca ? 
 
Avez vous des docs qui décrivent comment configurer l'option CPS Disk File Field ?
Comment cela fonctionne t il (versionning ? Locks ? etc...).
Peut on (et si oui comment ?) migrer notre base actuelle en CPS Disk File Field ?
 
Je vous remercie tous de votre aide.
 
JVA
 
-----Message d'origine-----
De : cedric MARFIL [mailto:[EMAIL PROTECTED]]
Envoyé : mardi 23 janvier 2007 16:37
À : pierre.maris
Cc : ALBAR, Jean-victor (CAP-GEMINI); cps-users-fr
Objet : Re: [CPS-users-fr] Stockage de documents Office

Effectivement, je n'avais pas lu le mail d'Eric.
Comment fonctionne exactement le DiskFileField ?
Est-ce que quelqu'un as des exemples de mise en oeuvre, s'il vous plaît ?
Je posterai ce soir les sources du script permettant la création d'objet de type file à partir d'un répertoire du disque local du serveur.
La volonté d'utiliser ce script serait pour initialiser le réferentiel ou pour faire des aller retours clients / serveur ?
Notre script est écrit pour une utilisation avec les fichiers présents sur le serveur dans le but de les mettre à disposition dans des espaces collaboratifs en les stockant dans la ZODB. Il conviendra de l'adapter à la situation présente.
 
Cordialement
 
 
To "cedric MARFIL" [EMAIL PROTECTED]
Cc "JEAN-VICTOR.ALBAR" [EMAIL PROTECTED],"cps-users-fr" [EMAIL PROTECTED]
Date Tue, 23 Jan 2007 16:25:02 +0100
Subject Re: [CPS-users-fr] Stockage de documents Office
   
Bonjour,

Bien d'accord que 15Go pour les données, ça commence à faire, surtout que les index risque de peser presque autant!

Mais est-ce que, comme le suggérait Eric , l'utilisation d'un Disk File Field n'est pas suffisante?


Pierre Maris
Architecte
Capgemini Est
04 72 21 31 29
06 83 56 59 33


cedric MARFIL a écrit :
>
> Je ne sais pas ce qu'en pense la communauté, mais il me paraît raisonnable de trouver une solution de contournement à la ZODB et une façon de stocker les fichiers sur le fileSystem. 15Go de ZODB en volume, çà représente tout de même beaucoup (Sans compter qu'il faudra monter une partition reiserfs sous Linux pour accepter que le fichier Data.fs puisse faire une taille si importante).
> Il faut donc se pencher sur l'option ZFS_Path peut-être, qui permet de stocker des fichiers sur le fileSystem en référençant un chemin d'accès à la racine du repository. Peut-être que ce mode de fonctionnement conviendrait.
> Que souhaites tu faire de ces documents à terme ? Du versionning ? ou serait-ce un simple référentiel documentaire partagé ?
>  
>
Cc
>
Date Tue, 23 Jan 2007 14:55:48 +0100
>
Subject RE: [CPS-users-fr] Stockage de documents Office
>
   
> >
> > Re bonjour Cédric,
> > oui ce script m'interesse beaucoup.
> > Je recherche à importer mes documents dans l'outil et bien sur l'inverse (récupérer les documents originaux en masse vers un file system).
> > La volumétrie des 2000 documents représente environ 7Go (en sachant qu'a moyen terme il y aura environ 15Go de documents).
> >  
> > Merci
> >  
> > JVA
> >  
-----Message d'origine-----
De : cedric MARFIL [mailto:[EMAIL PROTECTED]]
Envoyé : mardi 23 janvier 2007 14:36
À : ALBAR, Jean-victor (CAP-GEMINI)
Cc : cps-users-fr
Objet : RE: [CPS-users-fr] Stockage de documents Office

> >
> > Re-Bonjour JV,
> > Nous avons pour notre part développé un petit script permettant de faire un import de 100 fichiers au format Word pour les intégrer dans la ZODB (parce que nous n'avions que 100 fichiers à importer, mais c'était une boucle qui marche pour n'importe quel nombre de fichiers). Ce script one shot lit le fichier sur le disque, crée un objet de type "File" (portal_type) et y attache le fichier récupéré sur le fileSystem. Le fichier est lui-même sérialisé dans la ZODB.
> > Peut-être cet import te conviendrait-il ?
> > Il est certainement possible de faire en sorte de stocker les fichiers sur le fileSystem du serveur plutôt que dans la ZODB. A toi de voir ce qui te convient le mieux. Quelle est la volumétrie de tes 2000 fichiers en termes de Mo ?
> >  
> > Cordialement
> > Cédric
> >  
> >
Cc
> >
Date Tue, 23 Jan 2007 14:16:11 +0100
> >
Subject RE: [CPS-users-fr] Stockage de documents Office
> >
   
> > > Merci pour vos réponses.
> > >  
> > > Je croyais que Nuxeo 5 n'etait pas encore dispo...
> > > Est-il stable ?
> > > Gere t il le versionning et le "undo" ?
> > >  
> > > La décision du choix de l'outil doit être prise très rapidement.
> > > Si Nuxeo 5 n'est pas dispo dans les semaines qui viennent, nous voulons rester sous CPS.
> > > La fonctionnalité d'import/export des documents originaux est primordiale pour nous dans CPS.
> > > Est-elle possible actuellement ? 
> > >  
> > > Notre volumétrie est d'environ 2000 documents (principalement des documents word et Excel en espace de travail collaboratif).
> > > Nous avons environ 100 utilisateurs succeptibles d'utiliser l'outil.
> > > Nous avons la version CPS 3.4 sous Windows 2003 (nous avons eu des soucis de configuration de CPS sous Linux en juin 2006 et avons du migrer sur Windows pour les résoudre).
> > > Notre objectif est d'utiliser un produit simple (mais complet) ne necessitant pas ou peu de developpement ni d'administration compliquée.
> > >  
> > > Voila, vous savez tout :-)
> > >  
> > > Encore merci de votre aide....
> > >  
> > > JVA
-----Message d'origine-----
De : Eric Barroca [mailto:[EMAIL PROTECTED]]
Envoyé : mardi 23 janvier 2007 12:42
À : ALBAR, Jean-victor (CAP-GEMINI)
Cc : [email protected]
Objet : Re: [CPS-users-fr] Stockage de documents Office

Bonjour,
> > >
> > >
> > > On 23 janv. 07, at 12:00, [EMAIL PROTECTED] wrote:
Nous sommes en phase de test de CPS 3.4 et nous nous posons quelques questions :

Nos besoins sont des besoins de stockage de documents, de travail collaboratif, de versionning et de flux de validation.
CPS répond à tous nos besoins à part le fait que Zope/CPS soit un peu difficile à apprehender encore pour nous (toute suggestion de documentations ou bouquins est la bienvenue).
> > > Avez-vous testé Nuxeo 5, il doit vous founir les mêmes fonctionnalités.

Nous avons 2 questions primordiales :

1/ Peut-on importer en masse nos documents office (word, Excel, Powerpoint, etc...) dans l'outil ?
Nous avons environ 2000 documents à importer sous CPS donc ca serait sympa de pouvoir les importer en quelques clics.
> > >  Nuxeo EP 5 offre des extensions pour les navigateurs qui permettent d'importer en masse des documents via drag and drop dans le browser.

2/ Notre impératif est la sauvegarde des documents et la restitution de ceux ci.
Le stockage de ceux ci dans la ZODB nous fait peur (en terme de gestion et de restitution).
Pouvons nous nous passer de la ZODB pour laisser les documents stockés dans un file system (ou au pire dans une base de données "ouverte") ?
Dans le cas d'un stockage dans un file system, quid du versionning ?
CPS peut permettre un stockage des pièces jointes sur le FileSystem en utilisant le type de field DiskFileField dans les documents.
> > >
> > > Pour Nuxeo EP5, le stockage est effectué par default sur le filesystem pour les fichiers attachés.
> > >
> > > Pouvez-vous nous en dire plus sur la volumétrie de l'instance que vous devez mettre en place (utilisateurs, etc.).
> > >
> > >
> > > Bonne journée,
> > >
> > > EB.


> > >
> > > --
> > > Éric Barroca - Ex. VP of Operations - +33 6 21 74 77 64
> > > www.nuxeo.com - Nuxeo: Open Source ECM - www.nuxeo.org
> > > Nuxeo EP 5: extensible, Java EE and standards based ECM Platform !


This mail has originated outside your organization, either from an external partner or the Global Internet.
Keep this in mind if you answer this message.


      
This e-mail is intended only for the above addressee. It may contain privileged information.
If you are not the addressee you must not copy, distribute, disclose or use any of the information in it. 
If you have received it in error please delete it and immediately notify the sender.
Security Notice: all e-mail, sent to or from this address, may be accessed by someone other than the recipient, for system management and security reasons. This access is controlled under Regulation of security reasons.
This access is controlled under Regulation of Investigatory Powers Act 2000, Lawful Business Practises.

    
This message contains information that may be privileged or confidential and is the property of the Capgemini Group. It is intended only for the person to whom it is addressed. If you are not the intended recipient, you are not authorized to read, print, retain, copy, disseminate, distribute, or use this message or any part thereof. If you receive this message in error, please notify the sender immediately and delete all copies of this message.

This mail has originated outside your organization, either from an external partner or the Global Internet.
Keep this in mind if you answer this message.

    
This e-mail is intended only for the above addressee. It may contain privileged information.
If you are not the addressee you must not copy, distribute, disclose or use any of the information in it. 
If you have received it in error please delete it and immediately notify the sender.
Security Notice: all e-mail, sent to or from this address, may be accessed by someone other than the recipient, for system management and security reasons. This access is controlled under Regulation of security reasons.
This access is controlled under Regulation of Investigatory Powers Act 2000, Lawful Business Practises.

  
This message contains information that may be privileged or confidential and is the property of the Capgemini Group. It is intended only for the person to whom it is addressed. If you are not the intended recipient, you are not authorized to read, print, retain, copy, disseminate, distribute, or use this message or any part thereof. If you receive this message in error, please notify the sender immediately and delete all copies of this message.


_______________________________________________ cps-users-fr Adresse de la liste : [email protected] Gestion de l'abonnement : <http://lists.nuxeo.com/mailman/listinfo/cps-users-fr>
This message contains information that may be privileged or confidential and is the property of the Capgemini Group. It is intended only for the person to whom it is addressed. If you are not the intended recipient, you are not authorized to read, print, retain, copy, disseminate, distribute, or use this message or any part thereof. If you receive this message in error, please notify the sender immediately and delete all copies of this message.

This mail has originated outside your organization, either from an external partner or the Global Internet.
Keep this in mind if you answer this message.

        
This e-mail is intended only for the above addressee. It may contain privileged information.
If you are not the addressee you must not copy, distribute, disclose or use any of the information in it. 
If you have received it in error please delete it and immediately notify the sender.
Security Notice: all e-mail, sent to or from this address, may be accessed by someone other than the recipient, for system management and security reasons. This access is controlled under Regulation of security reasons.
This access is controlled under Regulation of Investigatory Powers Act 2000, Lawful Business Practises.

      
This mail has originated outside your organization, either from an external partner or the Global Internet.
Keep this in mind if you answer this message.

    
This message contains information that may be privileged or confidential and is the property of the Capgemini Group. It is intended only for the person to whom it is addressed. If you are not the intended recipient, you are not authorized to read, print, retain, copy, disseminate, distribute, or use this message or any part thereof. If you receive this message in error, please notify the sender immediately and delete all copies of this message.

This e-mail is intended only for the above addressee. It may contain privileged information.
If you are not the addressee you must not copy, distribute, disclose or use any of the information in it. 
If you have received it in error please delete it and immediately notify the sender.
Security Notice: all e-mail, sent to or from this address, may be accessed by someone other than the recipient, for system management and security reasons. This access is controlled under Regulation of security reasons.
This access is controlled under Regulation of Investigatory Powers Act 2000, Lawful Business Practises.

  

_______________________________________________ cps-users-fr Adresse de la liste : [email protected] Gestion de l'abonnement : <http://lists.nuxeo.com/mailman/listinfo/cps-users-fr>
import os
import sys
import mx.DateTime
from zLOG import DEBUG, INFO, LOG 
from string import maketrans

def getFolder(dest, title):
        id = testid(title)
        if not hasattr(dest, id):
                dest.invokeFactory('Section', id)
                ob = getattr(dest, id)
                doc = ob.getEditableContent()
                dico = {'Title':title}
                doc.edit(dico)
        return getattr(dest, id)

max_chars_for_id=40
def testid(compute_from):
        # Create, no id, get from title
        newid = compute_from.strip()[:max_chars_for_id]
        
        # Normalization
        newid = newid.replace('Æ', 'AE')
        newid = newid.replace('æ', 'ae')
        newid = newid.replace('¼', 'OE')
        newid = newid.replace('½', 'oe')
        newid = newid.replace('ß', 'ss')
        tr = maketrans(
                r"'\;/ 
&:ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöøùúûüýÿ",
                
r'_______AAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy')
        newid = newid.translate(tr)
        ok = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.'
        newid = ''.join([c for c in newid if c in ok])
        while newid.startswith('_') or newid.startswith('.'):
                newid = newid[1:]
        
        while newid.endswith('_'):
                newid = newid[:-1]
        
        if newid:
                newid = newid.lower()
        else:
                # Fallback if empty
                newid = str(int(DateTime())) + str(randrange(1000, 10000))
        return newid

def load(self, min=1, max=33000):
        dest = self
        type_name = 'AVI_Deliberations'
        f = open(os.path.join(CLIENT_HOME,'../import/export_delib.txt'), 
mode='r')
        source = f.read(-1)
        delibs = source.split('\n')
        i = 0
        t = get_transaction()
        t.begin()
        for delib  in delibs[min:max]:
                fields = delib.split('\t')
                ordre = fields[0]
                date = fields[1]
                jma = date.split('/')
                jour = jma[0]
                mois = jma[1]
                annee = jma[2]
                if int(annee)>20:
                        annee = '19'+annee
                else:
                        annee = '20'+annee
                dt = fields[2].split(':')
                if len(dt)>1:
                        domaine = dt[0].strip()
                        title = dt[1].strip()
                else:
                        title = dt[0]
                        domaine = "Autres"
                folderAnnee = getFolder(dest, annee)
                folderMois = getFolder(folderAnnee, mois)
                folderDomaine = getFolder(folderMois, domaine)
                dico = {}
                dico['Ordre'] = ordre
                dico['Date-Delib'] = "%s/%s/%s" % (jour, mois, annee)
                dico['Domaine'] = domaine
                dico['Title'] = title
                id = dico['Ordre']
                if not hasattr(folderDomaine, id):
                        folderDomaine.invokeFactory(type_name, id)
                ob = getattr(folderDomaine, id)
                doc = ob.getEditableContent()
                LOG('Upload Delib', INFO, '%s : %s/%s/%s/%s : %s created' % (i, 
annee, mois, domaine, id, title))
                doc.edit(dico)
                i = i+1
                if i%100==0:
                        t.commit()
                        LOG('Upload Delib', INFO, '%s : commit' % i)
                        t = get_transaction()
                        t.begin
                
        t.commit()
        
        return "%s deliberations importees" % i


This message contains information that may be privileged or confidential and is 
the property of the Capgemini Group. It is intended only for the person to whom 
it is addressed. If you are not the intended recipient,  you are not authorized 
to read, print, retain, copy, disseminate,  distribute, or use this message or 
any part thereof. If you receive this  message in error, please notify the 
sender immediately and delete all  copies of this message.
_______________________________________________
cps-users-fr 
Adresse de la liste : [email protected]
Gestion de l'abonnement : <http://lists.nuxeo.com/mailman/listinfo/cps-users-fr>

Répondre à