Vastaa Viestiin

L'épineuse question des fusions de gedcom...

Pour les utilisateurs du logiciel Gramps.
valentil
male
Viestit: 25
Sisääntulotila: Teksti
Selailu: Teksti
Tarkastele heidän sukupuutaan.
Hello,
Comme tout le monde je dois de temps en temps fusionner un gedcom dans ma base, et en général une bonne partie doit se faire manuellement pour fusionner aux bons endroits... donc galère mais bon pas d'autres options
J'ai aujourd'hui un nouveau gedcom à intégrer de qqs 40 000 individus, dans une base de 4 000 individus, avec 890 individus communs, du coup je cherche un moyen efficace d'importer/fusionner le gedcom en question..
Le gedcom de 40 000 individus à une particularité qui peut aider, il ne s'agit "que" d'ascendant direct, donc je dois pouvoir faire correspondre les individus par les sosa.. L'idéal serait de pouvoir supprimer du gedcom les sosa existant dans ma base... mais je ne vois pas comment faire... une/des idées?
Merci merci!
Laurent
valentil
male
Viestit: 25
Sisääntulotila: Teksti
Selailu: Teksti
Tarkastele heidän sukupuutaan.
existe t-il un moyen d'affecter une étiquette "dynamique" ? en y insérant le numéro sosa?
ça me permettra d'affecter les sosa dans ma base puis dans l'autre base et enfin en important l'une dans l'autre je n'aurais "plus qu'à" faire la correspondance par sosa
patricelegoux
patricelegoux
Viestit: 1786
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
Bonjour,

