Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce the new GeneanetForGramps plugin #473

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

bcornec
Copy link

@bcornec bcornec commented Dec 5, 2020

New plugin for Gramps to easily import Geneanet subtrees of a person.

Code pushed to addons-source and soon to addons
Wiki pages proposed as well:

@romjerome
Copy link
Contributor

romjerome commented Dec 6, 2020

Nice tool!
Thanks.

Note, lxml might be also a dependency...
https://github.com/bcornec/addons-source/blob/master/GeneanetForGramps/GeneanetForGramps.py#L35

At a glance, it seems that birth and death dates are ignored (parsing marriage date is good)

        if evttype == EventType.BIRTH:
            ref = self.grampsp.get_birth_ref()
        elif evttype == EventType.DEATH:
            ref = self.grampsp.get_death_ref()
        elif evttype == EventType.MARRIAGE:
            eventref = None
            for eventref in self.family.get_event_ref_list():
                event = db.get_event_from_handle(eventref.ref)
                if (event.get_type() == EventType.MARRIAGE
                    and (eventref.get_role() == EventRoleType.FAMILY
                    or eventref.get_role() == EventRoleType.PRIMARY)):
                        break
            ref = eventref

https://github.com/bcornec/addons-source/blob/master/GeneanetForGramps/GeneanetForGramps.py#L647

I am not sure of the cause there, but if it is an issue on localized date handler (there is an attribute for setting the locale on date/event; ie. on reports), then I should not get date on marriage event and maybe at least get a date with textual format as fallback. Anyway, I suppose this can be quickly checked.

# Only in case of french language analysis
elif self.__dict__[attr+'date'][0:2] == _("in")[0:2]:

Maybe an hardcoded string (in french) for _("in") will limit issues with translations handling ?

Otherwise, a description will be added on created events. That's a great idea. Maybe could go further!
There is an option (set under gramps preferences) for adding a tag on imported records.
https://github.com/gramps-project/gramps/blob/master/gramps/gen/config.py#L245
https://github.com/gramps-project/gramps/blob/master/gramps/gui/configure.py#L1558
https://github.com/gramps-project/gramps/blob/master/gramps/plugins/importer/importxml.py#L136
https://github.com/gramps-project/gramps/blob/master/gramps/plugins/importer/importxml.py#L571
...

All imported records from geneanet might be also marked with one custom tag added during import?
e,g. content of the <title> tag with date of the import

Just an idea!

@jralls
Copy link
Member

jralls commented Dec 6, 2020

Note, lxml might be also a dependency...

Which creates a problem for packagers. Please use the markup API of the Python standard library.

@romjerome
Copy link
Contributor

My bad!
Having a locale support (''addon.mo'' in french for me) will fix the parsing issue on individual events (birth and death events). Except a possible problem when one try to import text (source) under a specific locale, I suppose this is fixed (once locale support available and set).

@bcornec
Copy link
Author

bcornec commented Dec 7, 2020

I added lxml as a prerequisite indeed and also documented the fact that it's only working with the new SQlite DB format of 5.1, not the BSDDB.
I don't see why it's a problem to use an official pypi package for lxml ?

@bcornec
Copy link
Author

bcornec commented Dec 7, 2020

Nice tool!
Thanks.

Note, lxml might be also a dependency...
https://github.com/bcornec/addons-source/blob/master/GeneanetForGramps/GeneanetForGramps.py#L35

At a glance, it seems that birth and death dates are ignored (parsing marriage date is good)

        if evttype == EventType.BIRTH:
            ref = self.grampsp.get_birth_ref()
        elif evttype == EventType.DEATH:
            ref = self.grampsp.get_death_ref()
        elif evttype == EventType.MARRIAGE:
            eventref = None
            for eventref in self.family.get_event_ref_list():
                event = db.get_event_from_handle(eventref.ref)
                if (event.get_type() == EventType.MARRIAGE
                    and (eventref.get_role() == EventRoleType.FAMILY
                    or eventref.get_role() == EventRoleType.PRIMARY)):
                        break
            ref = eventref

https://github.com/bcornec/addons-source/blob/master/GeneanetForGramps/GeneanetForGramps.py#L647

I am not sure of the cause there, but if it is an issue on localized date handler (there is an attribute for setting the locale on date/event; ie. on reports), then I should not get date on marriage event and maybe at least get a date with textual format as fallback. Anyway, I suppose this can be quickly checked.

