[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'
Le langage RQL (Relation Query Language)
========================================
Prsentation
------------
* langage mettant l'accent sur le parcours de relations.
* Les attributs sont considrs comme des cas particuliers de relations.
* RQL s'inspire de SQL mais se veut plus haut niveau.
* Une connaissance du schma CubicWeb dfinissant l'application est ncessaire.
Les diffrents types de requtes
--------------------------------
Recherche (`Any`)
interroger l'entrept afin d'extraire des entits et/ou des attributs
d'entits.
Insertion (`INSERT`)
insrer de nouvelles entits dans la base.
Mise jour d'entits, cration de relations (`SET`)
mettre jours des entits existantes dans la base, ou de crer des
relations entres des entits existantes.
Suppression d'entits ou de relation (`DELETE`)
supprimer des entits et relations existantes dans la base.
Variables et typage
-------------------
Les entits et valeurs parcourir et / ou slctionner sont reprsentes dans
la requte par des *variables* qui doivent tre crites en majuscule.
Les types possibles pour chaque variable sont dduits partir du schma en
fonction des contraintes prsentes dans la requte.
On peut contraindre les types possibles pour une variable l'aide de la
relation spciale `is`.
Types de bases
--------------
* `String` (litral: entre doubles ou simples quotes).
* `Int`, `Float` (le sparateur tant le '.').
* `Date`, `Datetime`, `Time` (litral: chane YYYY/MM/DD[ hh:mm] ou mots-cls
`TODAY` et `NOW`).
* `Boolean` (mots-cls `TRUE` et `FALSE`).
* mot-cl `NULL`.
Oprateurs
----------
* Oprateurs logiques : `AND`, `OR`, `,`.
* Oprateurs mathmatiques: `+`, `-`, `*`, `/`.
* Operateur de comparaisons: `=`, `<`, `<=`, `>=`, `>`, `~=`, `LIKE`, `IN`.
* L'oprateur `=` est l'oprateur par dfaut.
* L'oprateur `LIKE` / `~=` permet d'utiliser le caractre `%` dans une chaine
de caractre pour indiquer que la chane doit commencer ou terminer par un
prfix/suffixe::
Any X WHERE X nom ~= 'Th%'
Any X WHERE X nom LIKE '%lt'
* L'oprateur `IN` permet de donner une liste de valeurs possibles::
Any X WHERE X nom IN ('chauvat', 'fayolle', 'di mascio', 'thenault')
Requte de recherche
--------------------
[`DISTINCT`] <type d'entit> V1(, V2)\*
[`GROUPBY` V1(, V2)\*] [`ORDERBY` <orderterms>]
[`WHERE` <restriction>]
[`LIMIT` <value>] [`OFFSET` <value>]
:type d'entit:
Type de la ou des variables slctionnes.
Le type spcial `Any`, revient ne pas spcifier de type.
:restriction:
liste des relations parcourir sous la forme
`V1 relation V2|<valeur constante>`
:orderterms:
Dfinition de l'ordre de selection : variable ou n de colonne suivie de la
mthode de tri (`ASC`, `DESC`), ASC tant la valeur par dfaut.
:note pour les requtes groupes:
Pour les requtes groupes (i.e. avec une clause `GROUPBY`), toutes les
variables slectionne doivent tre soit groupe soit aggrge.
Exemples - recherche
`````````````````````
::
Any X WHERE X eid 53
Personne X
Personne X WHERE X travaille_pour S, S nom "logilab"
Any E,COUNT(X) GROUPBY E ORDERBY EN WHERE X is E, E name EN
Any E,COUNT(X) GROUPBY E ORDERBY 2 WHERE X is E
Fonctionnalits avances
````````````````````````
* Fonctions d'aggrgat : `COUNT`, `MIN`, `MAX`, `SUM`.
* Fonctions sur les chaines :`UPPER`, `LOWER`.
* Relations optionnelles :
* Elles permettent de slectionner des entits lies ou non une autre.
* Il faut utiliser le `?` derrire la variable pour spcifier que la relation
vers celle-ci est optionnelle :
- Anomalies d'un projet attaches ou non une version ::
Any X,V WHERE X concerns P, P eid 42, X corrected_in V?
- Toutes les fiches et le projet qu'elles documentent le cas chant ::
Any C,P WHERE C is Card, P? documented_by C
Ngation
````````
* Une requte du type `Document X WHERE NOT X owned_by U` revient dire "les
documents n'ayant pas de relation `owned_by`".
* En revanche la requte `Document X WHERE NOT X owned_by U, U login "syt"`
revient dire "les documents n'ayant pas de relation `owned_by` avec
l'utilisateur syt". Ils peuvent avoir une relation "owned_by" avec un autre
utilisateur.
Requte d'insertion
-------------------
`INSERT` <type d'entit> V1(, <type d'entit> V2)\* `:` <assignements>
[`WHERE` <restriction>]
:assignements:
liste des relations assigner sous la forme `V1 relation V2|<valeur constante>`
La restriction permet de dfinir des variables utilises dans les assignements.
Attention, si une restriction est spcifie, l'insertion est effectue *pour
chaque ligne de rsultat renvoye par la restriction*.
Exemples - insertion
`````````````````````
* Insertion d'une nouvelle personne nomme 'bidule'::
INSERT Personne X: X nom 'bidule'
* Insertion d'une nouvelle personne nomme 'bidule', d'une autre nomme
'chouette' et d'une relation 'ami' entre eux::
INSERT Personne X, Personne Y: X nom 'bidule', Y nom 'chouette', X ami Y
* Insertion d'une nouvelle personne nomme 'bidule' et d'une relation 'ami' avec
une personne existante nomme 'chouette'::
INSERT Personne X: X nom 'bidule', X ami Y WHERE Y nom 'chouette'
Requte de mise jour
----------------------
`SET` <assignements>
[`WHERE` <restriction>]
Attention, si une restriction est spcifie, la mise jour est effectue *pour
chaque ligne de rsultat renvoye par la restriction*.
Exemples - mise jour
````````````````````````
* Renommage de la personne nomme 'bidule' en 'toto', avec modification du
prnom::
SET X nom 'toto', X prenom 'original' WHERE X is 'Person', X nom 'bidule'
* Insertion d'une relation de type 'connait' entre les objets relis par la
relation de type 'ami'::
SET X know Y WHERE X ami Y
Requte de suppression
----------------------
`DELETE` (<type d''entit> V) | (V1 relation v2),...
[`WHERE` <restriction>]
Attention, si une restriction est spcifie, la suppression est effectue *pour
chaque ligne de rsultat renvoye par la restriction*.
Exemples
````````
* Suppression de la personne nomm 'toto'::
DELETE Person X WHERE X nom 'toto'
* Suppression de toutes les relations de type 'ami' partant de la personne
nomme 'toto'::
DELETE X ami Y WHERE X is 'Person', X nom 'toto'