goa/doc/devmanual_fr/chap_manipulation_donnees.txt
author Julien Jehannet <Julien Jehannet <julien.jehannet@logilab.fr>>
Tue, 02 Mar 2010 21:48:36 +0100
branchstable
changeset 4783 6dc34d4cf892
parent 0 b97547f5f1fa
permissions -rw-r--r--
[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