From 4edffcaa9f822fb2862d3e991f4144728bda12f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89loi=20Rivard?= Date: Fri, 15 Mar 2024 19:58:06 +0100 Subject: [PATCH] chore: use isort instead of reoder-python-imports --- .pre-commit-config.yaml | 11 ++++--- canaille/__init__.py | 5 ++- canaille/app/commands.py | 5 +-- canaille/app/configuration.py | 3 +- canaille/app/flask.py | 7 ++-- canaille/app/forms.py | 11 ++++--- canaille/app/i18n.py | 3 +- canaille/app/mails.py | 5 +-- canaille/backends/ldap/backend.py | 6 ++-- canaille/backends/ldap/ldapobject.py | 1 + canaille/backends/ldap/models.py | 5 +-- canaille/backends/memory/models.py | 3 +- canaille/backends/sql/backend.py | 4 +-- canaille/backends/sql/models.py | 15 +++++---- canaille/commands.py | 5 +-- canaille/core/commands.py | 3 +- canaille/core/endpoints/account.py | 32 +++++++++---------- canaille/core/endpoints/admin.py | 16 +++++----- canaille/core/endpoints/auth.py | 17 +++++----- canaille/core/endpoints/forms.py | 12 +++---- canaille/core/endpoints/groups.py | 13 ++++---- canaille/core/mails.py | 5 +-- canaille/core/populate.py | 3 +- canaille/oidc/commands.py | 3 +- canaille/oidc/endpoints/authorizations.py | 8 ++--- canaille/oidc/endpoints/clients.py | 16 +++++----- canaille/oidc/endpoints/consents.py | 10 +++--- canaille/oidc/endpoints/forms.py | 3 +- canaille/oidc/endpoints/oauth.py | 24 +++++++------- canaille/oidc/endpoints/tokens.py | 9 +++--- canaille/oidc/endpoints/well_known.py | 1 - canaille/oidc/models.py | 1 + canaille/oidc/oauth.py | 2 +- demo/client/__init__.py | 3 +- demo/demoapp.py | 1 - pyproject.toml | 2 +- tests/app/test_configuration.py | 3 +- tests/app/test_flaskutils.py | 3 +- tests/app/test_forms.py | 5 +-- tests/app/test_mails.py | 3 +- tests/backends/ldap/fixtures.py | 1 + tests/backends/ldap/test_errors.py | 3 +- tests/backends/ldap/test_install.py | 3 +- tests/backends/ldap/test_utils.py | 3 +- tests/backends/memory/fixtures.py | 1 + tests/backends/sql/fixtures.py | 1 + tests/backends/test_backends.py | 1 + tests/backends/test_models.py | 1 + tests/conftest.py | 7 ++-- tests/core/test_account.py | 3 +- tests/core/test_email_confirmation.py | 3 +- tests/core/test_invitation.py | 3 +- tests/core/test_models.py | 1 + tests/core/test_profile_edition.py | 3 +- tests/core/test_profile_photo.py | 3 +- tests/core/test_profile_settings.py | 3 +- tests/core/test_registration.py | 3 +- tests/oidc/commands/test_clean.py | 3 +- tests/oidc/conftest.py | 3 +- tests/oidc/test_authorization_code_flow.py | 5 +-- tests/oidc/test_authorization_prompt.py | 4 ++- tests/oidc/test_client_admin.py | 3 +- tests/oidc/test_code_admin.py | 3 +- tests/oidc/test_configuration.py | 1 + .../oidc/test_dynamic_client_registration.py | 1 + tests/oidc/test_end_session.py | 1 + tests/oidc/test_hybrid_flow.py | 1 + tests/oidc/test_implicit_flow.py | 1 + tests/oidc/test_token_admin.py | 3 +- tests/oidc/test_userinfo.py | 2 +- 70 files changed, 207 insertions(+), 154 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 14558603..405986a4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ --- repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.3.1' + rev: 'v0.3.3' hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] @@ -15,11 +15,12 @@ repos: - id: end-of-file-fixer exclude: "\\.svg$|\\.map$|\\.min\\.css$|\\.min\\.js$|\\.po$|\\.pot$" - id: check-toml - - repo: https://github.com/asottile/reorder_python_imports - rev: v3.12.0 + - repo: https://github.com/pycqa/isort + rev: "5.13.2" hooks: - - id: reorder-python-imports - args: ["--application-directories", "canaille"] + - id: isort + name: isort (python) + args: ["--force-single-line-imports", "--profile", "black"] - repo: https://github.com/PyCQA/docformatter rev: v1.7.5 hooks: diff --git a/canaille/__init__.py b/canaille/__init__.py index 132e4744..4a6c4619 100644 --- a/canaille/__init__.py +++ b/canaille/__init__.py @@ -6,7 +6,6 @@ from flask import request from flask import session from flask_wtf.csrf import CSRFProtect - csrf = CSRFProtect() @@ -107,16 +106,16 @@ def setup_flask(app): def setup_flask_converters(app): - from canaille.app.flask import model_converter from canaille.app import models + from canaille.app.flask import model_converter for model_name, model_class in models.MODELS.items(): app.url_map.converters[model_name.lower()] = model_converter(model_class) def create_app(config=None, validate=True, backend=None): - from .app.i18n import setup_i18n from .app.configuration import setup_config + from .app.i18n import setup_i18n from .app.themes import setup_themer from .backends import setup_backend diff --git a/canaille/app/commands.py b/canaille/app/commands.py index f5a816ae..a49f8b96 100644 --- a/canaille/app/commands.py +++ b/canaille/app/commands.py @@ -2,10 +2,11 @@ import functools import sys import click -from canaille.backends import BaseBackend from flask import current_app from flask.cli import with_appcontext +from canaille.backends import BaseBackend + def with_backendcontext(func): @functools.wraps(func) @@ -41,8 +42,8 @@ def check(): @with_appcontext def install(): """Installs canaille elements from the configuration.""" - from canaille.app.installation import install from canaille.app.configuration import ConfigurationException + from canaille.app.installation import install try: install(current_app.config) diff --git a/canaille/app/configuration.py b/canaille/app/configuration.py index fa6b8eda..a30bb7fc 100644 --- a/canaille/app/configuration.py +++ b/canaille/app/configuration.py @@ -3,9 +3,10 @@ import smtplib import socket from collections.abc import Mapping +from flask import current_app + from canaille.app.mails import DEFAULT_SMTP_HOST from canaille.app.mails import DEFAULT_SMTP_PORT -from flask import current_app ROOT = os.path.dirname(os.path.abspath(__file__)) diff --git a/canaille/app/flask.py b/canaille/app/flask.py index 44f3ff88..2a8d0530 100644 --- a/canaille/app/flask.py +++ b/canaille/app/flask.py @@ -3,9 +3,6 @@ from functools import wraps from urllib.parse import urlsplit from urllib.parse import urlunsplit -from canaille.app import models -from canaille.app.i18n import gettext as _ -from canaille.app.themes import render_template from flask import abort from flask import current_app from flask import g @@ -13,6 +10,10 @@ from flask import request from flask import session from werkzeug.routing import BaseConverter +from canaille.app import models +from canaille.app.i18n import gettext as _ +from canaille.app.themes import render_template + def current_user(): if "user" in g: diff --git a/canaille/app/forms.py b/canaille/app/forms.py index 36588deb..80ca0652 100644 --- a/canaille/app/forms.py +++ b/canaille/app/forms.py @@ -3,11 +3,6 @@ import math import re import wtforms.validators -from canaille.app import models -from canaille.app.i18n import DEFAULT_LANGUAGE_CODE -from canaille.app.i18n import gettext as _ -from canaille.app.i18n import locale_selector -from canaille.app.i18n import timezone_selector from flask import abort from flask import current_app from flask import make_response @@ -15,6 +10,12 @@ from flask import request from flask_wtf import FlaskForm from wtforms.meta import DefaultMeta +from canaille.app import models +from canaille.app.i18n import DEFAULT_LANGUAGE_CODE +from canaille.app.i18n import gettext as _ +from canaille.app.i18n import locale_selector +from canaille.app.i18n import timezone_selector + from . import validate_uri from .flask import request_is_htmx diff --git a/canaille/app/i18n.py b/canaille/app/i18n.py index 7c1ba0d7..e9bd9569 100644 --- a/canaille/app/i18n.py +++ b/canaille/app/i18n.py @@ -74,8 +74,9 @@ def timezone_selector(): def native_language_name_from_code(code): try: - import pycountry from gettext import translation + + import pycountry except ImportError: return code diff --git a/canaille/app/mails.py b/canaille/app/mails.py index 9563f6dd..9bf6a18a 100644 --- a/canaille/app/mails.py +++ b/canaille/app/mails.py @@ -4,11 +4,12 @@ import smtplib import urllib.request from email.utils import make_msgid -from canaille.app import get_current_domain -from canaille.app import get_current_mail_domain from flask import current_app from flask import request +from canaille.app import get_current_domain +from canaille.app import get_current_mail_domain + DEFAULT_SMTP_HOST = "localhost" DEFAULT_SMTP_PORT = 25 DEFAULT_SMTP_TLS = False diff --git a/canaille/backends/ldap/backend.py b/canaille/backends/ldap/backend.py index ea840172..23bbb3ed 100644 --- a/canaille/backends/ldap/backend.py +++ b/canaille/backends/ldap/backend.py @@ -5,11 +5,12 @@ from contextlib import contextmanager import ldap.modlist import ldif +from flask import current_app + from canaille.app import models from canaille.app.configuration import ConfigurationException from canaille.app.i18n import gettext as _ from canaille.backends import BaseBackend -from flask import current_app from .utils import listify @@ -188,9 +189,10 @@ class Backend(BaseBackend): def setup_ldap_models(config): - from .ldapobject import LDAPObject from canaille.app import models + from .ldapobject import LDAPObject + LDAPObject.root_dn = config["BACKENDS"]["LDAP"]["ROOT_DN"] user_base = config["BACKENDS"]["LDAP"]["USER_BASE"].replace( diff --git a/canaille/backends/ldap/ldapobject.py b/canaille/backends/ldap/ldapobject.py index caa25374..ce3b8941 100644 --- a/canaille/backends/ldap/ldapobject.py +++ b/canaille/backends/ldap/ldapobject.py @@ -3,6 +3,7 @@ from collections.abc import Iterable import ldap.dn import ldap.filter + from canaille.backends.models import Model from .backend import Backend diff --git a/canaille/backends/ldap/models.py b/canaille/backends/ldap/models.py index f05e732c..fc1f1264 100644 --- a/canaille/backends/ldap/models.py +++ b/canaille/backends/ldap/models.py @@ -1,11 +1,12 @@ -import canaille.core.models -import canaille.oidc.models import ldap.filter from flask import current_app from ldap.controls import DecodeControlTuples from ldap.controls.ppolicy import PasswordPolicyControl from ldap.controls.ppolicy import PasswordPolicyError +import canaille.core.models +import canaille.oidc.models + from .backend import Backend from .ldapobject import LDAPObject diff --git a/canaille/backends/memory/models.py b/canaille/backends/memory/models.py index 6eb409cb..9489d0d0 100644 --- a/canaille/backends/memory/models.py +++ b/canaille/backends/memory/models.py @@ -2,11 +2,12 @@ import copy import datetime import uuid +from flask import current_app + import canaille.core.models import canaille.oidc.models from canaille.app import models from canaille.backends.models import Model -from flask import current_app def listify(value): diff --git a/canaille/backends/sql/backend.py b/canaille/backends/sql/backend.py index 23b4d5f4..69da9477 100644 --- a/canaille/backends/sql/backend.py +++ b/canaille/backends/sql/backend.py @@ -1,8 +1,8 @@ -from canaille.backends import BaseBackend from sqlalchemy import create_engine -from sqlalchemy.orm import declarative_base from sqlalchemy.orm import Session +from sqlalchemy.orm import declarative_base +from canaille.backends import BaseBackend Base = declarative_base() diff --git a/canaille/backends/sql/models.py b/canaille/backends/sql/models.py index 7016df43..bd29fd4e 100644 --- a/canaille/backends/sql/models.py +++ b/canaille/backends/sql/models.py @@ -2,27 +2,28 @@ import datetime import uuid from typing import List -import canaille.core.models -import canaille.oidc.models -from canaille.app import models -from canaille.backends.models import Model from flask import current_app from sqlalchemy import Boolean from sqlalchemy import Column from sqlalchemy import ForeignKey from sqlalchemy import Integer from sqlalchemy import LargeBinary -from sqlalchemy import or_ -from sqlalchemy import select from sqlalchemy import String from sqlalchemy import Table +from sqlalchemy import or_ +from sqlalchemy import select from sqlalchemy.orm import Mapped from sqlalchemy.orm import mapped_column from sqlalchemy.orm import reconstructor from sqlalchemy.orm import relationship from sqlalchemy_json import MutableJson -from sqlalchemy_utils import force_auto_coercion from sqlalchemy_utils import PasswordType +from sqlalchemy_utils import force_auto_coercion + +import canaille.core.models +import canaille.oidc.models +from canaille.app import models +from canaille.backends.models import Model from .backend import Backend from .backend import Base diff --git a/canaille/commands.py b/canaille/commands.py index c7aeff5f..a7324a42 100644 --- a/canaille/commands.py +++ b/canaille/commands.py @@ -1,9 +1,10 @@ +import click +from flask.cli import FlaskGroup + import canaille.app.commands import canaille.core.commands import canaille.oidc.commands -import click from canaille import create_app -from flask.cli import FlaskGroup @click.group(cls=FlaskGroup, create_app=create_app) diff --git a/canaille/core/commands.py b/canaille/core/commands.py index 0ea771cc..bf743461 100644 --- a/canaille/core/commands.py +++ b/canaille/core/commands.py @@ -1,7 +1,8 @@ import click -from canaille.app.commands import with_backendcontext from flask.cli import with_appcontext +from canaille.app.commands import with_backendcontext + try: HAS_FAKER = True except ImportError: diff --git a/canaille/core/endpoints/account.py b/canaille/core/endpoints/account.py index afa6de24..5e61b8d9 100644 --- a/canaille/core/endpoints/account.py +++ b/canaille/core/endpoints/account.py @@ -7,6 +7,19 @@ from importlib import metadata from typing import List import wtforms +from flask import Blueprint +from flask import abort +from flask import current_app +from flask import flash +from flask import g +from flask import redirect +from flask import request +from flask import send_file +from flask import session +from flask import url_for +from werkzeug.datastructures import CombinedMultiDict +from werkzeug.datastructures import FileStorage + from canaille.app import b64_to_obj from canaille.app import build_hash from canaille.app import default_fields @@ -21,38 +34,25 @@ from canaille.app.flask import request_is_htmx from canaille.app.flask import smtp_needed from canaille.app.flask import user_needed from canaille.app.forms import IDToModel +from canaille.app.forms import TableForm from canaille.app.forms import is_readonly from canaille.app.forms import set_readonly from canaille.app.forms import set_writable -from canaille.app.forms import TableForm from canaille.app.i18n import gettext as _ from canaille.app.i18n import reload_translations from canaille.app.themes import render_template from canaille.backends import BaseBackend -from flask import abort -from flask import Blueprint -from flask import current_app -from flask import flash -from flask import g -from flask import redirect -from flask import request -from flask import send_file -from flask import session -from flask import url_for -from werkzeug.datastructures import CombinedMultiDict -from werkzeug.datastructures import FileStorage from ..mails import send_confirmation_email from ..mails import send_invitation_mail from ..mails import send_password_initialization_mail from ..mails import send_password_reset_mail from ..mails import send_registration_mail -from .forms import build_profile_form +from .forms import MINIMUM_PASSWORD_LENGTH from .forms import EmailConfirmationForm from .forms import InvitationForm from .forms import JoinForm -from .forms import MINIMUM_PASSWORD_LENGTH - +from .forms import build_profile_form bp = Blueprint("account", __name__) diff --git a/canaille/core/endpoints/admin.py b/canaille/core/endpoints/admin.py index d3ee4397..851532d9 100644 --- a/canaille/core/endpoints/admin.py +++ b/canaille/core/endpoints/admin.py @@ -1,11 +1,3 @@ -from canaille.app import obj_to_b64 -from canaille.app.flask import permissions_needed -from canaille.app.forms import email_validator -from canaille.app.forms import Form -from canaille.app.i18n import gettext as _ -from canaille.app.themes import render_template -from canaille.core.mails import build_hash -from canaille.core.mails import send_test_mail from flask import Blueprint from flask import current_app from flask import flash @@ -14,6 +6,14 @@ from flask import url_for from wtforms import StringField from wtforms.validators import DataRequired +from canaille.app import obj_to_b64 +from canaille.app.flask import permissions_needed +from canaille.app.forms import Form +from canaille.app.forms import email_validator +from canaille.app.i18n import gettext as _ +from canaille.app.themes import render_template +from canaille.core.mails import build_hash +from canaille.core.mails import send_test_mail bp = Blueprint("admin", __name__, url_prefix="/admin") diff --git a/canaille/core/endpoints/auth.py b/canaille/core/endpoints/auth.py index 68349745..b1f5bff5 100644 --- a/canaille/core/endpoints/auth.py +++ b/canaille/core/endpoints/auth.py @@ -1,3 +1,12 @@ +from flask import Blueprint +from flask import abort +from flask import current_app +from flask import flash +from flask import redirect +from flask import request +from flask import session +from flask import url_for + from canaille.app import build_hash from canaille.app import models from canaille.app.flask import current_user @@ -7,14 +16,6 @@ from canaille.app.flask import smtp_needed from canaille.app.i18n import gettext as _ from canaille.app.themes import render_template from canaille.backends import BaseBackend -from flask import abort -from flask import Blueprint -from flask import current_app -from flask import flash -from flask import redirect -from flask import request -from flask import session -from flask import url_for from ..mails import send_password_initialization_mail from ..mails import send_password_reset_mail diff --git a/canaille/core/endpoints/forms.py b/canaille/core/endpoints/forms.py index 1cb38ac8..d6c9005f 100644 --- a/canaille/core/endpoints/forms.py +++ b/canaille/core/endpoints/forms.py @@ -1,22 +1,22 @@ import wtforms.form import wtforms.validators +from flask import current_app +from flask import g +from flask_wtf.file import FileAllowed +from flask_wtf.file import FileField + from canaille.app import models from canaille.app.forms import BaseForm from canaille.app.forms import DateTimeUTCField -from canaille.app.forms import email_validator from canaille.app.forms import Form from canaille.app.forms import IDToModel +from canaille.app.forms import email_validator from canaille.app.forms import is_uri from canaille.app.forms import phone_number from canaille.app.forms import set_readonly from canaille.app.forms import unique_values from canaille.app.i18n import lazy_gettext as _ from canaille.app.i18n import native_language_name_from_code -from flask import current_app -from flask import g -from flask_wtf.file import FileAllowed -from flask_wtf.file import FileField - MINIMUM_PASSWORD_LENGTH = 8 diff --git a/canaille/core/endpoints/groups.py b/canaille/core/endpoints/groups.py index b05b15e1..5ee30b25 100644 --- a/canaille/core/endpoints/groups.py +++ b/canaille/core/endpoints/groups.py @@ -1,15 +1,16 @@ +from flask import Blueprint +from flask import abort +from flask import flash +from flask import redirect +from flask import request +from flask import url_for + from canaille.app import models from canaille.app.flask import permissions_needed from canaille.app.flask import render_htmx_template from canaille.app.forms import TableForm from canaille.app.i18n import gettext as _ from canaille.app.themes import render_template -from flask import abort -from flask import Blueprint -from flask import flash -from flask import redirect -from flask import request -from flask import url_for from .forms import CreateGroupForm from .forms import EditGroupForm diff --git a/canaille/core/mails.py b/canaille/core/mails.py index 4b67c112..6331fe5b 100644 --- a/canaille/core/mails.py +++ b/canaille/core/mails.py @@ -1,10 +1,11 @@ +from flask import current_app +from flask import url_for + from canaille.app import build_hash from canaille.app.i18n import gettext as _ from canaille.app.mails import logo from canaille.app.mails import send_email from canaille.app.themes import render_template -from flask import current_app -from flask import url_for def send_test_mail(email): diff --git a/canaille/core/populate.py b/canaille/core/populate.py index 665c6dff..fecfbddc 100644 --- a/canaille/core/populate.py +++ b/canaille/core/populate.py @@ -1,9 +1,10 @@ import random import faker +from faker.config import AVAILABLE_LOCALES + from canaille.app import models from canaille.app.i18n import available_language_codes -from faker.config import AVAILABLE_LOCALES def faker_generator(locales=None): diff --git a/canaille/oidc/commands.py b/canaille/oidc/commands.py index b6beca3b..b8285572 100644 --- a/canaille/oidc/commands.py +++ b/canaille/oidc/commands.py @@ -1,7 +1,8 @@ import click +from flask.cli import with_appcontext + from canaille.app import models from canaille.app.commands import with_backendcontext -from flask.cli import with_appcontext @click.command() diff --git a/canaille/oidc/endpoints/authorizations.py b/canaille/oidc/endpoints/authorizations.py index 50e68791..a227168b 100644 --- a/canaille/oidc/endpoints/authorizations.py +++ b/canaille/oidc/endpoints/authorizations.py @@ -1,12 +1,12 @@ +from flask import Blueprint +from flask import abort +from flask import request + from canaille.app import models from canaille.app.flask import permissions_needed from canaille.app.flask import render_htmx_template from canaille.app.forms import TableForm from canaille.app.themes import render_template -from flask import abort -from flask import Blueprint -from flask import request - bp = Blueprint("authorizations", __name__, url_prefix="/admin/authorization") diff --git a/canaille/oidc/endpoints/clients.py b/canaille/oidc/endpoints/clients.py index 9c9f4dd5..1836fc0a 100644 --- a/canaille/oidc/endpoints/clients.py +++ b/canaille/oidc/endpoints/clients.py @@ -1,22 +1,22 @@ import datetime +from flask import Blueprint +from flask import abort +from flask import flash +from flask import redirect +from flask import request +from flask import url_for +from werkzeug.security import gen_salt + from canaille.app import models from canaille.app.flask import permissions_needed from canaille.app.flask import render_htmx_template from canaille.app.forms import TableForm from canaille.app.i18n import gettext as _ from canaille.app.themes import render_template -from flask import abort -from flask import Blueprint -from flask import flash -from flask import redirect -from flask import request -from flask import url_for -from werkzeug.security import gen_salt from .forms import ClientAddForm - bp = Blueprint("clients", __name__, url_prefix="/admin/client") diff --git a/canaille/oidc/endpoints/consents.py b/canaille/oidc/endpoints/consents.py index b8112b36..1bf2db3b 100644 --- a/canaille/oidc/endpoints/consents.py +++ b/canaille/oidc/endpoints/consents.py @@ -1,17 +1,17 @@ import datetime import uuid -from canaille.app import models -from canaille.app.flask import user_needed -from canaille.app.i18n import gettext as _ -from canaille.app.themes import render_template from flask import Blueprint from flask import flash from flask import redirect from flask import url_for -from ..utils import SCOPE_DETAILS +from canaille.app import models +from canaille.app.flask import user_needed +from canaille.app.i18n import gettext as _ +from canaille.app.themes import render_template +from ..utils import SCOPE_DETAILS bp = Blueprint("consents", __name__, url_prefix="/consent") diff --git a/canaille/oidc/endpoints/forms.py b/canaille/oidc/endpoints/forms.py index a377f491..4de65a36 100644 --- a/canaille/oidc/endpoints/forms.py +++ b/canaille/oidc/endpoints/forms.py @@ -1,8 +1,9 @@ import wtforms + from canaille.app import models -from canaille.app.forms import email_validator from canaille.app.forms import Form from canaille.app.forms import IDToModel +from canaille.app.forms import email_validator from canaille.app.forms import is_uri from canaille.app.forms import unique_values from canaille.app.i18n import lazy_gettext as _ diff --git a/canaille/oidc/endpoints/oauth.py b/canaille/oidc/endpoints/oauth.py index 363c073f..10d40057 100644 --- a/canaille/oidc/endpoints/oauth.py +++ b/canaille/oidc/endpoints/oauth.py @@ -5,15 +5,8 @@ from authlib.integrations.flask_oauth2 import current_token from authlib.jose import jwt from authlib.jose.errors import JoseError from authlib.oauth2 import OAuth2Error -from canaille import csrf -from canaille.app import models -from canaille.app.flask import current_user -from canaille.app.flask import logout_user -from canaille.app.flask import set_parameter_in_url_query -from canaille.app.i18n import gettext as _ -from canaille.app.themes import render_template -from flask import abort from flask import Blueprint +from flask import abort from flask import current_app from flask import flash from flask import jsonify @@ -23,21 +16,28 @@ from flask import session from flask import url_for from werkzeug.datastructures import CombinedMultiDict -from ..oauth import authorization +from canaille import csrf +from canaille.app import models +from canaille.app.flask import current_user +from canaille.app.flask import logout_user +from canaille.app.flask import set_parameter_in_url_query +from canaille.app.i18n import gettext as _ +from canaille.app.themes import render_template + from ..oauth import ClientConfigurationEndpoint from ..oauth import ClientRegistrationEndpoint +from ..oauth import IntrospectionEndpoint +from ..oauth import RevocationEndpoint +from ..oauth import authorization from ..oauth import generate_user_info from ..oauth import get_issuer from ..oauth import get_jwks -from ..oauth import IntrospectionEndpoint from ..oauth import require_oauth -from ..oauth import RevocationEndpoint from ..utils import SCOPE_DETAILS from .forms import AuthorizeForm from .forms import LogoutForm from .well_known import openid_configuration - bp = Blueprint("endpoints", __name__, url_prefix="/oauth") diff --git a/canaille/oidc/endpoints/tokens.py b/canaille/oidc/endpoints/tokens.py index 96fd9016..234a255d 100644 --- a/canaille/oidc/endpoints/tokens.py +++ b/canaille/oidc/endpoints/tokens.py @@ -1,15 +1,16 @@ import datetime +from flask import Blueprint +from flask import abort +from flask import flash +from flask import request + from canaille.app import models from canaille.app.flask import permissions_needed from canaille.app.flask import render_htmx_template from canaille.app.forms import TableForm from canaille.app.i18n import gettext as _ from canaille.app.themes import render_template -from flask import abort -from flask import Blueprint -from flask import flash -from flask import request from .forms import TokenRevokationForm diff --git a/canaille/oidc/endpoints/well_known.py b/canaille/oidc/endpoints/well_known.py index 88e548bc..5d8d153b 100644 --- a/canaille/oidc/endpoints/well_known.py +++ b/canaille/oidc/endpoints/well_known.py @@ -5,7 +5,6 @@ from flask import request from ..oauth import oauth_authorization_server from ..oauth import openid_configuration - bp = Blueprint("home", __name__, url_prefix="/.well-known") diff --git a/canaille/oidc/models.py b/canaille/oidc/models.py index 0a5304f9..790190d3 100644 --- a/canaille/oidc/models.py +++ b/canaille/oidc/models.py @@ -4,6 +4,7 @@ from authlib.oauth2.rfc6749 import AuthorizationCodeMixin from authlib.oauth2.rfc6749 import ClientMixin from authlib.oauth2.rfc6749 import TokenMixin from authlib.oauth2.rfc6749 import util + from canaille.app import models from .basemodels import AuthorizationCode as BaseAuthorizationCode diff --git a/canaille/oidc/oauth.py b/canaille/oidc/oauth.py index 7ffff424..66202e4a 100644 --- a/canaille/oidc/oauth.py +++ b/canaille/oidc/oauth.py @@ -27,13 +27,13 @@ from authlib.oidc.core.grants import OpenIDCode as _OpenIDCode from authlib.oidc.core.grants import OpenIDHybridGrant as _OpenIDHybridGrant from authlib.oidc.core.grants import OpenIDImplicitGrant as _OpenIDImplicitGrant from authlib.oidc.core.grants.util import generate_id_token -from canaille.app import models from flask import current_app from flask import g from flask import request from flask import url_for from werkzeug.security import gen_salt +from canaille.app import models DEFAULT_JWT_KTY = "RSA" DEFAULT_JWT_ALG = "RS256" diff --git a/demo/client/__init__.py b/demo/client/__init__.py index bd862b5f..bee28fb9 100644 --- a/demo/client/__init__.py +++ b/demo/client/__init__.py @@ -4,15 +4,14 @@ from urllib.parse import urlunsplit from authlib.common.errors import AuthlibBaseError from authlib.integrations.flask_client import OAuth from authlib.oidc.discovery import get_well_known_url +from flask import Flask from flask import current_app from flask import flash -from flask import Flask from flask import redirect from flask import render_template from flask import session from flask import url_for - oauth = OAuth() diff --git a/demo/demoapp.py b/demo/demoapp.py index d214cbb4..d5d95efa 100644 --- a/demo/demoapp.py +++ b/demo/demoapp.py @@ -2,7 +2,6 @@ import datetime import os import sys - if os.path.exists("../canaille"): sys.path.append("../canaille") diff --git a/pyproject.toml b/pyproject.toml index 9582e3ba..bbfcc25e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -170,7 +170,7 @@ exclude_lines = [ "if app.debug", ] -[tool.ruff] +[tool.ruff.lint] ignore = ["E501", "E722"] [tool.tox] diff --git a/tests/app/test_configuration.py b/tests/app/test_configuration.py index 605f6d22..56fcba01 100644 --- a/tests/app/test_configuration.py +++ b/tests/app/test_configuration.py @@ -1,10 +1,11 @@ import os import pytest +from flask_webtest import TestApp + from canaille import create_app from canaille.app.configuration import ConfigurationException from canaille.app.configuration import validate -from flask_webtest import TestApp def test_configuration_file_suffix(tmp_path, backend, configuration): diff --git a/tests/app/test_flaskutils.py b/tests/app/test_flaskutils.py index 3f3f162b..b8563f96 100644 --- a/tests/app/test_flaskutils.py +++ b/tests/app/test_flaskutils.py @@ -2,9 +2,10 @@ import os import pytest import toml +from flask_webtest import TestApp + from canaille import create_app from canaille.app.flask import set_parameter_in_url_query -from flask_webtest import TestApp def test_set_parameter_in_url_query(): diff --git a/tests/app/test_forms.py b/tests/app/test_forms.py index 8462e254..bcff10bf 100644 --- a/tests/app/test_forms.py +++ b/tests/app/test_forms.py @@ -3,11 +3,12 @@ import datetime import pytest import wtforms from babel.dates import LOCALTZ -from canaille.app.forms import DateTimeUTCField -from canaille.app.forms import phone_number from flask import current_app from werkzeug.datastructures import ImmutableMultiDict +from canaille.app.forms import DateTimeUTCField +from canaille.app.forms import phone_number + def test_datetime_utc_field_no_timezone_is_local_timezone(testclient): del current_app.config["TIMEZONE"] diff --git a/tests/app/test_mails.py b/tests/app/test_mails.py index 1ce3c964..9a5818e3 100644 --- a/tests/app/test_mails.py +++ b/tests/app/test_mails.py @@ -3,9 +3,10 @@ import warnings from unittest import mock import pytest -from canaille import create_app from flask_webtest import TestApp +from canaille import create_app + @pytest.fixture def configuration(configuration, httpserver): diff --git a/tests/backends/ldap/fixtures.py b/tests/backends/ldap/fixtures.py index 105db04a..c11c13ce 100644 --- a/tests/backends/ldap/fixtures.py +++ b/tests/backends/ldap/fixtures.py @@ -1,4 +1,5 @@ import pytest + from canaille.backends.ldap.backend import Backend from tests.backends.ldap import CustomSlapdObject diff --git a/tests/backends/ldap/test_errors.py b/tests/backends/ldap/test_errors.py index 0c274e41..5af7902c 100644 --- a/tests/backends/ldap/test_errors.py +++ b/tests/backends/ldap/test_errors.py @@ -1,7 +1,8 @@ import pytest -from canaille import create_app from flask_webtest import TestApp +from canaille import create_app + @pytest.fixture def configuration(slapd_server, ldap_configuration): diff --git a/tests/backends/ldap/test_install.py b/tests/backends/ldap/test_install.py index 3db3f64c..26d00bc1 100644 --- a/tests/backends/ldap/test_install.py +++ b/tests/backends/ldap/test_install.py @@ -1,10 +1,11 @@ import pytest +from flask_webtest import TestApp + from canaille import create_app from canaille.app.installation import InstallationException from canaille.backends.ldap.backend import Backend from canaille.backends.ldap.ldapobject import LDAPObject from canaille.commands import cli -from flask_webtest import TestApp from . import CustomSlapdObject diff --git a/tests/backends/ldap/test_utils.py b/tests/backends/ldap/test_utils.py index ed548f73..e1a96c2b 100644 --- a/tests/backends/ldap/test_utils.py +++ b/tests/backends/ldap/test_utils.py @@ -3,15 +3,16 @@ from unittest import mock import ldap.dn import pytest + from canaille.app import models from canaille.app.configuration import ConfigurationException from canaille.app.configuration import validate from canaille.backends.ldap.backend import setup_ldap_models from canaille.backends.ldap.ldapobject import LDAPObject from canaille.backends.ldap.ldapobject import python_attrs_to_ldap +from canaille.backends.ldap.utils import Syntax from canaille.backends.ldap.utils import ldap_to_python from canaille.backends.ldap.utils import python_to_ldap -from canaille.backends.ldap.utils import Syntax # TODO: tester le changement de cardinalité des attributs diff --git a/tests/backends/memory/fixtures.py b/tests/backends/memory/fixtures.py index a97490f7..1658dd7b 100644 --- a/tests/backends/memory/fixtures.py +++ b/tests/backends/memory/fixtures.py @@ -1,4 +1,5 @@ import pytest + from canaille.backends.memory.backend import Backend diff --git a/tests/backends/sql/fixtures.py b/tests/backends/sql/fixtures.py index 395661ae..76c6dacb 100644 --- a/tests/backends/sql/fixtures.py +++ b/tests/backends/sql/fixtures.py @@ -1,4 +1,5 @@ import pytest + from canaille.backends.sql.backend import Backend diff --git a/tests/backends/test_backends.py b/tests/backends/test_backends.py index be5af49f..0bbec40c 100644 --- a/tests/backends/test_backends.py +++ b/tests/backends/test_backends.py @@ -1,4 +1,5 @@ import pytest + from canaille.backends import BaseBackend diff --git a/tests/backends/test_models.py b/tests/backends/test_models.py index 3a589772..4b9786ba 100644 --- a/tests/backends/test_models.py +++ b/tests/backends/test_models.py @@ -1,4 +1,5 @@ import pytest + from canaille.app import models from canaille.backends.models import Model diff --git a/tests/conftest.py b/tests/conftest.py index cf3b1e64..b01a2dc1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,14 +2,15 @@ import os import pytest from babel.messages.frontend import compile_catalog -from canaille import create_app -from canaille.app import models -from canaille.backends import available_backends from flask_webtest import TestApp from jinja2 import StrictUndefined from pytest_lazyfixture import lazy_fixture from werkzeug.security import gen_salt +from canaille import create_app +from canaille.app import models +from canaille.backends import available_backends + @pytest.fixture(autouse=True, scope="session") def babel_catalogs(): diff --git a/tests/core/test_account.py b/tests/core/test_account.py index 1206ffc2..fa7aae11 100644 --- a/tests/core/test_account.py +++ b/tests/core/test_account.py @@ -1,9 +1,10 @@ import datetime from unittest import mock -from canaille.app import models from flask import g +from canaille.app import models + def test_index(testclient, user): res = testclient.get("/", status=302) diff --git a/tests/core/test_email_confirmation.py b/tests/core/test_email_confirmation.py index 4de002f5..04fbe5d6 100644 --- a/tests/core/test_email_confirmation.py +++ b/tests/core/test_email_confirmation.py @@ -2,9 +2,10 @@ import datetime from unittest import mock import freezegun +from flask import url_for + from canaille.core.endpoints.account import EmailConfirmationPayload from canaille.core.endpoints.account import RegistrationPayload -from flask import url_for def test_confirmation_disabled_email_editable(testclient, backend, logged_user): diff --git a/tests/core/test_invitation.py b/tests/core/test_invitation.py index b9e7c6d5..4ac50d3d 100644 --- a/tests/core/test_invitation.py +++ b/tests/core/test_invitation.py @@ -1,8 +1,9 @@ import datetime +from flask import g + from canaille.app import models from canaille.core.endpoints.account import RegistrationPayload -from flask import g def test_invitation(testclient, logged_admin, foo_group, smtpd): diff --git a/tests/core/test_models.py b/tests/core/test_models.py index 350d3544..9c29455c 100644 --- a/tests/core/test_models.py +++ b/tests/core/test_models.py @@ -1,4 +1,5 @@ import pytest + from canaille.app import models from canaille.core.models import Group from canaille.core.models import User diff --git a/tests/core/test_profile_edition.py b/tests/core/test_profile_edition.py index 034fbbbd..e3408512 100644 --- a/tests/core/test_profile_edition.py +++ b/tests/core/test_profile_edition.py @@ -1,8 +1,9 @@ import pytest -from canaille.core.populate import fake_users from flask import g from webtest import Upload +from canaille.core.populate import fake_users + @pytest.fixture def configuration(configuration): diff --git a/tests/core/test_profile_photo.py b/tests/core/test_profile_photo.py index 7de70565..fde52cac 100644 --- a/tests/core/test_profile_photo.py +++ b/tests/core/test_profile_photo.py @@ -1,8 +1,9 @@ import datetime -from canaille.app import models from webtest import Upload +from canaille.app import models + def test_photo(testclient, user, jpeg_photo): user.photo = jpeg_photo diff --git a/tests/core/test_profile_settings.py b/tests/core/test_profile_settings.py index 9f5f3146..456c9a20 100644 --- a/tests/core/test_profile_settings.py +++ b/tests/core/test_profile_settings.py @@ -1,9 +1,10 @@ import datetime from unittest import mock -from canaille.app import models from flask import g +from canaille.app import models + def test_edition( testclient, diff --git a/tests/core/test_registration.py b/tests/core/test_registration.py index a8b72c6b..7e8a701b 100644 --- a/tests/core/test_registration.py +++ b/tests/core/test_registration.py @@ -1,9 +1,10 @@ from unittest import mock import freezegun +from flask import url_for + from canaille.app import models from canaille.core.endpoints.account import RegistrationPayload -from flask import url_for def test_registration_without_email_validation(testclient, backend, foo_group): diff --git a/tests/oidc/commands/test_clean.py b/tests/oidc/commands/test_clean.py index 5dc58387..1dbecae7 100644 --- a/tests/oidc/commands/test_clean.py +++ b/tests/oidc/commands/test_clean.py @@ -1,8 +1,9 @@ import datetime +from werkzeug.security import gen_salt + from canaille.app import models from canaille.commands import cli -from werkzeug.security import gen_salt def test_clean_command(testclient, backend, client, user): diff --git a/tests/oidc/conftest.py b/tests/oidc/conftest.py index c3089b5a..1de83002 100644 --- a/tests/oidc/conftest.py +++ b/tests/oidc/conftest.py @@ -4,11 +4,12 @@ import uuid import pytest from authlib.oidc.core.grants.util import generate_id_token +from werkzeug.security import gen_salt + from canaille.app import models from canaille.oidc.installation import generate_keypair from canaille.oidc.oauth import generate_user_info from canaille.oidc.oauth import get_jwt_config -from werkzeug.security import gen_salt @pytest.fixture diff --git a/tests/oidc/test_authorization_code_flow.py b/tests/oidc/test_authorization_code_flow.py index dc2a5cd3..75480a2c 100644 --- a/tests/oidc/test_authorization_code_flow.py +++ b/tests/oidc/test_authorization_code_flow.py @@ -4,11 +4,12 @@ from urllib.parse import urlsplit import freezegun from authlib.jose import jwt from authlib.oauth2.rfc7636 import create_s256_code_challenge -from canaille.app import models -from canaille.oidc.oauth import setup_oauth from flask import g from werkzeug.security import gen_salt +from canaille.app import models +from canaille.oidc.oauth import setup_oauth + from . import client_credentials diff --git a/tests/oidc/test_authorization_prompt.py b/tests/oidc/test_authorization_prompt.py index 435484a2..4805fbd0 100644 --- a/tests/oidc/test_authorization_prompt.py +++ b/tests/oidc/test_authorization_prompt.py @@ -2,14 +2,16 @@ https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint """ + import datetime import uuid from urllib.parse import parse_qs from urllib.parse import urlsplit +from flask import url_for + from canaille.app import models from canaille.core.endpoints.account import RegistrationPayload -from flask import url_for def test_prompt_none(testclient, logged_user, client): diff --git a/tests/oidc/test_client_admin.py b/tests/oidc/test_client_admin.py index cfcef631..b5c4a3bd 100644 --- a/tests/oidc/test_client_admin.py +++ b/tests/oidc/test_client_admin.py @@ -1,8 +1,9 @@ import datetime -from canaille.app import models from werkzeug.security import gen_salt +from canaille.app import models + def test_no_logged_no_access(testclient): testclient.get("/admin/client", status=403) diff --git a/tests/oidc/test_code_admin.py b/tests/oidc/test_code_admin.py index 4102051d..d41cb870 100644 --- a/tests/oidc/test_code_admin.py +++ b/tests/oidc/test_code_admin.py @@ -1,6 +1,7 @@ -from canaille.app import models from werkzeug.security import gen_salt +from canaille.app import models + def test_no_logged_no_access(testclient): testclient.get("/admin/authorization", status=403) diff --git a/tests/oidc/test_configuration.py b/tests/oidc/test_configuration.py index bbe1cf2c..d3fdec3a 100644 --- a/tests/oidc/test_configuration.py +++ b/tests/oidc/test_configuration.py @@ -1,6 +1,7 @@ import warnings import pytest + from canaille.app.configuration import ConfigurationException from canaille.app.configuration import validate from canaille.oidc.oauth import get_issuer diff --git a/tests/oidc/test_dynamic_client_registration.py b/tests/oidc/test_dynamic_client_registration.py index ab1b3361..b5583a7c 100644 --- a/tests/oidc/test_dynamic_client_registration.py +++ b/tests/oidc/test_dynamic_client_registration.py @@ -1,6 +1,7 @@ from unittest import mock from authlib.jose import jwt + from canaille.app import models diff --git a/tests/oidc/test_end_session.py b/tests/oidc/test_end_session.py index fdab5aca..192e3883 100644 --- a/tests/oidc/test_end_session.py +++ b/tests/oidc/test_end_session.py @@ -1,4 +1,5 @@ from authlib.oidc.core.grants.util import generate_id_token + from canaille.oidc.oauth import generate_user_info from canaille.oidc.oauth import get_jwt_config diff --git a/tests/oidc/test_hybrid_flow.py b/tests/oidc/test_hybrid_flow.py index 911f7339..92c15762 100644 --- a/tests/oidc/test_hybrid_flow.py +++ b/tests/oidc/test_hybrid_flow.py @@ -2,6 +2,7 @@ from urllib.parse import parse_qs from urllib.parse import urlsplit from authlib.jose import jwt + from canaille.app import models diff --git a/tests/oidc/test_implicit_flow.py b/tests/oidc/test_implicit_flow.py index 567c5c10..87f125bf 100644 --- a/tests/oidc/test_implicit_flow.py +++ b/tests/oidc/test_implicit_flow.py @@ -2,6 +2,7 @@ from urllib.parse import parse_qs from urllib.parse import urlsplit from authlib.jose import jwt + from canaille.app import models diff --git a/tests/oidc/test_token_admin.py b/tests/oidc/test_token_admin.py index e3f1a8d6..7eca4e9c 100644 --- a/tests/oidc/test_token_admin.py +++ b/tests/oidc/test_token_admin.py @@ -1,8 +1,9 @@ import datetime -from canaille.app import models from werkzeug.security import gen_salt +from canaille.app import models + def test_no_logged_no_access(testclient): testclient.get("/admin/token", status=403) diff --git a/tests/oidc/test_userinfo.py b/tests/oidc/test_userinfo.py index 166152c1..857a7535 100644 --- a/tests/oidc/test_userinfo.py +++ b/tests/oidc/test_userinfo.py @@ -1,5 +1,5 @@ -from canaille.oidc.oauth import claims_from_scope from canaille.oidc.oauth import DEFAULT_JWT_MAPPING +from canaille.oidc.oauth import claims_from_scope from canaille.oidc.oauth import generate_user_claims