Georges Racinet a écrit :
On Aug 10, 2006, at 1:49 AM, Christophe Otton wrote:
Georges Racinet a écrit :
On Aug 9, 2006, at 10:48 AM, Christophe Otton wrote:
Bonjour,
Sur un CPS 3.2.4.0 et Zope 2.7.5
J'ai créé deux sites cps avec un chacun un produit dans lequel est
défini un chemin de stockage externe pour les fichiers attachés des
types : file, news et flexible.
Pour les deux premiers pas de pb mais pour les flexibles le
'disk_storage_path' est défini uniquement dans un script :
AttachedFileWidgetPatch.py avec la ligne :
ExtendedWidgets.CPSAttachedFileWidget.field_inits[0]['disk_storage_path']
= 'var/StoSite1'
et 'var/StoSite2' pour le deuxième site.
Evidemment, le dernier produit installé défini le chemin de
stockage pour les docs flexibles des deux sites.
J'ai donc essayé de trouver un endroit où modifier ce chemin
uniquement pour le site :
D'après la doc de CPSSchema les champs CPS Disk File ont une
propriété 'disk_storage_path' apparemment définie dans le schéma du
document mais les doc flexibles n'ont pas de schema ; Toujours
d'après la doc, si cette propriété n'est pas définie c'est la
valeur du portal_schemas qui est utilisée ? Mais je ne sais pas où
est définie cette valeur.
Si, il y a un schéma (flexible), qui est créé dans le document au
moment de l'ajout du premier widget flexible par recopie de celui
qui est dans portal_types, qui sert donc de point de départ.
Lorsque l'on ajoute un widget flexible, les champs nécessaires sont
créés dans ledit schéma, en fonction du type de widget créé. C'est
l'attribut de classe
"field_types" qui sert à déterminer quels types de champs créer.
En CPS 3.4 (je ne suis pas sûr pour 3.2), les propriétés des champs
sont de plus initialisées en fonction de l'attribut "field_inits".
Voici un extrait de CPSSchemas/ExtendedWidgets.py:
class CPSAttachedFileWidget(CPSFileWidget):
"""AttachedFile widget."""
meta_type = 'AttachedFile Widget'
field_types = ('CPS File Field', # File
'CPS String Field', # Plain text for indexing
(optional)
'CPS File Field', # Preview (HTML, optional)
'CPS SubObjects Field',)
field_inits = ({'is_searchabletext': 0,
'suffix_text': '_f1', # _f# are autocomputed
field ext
'suffix_html': '_f2',
'suffix_html_subfiles': '_f3',
},
{'is_searchabletext': 1}, {}, {},
)
Lorsque l'on ajoute un widget flexible de type (meta_type)
"AttachedFile Widget" il y a donc creation de 4 champs. Le premier
(le CPS File Field) portera les références aux autres, le second est
indexable full text et rien de particulier pour les autres.
Pour faire ce que vous voulez le plus simple est de créer un nouveau
type de widget héritant de celui-là portant les bons paramètres
(disk_storage_path sur le Disk File Field)
Merci de votre réponse,
Voilà ce que j'en ai fait en essayant de faire au plus simple (j'ai
un peu de mal avec le python...)
J'aimerais bien quand même une confirmation de la validité de la
manip avant de la mettre sur le serveur en production
- bien que ça m'ait pris une journée de réflexion et 3h de travail,
ça me semble qd même un peu trop simple.
J'ai des doutes.
À tester:
- présence de "previsualisation, version imprimable". Ceci
supposant qu'ils sont là pour les documents File (ie les binaires de
conversion sont ok)
- indexation. Mêmes présupposés
Pour vérifier que ça se passe bien, vous pouvez aller voir directement
le schema flexible dans le document
- ajouter /manage à l'url du proxy, onglet "Proxy"
- suivre le lien vers le document lui-même (dans
portal_repository) et prendre l'onglet "Contents"
- ensuite c'est comme un schema de portal_schemas. Il faut
vérifier qu'il y a bien les trois champs, que le premier est du bon
type, connaît les suffixes des autres, a le bon storage path, etc.
Donc sur le site 1:
J'ai laissé le patch complet du CPSAttachedFileWidget qui si je
comprends bien patch pour tous les sites :
Tous les sites de la même instance Zope, oui.
from Products.CPSSchemas import ExtendedWidgets
field_types = ('CPS Disk File Field', 'CPS String Field', 'CPS File
Field')
ExtendedWidgets.CPSAttachedFileWidget.field_types = field_types
ExtendedWidgets.CPSAttachedFileWidget.field_inits[0]['disk_storage_path']
= 'var/storage'
ok
Pour le site 2 : J'ai créé :
un nouveau widget basé sur CPSAttachedFileWidget en mettant dans mon
produit un getCustomDocumentWidget.py comme ça (Facteau c'est mon
Site2):
"""Return custom layouts types."""
widgets = {
'AttachedFileFacteau Widget': {
'type': 'CPS AttachedFile Widget Type',
'data': {
'field_inits':{
'disk_storage_path':'var/facteau',
},
},
},
}
return widgets
Hum, je n'y crois pas trop si je me souviens bien de comment les
widget types de CPS < 3.4 instancient des widgets (data finit en
manage_changeProperties).
Àma c'est plus simple et symétrique de sous-classer plutôt que de
patcher (et ce sera + facile à passer en 3.4 un jour).
Oui c'est en projet ...
Quelque chose dans ce goût là (non testé)
from Globals import InitializeClass
from Products.CPSSchemas.Widget import CPSWidgetType
from Products.CPSSchemas.WidgetTypesTool import WidgetTypeRegistry
class Site1AttachedFileWidget(CPSAttachedFileWidget):
field_types = ('CPS Disk File Field', # File
'CPS String Field', # Plain text for indexing
(optional)
'CPS File Field', # Preview (HTML, optional)
# 'CPS SubObjects Field', # uncomment for 3.4
)
field_inits = ({'is_searchabletext': 0,
'suffix_text': '_f1', # _f# are autocomputed field
ext
'suffix_html': '_f2',
# 'suffix_html_subfiles': '_f3', # uncomment for 3.4
'disk_storage_path' = '/var/site1',
},
{'is_searchabletext': 1,
},
{'is_searchabletext': 0,
},
)
class Site1AttachedFileWidgetType(CPSWidgetType):
"""AttachedFile widget type."""
meta_type = "Site1 AttachedFile Widget Type"
cls = Site1AttachedFileWidget
WidgetTypeRegistry.register(Site1AttachedFileWidgetType)
etc., et utiliser ce widget type dans getCustomDocumentWidgetTypes à
la place du CPS AttachedFile Widget Types avec data : {}
Mouais effectivement, il va falloir en passer par là ... au redémarrage
ce matin l'ajout d'un fichier attaché dans un flexible sur Site2 fait
une erreur :Memory error et le seul fichier attaché stocké au bon
endroit (celui d'hier soir) n'a ni prévisualisation ni version imprimable.
Merci encore pour votre aide.
et un nouveau layout pour 'flexible_content'
flexible_content_layout = {
'widgets': { .../...
'attachedFileFacteau': {
'type': 'AttachedFileFacteau Widget',
'data': {
'title': 'cpsdoc_flex_attachedFile_title',
'fields': ('?',),
etc...
et
'layout': {
'style_prefix': 'layout_default_',
'flexible_widgets': ('textimage:10', 'link',
'attachedFileFacteau:10'),
etc..
Après un test rapide ça a l'air de fonctionner, mais j'ai un encore
un petit doute...
Est ce quelqu'un a une idée pour résoudre le pb ?
Merci d'avance
_______________________________________________
cps-users-fr
Adresse de la liste : [email protected]
Gestion de l'abonnement :
<http://lists.nuxeo.com/mailman/listinfo/cps-users-fr>
---------
Georges Racinet Nuxeo SAS
[EMAIL PROTECTED] http://nuxeo.com
Tel: +33 (0) 1 40 33 71 73
---------
Georges Racinet Nuxeo SAS
[EMAIL PROTECTED] http://nuxeo.com
Tel: +33 (0) 1 40 33 71 73
_______________________________________________
cps-users-fr
Adresse de la liste : [email protected]
Gestion de l'abonnement : <http://lists.nuxeo.com/mailman/listinfo/cps-users-fr>