Au besoin, je m'étais conservé ce lien et sa méthode dans un coin: https://gramps.discourse.group/t/best-way-to-integrate-foreign-gedcom/157/2?u=plegoux
valentil kirjoitti: 04 Kesäkuu 2021, 17:34 existe t-il un moyen d'affecter une étiquette "dynamique" ? en y insérant le numéro sosa?
Dynamique je ne pense pas mais tagger simplement "sosa base perso" et "sosa base gedcom" tous ses sosas dans les deux bases avant d'importer celle issue du gedcom dans une copie de la tienne n'est pas bien compliqué (je me mets dans l'hypothèse que tu n'utilises qu'une fois le gedcom pour creer une base Gramps et que c'est celle ci qui sert d'import, en xml Gramps, dans une copie de la tienne). Il suffit d'un filtre ascendant du même untel dans chaque base et tagger tout ce que retourne le filtre.
Patrice Legoux Publications: Logiciels utilisés / Version:
  • Windows: Windows 10 Pro
  • Gramps: AIO64-5.1.3-2
  • Geneanet Upload
  • Chrome
valentil
male
Viestit: 25
Sisääntulotila: Teksti
Selailu: Teksti
Tarkastele heidän sukupuutaan.
oui c'est ce que j'ai commencé à faire mais c'est un peu long vu la masse - avant de poursuivre j'essaie de voir si il n'y aurait pas un moyen plus rapide. par exemple si j'avais pu taguer par numéro de sosa dans chaque base, j'aurai pu ensuite (après import) trier par ce tag qui aurait fait apparaître les doublons les uns à la suite des autres, les 1 avec les 1, les 2 avec les 2.. etc beaucoup plus rapide et beaucoup moins de risque d'en oublier
bref je pensais que ça aurait pu être faisable simplement mais la je sèche
romjerome
male
Viestit: 1514
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
valentil kirjoitti: 04 Kesäkuu 2021, 17:34 existe t-il un moyen d'affecter une étiquette "dynamique" ? en y insérant le numéro sosa?
ça me permettra d'affecter les sosa dans ma base puis dans l'autre base et enfin en important l'une dans l'autre je n'aurais "plus qu'à" faire la correspondance par sosa
Il doit également être possible d'adapter la fonction qui "ajoute une étiquette à l'importation".
Kuva

Actuellement les variables sont liées à la date et l'heure.
Je vais regarder du côté du code.
romjerome
male
Viestit: 1514
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
romjerome kirjoitti: 05 Kesäkuu 2021, 08:42 Je vais regarder du côté du code.
#: ../gramps/gen/config.py:246
msgid "Imported %Y/%m/%d %H:%M:%S"
msgstr "Importé le %d/%m/%Y à %H:%M:%S"

Koodi: Valitse kaikki

register('preferences.tag-on-import-format', _("Imported %Y/%m/%d %H:%M:%S"))
--

Koodi: Valitse kaikki

        
        # tag Entry
        self.tag_format_entry = Gtk.Entry()
        tag_const = 'preferences.tag-on-import-format'
        tag_data = _(config.get(tag_const))
../gramps/gui/configure.py:1561

cela ne devrait pas être simple, car tout en étant "dynamique", ce n'est pas prévu pour marquer des individus mais plutôt des lots d'enregistrements. :(
valentil
male
Viestit: 25
Sisääntulotila: Teksti
Selailu: Teksti
Tarkastele heidän sukupuutaan.
je pensais peut-être en détournant le rapport ahnenfatel? j'ai essayé d'y ajouter une ligne pour ajouter un tag au moment de l'impression du sosa mais je ne vois pas quoi ajouter exactement, tu saurais me dire ce que je devrais ajouter?

j'ai essayé d'ajouter ça pour avir la gestion des tags, mais ça plante:
from gramps.gen.lib import TagBase

et ça du coup pour ajouter le sosa/tag - mais je suis pas sur du tout de ce qu'il y a dans "key" du coup
self.add_tag(self, "sosa" % key)

evidemment ça ne fonctionne pas... tu peux m'aider stp?
romjerome
male
Viestit: 1514
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
Le détournement de cette fonction risque de générer plus (+) de soucis !
En effet, le module 'plugins/importer/importgedcom.py' appelle la classe GedcomParser
de la bibliothèque 'plugins/lib/libgedcom.py'. Dont voici les arguments, parfois optionnels :
def __init__(self, dbase, ifile, filename, user, stage_one,
default_source, default_tag_format=None):
Pour faire simple, le format d'étiquette sera ajouté à tous les enregistrements et pas uniquement aux individus...

En revanche il devrait être possible de modifier les noms importés en y ajoutant des informations, ou plus "proprement", modifier les identifiants dans le gedcom pour qu'ils apparaissent comme "ID dans gramps"...

Kuva
self.pid_map = IdMapper(
self.dbase.has_person_gramps_id,
self.dbase.find_next_person_gramps_id,
self.dbase.id2user_format)
..
# find the person
real_id = self.pid_map[line.token_text]
person = self.__find_or_create_person(real_id)
..
__check(self.pid_map, self.dbase.has_person_gramps_id,
self.__find_or_create_person, self.dbase.commit_person,
self.gid2id, "INDI")
..
def __find_or_create_person(self, gramps_id):
"""
Finds or creates a person based on the Gramps ID. If the ID is
already used (is in the db), we return the item in the db. Otherwise,
we create a new person, assign the handle and Gramps ID.
"""
person = Person()
intid = self.gid2id.get(gramps_id)
if self.dbase.has_person_handle(intid):
person.unserialize(self.dbase.get_raw_person_data(intid))
else:
intid = self.__find_from_handle(gramps_id, self.gid2id)
person.set_handle(intid)
person.set_gramps_id(gramps_id)
return person
..
def __find_person_handle(self, gramps_id):
"""
Return the database handle associated with the person's Gramps ID
"""
return self.__find_from_handle(gramps_id, self.gid2id)
..
person_handle = self.__find_from_handle(gramps_id, self.gid2id)
Viimeksi muokannut romjerome, 06 Kesäkuu 2021, 12:24. Yhteensä muokattu 1 kertaa.
valentil
male
Viestit: 25
Sisääntulotila: Teksti
Selailu: Teksti
Tarkastele heidän sukupuutaan.
merci pour ta réponse :)
je suis pas sur d'avoir bien tout compris :/

je pensais plutôt à détourner le rapport "ancestorrport.py" qui fait déjà un calcul des sosa pour impression, ça pourrait peut-être marcher en rajoutant cette ligne:

Koodi: Valitse kaikki

self.database.add_tag(person, "sosa %d" % key) #add sosa number tag


j'ai essayé mais il dit manquer quelquechose pour permettre l'écriture en base de donnée, j'imagine que pour un rapport la base n'est pas ouverte en écriture..:

Koodi: Valitse kaikki

3772: ERROR: _reportdialog.py: line 748: Failed to run report.
Traceback (most recent call last):
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\plug\report\_reportdialog.py", line 709, in report
    my_report.write_report()
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\plugins\textreport\ancestorreport.py", line 241, in write_report
    self.database.add_tag(person, "sosa %d" % key) #add sosa number tag
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gen\db\generic.py", line 1793, in add_tag
    self.commit_tag(tag, trans)
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gen\db\generic.py", line 2003, in commit_tag
    self._commit_base(tag, TAG_KEY, trans, change_time)
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\plugins\db\dbapi\dbapi.py", line 622, in _commit_base
    if not trans.batch:
AttributeError: 'str' object has no attribute 'batch'
romjerome
male
Viestit: 1514
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
valentil kirjoitti: 06 Kesäkuu 2021, 01:19 j'ai essayé mais il dit manquer quelquechose pour permettre l'écriture en base de donnée, j'imagine que pour un rapport la base n'est pas ouverte en écriture..:

Koodi: Valitse kaikki

3772: ERROR: _reportdialog.py: line 748: Failed to run report.
Traceback (most recent call last):
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\plug\report\_reportdialog.py", line 709, in report
    my_report.write_report()
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\plugins\textreport\ancestorreport.py", line 241, in write_report
    self.database.add_tag(person, "sosa %d" % key) #add sosa number tag
Ah oui, là cela ne fonctionnera pas !
Il faut partir d'un outil.

Par exemple, le greffon 'RelID' calcule également dynamiquement le sosa :
https://github.com/gramps-project/addons-source/tree/maintenance/gramps51/RelID

L'écriture dans la base de données d'une numérotation partielle (uniquement les ascendants) avec une variation d'un individu à l'autre est-elle vraiment utile ?
romjerome
male
Viestit: 1514
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
Dans les options de configuration (Préférences) il est possible d'afficher des informations complémentaires dans la barre de statut/état.

Kuva

- Nom et identifiant de l'individu actif
- Relation avec la souche

../gramps/gui/configure.py:1322

C'est peut être plus "sûr" d'essayer de modifier des objets de l'interface plutôt que la base ?
Par exemple, chercher "interface.statusbar" dans ../gramps/gui/displaystate.py
et ../gramps/gui/viewmanager.py et y ajouter une variante de l'affichage de l'identifiant ou modifier les identifiants pour qu'ils correspondent à vos identifiants dans votre gedcom.
patricelegoux
patricelegoux
Viestit: 1786
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
Si ça peut servir... j'avais écrit ça (mes premières lignes en python soyez indulgent), ça (renameBk.py) rénommait les id des personnes avec le numéro de sosa prefixé de Bk (Innnnn du sosa 1 -> Bk00001) à partir du xml de gramps et en en générant un autre

https://www.dropbox.com/sh/i0kp2yxreh0xrj6/AAAUm_3wiglZZsYhS4V0U-Kua?dl=0
Patrice Legoux Publications: Logiciels utilisés / Version:
  • Windows: Windows 10 Pro
  • Gramps: AIO64-5.1.3-2
  • Geneanet Upload
  • Chrome
patricelegoux
patricelegoux
Viestit: 1786
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
Et comparer/réconcilier les deux bases dans openrefine ? Je ne sais pas si a du sens, je m'y suis mis il y a peu je suis donc enthousiaste à son propos, mais je vois bien des colonnes base1(la votre)/base2(le gedcom), nom, prénoms, père, mère et comparer tout ce monde la afin de trouver les quadruplets similaires et conserver ceux de la vôtre base en priorité et à défaut ceux du gedcom. Je ne me souviens plus mais on doit aussi pouvoir faire des calculs et donc calculer des numéros de sosa. En plus s'il y a besoin ça permettrait de nettoyer lieux, sources, patronymes au besoin, etc
Patrice Legoux Publications: Logiciels utilisés / Version:
  • Windows: Windows 10 Pro
  • Gramps: AIO64-5.1.3-2
  • Geneanet Upload
  • Chrome
romjerome
male
Viestit: 1514
Sisääntulotila: Graafinen
Selailu: Teksti
Tarkastele heidän sukupuutaan.
valentil kirjoitti: 04 Kesäkuu 2021, 15:32 J'ai aujourd'hui un nouveau gedcom à intégrer de qqs 40 000 individus, dans une base de 4 000 individus, avec 890 individus communs, du coup je cherche un moyen efficace d'importer/fusionner le gedcom en question..
Existe t'il un lien avec une autre question sur ce forum ?
Si oui, je peux vous fournir (pour un test) une version de cet outil, fonctionnant également sous Windows (et Mac OS) !

ps : j'ai fait une bétise sur les dates et lieux, mais je peux (rapidement ?) corriger mon erreur dans le code.
valentil
male
Viestit: 25
Sisääntulotila: Teksti
Selailu: Teksti
Tarkastele heidän sukupuutaan.
Hello, il y a plus ou moins un lien, je n'ai pas réussi à faire fonctionner le script de récupération roglo, du coup j'ai récupéré l'arbre plus ou moins manuellement, à base d'export, de copier-coller, et de formules excel puis de conversion vers gedcom. à la fin j'obtient un gedcom a peu près correct de 40k individus

Merci pour votre aide, j'ai fais une compil de vos différentes suggestions et j'ai écris ce but de code qui permet de créer et remplir un attribut "SOSA" (les tags ce n'était finalement pas très pratique, la génération de nombreux tags différents rendait l'utilisation laborieuse)

J'ai essayé de rajouté cet attribut dans la liste d'individu, mais je me heurte à un nouveau blocage: le tri sur ma nouvelle colonne plante dans la vue "flat"

Koodi: Valitse kaikki

62893: ERROR: grampsapp.py: line 157: Unhandled exception
Traceback (most recent call last):
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\views\listview.py", line 657, in column_clicked
    search=filter_info, sort_map=self.column_order())
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\views\treemodels\peoplemodel.py", line 596, in __init__
    scol=scol, order=order, sort_map=sort_map)
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\views\treemodels\flatbasemodel.py", line 486, in __init__
    self.rebuild_data()
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\views\treemodels\flatbasemodel.py", line 613, in _rebuild_filter
    allkeys = self.sort_keys()
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\views\treemodels\flatbasemodel.py", line 570, in sort_keys
    for key, data in cursor]
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\views\treemodels\flatbasemodel.py", line 570, in <listcomp>
    for key, data in cursor]
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gui\views\treemodels\flatbasemodel.py", line 476, in <lambda>
    self.sort_func = lambda x: glocale.sort_key(self.smap[col](x))
  File "C:\Users\l\AppData\Local\GrampsAIO64-5.1.3\gramps\gen\utils\grampslocale.py", line 926, in sort_key
    return hexlify(self.collator.getCollationKey(string).getByteArray()).decode()
