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>