[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'
Manipulation des donnes stockes
=================================
Les classes `Entity` et `AnyEntity`
-----------------------------------
Pour fournir un comportement spcifique un type d'entit, il suffit de dfinir
une classe hritant de la class `cubicweb.entities.AnyEntity`. En gnral il faut
dfinir ces classes dans un module du package `entities` d'une application pour
qu'elle soit disponible la fois cot serveur et cot client.
La classe `AnyEntity` est une classe charge dynamiquement hritant de la classe
de base `Entity` (`cubicweb.common.entity`). On dfinit une sous-classe pour
ajouter des mthodes ou spcialiser les comportements d'un type d'entit donn.
Des descripteurs sont ajouts l'enregistrement pour initialiser la classe en
fonction du schma :
* on peut accder aux attributs dfinis dans le schma via les attributs de mme
nom sur les instances (valeur type)
* on peut accder aux relations dfinies dans le schma via les attributs de mme
nom sur les instances (liste d'instances d'entit)
Les mthodes dfinies sur la classe `AnyEntity` ou `Entity` sont les suivantes :
* `has_eid()`, retourne vrai si l'entit un eid affect (i.e. pas en cours de
cration)
* `check_perm(action)`, vrifie que l'utilisateur le droit d'effectuer
l'action demande sur l'entit
:Formattage et gnration de la sortie:
* `view(vid, **kwargs)`, applique la vue donne l'entit
* `absolute_url(**kwargs)`, retourne une URL absolue permettant d'accder la
vue primaire d'une entit
* `format(attr)`, retourne le format (type MIME) du champ pass en argument
* `printable_value(attr, value=_marker, attrtype=None, format='text/html')`,
retourne une chaine permettant l'affichage dans un format donn de la valeur
d'un attribut (la valeur est automatiquement rcupre au besoin)
* `display_name(form='')`, retourne une chane pour afficher le type de
l'entit, en spcifiant ventuellement la forme dsire ('plural' pour la
forme plurielle)
:Gestion de donnes:
* `complete(skip_bytes=True)`, effectue une requte permettant de rcuprer d'un
coup toutes les valeurs d'attributs manquant sur l'entit
* `get_value(name)`, rcupere la valeur associe l'attribut pass en argument
* `related(rtype, x='subject', limit=None, entities=False)`, retourne une liste
des entits lies l'entit courant par la relation donne en argument
* `unrelated(rtype, targettype, x='subject', limit=None)`, retourne un result set
des entits not lies l'entit courante par la relation donne en argument
et satisfaisants les contraintes de celle-ci
* `copy_relations(ceid)`, copie les relations de l'entit ayant l'eid pass en
argument sur l'entit courante
* `last_modified(view)`, retourne la date laquelle on doit considrer
l'objet comme modifi (utiliser par la gestion de cache HTTP)
:Meta-donnes standard (Dublin Core):
* `dc_title()`, retourne une chaine unicode correspondant la mta-donne
'Title' (utilise par dfaut le premier attribut non 'meta' du schma de
l'entit)
* `dc_long_title()`, comme dc_title mais peut retourner un titre plus dtaill
* `dc_description(format='text/plain')`, retourne une chaine unicode
correspondant la mta-donne 'Description' (cherche un attribut
'description' par dfaut)
* `dc_authors()`, retourne une chaine unicode correspondant la mta-donne
'Authors' (propritaires par dfaut)
* `dc_date(date_format=None)`, retourne une chaine unicode
correspondant la mta-donne 'Date' (date de modification par dfaut)
:Contrle du vocabulaire pour les relations:
* `vocabulary(rtype, x='subject', limit=None)`
* `subject_relation_vocabulary(rtype, limit=None)`
* `object_relation_vocabulary(rtype, limit=None)`
* `relation_vocabulary(rtype, targettype, x, limit=None)`
Les *rtags*
-----------
Les *rtags* permettent de spcifier certains comportements propres aux relations
d'un type d'entit donn (voir plus loin). Ils sont dfinis sur la classe
d'entit via l'attribut `rtags` qui est un dictionnaire dont les cls sont un
triplet ::
<type de relation>, <type d'entit cible>, <position du contexte ("subject" ou "object"
et les valeurs un `set` ou un tuple de marqueurs dfinissant des proprits
s'appliquant cette relation.
Il est possible de simplifier ce dictionnaire :
* si l'on veut spcifier un seul marqueur, il n'est pas ncessaire d'utiliser
un tuple comme valeur, le marqueur seul (chaine de caractres) suffit
* si l'on s'intresse uniquement un type de relation et non la cible et la
position du contexte (ou que celui-ci n'est pas ambige), on peut simplement
utiliser le nom du type de relation comme cl
* si l'on veut qu'un marqueur s'applique quelque soit le type d'entit cible, il
faut utiliser la chaine `*` comme type d'entit cible
A noter galement que ce dictionnaire est *trait la cration de la classe*.
Il est automatiquement fusionn avec celui de la ou des classe(s) parentes (pas
besoin de copier celui de la classe parent pour le modifier). De mme modifier
celui-ci aprs cration de la classe n'aura aucun effet...
.. include:: sect_definition_entites.txt