[Zope3-french-user] Re: Premier problème pour zblog : comment gérer les "Category"
Thierry Florac
thierry.florac at onf.fr
Mer 18 Oct 09:39:14 CEST 2006
Le lundi 16 octobre 2006 à 23:48 +0200, KLEIN Stéphane a écrit :
> 2006/9/29, Thierry Florac <thierry.florac at onf.fr>:
>
>
> Je crois que oui, sauf pour le dernier point...
> Une option possible (après trois secondes et demie de
> réflexion...) :
> - créer effectivement au niveau de IBlog une propriété de type
> List destinée à stocker les catégories
>
>
> J'ai un objet CategoryEntry avec une ou plusieurs propriétés. Si je
> veux l'utiliser dans la propriétés List il faut que mon objet
> CategoryEntry soit un enfant de Field ?
>
> Exemple d'interfaces
>
> class IBlog(IContainer):
> """The blog container which can contain IBlogEntry objects."""
>
> def __setitem__(name, object):
> """Add a IBlogEntry object."""
>
> __setitem__.precondition = ItemTypePrecondition(IBlogEntry)
>
> title = TextLine(
> title = u"Blog title",
> description = u"Blog description",
> default = u"",
> required = True)
>
> description = Text(
> title = u"Description",
> description = u"A detailed description of the blog's
> contents.",
> default = u"",
> required = False)
>
> author = TextLine(
> title = u"Author name",
> description = u"Author name of this blog",
> default = u"",
> required = True)
>
> category = List(
> title = u"Category",
> description = u"Category list",
> value_type = CategoryEntry()
> )
>
> class ICategoryEntry(Interface):
> """Interface for category entry objects."""
>
> title = TextLine(
> title = u"Category entry title",
> description = u"Category entry title",
> default = u"",
> required = True)
>
> description = Text(
> title = u"Category entry description",
> description = u"Category entry description",
> default = u"",
> required = False)
>
>
> Si maintenant, au lieu d'utiliser une propriété List, je souhaite
> utiliser Category, là encore Category doit être dérivé de List ?
Sauf erreur de ma part, la structure actuelle de l'interface est bonne :
on veut, au niveau de chaque blog, gérer une liste de catégories : on a
donc une propriété "category" (que j'aurais plutôt appelé "categories"
vu qu'on en gère plusieurs, mais passons...) qui gère une liste
d'instances implémentant l'interface ICategoryEntry. J'aurais
personnellement fait un truc du genre :
from zope.app.container.constraints import containers, contains
class ICategoryEntry(Interface):
"""..."""
containers('.IBlog')
title = TextLine(...)
description = Text(...)
class IBlogEntry(Interface):
"""..."""
containers('.IBlog')
title = TextLine(...)
body = Text(...)
categories = List(title="...",
description="...",
value_type=Choice(..., vocabulary="BlogCategories"))
class IBlogInfo(Interface):
"""..."""
title = TextLine(...)
description = Text(...)
author = TextLine(...)
categories = List(title="...",
description="...",
value_type=ICategoryEntry)
class IBlog(IBlogInfo, IContainer):
"""..."""
contains(IBlogEntry)
Quelques remarques par rapport aux modifications effectuées :
- l'utilisation des contraintes "containers" ou "contains" est plus
claire que la définition via les pré-conditions mais fait la même
chose...
- la séparation de l'interface IBlog en deux interfaces (IBlogInfo et
IContainer) permet de gérer plus finement les permissions
- je n'ai pas testé réellement de cas avec "value_type=interface", mais
normalement ça le fait bien...
- il faudra donc également déclarer un vocabulaire "BlogCategories",
permettant de récupérer pour les entrées du blog la liste des catégories
définies au niveau du blog lui-même
- d'une façon générale, penser dès la création des interfaces à
utiliser les méthodes liées à GetText pour faciliter les
traductions... :
from zope.i18nmessageid import MessageFactory
_ = MessageFactory("z3blog") # ???
...
title = TextLine(_("Title'),...)
A partir de ce schéma, tu dois donc pouvoir générer tes formulaires de
saisie automatiquement, par exemple en utilisant "zope.formlib" que je
trouve très pratique... A voir s'il y a lieu de créer ou de dériver
certains widgets en fonction de la façon dont les widgets par défaut
gèrent la saisie.
Thierry Florac
--
Chef de projet intranet/internet
Office National des Forêts - Département Informatique
2, Avenue de Saint-Mandé
75570 PARIS Cedex 12
Mél : thierry.florac at onf.fr
Tél. : +33 01.40.19.59.64
Fax. : +33 01.40.19.59.85
Plus d'informations sur la liste de diffusion zope3-french-user