From 10681467a49678e36a380fee2cb10f9515e17645 Mon Sep 17 00:00:00 2001 From: Javier Paniagua Date: Fri, 8 Sep 2023 21:42:16 +0200 Subject: [PATCH] make phonenumbers and django-phonenumber-field optional --- setup.py | 11 +++++--- .../migrations/0003_auto_20150817_1733.py | 27 ++++++++++++------- .../migrations/0004_auto_20160205_1827.py | 22 ++++++++------- two_factor/views/core.py | 10 +++++-- two_factor/views/profile.py | 10 +++---- 5 files changed, 51 insertions(+), 29 deletions(-) diff --git a/setup.py b/setup.py index 0c6b66581..639f6906d 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,6 @@ 'Django>=3.2', 'django_otp>=0.8.0', 'qrcode>=4.0.0,<7.99', - 'django-phonenumber-field<8', 'django-formtools', ], extras_require={ @@ -23,8 +22,14 @@ 'sms': ['twilio>=6.0'], 'webauthn': ['webauthn>=2.0,<2.99'], 'yubikey': ['django-otp-yubikey'], - 'phonenumbers': ['phonenumbers>=7.0.9,<8.99'], - 'phonenumberslite': ['phonenumberslite>=7.0.9,<8.99'], + 'phonenumbers': [ + 'phonenumbers>=7.0.9,<8.99', + 'django-phonenumber-field<8', + ], + 'phonenumberslite': [ + 'phonenumberslite>=7.0.9,<8.99', + 'django-phonenumber-field<8', + ], # used internally for local development & CI 'tests': [ 'coverage', diff --git a/two_factor/migrations/0003_auto_20150817_1733.py b/two_factor/migrations/0003_auto_20150817_1733.py index da25c0c3d..9bb9b6dac 100644 --- a/two_factor/migrations/0003_auto_20150817_1733.py +++ b/two_factor/migrations/0003_auto_20150817_1733.py @@ -1,13 +1,14 @@ import logging -import phonenumbers +from django.apps import apps from django.db import migrations -from phonenumber_field.modelfields import PhoneNumberField logger = logging.getLogger(__name__) def migrate_phone_numbers(apps, schema_editor): + import phonenumbers + PhoneDevice = apps.get_model("two_factor", "PhoneDevice") for device in PhoneDevice.objects.all(): try: @@ -29,11 +30,17 @@ class Migration(migrations.Migration): ('two_factor', '0002_auto_20150110_0810'), ] - operations = [ - migrations.RunPython(migrate_phone_numbers, reverse_code=migrations.RunPython.noop), - migrations.AlterField( - model_name='phonedevice', - name='number', - field=PhoneNumberField(max_length=16, verbose_name='number'), - ), - ] + if apps.is_installed('two_factor.plugins.phonenumber'): + from phonenumber_field.modelfields import PhoneNumberField + + operations = [ + migrations.RunPython(migrate_phone_numbers, reverse_code=migrations.RunPython.noop), + migrations.AlterField( + model_name='phonedevice', + name='number', + field=PhoneNumberField(max_length=16, verbose_name='number'), + ), + ] + + else: + operations = [] diff --git a/two_factor/migrations/0004_auto_20160205_1827.py b/two_factor/migrations/0004_auto_20160205_1827.py index 80c439e43..2d603429f 100644 --- a/two_factor/migrations/0004_auto_20160205_1827.py +++ b/two_factor/migrations/0004_auto_20160205_1827.py @@ -1,6 +1,5 @@ # Generated by Django 1.9.2 on 2016-02-05 17:27 - -import phonenumber_field.modelfields +from django.apps import apps from django.db import migrations @@ -10,10 +9,15 @@ class Migration(migrations.Migration): ('two_factor', '0003_auto_20150817_1733'), ] - operations = [ - migrations.AlterField( - model_name='phonedevice', - name='number', - field=phonenumber_field.modelfields.PhoneNumberField(max_length=128), - ), - ] + if apps.is_installed('two_factor.plugins.phonenumber'): + import phonenumber_field.modelfields + + operations = [ + migrations.AlterField( + model_name='phonedevice', + name='number', + field=phonenumber_field.modelfields.PhoneNumberField(max_length=128), + ), + ] + else: + operations = [] diff --git a/two_factor/views/core.py b/two_factor/views/core.py index d37ea19f4..4fa3f9dcd 100644 --- a/two_factor/views/core.py +++ b/two_factor/views/core.py @@ -9,6 +9,7 @@ import django_otp import qrcode import qrcode.image.svg +from django.apps import apps from django.conf import settings from django.contrib.auth import REDIRECT_FIELD_NAME, login from django.contrib.auth.decorators import login_required @@ -35,7 +36,6 @@ from django_otp.util import random_hex from two_factor import signals -from two_factor.plugins.phonenumber.utils import get_available_phone_methods from two_factor.plugins.registry import registry from two_factor.utils import totp_digits from two_factor.views.mixins import OTPRequiredMixin @@ -685,8 +685,14 @@ def get(self, request, *args, **kwargs): return super().get(request, *args, **kwargs) def get_context_data(self): + phone_methods = None + if (apps.is_installed('two_factor.plugins.phonenumber')): + from two_factor.plugins.phonenumber.utils import get_available_phone_methods + + phone_methods = get_available_phone_methods() + return { - 'phone_methods': get_available_phone_methods(), + 'phone_methods': phone_methods, } diff --git a/two_factor/views/profile.py b/two_factor/views/profile.py index 1cd5cba8f..fb4c45d5e 100644 --- a/two_factor/views/profile.py +++ b/two_factor/views/profile.py @@ -1,4 +1,4 @@ -from django.apps.registry import apps +from django.apps import apps from django.conf import settings from django.contrib.auth.decorators import login_required from django.shortcuts import redirect, resolve_url @@ -8,10 +8,6 @@ from django_otp import devices_for_user from django_otp.decorators import otp_required -from two_factor.plugins.phonenumber.utils import ( - backup_phones, get_available_phone_methods, -) - from ..forms import DisableForm from ..utils import default_device from .utils import class_view_decorator @@ -43,6 +39,10 @@ def get_context_data(self, **kwargs): } if (apps.is_installed('two_factor.plugins.phonenumber')): + from two_factor.plugins.phonenumber.utils import ( + backup_phones, get_available_phone_methods, + ) + context.update({ 'backup_phones': backup_phones(self.request.user), 'available_phone_methods': get_available_phone_methods(),