# Only in case of french language analysis
elif self.__dict__[attr+'date'][0:2] == _("in")[0:2]:

Maybe an hardcoded string (in french) for _("in") will limit issues with translations handling ?

Otherwise, a description will be added on created events. That's a great idea. Maybe could go further!
There is an option (set under gramps preferences) for adding a tag on imported records.
https://github.com/gramps-project/gramps/blob/master/gramps/gen/config.py#L245
https://github.com/gramps-project/gramps/blob/master/gramps/gui/configure.py#L1558
https://github.com/gramps-project/gramps/blob/master/gramps/plugins/importer/importxml.py#L136
https://github.com/gramps-project/gramps/blob/master/gramps/plugins/importer/importxml.py#L571
...

All imported records from geneanet might be also marked with one custom tag added during import?
e,g. content of the <title> tag with date of the import

Just an idea!

Will try to understand how it works and implement it. Cf: https://github.com/bcornec/GeneanetForGramps/issues/23

@jralls
Copy link
Member

jralls commented Dec 7, 2020

I don't see why it's a problem to use an official pypi package for lxml ?

Because Gramps is distributed as an all-in-one bundle on macOS and Microsoft Windows. Every additional dependency adds to the effort to create those bundles and to the resulting download size. The python in those bundles doesn't include pip and even if it did would require a UAC to run on Windows and would violate macOS's code signing security so everything must be in the bundles.

Add to that that Gramps already depends directly on libxml2's python API so lxml, while a little easier to use and a little more pythonic, is superfluous.

@bcornec
Copy link
Author

bcornec commented Dec 8, 2020

I don't see why it's a problem to use an official pypi package for lxml ?

Because Gramps is distributed as an all-in-one bundle on macOS and Microsoft Windows. Every additional dependency adds to the effort to create those bundles and to the resulting download size. The python in those bundles doesn't include pip and even if it did would require a UAC to run on Windows and would violate macOS's code signing security so everything must be in the bundles.

Add to that that Gramps already depends directly on libxml2's python API so lxml, while a little easier to use and a little more pythonic, is superfluous.

