[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'
Gestion de formulaires
======================
Contrle de la gnration automatique de formulaire pour les entits manipule
------------------------------------------------------------------------------
XXX FILLME
* les formulaires 'edition' et 'creation'
Le formulaire gnr par dfaut ne vous convient pas ? Vous tes peut-tre pas
oblig de le refaire la main ! :)
* rtags primary, secondary, generated, generic,
`Entity.relation_category(rtype, x='subject')`
* inline_view (now a rtag?)
* spcification widget
Fonctionnement du contrleur d'dition par dfaut (id: 'edit')
--------------------------------------------------------------
Contrle de l'dition
`````````````````````
Prrequis: les paramtres lis aux entits diter sont spcifis de la forme ::
<nom de champ>:<eid de l'entit>
o l'eid de l'entit pourra tre une lettre dans le cas d'une entit crer. On
dnommera ces paramtres comme *qualifi*.
1. rcupration des entits diter en cherchant les paramtres de formulaire
commenant par 'eid:' ayant galement un paramtre '__type' associ
(galement *qualifi* par l'eid videmment)
2. pour tous les attributs et relations de chaque entit diter
1. recherche d'un paramtre 'edits-<nom relation>' ou 'edito-<nom relation>'
qualifi dans le cas d'une relation dont l'entit est objet
2. si trouv, la valeur rcupre est considre comme la valeur originale
pour cette relation, et on cherche la (ou les) nouvelle(s) valeur(s) dans
le paramtre <nom relation> (qualifi)
3. si la valeur est diffrente de l'originale, une requte de modification en
base est effectue
3. pour chaque entit diter
1. si un paramtre `__linkto` qualifi est spcifi, sa valeur doit tre une
chaine (ou une liste de chaine) de la forme : ::
<relation type>:<eids>:<target>
o <target> vaut 'subject' ou 'object' et chaque eid peut-tre spar d'un
autre par un '_'. Target spcifie *l'entit dite* est sujet ou objet de la
relation et chaque relation ainsi spcifie sera insre.
2. si un paramtre `__cloned_eid` qualifi est spcifi pour une entit, les
relations de l'entit spcifie en valeur de cette argument sont copies sur
l'entit dite
3. si un paramtre `__delete` qualifi est spcifi, sa valeur doit tre une
chaine (ou une liste de chaine) de la forme : ::
<subject eids>:<relation type>:<object eids>
o chaque eid sujet ou objet peut-tre spar d'un autre par un '_'. Chaque
relation ainsi spcifie sera supprime.
4. si un paramtre `__insert` qualifi est spcifi, sa valeur doit tre de
mme format que pour `__delete`, mais chaque relation ainsi spcifie sera
insre.
4. si les paramtres `__insert` et/ou `__delete` sont trouvs non qualifis,
ils sont interprts comme dcrit ci-dessus (quelque soit le nombre d'entit
dit)
5. si aucune entit n'est dite mais que le formulaire contient les paramtres
`__linkto` et `eid`, celui-ci est interprt en prenant la valeur spcifi
par le paramtre `eid` pour dsigner l'entit sur laquelle ajouter les
relations
A noter que :
* si le paramtre `__action_delete` est trouv, toutes les entits comme
spcifies diter seront supprimes
* si le paramtre `__action_cancel` est trouv, aucune action n'est effectue
* si le paramtre `__action_apply` est trouv, l'dition est effectue
normalement mais la redirection sera effectue sur le formulaire (cf `Contrle
de la redirection`_)
* le paramtre `__method` est galement support comme sur le template principal
(XXX not very consistent, maybe __method should be dealed in the view controller)
* si aucune entit diter n'est trouve et qu'il n'y a pas de paramtre
`__action_delete`, `__action_cancel`, `__linkto`, `__delete` ou `__insert`,
une erreur est leve
* placer dans le formulaire le paramtre `__message` permettra d'utiliser la
valeur de ce paramtre comme message d'information l'utilisateur une fois
l'dition effectue.
Contrle de la redirection
``````````````````````````
Une fois que l'dition s'est bien pass, reste un problme : c'est bien beau
tout a, mais o qu'on va maintenant ?? Si rien n'est spcifi, le controlleur
se dbrouille, mais comme il fait pas toujours ce qu'on voudrait, on peut
controller a en utilisant les paramtres suivant :
* `__redirectpath`: chemin de l'url (relatif la racine du site, sans paramtre
de formulaire
* `__redirectparams`: paramtres de formulaires ajouter au chemin
* `__redirectrql`: requte RQL de redirection
* `__redirectvid`: identifiant de vue de redirection
* `__errorurl`: url du formulaire original, utilis pour la redirection en cas
d'erreur de validation pendant l'dition. Si celui-ci n'est pas spcifi, une
page d'erreur sera prsente plutot qu'un retour sur le formulaire (qui est le
cas chant responsable d'afficher les erreurs)
* `__form_id`: identifiant de vue du formulaire original, utilise si
`__action_apply` est trouv
En gnral on utilise soit `__redirectpath et `__redirectparams` soit
`__redirectrql` et `__redirectvid`.