goa/doc/devmanual_fr/chap_ui_gestion_formulaire.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'

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`.