author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Tue, 18 Aug 2009 09:25:26 +0200 | |
changeset 2901 | 8f4d495c94c2 |
parent 2789 | 39712da6f397 |
permissions | -rw-r--r-- |
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
1 |
.. -*- coding: utf-8 -*- |
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
2 |
|
0 | 3 |
Introduction |
4 |
============= |
|
5 |
||
6 |
||
7 |
Concepts et vocabulaire |
|
8 |
----------------------- |
|
9 |
||
10 |
*schéma* |
|
11 |
le schéma définit le modèle de données d'une application sous forme |
|
12 |
d'entités et de relations. C'est l'élément central d'une |
|
13 |
application. |
|
14 |
||
15 |
*result set* |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
16 |
objet qui encaspule les résultats d'une requête adressée à l'entrepôt |
0 | 17 |
de données et des informations sur cette requête. |
18 |
||
19 |
*vue* |
|
20 |
une vue est une manière de représenter les données d'un `result set` |
|
21 |
sous forme HTML, CSV, JSON, etc. |
|
22 |
||
23 |
||
24 |
||
25 |
Définition d'une application de Blog |
|
26 |
==================================== |
|
27 |
||
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
28 |
La première chose à faire est de copier le squelette depuis le répertoire |
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
29 |
``lax/skel`` vers un nouveau répertoire qui sera votre application |
0 | 30 |
``Google AppEngine``:: |
31 |
||
32 |
$ cp -r lax/skel myapp |
|
33 |
||
34 |
Définition du schéma |
|
35 |
-------------------- |
|
36 |
||
37 |
Ouvrir le fichier ``myapp/schema.py`` afin de définir le schéma des |
|
38 |
données manipulées. La syntaxe de la définition est la même que celle |
|
39 |
proposée par `Google AppEngine`_ mais il faut remplacer la ligne |
|
40 |
d'import:: |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
41 |
|
0 | 42 |
from google.appengine.ext import db |
43 |
||
44 |
par celle-ci:: |
|
45 |
||
46 |
from cubicweb.goa import db |
|
47 |
||
48 |
||
49 |
Un exemple de schéma de données pour un ``Blog`` pourrait être:: |
|
50 |
||
51 |
from cubicweb.goa import db |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
52 |
|
0 | 53 |
class Blog(db.Model): |
54 |
# un titre à donner à l'entrée |
|
55 |
title = db.StringProperty(required=True) |
|
56 |
# la date à laquelle le blog est créé |
|
57 |
diem = db.DateProperty(required=True, auto_now_add=True) |
|
58 |
# le contenu de l'entrée |
|
59 |
content = db.TextProperty() |
|
60 |
# une entrée peut en citer une autre |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
61 |
cites = db.SelfReferenceProperty() |
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
62 |
|
0 | 63 |
|
64 |
Personnalisation des vues |
|
65 |
------------------------- |
|
66 |
||
67 |
``LAX`` permet de générer directement, à partir de la définition |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
68 |
du schéma, des vues de consultation, d'ajout et de modification |
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
69 |
pour tous les types de donées manipulés. Il est toutefois |
0 | 70 |
généralement souhaitable de personnaliser les vues de consultations. |
71 |
||
72 |
Dans ``LAX``, les vues sont représentées par des classes Python. |
|
73 |
||
74 |
Une vue se caractérise par : |
|
75 |
||
76 |
- un identifiant (tous les objets dans ``LAX`` sont enregistrés |
|
77 |
dans un registre et cet identifiant sert de clé pour y retrouver |
|
78 |
la vue) |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
79 |
|
0 | 80 |
- une description des types de données auxquels elle s'applique |
81 |
||
82 |
Il existe dans ``LAX`` des vues prédéfinies et utilisées par le moteur |
|
83 |
d'affichage. Pour avoir une liste exhaustive de ces vues prédéfinies, |
|
84 |
vous pouvez consulter cette page. (XXX mettre le lien vers la liste). |
|
85 |
Par exemple, la vue ``primary`` est la vue utilisée pour générer la |
|
86 |
page principale de consultation d'un objet. |
|
87 |
||
88 |
Par exemple, si on souhaite modifier la page principale d'une entrée de |
|
89 |
blog, il faut surcharger la vue ``primary`` des objets ``Blog`` dans |
|
90 |
le fichier ``myapp/views.py``:: |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
91 |
|
0 | 92 |
from cubicweb.web.views import baseviews |
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
93 |
|
0 | 94 |
class BlogPrimaryView(baseviews.PrimaryView): |
95 |
accepts = ('Blog',) |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
96 |
|
0 | 97 |
def cell_call(self, row, col): |
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
98 |
entity = self.rset.get_entity(row, col) |
0 | 99 |
self.w(u'<h1>%s</h1>' % entity.title) |
100 |
self.w(u'<div>%s</div>' entity.content) |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
101 |
|
0 | 102 |
|
103 |
Génération du graphique de schéma |
|
104 |
--------------------------------- |
|
105 |
||
106 |
Il existe une vue ``schema`` qui permet d'afficher un graphique |
|
107 |
représantant les différents types d'entités définis dans le schéma |
|
108 |
ainsi que les relations entre ces types. Ce graphique doit être généré |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
109 |
statiquement. Le script à utiliser pour générer ce schéma est |
0 | 110 |
dans ``myapp/tools``. Ce script nécessite d'avoir accès aux |
111 |
bibliothèques fournies par le SDK de ``Google AppEngine``. Il faut |
|
112 |
donc modifier son PYTHONPATH:: |
|
113 |
||
114 |
$ export PYTHONPATH=GAE_ROOT/google:GAE_ROOT/lib/yaml |
|
2789
39712da6f397
R propagate deprecation of AppObject.entity()
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
0
diff
changeset
|
115 |
$ python tools/generate_schema_img.py |
0 | 116 |
|
117 |
||
118 |
Génération des fichiers de traduction |
|
119 |
------------------------------------- |
|
120 |
||
121 |
Des catalogues de traduction se trouvent dans `myapp/i18n`. Il faut |
|
122 |
pour l'instant les mettre à jour à la main (et/ou avec les outils |
|
123 |
``GNU`` comme ``xgettext``) et ensuite les compiler grâce au script |
|
124 |
``myapp/tools/i18ncompile.py``:: |
|
125 |
||
126 |
$ python tools/i18ncompile.py |
|
127 |
||
128 |
.. _`Google AppEngine` :: http://code.google.com/appengine/docs/datastore/overview.html |