diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index ca29fd10a5..0dec88e90c 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -45,7 +45,6 @@ import pycountry from django import forms from django.conf import settings from django.contrib import messages -from django.contrib.gis.geoip2 import GeoIP2 from django.core.exceptions import ValidationError from django.core.files.uploadedfile import SimpleUploadedFile from django.core.validators import ( @@ -102,6 +101,7 @@ from pretix.helpers.countries import ( from pretix.helpers.escapejson import escapejson_attr from pretix.helpers.http import get_client_ip from pretix.helpers.i18n import get_format_without_seconds +from pretix.helpers.security import get_geoip from pretix.presale.signals import question_form_fields logger = logging.getLogger(__name__) @@ -393,7 +393,7 @@ class WrappedPhoneNumberPrefixWidget(PhoneNumberPrefixWidget): def guess_country_from_request(request, event): if settings.HAS_GEOIP: - g = GeoIP2() + g = get_geoip() try: res = g.country(get_client_ip(request)) if res['country_code'] and len(res['country_code']) == 2: diff --git a/src/pretix/helpers/security.py b/src/pretix/helpers/security.py index 6a67bbc69b..d09fbe0f3d 100644 --- a/src/pretix/helpers/security.py +++ b/src/pretix/helpers/security.py @@ -25,7 +25,7 @@ import time from django.conf import settings from django.contrib.auth import login as auth_login -from django.contrib.gis.geoip2 import GeoIP2 +from django.contrib.gis import geoip2 from django.core.cache import cache from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ @@ -63,14 +63,20 @@ def get_user_agent_hash(request): _geoip = None -def _get_country(request): +def get_geoip() -> geoip2.GeoIP2: + # See https://code.djangoproject.com/ticket/36988#ticket global _geoip - if not _geoip: - _geoip = GeoIP2() + geoip2.SUPPORTED_DATABASE_TYPES.add("Geoacumen-Country") + if not _geoip: + _geoip = geoip2.GeoIP2() + return _geoip + + +def _get_country(request): try: - res = _geoip.country(get_client_ip(request)) + res = get_geoip().country(get_client_ip(request)) except AddressNotFoundError: return None return res['country_code']