[F] views: fix 2 unicode errors
1. You can now use valid unicode strings in ValidationError exception.
Previously, if 'err' contains unicode, UnicodeDecodeError was raised by format_errors()
>>> templstr = '<li>%s</li>\n'
>>> e = ValidationError(None, {None: u'oué, une exception en unicode!'})
>>> templstr % e
'<li>None (None): ou\xc3\xa9, une exception en unicode!</li>\n'
>>> templstr = u'<li>%s</li>\n'
>>> templstr % e
u'<li>None (None): ou\xe9, une exception en unicode!</li>\n'
2. The message of an Exception can contains unicode. But it now properly managed by “informal” string representation.
We can easily fix the problem by using the Exception.message attribute that still contains the original message.
>>> a = AssertionError(u'séfdsdf')
>>> a.message
u's\xe9fdsdf'
>>> str(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 1: ordinal not in range(128)
>>> a = ValueError(u'fsdfsdéfsdfs')
>>> str(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128)
>>> a
ValueError(u'fsdfsd\xe9fsdfs',)
>>> unicode(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128)
>>> a.message
u'fsdfsd\xe9fsdfs'
Dfinition de vues
==================
Les classes de base des vues
----------------------------
La class `View` (`cubicweb.common.view`)
`````````````````````````````````````
Un vue crit dans son flux de sortie via son attribut `w` (`UStreamIO`).
L'interface de base des vues est la suivante :
* `dispatch(**context)`, appelle ("rend") la vue en appellent `call` ou
`cell_call` en fonction des arguments pass
* `call(**kwargs)`, appelle la vue pour un result set complet ou nul
* `cell_call(row, col, **kwargs)`, appelle la vue pour une cellule donne d'un
result set
* `url()`, retourne l'url permettant d'obtenir cette vue avec le result set en
cours
* `view(__vid, rset, __fallback_vid=None, **kwargs)`, appelle la vue
d'identificant `__vid` sur le result set donn. Il est possible de donnes un
identificant de vue de "fallback" qui sera utilis si la vue demande n'est
pas applicable au result set
* `wview(__vid, rset, __fallback_vid=None, **kwargs)`, pareil que `view` mais
passe automatiquement le flux en argument
* `html_headers()`, retourne une liste d'en-tte HTML placer par le template
principal
* `page_title()`, retourne le titre utiliser dans l'en tte HTML `title`
* `creator(eid)`, retourne l'eid et le login du crateur de l'entit ayant
l'eid pass en argument
Autres classes de base :
* `EntityView`, vue s'appliquant aux lignes ou cellule contenant une entit
(eg un eid)
* `StartupView`, vue de dpart n'ayant pas besoin de result set
* `AnyRsetView`, vue s'appliquant n'importe quelle result set
Les templates ou patron
-----------------------
Les patrons (ou *template*) sont des cas particulier de vue ne dpendant a
priori pas d'un result set. La classe de base `Template` (`cubicweb.common.view`)
est une classe drive de la classe `View`.
Pour construire une page HTML, un *template principal* est utilis. Gnralement
celui possdant l'identifiant 'main' est utilis (ce n'est pas le cas lors
d'erreur dans celui-ci ou pour le formulaire de login par exemple). Ce patron
utilise d'autres patrons en plus des vues dpendants du contenu pour gnrer la
page renvoyer.
C'est ce template qui est charg :
1. d'xcuter la requte RQL des donnes afficher le cas chant
2. ventuellement de dterminer la vue utiliser pour l'afficher si non
spcifie
3. de composer la page retourner
Le patron principal par dfaut (`cubicweb.web.views.basetemplates.TheMainTemplate`)
--------------------------------------------------------------------------------
Le template principal par dfaut construit la page selon la dcomposition
suivante :
.. image:: main_template_layout.png
Le rectancle contenant le `view.dispatch()` reprsente l'emplacement o est
insr la vue de contenu afficher. Les autres reprsentent des sous-templates
appel pour construire la page. Les implmentations par dfaut de tout ces
templates sont dans le module `cubicweb.web.views.basetemplates`. Vous pouvez
videmment surcharger l'un des sous-templates pour modifier l'aspect visuel
d'une partie dsire de la page.
On peut galement contrler certains comportements du template principal
l'aide des paramtres de formulaire suivante :
* `__notemplate`, si prsente (quelque soit la valeur associe), seule la vue de
contenu est renvoye
* `__force_display`, si prsente et contient une valeur non nulle, pas de
navigation quelque soit le nombre d'entits afficher
* `__method`, si le result set afficher ne contient qu'une entit et que ce
paramtre est spcifi, celui-ci dsigne une mthode appeler sur l'entit
en lui donnant en argument le dictionnaire des paramtres de formulaire, avant
de reprendre le comportement classique (s'insre entre les tapes 1. et
2. dcrites ci-dessus)
.. include:: sect_stdlib_vues.txt
Vues xml, binaires...
---------------------
Pour les vues gnrants autre que du html (une image gnre dynamiquement par
exemple), et qui ne peuvent donc gnralement pas tre incluse dans la page
HTML gnre par le template principal (voir ci-dessus), il faut :
* placer l'attribut `templatable` de la classe `False`
* indiquer via l'attribut `content_type` de la classe le type MIME gnr par la
vue 'application/octet-stream'
Pour les vues gnrants un contenu binaire (une image gnre dynamiquement par
exemple), il faut galement placer l'attribut `binary` de la classe `True` (ce
qui implique `templatable == False` afin que l'attribut `w` de la vue soit
remplac par un flux binaire plutt que unicode.
Quelques trucs (X)HTML respecter
----------------------------------
Certains navigateurs (dont firefox) n'aime pas les `<div>` vides (par vide
j'entend sans contenu dans la balise, il peut y avoir des attributs), faut
toujours mettre `<div></div>` mme s'il n'y a rien dedans, et non `<div/>`.