mirror of https://github.com/django/django.git
Fixed #30461 -- Made GeoIP2 and GEOIP_PATH setting accept pathlib.Path as library path.
Thanks Nikita Krokosh for the initial patch.
This commit is contained in:
parent
88c0b907e7
commit
eed2e740f7
|
@ -1,11 +1,11 @@
|
|||
import socket
|
||||
from pathlib import Path
|
||||
|
||||
import geoip2.database
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.validators import validate_ipv46_address
|
||||
from django.utils._os import to_path
|
||||
|
||||
from .resources import City, Country
|
||||
|
||||
|
@ -76,10 +76,8 @@ class GeoIP2:
|
|||
path = path or GEOIP_SETTINGS['GEOIP_PATH']
|
||||
if not path:
|
||||
raise GeoIP2Exception('GeoIP path must be provided via parameter or the GEOIP_PATH setting.')
|
||||
if not isinstance(path, str):
|
||||
raise TypeError('Invalid path type: %s' % type(path).__name__)
|
||||
|
||||
path = Path(path)
|
||||
path = to_path(path)
|
||||
if path.is_dir():
|
||||
# Constructing the GeoIP database filenames using the settings
|
||||
# dictionary. If the database files for the GeoLite country
|
||||
|
|
|
@ -86,6 +86,10 @@ Keyword Arguments Description
|
|||
the :setting:`GEOIP_CITY` setting.
|
||||
=================== =======================================================
|
||||
|
||||
.. versionchanged:: 3.0
|
||||
|
||||
Support for :class:`pathlib.Path` ``path`` was added.
|
||||
|
||||
Methods
|
||||
=======
|
||||
|
||||
|
@ -151,10 +155,14 @@ Settings
|
|||
``GEOIP_PATH``
|
||||
--------------
|
||||
|
||||
A string specifying the directory where the GeoIP data files are
|
||||
located. This setting is *required* unless manually specified
|
||||
A string or :class:`pathlib.Path` specifying the directory where the GeoIP data
|
||||
files are located. This setting is *required* unless manually specified
|
||||
with ``path`` keyword when initializing the :class:`GeoIP2` object.
|
||||
|
||||
.. versionchanged:: 3.0
|
||||
|
||||
Support for :class:`pathlib.Path` was added.
|
||||
|
||||
.. setting:: GEOIP_COUNTRY
|
||||
|
||||
``GEOIP_COUNTRY``
|
||||
|
|
|
@ -133,6 +133,11 @@ Minor features
|
|||
* Added support for the ``furlong`` unit in
|
||||
:class:`~django.contrib.gis.measure.Distance`.
|
||||
|
||||
* The :setting:`GEOIP_PATH` setting now supports :class:`pathlib.Path`.
|
||||
|
||||
* The :class:`~django.contrib.gis.geoip2.GeoIP2` class now accepts
|
||||
:class:`pathlib.Path` ``path``.
|
||||
|
||||
:mod:`django.contrib.messages`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import os
|
||||
import pathlib
|
||||
from unittest import mock, skipUnless
|
||||
|
||||
from django.conf import settings
|
||||
|
@ -28,8 +29,13 @@ class GeoIPTest(SimpleTestCase):
|
|||
path = settings.GEOIP_PATH
|
||||
g2 = GeoIP2(path, 0) # Passing in data path explicitly.
|
||||
g3 = GeoIP2.open(path, 0) # MaxMind Python API syntax.
|
||||
# path accepts str and pathlib.Path.
|
||||
if isinstance(path, str):
|
||||
g4 = GeoIP2(pathlib.Path(path))
|
||||
else:
|
||||
g4 = GeoIP2(str(path))
|
||||
|
||||
for g in (g1, g2, g3):
|
||||
for g in (g1, g2, g3, g4):
|
||||
self.assertTrue(g._country)
|
||||
self.assertTrue(g._city)
|
||||
|
||||
|
|
Loading…
Reference in New Issue