geneweb / geneweb

GeneWeb is a free (as in free speech) genealogy software with a web interface created by Daniel de Rauglaudre.
GNU General Public License v2.0
311 stars 93 forks source link

gwc not able to read date of death prefix modifier from gwplus files #369

Closed GuillaumeBrochu closed 8 years ago

GuillaumeBrochu commented 8 years ago

First step : take a .gw file generated by version 6.08 (not of gwplus format...). I have this :

- h Joseph #apubl #occu Meunier,_Capitaine_de_milice 22/3/1698 #bp Beaumont e1760 #buri 1760

There is a prefix modifier "e" (for executed, see http://geneweb.tuxfamily.org/wiki/GWformat#Personal_information) before the date of death

Second, using version 7.00 exp, I do this operation : .gw file (V6, not gwplus) -> gwc (V7) -> gwu (V7) -> .gw file (V7, gwplus). Result:

- h Joseph #apubl #occu Meunier,_Capitaine_de_milice 22/3/1698 #bp Beaumont e1760 #buri 1760

The prefix modifier "e" is there , and we can see "executed" at the top of this person's page with version 7.00 running.

Third, using version 7.00 exp, I do this operation : .gw file (V7, gwplus) -> gwc (V7) -> gwu (V7) -> .gw file (V7, gwplus). Result:

- h Joseph #apubl #occu Meunier,_Capitaine_de_milice 22/3/1698 #bp Beaumont 1760 #buri 1760

The prefix modifier "e" vanished in this last operation...

I have not check for other prefixes ("k","m","s")

I'm using geneweb/geneweb/master at this commit : https://github.com/geneweb/geneweb/commit/d6bec129e9cad750c9e25e21fc0f9e1d56cf147f. If I use gwu from geneweb/geneweb/api (two commits ahead, see https://github.com/geneanet/geneweb/issues/359#issuecomment-168522155), the result is the same, so these two additionnal commits do not seem to have an impact.

GuillaumeBrochu commented 8 years ago

I also observed the same phenomenon for the #nsck flag.

When read from a V6 .gw file (not gwplus), the #nsck flag is read by gwc as it should be and saved to gwplus format with gwu, but it is not read by gwc (I mean, transfered to the newly created database) if the file is in V7/gwplus format.

GuillaumeBrochu commented 8 years ago

Voir ce commentaire, qui, je crois, est relié à ce problème : https://github.com/geneanet/geneweb/issues/368#issuecomment-170362780

GuillaumeBrochu commented 8 years ago

Voir aussi : https://github.com/geneanet/geneweb/issues/305

GuillaumeBrochu commented 8 years ago

Je crois avoir trouvé pourquoi les préfixes de types de décès ("k","m","s","e") et les #nsck sont mal importées par gwc seulement pour des fichiers .gw au format gwplus (les fichiers .gw générés avec la V6 s'importent sans problème).

C'est essentiellement causé par la redondance des informations sur les dates de décès et sur les mariages entre les informations de base des personnes/familles et les pevt/fevt.

Par exemple, la date de décès est interprétée deux fois par gwc (gwcomp.ml) pour chaque fichier .w. La première dans les informations des personnes, et la deuxième dans les pevt. Or, les préfixes de types de décès ne sont sauvegardées par gwu que dans l'information des personnes, pas dans les pevt. Comme les pevt apparaissent dans l'ordre APRÈS les informations des personnes dans les fichiers .gw, c'est ce second décodage qui fixe le type de décès à "Unspecified". Le même principe doit s'appliquer pour les #nsck.

Exemple :

1.Fichier .gw V6 original

encoding: utf-8

fam AAAA Père 0 e1997 + AAAA Mère 0 s1996
beg
- h Fils 0 1995
- f Fille 0 2000
- f Cadette
end

fam AAAA Fils + #nsckm mm BBBB Fils

fam BBBB Père 0 k1999 + BBBB Mère 0 m1998
beg
- h Fils
- f Fille
- h Fiston
end

fam AAAA Fille + #nsck ff BBBB Fille

fam BBBB Fiston + #noment AAAA Cadette

2.On importe le fichier ci-haut dans la V7 et on sauvegarde avec cette V7 :

encoding: utf-8
gwplus

fam AAAA Père 0 e1997 + AAAA Mère 0 s1996
fevt
#marr 
end fevt
beg
- h Fils 0 1995
- f Fille 0 2000
- f Cadette
end

pevt AAAA Fils
#deat 1995
end pevt

pevt AAAA Fille
#deat 2000
end pevt

pevt AAAA Mère
#deat 1996
end pevt

pevt AAAA Père
#deat 1997
end pevt

fam AAAA Fils + #nsckm mm BBBB Fils
fevt
#marr 
end fevt

fam BBBB Père 0 k1999 + BBBB Mère 0 m1998
fevt
#marr 
end fevt
beg
- h Fils
- f Fille
- h Fiston
end

pevt BBBB Mère
#deat 1998
end pevt

pevt BBBB Père
#deat 1999
end pevt

fam AAAA Fille + #nsck ff BBBB Fille
fevt
#nmar 
end fevt

fam BBBB Fiston + #noment AAAA Cadette
fevt
#nmen 
end fevt

3.On importe le fichier ci-haut (gwplus) dans la V7 et on sauvegarde avec cette V7 :

encoding: utf-8
gwplus

fam AAAA Père 0 1997 + AAAA Mère 0 1996
fevt
#marr 
end fevt
beg
- h Fils 0 1995
- f Fille 0 2000
- f Cadette
end

pevt AAAA Fils
#deat 1995
end pevt

pevt AAAA Fille
#deat 2000
end pevt

pevt AAAA Mère
#deat 1996
end pevt

pevt AAAA Père
#deat 1997
end pevt

fam AAAA Fils + BBBB Fils
fevt
#marr 
end fevt

fam BBBB Père 0 1999 + BBBB Mère 0 1998
fevt
#marr 
end fevt
beg
- h Fils
- f Fille
- h Fiston
end

pevt BBBB Mère
#deat 1998
end pevt

pevt BBBB Père
#deat 1999
end pevt

fam AAAA Fille + #nm BBBB Fille
fevt
#nmar 
end fevt

fam BBBB Fiston + #noment AAAA Cadette
fevt
#nmen 
end fevt

4.Pour tester mon hypothèse, j'ai produit ces modifications manuellement avec un éditeur de texte (préfixe de type de décès ajoutés aussi dans les pevt) et ces préfixes sont importés sans problème par gwc!

[...]
pevt AAAA Mère
#deat s1996
end pevt

pevt AAAA Père
#deat e1997
end pevt
[...]
pevt BBBB Mère
#deat m1998
end pevt

pevt BBBB Père
#deat k1999
end pevt
[...]
GuillaumeBrochu commented 8 years ago

Commentaire pertinent de 304100:

http://www.geneanet.org/forum/?topic=531041.msg1050502#msg1050502

304100: Pour la gestion de la raison du décès, il ne semble pas que ce soit une simple gestion de format de fichier .gw. En effet, sauf avis contraire, avec le template default, sur une fiche où il est indiqué tué, vous perdez l'information 'tué' au moment de valider le formulaire "modifier personne". Il n'y a donc pas que gwc d'impacté par ce problème. C'est pourquoi j'ai placé le code "death_reason" en commentaire dans updind.txt pour éviter de renseigner un champ qui s'efface automatiquement.

GuillaumeBrochu: En fait, est-ce parce que le template par défaut ne récupère pas l'information sur le type de décès (https://github.com/geneanet/geneweb/issues/370) pour la proposer à l'usager (via m=MOD_IND et updateInd.ml) que celle-ci est perdue lors de la sauvegarde, ou est-ce parce que la fonction updateIndOk.ml (m=MOD_IND_OK) est aussi brisée pour le type de décès? Bref, serait-il possible avec un template modifié de transférer avec succès le type de décès dans la requête m=MOD_IND_OK d'une quelconque façon?

GuillaumeBrochu commented 8 years ago

Voir : https://github.com/geneanet/geneweb/issues/370#issuecomment-172328698

ghost commented 8 years ago

Bien vu. voici une autre base de test pour ceux qui n'auraient pas compris.

base 700.gw : pas bon:

encoding: utf-8
gwplus

fam PATRONYME Père 0 + #nsckm m? #mp union_homosexuelle MAMAN Mère 0
fevt
#marr  #p union_homosexuelle
end fevt
beg
- h Tué 0 k2000
- h Assassiné 0 m2000
- h Exécuté 0 e2000
- h Disparu 0 s2000
- h Non_précisé 0 0
- h Vivant
- h Ne_sais_pas
- h Décédé 0 2000
- h Mort_jeune 0 mj
- h Certainement_décédé 0 od
end

pevt PATRONYME Tué
#deat 2000
end pevt

pevt PATRONYME Assassiné
#deat 2000
end pevt

pevt PATRONYME Exécuté
#deat 2000
end pevt

pevt PATRONYME Disparu
#deat 2000
end pevt

pevt PATRONYME Non_précisé
#deat 
end pevt

pevt PATRONYME Décédé
#deat 2000
end pevt

pevt PATRONYME Mort_jeune
#deat 
end pevt

pevt PATRONYME Certainement_décédé
#deat 
end pevt

Même base corrigéé manuellement: bon:

encoding: utf-8
gwplus

fam PATRONYME Père 0 + #nsckm m? #mp union_homosexuelle MAMAN Mère 0
fevt
#marr  #p union_homosexuelle
end fevt
beg
- h Tué 0 k2000
- h Assassiné 0 m2000
- h Exécuté 0 e2000
- h Disparu 0 s2000
- h Non_précisé 0 0
- h Vivant
- h Ne_sais_pas
- h Décédé 0 2000
- h Mort_jeune 0 mj
- h Certainement_décédé 0 od
end

pevt PATRONYME Tué
#deat 0 k2000
end pevt

pevt PATRONYME Assassiné
#deat 0 m2000
end pevt

pevt PATRONYME Exécuté
#deat 0 e2000
end pevt

pevt PATRONYME Disparu
#deat 0 s2000
end pevt

pevt PATRONYME Non_précisé
#deat 0 0
end pevt

pevt PATRONYME Décédé
#deat 0 2000
end pevt

pevt PATRONYME Mort_jeune
#deat 0 mj
end pevt

pevt PATRONYME Certainement_décédé
#deat 0 od
end pevt

Donc, il fa falloir que je modifie templm en prévision du retour de K2000 ;)