icu.InvalidArgsError: (<class 'icu.RuleBasedCollator'>, 'getCollationKey', (0,))
Je n'ai probablement pas correctement affecté le contenu de ma colonne sosa, sauriez vous me dire comment est-il possible de rajouter proprement cette colonne svp?

j'ai rajouté une colonne dans gui\view\treemodels\peoplemodel.py:

Koodi: Valitse kaikki

class PeopleBaseModel(BaseModel):
    """
    Basic Model interface to handle the PersonViews
    """
    _GENDER = [ _('female'), _('male'), _('unknown') ]

    def __init__(self, db):
        """
        Initialize the model building the initial data
        """
        BaseModel.__init__(self)
        self.db = db
        self.gen_cursor = db.get_person_cursor
        self.map = db.get_raw_person_data

        self.fmap = [
            self.column_name,
            self.column_id,
            self.column_gender,
            self.column_birth_day,
            self.column_birth_place,
            self.column_death_day,
            self.column_death_place,
            self.column_spouse,
            self.column_parents,
            self.column_marriages,
            self.column_children,
            self.column_todo,
            self.column_private,
            self.column_tags,
            self.column_change,
            self.column_tag_color,
            self.column_attrib_sosa, #LVA modif
            ]
        self.smap = [
            self.sort_name,
            self.column_id,
            self.column_gender,
            self.sort_birth_day,
            self.column_birth_place,
            self.sort_death_day,
            self.column_death_place,
            self.column_spouse,
            self.sort_parents,
            self.sort_marriages,
            self.sort_children,
            self.sort_todo,
            self.column_private,
            self.column_tags,
            self.sort_change,
            self.column_tag_color,
            self.column_attrib_sosa, #LVA modif
            ]

    #LVA modif
    def column_attrib_sosa(self, data):
        """
        Return the sorted list of tags.
        """
        handle = data[0]
        cached = None
        cached, value = self.get_cached_value(handle, "SOSA")
        if not cached:
            person = self.db.get_person_from_handle(handle)
            value=0
            for attr in person.get_attribute_list():
                if attr.get_type() == "SOSA":
                    value = attr.get_value()
                    break
            self.set_cached_value(handle, "SOSA", value)
        return value
