Des interfaces alternatives

L’écriture d’un code pour trouver quelque chose dans votre arbre familial depuis Gramps n’est pas forcément très compliqué, seulement fastidieux. Et plus le code est long et répétitif, plus je fais des erreurs.

Voyons maintenant quelques exemples pris au hasard pour voir les difficultés possibles avec Gramps. Considérez l’idée de savoir combien d’individus sont nés au mois de mars. Basiquement, nous avons besoin de naviguer dans la base de données, obtenir la référence (si elle existe) à un événement naissance, regarder le contenu de cet événement naissance, si trouvée, obtenir la date, le mois et le comparer. Ceci pourrait ressembler à çà :

count = 0
for p in db.iter_people():
    birth_ref = p.get_birth_ref()
    if birth_ref:
        event = db.get_event_from_handle(birth_ref.ref)
        if event:
            date = event.get_date_object()
            if date.get_month() == 3:
                count += 1

Cette exemple n’est pas pratique; mais vous avez besoin de faire comme cela. Et ce n’est qu’un simple exemple. Ceci peut devenir bien plus compliqué. Mais même avec ce “simple” exemple, vous avez besoin de bien connaître les objets gen.lib qui font Gramps (personne, événement et date) vous avez également besoin de connaître l’interface de la base de données (tel que iter_people, get_event_from_handle) et comment les choses sont reliées entre elles (handles et refs).

J’ai travaillé sur Gramps-Connect, une version internet de Gramps, l’idée de départ est différente. Étant basé sur un langage de requêtes (et construit depuis Django), la question précédente peut être résumée en une ligne :

Person.objects.filter(birth__month1=3).count()

Cette forme nécessite un petit temps d’adaptation, car la syntaxe est différente de Python. Vous devez lire les deux tirets-bas comme un point. Vous avez toujours besoin de connaître les noms des tables et des champs, mais tout le reste étant du Django standard. Il y a quelques trucs intéressants : il n’y a aucune référence à la base de données, et aucune mention explicite des handles pour regarder les données liées.

Je me suis demandé si nous pouvions appliquer certaines idées de Django dans Gramps pour obtenir une meilleure interface. Je ne suis pas intéressé à l’écriture d’un moteur de formulaire pour Gramps (Gramps est implémenté dans un schéma-moins de graphique-comme un stockage de données, aucun lien avec une base de données relationnelle), mais j’aimerai simplifier la manière dont les développeurs interagissent avec Gramps.

Voici comment vous pourriez résoudre ceci en utilisant un greffon expérimental supplémentaire :

from libaccess import *
init(dbstate.db)
len([p for p in Person.all() if p.birth.date.month == 3])

Voilà. Maintenant il y a encore des choses à régler, mais je pense que le plus intéressant étant que çà fonctionne même si une personne n’a pas d’événement naissance, ou si l’événement naissance a eu lieu mais reste absent (c’est à dire, la base de données n’est pas dans un état stable). En acceptant ceci, on peut enchaîner les point d’accès (item.item.item) et être utiliser pour obtenir un résultat comparable (month == 3). Également, on n’a pas besoin de connaître la base de données ou les objets gen.lib, rien que les noms des champs qui nous intéressent.

L’équipe de développement de Gramps va regarder les interfaces alternatives avec Gramps 3.3 pour un ensemble de raisons. Peut être que vous avez quelques idées.

Vous pouvez jouer (et faire des changements) dans cette interface expérimentale avec Gramps 3.2, et en utilisant libaccess depuis gramps-addons.

-Doug

Join the Conversation!