GuillaumeBrochu commented 8 years ago

À mon avis, les bugs reliés aux différents #nsckX sont les plus critiques à court terme. Actuellement, il est impossible de sauvegarder / restaurer une base contenant des unions homosexuelles via un fichier .gw avec le format gwplus. Les #nsckX se perdent à la lecture d'un .gw gwplus avec gwc, et après un autre cycle ->gwu->gwc on obtient une erreur avec gwc.

Et tant qu'une décision "éditoriale" sur la redondance entre les informations de base des personnes et les pevt/fevt ne sera pas prise (autant dans les .gw que dans la base de données interne), il ne sera pas possible de faire avancer geneweb davantage ...

Et ce n'est pas évident... Dans l'événement décès, il y a un champ additionnel pour des notes (ce qu'il n'y a pas dans l'information des personnes...), mais pas de death_reason comme dans l'information des personnes...

GuillaumeBrochu commented 8 years ago

En fait, je ne suis pas certain que ce phénomène qu'on observe avec les modifications manuelles s'explique par un double décodage des dates de décès entre les informations de base des personnes et les pevt, car il n'y a qu'un seul appel de get_optional_deathdate dans gwcomp.ml :

https://github.com/geneweb/geneweb/blob/master/src/gwcomp.ml#L705

Il doit y avoir une autre explication...

GuillaumeBrochu commented 8 years ago

Après vérification, j'ai produit le fichier suivant avec un éditeur de texte, où l'information des personnes indique "executé (e)" et "disparu (s)", alors que les pevt indiquent "tué (k)" pour les deux parents, avec des dates de décès incohérentes:

fam AAAA Père 0 e1997 + AAAA Mère 0 s1996

[...]

pevt AAAA Mère
#deat k2006
end pevt

pevt AAAA Père
#deat k2007
end pevt

Conclusion : c'est "executé" et "disparu" dans l'information des personnes qui gagnent, tout comme les dates de décès 1997 et 1996! Et on observe ceci:

File "...bug.gw", line 23:
Error: #deat k2006
File "...bug.gw", line 24:
Error: end pevt
File "...bug.gw", line 27:
Error: #deat k2007
File "...bug.gw", line 28:
Error: end pevt

Bref, gwcomp.ml NE décode PAS le death_reason dans les pevt!! Ce death_rerason ajouté manuellement dans le pevt fait seulement planter le décodage dans gwcomp.ml / get_optional_event_date (https://github.com/geneweb/geneweb/blob/master/src/gwcomp.ml#L1110-L1178), qui, ainsi, laisse la priorité à l'information des personnes.

Par contre:

fam AAAA Père 0 e1997 + AAAA Mère 0 s1996

[...]

pevt AAAA Mère
#deat 2006
end pevt

pevt AAAA Père
#deat 2007
end pevt

efface les death_reasons "exécuté" et "disparu" et donne 2007 et 2006 comme dates de décès. Donc on voit que les pevt sont lus en dernier et c'est ce qui explique pourquoi le death_reason disparaît à la lecture d'un fichier .gw gwplus.

GuillaumeBrochu commented 8 years ago

Et par la suite, si je ne trompe pas, c'est probablement ce "Unspecified" hard-coded qui cause ultimement la disparition du death_reason: https://github.com/geneweb/geneweb/blob/master/src/db1link.ml#L1033

Ça ressemble beaucoup à ce bug (https://github.com/geneanet/geneweb/issues/370#issuecomment-172328698) dans updateIndOk.ml, qui a le même effet mais lors de la mise à jour d'une personne avec un template et non lors de la création de la base avec gwc.

En fait, si quelqu'un pouvait valider ceci, ça serait apprécié.