ainsi que dans plugins\lib\libpersonview.py

Koodi: Valitse kaikki

class BasePersonView(ListView):
    """
    Base view for PersonView listviews ListView, a treeview
    """
    COL_NAME = 0
    COL_ID = 1
    COL_GEN = 2
    COL_BDAT = 3
    COL_BPLAC = 4
    COL_DDAT = 5
    COL_DPLAC = 6
    COL_SPOUSE = 7
    COL_PARENTS = 8
    COL_MARRIAGES = 9
    COL_CHILDREN = 10
    COL_TODO = 11
    COL_PRIV = 12
    COL_TAGS = 13
    COL_CHAN = 14
    COL_COLOR = 15 #LVA modif
    COL_SOSA = 16 #LVA modif
    # column definitions
    COLUMNS = [
        (_('Name'), TEXT, None),
        (_('ID'), TEXT, None),
        (_('Gender'), TEXT, None),
        (_('Birth Date'), MARKUP, None),
        (_('Birth Place'), MARKUP, None),
        (_('Death Date'), MARKUP, None),
        (_('Death Place'), MARKUP, None),
        (_('Spouse'), TEXT, None),
        (_('Number of Parents'), TEXT, 'gramps-parents'),
        (_('Number of Marriages'), TEXT, 'gramps-family'),
        (_('Number of Children'), TEXT, 'gramps-relation'),
        (_('Number of To Do Notes'), TEXT, 'gramps-notes'),
        (_('Private'), ICON, 'gramps-lock'),
        (_('Tags'), TEXT, None),
        (_('Last Changed'), TEXT, None),
        #LVA modif
        (_('Color'), TEXT, None),
        (_('Sosa'), TEXT, None),
        ]
    # default setting with visible columns, order of the col, and their size
    CONFIGSETTINGS = (
        ('columns.visible', [COL_NAME, COL_ID, COL_GEN, COL_BDAT, COL_DDAT]),
        ('columns.rank', [COL_NAME, COL_ID, COL_GEN, COL_BDAT, COL_BPLAC,
                           COL_DDAT, COL_DPLAC, COL_SPOUSE, COL_PARENTS,
                           COL_MARRIAGES, COL_CHILDREN, COL_TODO, COL_PRIV,
                           #LVA modif COL_TAGS, COL_CHAN]),
                           COL_TAGS, COL_CHAN, COL_COLOR, COL_SOSA]),
        ('columns.size', [250, 75, 75, 100, 175, 100, 175, 100, 30, 30, 30, 30,
                          #LVA modif 30, 100, 100])
                          30, 100, 100, 10, 100])
Vastaa Viestiin

Palaa sivulle “Gramps”