.. -*- coding: utf-8 -*-

Introduction à `LAX`
====================


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 encaspulant les résultats d'une requête à 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 répertoire ``lax``
vers un nouveau répertoire qui sera votre application ``Google AppEngine``::

  $ cp -r lax 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 ginco.goa import db


Un exemple de schéma de données pour un ``Blog`` pourrait être::

  from ginco.goa import db
  
  class BlogEntry(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 d'obtenir directement, à partir de la définition
du schéma, de générer 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 ``BlogEntry`` dans
le fichier ``myapp/views.py``::
  
  from ginco.web.views import baseviews
  
  class BlogEntryPrimaryView(baseviews.PrimaryView):
      accepts = ('BlogEntry',)
      
      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``::

  $ export PYTHONPATH=GAE_ROOT/google:GAE_ROOT/lib/yaml
  $ python tools/i18ncompile.py