Hummm, too bad people are still using proprietary OSes to run FLOSS software :-(
It would be also easier for them to run a docker container with a Linux Gramps in it and avoid all these complications.

Ok, will have a look at what it requires to make modifications, but I'd like to concentrate first on having returns from people already able to execute it (so Linux users), see how it's working for them before breaking stuff to make it work for other platforms.
It may takes a bit of time, as I'm far from working full time on this, and that work started back in february.

@bcornec
Copy link
Author

bcornec commented Dec 8, 2020

Because Gramps is distributed as an all-in-one bundle on macOS and Microsoft Windows. Every additional dependency adds to the effort to create those bundles and to the resulting download size. The python in those bundles doesn't include pip and even if it did would require a UAC to run on Windows and would violate macOS's code signing security so everything must be in the bundles.

Also is requests part of your existing MacOS & Windows packages ? Because this time it would make it very difficult for me to work without it.

Add to that that Gramps already depends directly on libxml2's python API so lxml, while a little easier to use and a little more pythonic, is superfluous.

@romjerome
Copy link
Contributor

romjerome commented Dec 8, 2020

Copied from a forum (in french!):

J'avais déjà requests d'installé (j'ai meme refait un pip install requests) 
mais gramps me dit le contraire quand j'essaie de faire tourner GeneanetForGramps.
Y aurait pas des fois une version de python dédiée à gramps 
d'installée quelque part (sur windows en tout cas) sur laquelle il faudrait aussi installer requests ?

A gramps user ( @patlx ), under Windows, cannot get it working, despite 'requests' installed.

@patlx
Copy link

patlx commented Dec 8, 2020

Yes. Gramps on windows seems not to interact with any python installed packages outside of gramps, telling it where to look at using windows path variable don't change anything even with python and its installed packages as first directory in the path.

Gramps in a linux vm or dockerized may be an answer but if I couldn't add such a layer on my os it'll be better.

And, I'm aware that's a complex issue:
https://gramps.discourse.group/t/hotspot-heatmap-for-event-clusters/776/19?u=plegoux

@jralls
Copy link
Member

jralls commented Dec 8, 2020

Yes. Gramps on windows seems not to interact with any python installed packages outside of gramps, telling it where to look at using windows path variable don't change anything even with python and its installed packages as first directory in the path.

That's because Gramps on Windows and macOS has its own python interpreter, libpython, and sys.path. This is required in order to use the Gtk GUI stack as its python interface, gi.repository, must be linked with libpython. Windows doesn't provide any python while macOS only began providing python3 in the 2019 "Catalina" version 10.15.

@romjerome
Copy link
Contributor

romjerome commented Dec 8, 2020

Note, just made a minor local change on description addition/inclusion before more testing, and got an issue on a person without name : some data have been added on an unrelated person and the gender has been changed to unknown! Fortunately, the local change tracks this down easily. e.g., this url where the starting url was this one.

It was my testing database, but this could be an 'overwrite/collapse' issue for users having people without name (surname, firstname) on the database. The mistake seems to occur by checking the spouse and marriage.

tags people and events (records) with colored tags (and the black one) were already there before import (my data), have a look at new relations and dates...

Before import via GeneanetForGramps:
niquel
no_name

@romjerome
Copy link
Contributor

romjerome commented Dec 9, 2020

from lxml import html

Is it not possible to parse html stuff via gramps' Html class?
ok, maybe an old fashioned method, but we could also imagine users sharing an url with a pattern/template page based on html class and with some data as content. Either for generated reports in html format or any project linked with gramps and not using web API! html class could have a basic check for dependencies (try/except, etc.)

I did tests in the past.
Got (maybe improved since last years!) some limitations (performances issues) on etree module provided with python against lxml, but it was for parsing XML and few lines using XPath.

@romjerome
Copy link
Contributor

romjerome commented Dec 9, 2020

got an issue on a person without name : some data have been added on an unrelated person and the gender has been changed to unknown!

I suppose that the fallback for spouse surname should be improved?

@@ -1228,14 +1228,16 @@ def from_geneanet(self,purl):
                        if verbosity >= 2:
                            print(_("Spouse name:"), sname[s])
                    except:
-                       sname.append("")
+                       from uuid import uuid4
+                       sname.append(str(uuid4()))

                    try:
                        sref.append(str(spouse.xpath('a/attribute::href')[0]))
                        if verbosity >= 2:
                            print(_("Spouse ref:"), ROOTURL+sref[s])
                    except:
-                       sref.append("")
+                       from uuid import uuid4
+                       sname.append(str(uuid4()))
                    self.spouseref.append(ROOTURL+sref[s])

                    try:

maybe uuid3 will be more useful for this tool (e.g., hash on url)?

@romjerome
Copy link
Contributor

I suppose that the fallback for spouse surname should be improved?

The problem is somewhere else...

@romjerome
Copy link
Contributor

Copied debug log section:

Mise à jour birthDate pour 1816-08-23
Création de death (13) Événement 
=> Création d'une famille de Nicolas LEBLANC DE XOUCHE &  
Creation d'une GFamily: Nicolas LEBLANC DE XOUCHE -  
Comparaison de la ref conjoint https://gw.geneanet.org/hbetting?lang=fr&pz=hubert+serge&nz=betting&m=RL&i1=4255&i2=45188&b1=1&b2=2051 vis à vis de https://gw.geneanet.org/hbetting?lang=fr&pz=hubert+serge&nz=betting&m=RL&i1=4255&i2=45188&b1=1&b2=2051 (idx: 0)
Épou(x|se) https://gw.geneanet.org/hbetting?lang=fr&pz=hubert+serge&nz=betting&m=RL&i1=4255&i2=45188&b1=1&b2=2051 trouvé(e) (idx: 0)
Appel de from_gramps avec le gid: None
Le gid est maintenant: None
gid existant d'une Famille Gramps: None
Recherche d'une Famille Gramps
Analyze d'une famille Gramps F0002
Vérification de l'id du père : I2566 en comparaison de I15322
Vérification de l'id de la mère : None en comparaison de I3670
Analyze d'une famille Gramps F0005
Vérification de l'id du père : I2578 en comparaison de I15322
Vérification de l'id de la mère : None en comparaison de I3670
Analyze d'une famille Gramps F0006
Vérification de l'id du père : I2362 en comparaison de I15322
Vérification de l'id de la mère : I2344 en comparaison de I3670
Analyze d'une famille Gramps F0010
Vérification de l'id du père : I2356 en comparaison de I15322
Vérification de l'id de la mère : I2424 en comparaison de I3670
Analyze d'une famille Gramps F0016
...
Analyze d'une famille Gramps F7323
Vérification de l'id du père : I2466 en comparaison de I15322
Vérification de l'id de la mère : I2412 en comparaison de I3670
Analyze d'une famille Gramps F7325
Vérification de l'id du père : I2432 en comparaison de I15322
Vérification de l'id de la mère : I2476 en comparaison de I3670
Création d'une nouvelle Famille Gramps: F0000
Copie futée de Famille
Copy futée d'attributs marriagedate
Copie de l'attribut marriagedate de l'individu (valeur précédente : None, nouvelle valeur : None)
Copy futée d'attributs marriageplace
Copie de l'attribut marriageplace de l'individu (valeur précédente : None, nouvelle valeur : 57670)
Copy futée d'attributs marriageplacecode
Copie de l'attribut marriageplacecode de l'individu (valeur précédente : None, nouvelle valeur : None)
Création de marriage (1) Événement 
Creation d'un lieu: 57670
---
Création dun nouvel individu Gramps : I0003 ( )
Genre : U
===> Nom Gramps de I0003 :  
Pas de date de naissance
Pas de date de décès
Créé l'individu au niveau 1
Créé l'individu au niveau 1
Copie futée d'un individu I0003
Copy futée d'attributs firstname
Copie de l'attribut firstname de l'individu (valeur précédente : , nouvelle valeur : )
Copy futée d'attributs lastname
Copie de l'attribut lastname de l'individu (valeur précédente : , nouvelle valeur : )
Copy futée d'attributs sex
Pas de copie de l'attribut (sex, valeur U) sur U
Copy futée d'attributs birthdate
Copie de l'attribut birthdate de l'individu (valeur précédente : None, nouvelle valeur : None)
Copy futée d'attributs birthplace
Copie de l'attribut birthplace de l'individu (valeur précédente : None, nouvelle valeur : None)
Copy futée d'attributs birthplacecode
Copie de l'attribut birthplacecode de l'individu (valeur précédente : None, nouvelle valeur : None)
Copy futée d'attributs deathdate
Copie de l'attribut deathdate de l'individu (valeur précédente : None, nouvelle valeur : None)
Copy futée d'attributs deathplace
Copie de l'attribut deathplace de l'individu (valeur précédente : None, nouvelle valeur : None)
Copy futée d'attributs deathplacecode
Copie de l'attribut deathplacecode de l'individu (valeur précédente : None, nouvelle valeur : None)
Création de birth (12) Événement 
Création de death (13) Événement 
=> Création d'une famille de Nicolas LEBLANC DE XOUCHE &  
Creation d'une GFamily: Nicolas LEBLANC DE XOUCHE -  
Comparaison de la ref conjoint https://gw.geneanet.org/hbetting?lang=fr&pz=hubert+serge&nz=betting&m=RL&i1=4255&i2=45188&b1=1&b2=2051 vis à vis de https://gw.geneanet.org/hbetting?lang=fr&pz=hubert+serge&nz=betting&m=RL&i1=21800&i2=45188&b1=1&b2=1663 (idx: 0)
Comparaison de la ref conjoint https://gw.geneanet.org/hbetting?lang=fr&pz=hubert+serge&nz=betting&m=RL&i1=21800&i2=45188&b1=1&b2=1663 vis à vis de https://gw.geneanet.org/hbetting?lang=fr&pz=hubert+serge&nz=betting&m=RL&i1=21800&i2=45188&b1=1&b2=1663 (idx: 1)
Épou(x|se) https://gw.geneanet.org/hbetting?lang=fr&pz=hubert+serge&nz=betting&m=RL&i1=21800&i2=45188&b1=1&b2=1663 trouvé(e) (idx: 1)
Appel de from_gramps avec le gid: None
Le gid est maintenant: None
gid existant d'une Famille Gramps: None
Recherche d'une Famille Gramps
Analyze d'une famille Gramps F0000
Vérification de l'id du père : I15322 en comparaison de I15322
Vérification de l'id de la mère : I3670 en comparaison de I0003
Analyze d'une famille Gramps F0002
Vérification de l'id du père : I2566 en comparaison de I15322
Vérification de l'id de la mère : None en comparaison de I0003
Analyze d'une famille Gramps F0005
Vérification de l'id du père : I2578 en comparaison de I15322
Vérification de l'id de la mère : None en comparaison de I0003
Analyze d'une famille Gramps F0006
...
Analyze d'une famille Gramps F7323
Vérification de l'id du père : I2466 en comparaison de I15322
Vérification de l'id de la mère : I2412 en comparaison de I0003
Analyze d'une famille Gramps F7325
Vérification de l'id du père : I2432 en comparaison de I15322
Vérification de l'id de la mère : I2476 en comparaison de I0003
Création d'une nouvelle Famille Gramps: F0001
Copie futée de Famille
Copy futée d'attributs marriagedate
Copie de l'attribut marriagedate de l'individu (valeur précédente : None, nouvelle valeur : None)
Copy futée d'attributs marriageplace
Copie de l'attribut marriageplace de l'individu (valeur précédente : None, nouvelle valeur : None)
Copy futée d'attributs marriageplacecode
Copie de l'attribut marriageplacecode de l'individu (valeur précédente : None, nouvelle valeur : None)
Création de marriage (1) Événement 

@romjerome
Copy link
Contributor

Maybe one section is missing on find_grampsf() for a common use?

if self.father and father and father.gramps_id == self.father.gid \
                and self.mother and mother and mother.gramps_id == self.mother.gid:
    return(f)
    #TODO: What about preexisting families not created in this run ?
return(None)

@romjerome
Copy link
Contributor

Not certain to fully understand all expected stuff, but get a workaround (need to polish or refactor it) for the issue when data already exist (outside current geneanet page):

@ -792,6 +792,9 @@ def find_grampsf(self):
                and self.mother and mother and mother.gramps_id == self.mother.gid:
                return(f)
            #TODO: What about preexisting families not created in this run ?
+           else:
+               print(i)
+               return(f)
        return(None)

    def from_geneanet(self):

It seems that a proper fix could exist somewhere else (before on the trace back), but this workaround (as a simple addition) should not break something already checked. The only one remaining issue is maybe that we need to merge the family and the marriage event (but this avoids the overwrite without control!).

My specific case is maybe that I have some data missing on the url (geneanet): I just wanted to add some data from a distant cousin. I am not certain that the multiple marriages (families/spouses) or the empty name is the cause of the issue. This might be an issue for gramps' user as the tool will overwrite the existing relations and family.

@romjerome
Copy link
Contributor

@bcornec
Copy link
Author

bcornec commented Dec 15, 2020

from lxml import html

Is it not possible to parse html stuff via gramps' Html class?

Well, from my first reading I don't think there is an equivalent in it to the XPath features I'm getting with lxml.

I did tests in the past.
Got (maybe improved since last years!) some limitations (performances issues) on etree module provided with python against lxml, but it was for parsing XML and few lines using XPath.

What puzzles me then is that it seems that at least another gramplet is using lxml:

from lxml import etree as etree_

So if that's the case, why would importing lxml on my side be a problem in fact ?

@bcornec
Copy link
Author

bcornec commented Dec 15, 2020

got an issue on a person without name : some data have been added on an unrelated person and the gender has been changed to unknown!

I think that's probaly the origin of the issue you're seeing, as I hadn't such cases when I made my tests.
Can't promise I'll have a fix before Christmas as stuff are pretty busy, but will try.

@jralls
Copy link
Member

jralls commented Dec 15, 2020

So if that's the case, why would importing lxml on my side be a problem in fact ?

You didn't dig deeply enough. That's an experimental gramplet @romjerome wrote a few years ago. It's not distributed: Note its absence from the listing.

This SO explains using libxml2's XPath features.

@romjerome
Copy link
Contributor

romjerome commented Dec 15, 2020

What puzzles me then is that it seems that at least another gramplet is using lxml:

from lxml import etree as etree_

So if that's the case, why would importing lxml on my side be a problem in fact ?

Well, it was an experimental set of gramplets, which aims to explore lxml features with gramps xml file.
It was never designed for production and... is not on the listing files ! (include_in_listing = False).
So, available for tests or as documentation, sample, experimentations but without real
support or features useful for users (except maybe if one wants to recover or transform
data from a gramps xml file). We know that dependencies might be a problem for gramps bundles
on non-linux OS. That's also why I generated etree gramplet (ElementTree as built-in module for python),
which might be more limited (and less efficient) but available whatever OS! These gramplets (etree, lxml) might be useful (e.g., one needs to parse a gramps xml file and do not want to investigate (spend time on documentation, tests and lines of code), so hacking these basics gramplets could make the job). They could be safety removed, they are documented, one can download and use it outside addons listing.

The superclass module was an other experimentation...
It was before json support and Doug's stuff. So, some years ago.
Not far away from an alternate documentation, rather than a real addon.
All these files, scripts and experimentations were useful for testing (and sometimes fixing)
issues on gramps xml file! Now, as the model is more robust, I am not certain that it can still be useful.

@romjerome
Copy link
Contributor

So if that's the case, why would importing lxml on my side be a problem in fact ?

You didn't dig deeply enough. That's an experimental gramplet @romjerome wrote a few years ago. It's not distributed: Note its absence from the listing.

Yes, my bad!
We can remove the lxml directory/folder from addons sources.
As wrote, they are more and less a way to provide a description of gramps xml file
without a strict specification! One wants to support gramps xml file on import, feel
free, can hack (and fix) these files. Just not want to share something like that
with all gramps users, which does not really make sense (too many experimentations).

@romjerome
Copy link
Contributor

romjerome commented Dec 15, 2020

got an issue on a person without name : some data have been added on an unrelated person and the gender has been changed to unknown!

I think that's probaly the origin of the issue you're seeing, as I hadn't such cases when I made my tests.
Can't promise I'll have a fix before Christmas as stuff are pretty busy, but will try.

There is maybe a more global issue!
Gramps can store single individual (DB model).
e.g., witness on event, godparents, etc.

Geneanet/Geneweb model is family centric.
e.g., need to generate ghost or attach any single person to a family

Just ran the "check and repair" tool (Tools menu -> Repair Family Tree)
and got broken parent <-> child references

So, either my workaround is incomplete or it generates a new issue... Trying to get a better return (fallback), I also played with name/id by forcing a custom/random ID related to url: uuid.uuid3(uuid.NAMESPACE_URL, self.url),
but it seems that the current code is merging the first incomplete family (one parent) on gramps family list (sort by gramps id ?) and is attaching the first single individual (not related) on people listing (sort by gramps id ?).

This may not be a problem if all data will be imported from/for/by geneanet, but many gramps users will not be able to quickly look at this issue. By merging (overwrite) it becomes difficult to go back, so gramps developers will have to provide an help for getting safe data back...

ps: geneanet has a private API (I do not remember well the endpoint...)
Should we not try to ask for an access? It generates json stream (at least for some queries!).

@romjerome
Copy link
Contributor

romjerome commented Jun 7, 2021

@patlx
It seems that geneanet made some changes...
So, I use an alternate version, which should work under Windows OS (and MAC OS), as there is a fallback to 'import requests' by using built-in urllib module!

Note, if you want to test it, there is maybe one additionnal issue under non-linux system around logging (and a log file creation), but this should not be a problem if you do not use the debug flag/mode on your gramps session.

There is still some minor sections to check...
So, it is not far away from @bcornec's version, only made some local changes... having problems with some formats on strings (coding).

@romjerome
Copy link
Contributor

romjerome commented Jun 30, 2021

@bcornec
As I forked your 'GeneanetForGramps' repository, I played a little bit with it.
Also added a quick support for Tag objects (so, we can check records related to this tool) and looked at some experimental/draft ideas (like pseudo-UUID instead of an empty string for names on place & individual). For debug, there is also 'info.log' file creation (will be generated under gramps sources location!)

$ python3 Gramps.py -d "GeneanetForGramps"

Maybe it could be possible to add a support for WindowsOS (and MacOS), but I was not able to test it. So, just added a simple test and check around OS and plateform.
Not very clean, this will only generate a warning-like.

There is still some limitations with 'Requests' module as 'geneanet.org' returns 201 status code (generating a new response...). Also, after checking some pages, the server will generate a 302 code! I use a workaround but should 'Requests'
still be useful when 'geneanet.org' often returns 201 and 302 HTTP codes?

Otherwise, it works fine.
Thank you!

@romjerome
Copy link
Contributor

romjerome commented Jun 30, 2021

My local changes should be visible here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants