close #472361: omit password and bytes attributes in allowed mass-mailing keys
by fixing default implementation for allowed_massmail_keys() in the
Emailable pluggable mixin (cw.common.mixins).
Added test (in entities.test though), also fix CWUserTC classes conflicts in the test module.
Introduction
=============
Concepts et vocabulaire
-----------------------
*schéma*
le schéma définit le modèle de données d'une application sous forme
d'entités et de relations. C'est l'élément central d'une
application.
*result set*
objet qui encaspule les résultats d'une requête adressée à l'entrepôt
de données et des informations sur cette requête.
*vue*
une vue est une manière de représenter les données d'un `result set`
sous forme HTML, CSV, JSON, etc.
Définition d'une application de Blog
====================================
La première chose à faire est de copier le squelette depuis le répertoire
``lax/skel`` vers un nouveau répertoire qui sera votre application
``Google AppEngine``::
$ cp -r lax/skel myapp
Définition du schéma
--------------------
Ouvrir le fichier ``myapp/schema.py`` afin de définir le schéma des
données manipulées. La syntaxe de la définition est la même que celle
proposée par `Google AppEngine`_ mais il faut remplacer la ligne
d'import::
from google.appengine.ext import db
par celle-ci::
from cubicweb.goa import db
Un exemple de schéma de données pour un ``Blog`` pourrait être::
from cubicweb.goa import db
class Blog(db.Model):
# un titre à donner à l'entrée
title = db.StringProperty(required=True)
# la date à laquelle le blog est créé
diem = db.DateProperty(required=True, auto_now_add=True)
# le contenu de l'entrée
content = db.TextProperty()
# une entrée peut en citer une autre
cites = db.SelfReferenceProperty()
Personnalisation des vues
-------------------------
``LAX`` permet de générer directement, à partir de la définition
du schéma, des vues de consultation, d'ajout et de modification
pour tous les types de donées manipulés. Il est toutefois
généralement souhaitable de personnaliser les vues de consultations.
Dans ``LAX``, les vues sont représentées par des classes Python.
Une vue se caractérise par :
- un identifiant (tous les objets dans ``LAX`` sont enregistrés
dans un registre et cet identifiant sert de clé pour y retrouver
la vue)
- une description des types de données auxquels elle s'applique
Il existe dans ``LAX`` des vues prédéfinies et utilisées par le moteur
d'affichage. Pour avoir une liste exhaustive de ces vues prédéfinies,
vous pouvez consulter cette page. (XXX mettre le lien vers la liste).
Par exemple, la vue ``primary`` est la vue utilisée pour générer la
page principale de consultation d'un objet.
Par exemple, si on souhaite modifier la page principale d'une entrée de
blog, il faut surcharger la vue ``primary`` des objets ``Blog`` dans
le fichier ``myapp/views.py``::
from cubicweb.web.views import baseviews
class BlogPrimaryView(baseviews.PrimaryView):
accepts = ('Blog',)
def cell_call(self, row, col):
entity = self.entity(row, col)
self.w(u'<h1>%s</h1>' % entity.title)
self.w(u'<div>%s</div>' entity.content)
Génération du graphique de schéma
---------------------------------
Il existe une vue ``schema`` qui permet d'afficher un graphique
représantant les différents types d'entités définis dans le schéma
ainsi que les relations entre ces types. Ce graphique doit être généré
statiquement. Le script à utiliser pour générer ce schéma est
dans ``myapp/tools``. Ce script nécessite d'avoir accès aux
bibliothèques fournies par le SDK de ``Google AppEngine``. Il faut
donc modifier son PYTHONPATH::
$ export PYTHONPATH=GAE_ROOT/google:GAE_ROOT/lib/yaml
$ python tools/generate_schema_img.py
Génération des fichiers de traduction
-------------------------------------
Des catalogues de traduction se trouvent dans `myapp/i18n`. Il faut
pour l'instant les mettre à jour à la main (et/ou avec les outils
``GNU`` comme ``xgettext``) et ensuite les compiler grâce au script
``myapp/tools/i18ncompile.py``::
$ python tools/i18ncompile.py
.. _`Google AppEngine` :: http://code.google.com/appengine/docs/datastore/overview.html