Repository: zestedesavoir/zds-site

Issue:
Sortir du dépôt Git les données GeoLite
Les données GeoLite, utilisées pour la géolocalisation des adresses IP des membres, doivent être mises à jour (la version actuellement utilisée date de 2020 et une mise à jour est proposée chaque semaine).

Cependant, ce fichier de données a une taille de 60 Mo, donc ce n'est pas vraiment une idée de mettre à jour simplement ce fichier, faire un commit et une PR : les dépôts Git vont grossir très vite si on met régulièrement à jour le fichier.

Il faut donc sortir ce fichier du dépôt : 
- [x] supprimer le fichier du dépôt
- [x] permettre l'utilisation du site si le fichier n'est pas présent (notamment pour l'environnement de dev)
- [x] mettre à jour les instructions d'installation pour indiquer comment récupérer le fichier et où le placer
- [x] mettre à jour https://github.com/zestedesavoir/ansible-zestedesavoir pour qu'il récupère et installe tout seul le fichier (il me semble que MaxMind met à disposition une API pour ce genre de choses)



Discussion:
Il est en effet possible d'utiliser leur API, avec une clef d'API, pour télécharger la dernière version de la base de données. [La documentation est ici.](https://dev.maxmind.com/geoip/updating-databases?lang=en#directly-downloading-databases)

Peut-être faudrait-il stocker aussi quelque part la dernière date de mise à jour, afin de ne pas retélécharger le fichier à chaque fois, sauf si ce n'est pas un souci pour vous — et éventuellement prendre soin de ne pas le télécharger si exécuté en mode CI ?
Le fichier étant lourd, peut-être serait-il également pertinent de songer à nettoyer l'historique du dépôt de ce fichier ? En fonction des conséquences que ça aurait, bien sûr (à éviter si ça peut avoir des conséquences louches, mais si ça permet de réduire le clone du dépôt de quelques centaines de Mio, ça peut valoir le coup).
Autre solution que l'on peut considérer (à voir son coût et sa praticité, cependant) : utiliser GitLFS. Mais sachant que l'offre gratuite de GitHub est d'un Gio de stockage et d'autant de bande passante, ça me semble étroit (surtout la bande passante).

Resolving patch:
diff --git a/zds/member/models.py b/zds/member/models.py
--- a/zds/member/models.py
+++ b/zds/member/models.py
@@ -1,10 +1,11 @@
+import logging
 from datetime import datetime
 from geoip2.errors import AddressNotFoundError
 from hashlib import md5
 
 from django.conf import settings
 from django.contrib.auth.models import User
-from django.contrib.gis.geoip2 import GeoIP2
+from django.contrib.gis.geoip2 import GeoIP2, GeoIP2Exception
 from django.urls import reverse
 from django.db import models
 from django.dispatch import receiver
@@ -101,14 +102,21 @@ def get_city(self):
         try:
             geo = GeoIP2().city(self.last_ip_address)
         except AddressNotFoundError:
-            self._cached_city = (self.last_ip_address, "")
-            return ""
-
-        city = geo["city"]
-        country = geo["country_name"]
-        geo_location = ", ".join(i for i in [city, country] if i)
+            geo_location = ""
+        except GeoIP2Exception as e:
+            geo_location = ""
+            logging.getLogger(__name__).warning(
+                f"GeoIP2 failed with the following message: '{e}'. "
+                "The Geolite2 database might not be installed or configured correctly. "
+                "Check the documentation for guidance on how to install it properly."
+            )
+        else:
+            city = geo["city"]
+            country = geo["country_name"]
+            geo_location = ", ".join(i for i in [city, country] if i)
 
         self._cached_city = (self.last_ip_address, geo_location)
+
         return geo_location
 
     def get_avatar_url(self, size=80):


Test patch: