Le 7 nov. 2006, à 12:16, Remaud Frederic a écrit :


Bonjour
 
Je suis sous CPS 3.4.2 avec une archi ZEO et stockage des fichiers sur disque (CPS Disk File Field) et depuis le dernier reboot du serveur, lorsqu’on joint des fichiers aux documents flexibles (je n’ai pourtant pas updaté CPS à partir du svn), on a une erreur
 
        •       Module Products.CPSDocument.CPSDocument, line 78, in validate
• Module Products.CPSDocument.FlexibleTypeInformation, line 811, in validateObject • Module Products.CPSDocument.FlexibleTypeInformation, line 822, in _commitDM
        •       Module Products.CPSSchemas.DataModel, line 337, in _commit
        •       Module Products.CPSSchemas.DataModel, line 359, in _commitData
• Module Products.CPSSchemas.BasicFields, line 660, in computeDependantFields
        •       Module Products.CPSSchemas.DiskFile, line 50, in __init__
        •       Module Products.CPSSchemas.DiskFile, line 65, in getNewFilename
OSError: [Errno 2] No such file or directory: '/home/zope/CalypsoV2/ZEOClients/zc1/var/files'
 
Pourtant, j’ai bien un CPS Disk File Field dans portal_schemas/File dont le storage path est correct (../../../attached_files/Calypso321)

Oui, mais ce n'est justement pas celui qui est utilisé pour les flexibles: il est dans le schema 'file', qui sert pour les documents File.

 
Aucun problème pour les documents fichiers (ils sont bien stockés au bon endroit) mais dès qu’il s’agit d’un flexible, il veut absolument me mettre ca dans var/files.
 
Dois-je modifier les storage_path dans CPSSchemas/DiskFile.py ?

Normalement, le mieux est d'ajouter une propriété 'disk_storage_path' de type 'string' sur l'outil portal_schemas, elle devrait concerner toutes les instances de DiskFile.

Extrait de CPSSchemas/BasicFields.py:

    def getStoragePath(self):
        if self.disk_storage_path:
            return self.disk_storage_path
        else:
            portal_schemas = getToolByName(self, 'portal_schemas')
storage_path = getattr(portal_schemas, 'disk_storage_path', '')
            if storage_path:
                return storage_path
            return 'var/files'

On voit donc qu'on essaye successivement la propriété au niveau du champ, puis de l'outil, et qu'on utilise var/files en dernier recours.

 
[…]
def __init__(self, id, title, file=None, content_type=None, storage_path='var/files'):
[…]
def addDiskFile(self, id, title, file=None, content_type=None,
                storage_path='var/files', REQUEST=None):

Certes, mais (toujours de BasicFields)

        """Compute dependant fields.

        schemas is the list of schemas

        data is the dictionnary of the datamodel
        """
        field_id = self.getFieldId()
        file = data[field_id] # May be None.
        if isinstance(file, File) and not isinstance(file, DiskFile):
            file = DiskFile(file.getId(), file.title, file.data,
                            file.content_type, self.getStoragePath())
            data[field_id] = file

En d'autres termes, au moment de calculer les champs dépendants, le champ en profite pour convertir si besoin le fichier normal qu'il contient en un DiskFile, et utilise pour cela le getStoragePath() cité plus haut. Donc pas la peine de toucher à DiskFile.

Mais pour finir sur les flexibles, le widget-modèle (celui qui est dans le layout de portal_layouts) peut aussi porter les valeurs d'initialisation des propriétés des champs à créer. C'est peut-être aussi ton cas ? C'est peut-être vérifiable dans l'onglet 'introspection'

Quelques remarques générales:
- on peut aller voir les schemas et layouts d'un document flexible en ZMI: aller sur le proxy, suivre le lien vers
           le doc, puis onglet 'Contents'.
- les objets DiskFile portent leur storage_path, donc on ne peut pas décider de changer celui-ci a posteriori. - En ZEO, il faut bien sûr que le répertoire contenant les fichiers soit accessible par tous les clients. Pas un problème s'il s'agit de profiter d'un multiprocesseur. Avec plusieurs machines, il faut passer par exemple par NFS, avec les problèmes que cela peut engendrer.

_______________________________________________
cps-users-fr 
Adresse de la liste : [email protected]
Gestion de l'abonnement : <http://lists.nuxeo.com/mailman/listinfo/cps-users-fr>

Répondre à