chore: use isort instead of reoder-python-imports

This commit is contained in:
Éloi Rivard 2024-03-15 19:58:06 +01:00
parent bd57d69765
commit 4edffcaa9f
No known key found for this signature in database
GPG key ID: 7EDA204EA57DD184
70 changed files with 207 additions and 154 deletions

View file

@ -1,7 +1,7 @@
--- ---
repos: repos:
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
rev: 'v0.3.1' rev: 'v0.3.3'
hooks: hooks:
- id: ruff - id: ruff
args: [--fix, --exit-non-zero-on-fix] args: [--fix, --exit-non-zero-on-fix]
@ -15,11 +15,12 @@ repos:
- id: end-of-file-fixer - id: end-of-file-fixer
exclude: "\\.svg$|\\.map$|\\.min\\.css$|\\.min\\.js$|\\.po$|\\.pot$" exclude: "\\.svg$|\\.map$|\\.min\\.css$|\\.min\\.js$|\\.po$|\\.pot$"
- id: check-toml - id: check-toml
- repo: https://github.com/asottile/reorder_python_imports - repo: https://github.com/pycqa/isort
rev: v3.12.0 rev: "5.13.2"
hooks: hooks:
- id: reorder-python-imports - id: isort
args: ["--application-directories", "canaille"] name: isort (python)
args: ["--force-single-line-imports", "--profile", "black"]
- repo: https://github.com/PyCQA/docformatter - repo: https://github.com/PyCQA/docformatter
rev: v1.7.5 rev: v1.7.5
hooks: hooks:

View file

@ -6,7 +6,6 @@ from flask import request
from flask import session from flask import session
from flask_wtf.csrf import CSRFProtect from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect() csrf = CSRFProtect()
@ -107,16 +106,16 @@ def setup_flask(app):
def setup_flask_converters(app): def setup_flask_converters(app):
from canaille.app.flask import model_converter
from canaille.app import models from canaille.app import models
from canaille.app.flask import model_converter
for model_name, model_class in models.MODELS.items(): for model_name, model_class in models.MODELS.items():
app.url_map.converters[model_name.lower()] = model_converter(model_class) app.url_map.converters[model_name.lower()] = model_converter(model_class)
def create_app(config=None, validate=True, backend=None): def create_app(config=None, validate=True, backend=None):
from .app.i18n import setup_i18n
from .app.configuration import setup_config from .app.configuration import setup_config
from .app.i18n import setup_i18n
from .app.themes import setup_themer from .app.themes import setup_themer
from .backends import setup_backend from .backends import setup_backend

View file

@ -2,10 +2,11 @@ import functools
import sys import sys
import click import click
from canaille.backends import BaseBackend
from flask import current_app from flask import current_app
from flask.cli import with_appcontext from flask.cli import with_appcontext
from canaille.backends import BaseBackend
def with_backendcontext(func): def with_backendcontext(func):
@functools.wraps(func) @functools.wraps(func)
@ -41,8 +42,8 @@ def check():
@with_appcontext @with_appcontext
def install(): def install():
"""Installs canaille elements from the configuration.""" """Installs canaille elements from the configuration."""
from canaille.app.installation import install
from canaille.app.configuration import ConfigurationException from canaille.app.configuration import ConfigurationException
from canaille.app.installation import install
try: try:
install(current_app.config) install(current_app.config)

View file

@ -3,9 +3,10 @@ import smtplib
import socket import socket
from collections.abc import Mapping 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_HOST
from canaille.app.mails import DEFAULT_SMTP_PORT from canaille.app.mails import DEFAULT_SMTP_PORT
from flask import current_app
ROOT = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.dirname(os.path.abspath(__file__))

View file

@ -3,9 +3,6 @@ from functools import wraps
from urllib.parse import urlsplit from urllib.parse import urlsplit
from urllib.parse import urlunsplit 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 abort
from flask import current_app from flask import current_app
from flask import g from flask import g
@ -13,6 +10,10 @@ from flask import request
from flask import session from flask import session
from werkzeug.routing import BaseConverter 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(): def current_user():
if "user" in g: if "user" in g:

View file

@ -3,11 +3,6 @@ import math
import re import re
import wtforms.validators 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 abort
from flask import current_app from flask import current_app
from flask import make_response from flask import make_response
@ -15,6 +10,12 @@ from flask import request
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms.meta import DefaultMeta 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 . import validate_uri
from .flask import request_is_htmx from .flask import request_is_htmx

View file

@ -74,8 +74,9 @@ def timezone_selector():
def native_language_name_from_code(code): def native_language_name_from_code(code):
try: try:
import pycountry
from gettext import translation from gettext import translation
import pycountry
except ImportError: except ImportError:
return code return code

View file

@ -4,11 +4,12 @@ import smtplib
import urllib.request import urllib.request
from email.utils import make_msgid 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 current_app
from flask import request 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_HOST = "localhost"
DEFAULT_SMTP_PORT = 25 DEFAULT_SMTP_PORT = 25
DEFAULT_SMTP_TLS = False DEFAULT_SMTP_TLS = False

View file

@ -5,11 +5,12 @@ from contextlib import contextmanager
import ldap.modlist import ldap.modlist
import ldif import ldif
from flask import current_app
from canaille.app import models from canaille.app import models
from canaille.app.configuration import ConfigurationException from canaille.app.configuration import ConfigurationException
from canaille.app.i18n import gettext as _ from canaille.app.i18n import gettext as _
from canaille.backends import BaseBackend from canaille.backends import BaseBackend
from flask import current_app
from .utils import listify from .utils import listify
@ -188,9 +189,10 @@ class Backend(BaseBackend):
def setup_ldap_models(config): def setup_ldap_models(config):
from .ldapobject import LDAPObject
from canaille.app import models from canaille.app import models
from .ldapobject import LDAPObject
LDAPObject.root_dn = config["BACKENDS"]["LDAP"]["ROOT_DN"] LDAPObject.root_dn = config["BACKENDS"]["LDAP"]["ROOT_DN"]
user_base = config["BACKENDS"]["LDAP"]["USER_BASE"].replace( user_base = config["BACKENDS"]["LDAP"]["USER_BASE"].replace(

View file

@ -3,6 +3,7 @@ from collections.abc import Iterable
import ldap.dn import ldap.dn
import ldap.filter import ldap.filter
from canaille.backends.models import Model from canaille.backends.models import Model
from .backend import Backend from .backend import Backend

View file

@ -1,11 +1,12 @@
import canaille.core.models
import canaille.oidc.models
import ldap.filter import ldap.filter
from flask import current_app from flask import current_app
from ldap.controls import DecodeControlTuples from ldap.controls import DecodeControlTuples
from ldap.controls.ppolicy import PasswordPolicyControl from ldap.controls.ppolicy import PasswordPolicyControl
from ldap.controls.ppolicy import PasswordPolicyError from ldap.controls.ppolicy import PasswordPolicyError
import canaille.core.models
import canaille.oidc.models
from .backend import Backend from .backend import Backend
from .ldapobject import LDAPObject from .ldapobject import LDAPObject

View file

@ -2,11 +2,12 @@ import copy
import datetime import datetime
import uuid import uuid
from flask import current_app
import canaille.core.models import canaille.core.models
import canaille.oidc.models import canaille.oidc.models
from canaille.app import models from canaille.app import models
from canaille.backends.models import Model from canaille.backends.models import Model
from flask import current_app
def listify(value): def listify(value):

View file

@ -1,8 +1,8 @@
from canaille.backends import BaseBackend
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy.orm import declarative_base
from canaille.backends import BaseBackend
Base = declarative_base() Base = declarative_base()

View file

@ -2,27 +2,28 @@ import datetime
import uuid import uuid
from typing import List 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 flask import current_app
from sqlalchemy import Boolean from sqlalchemy import Boolean
from sqlalchemy import Column from sqlalchemy import Column
from sqlalchemy import ForeignKey from sqlalchemy import ForeignKey
from sqlalchemy import Integer from sqlalchemy import Integer
from sqlalchemy import LargeBinary from sqlalchemy import LargeBinary
from sqlalchemy import or_
from sqlalchemy import select
from sqlalchemy import String from sqlalchemy import String
from sqlalchemy import Table from sqlalchemy import Table
from sqlalchemy import or_
from sqlalchemy import select
from sqlalchemy.orm import Mapped from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import reconstructor from sqlalchemy.orm import reconstructor
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from sqlalchemy_json import MutableJson from sqlalchemy_json import MutableJson
from sqlalchemy_utils import force_auto_coercion
from sqlalchemy_utils import PasswordType 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 Backend
from .backend import Base from .backend import Base

View file

@ -1,9 +1,10 @@
import click
from flask.cli import FlaskGroup
import canaille.app.commands import canaille.app.commands
import canaille.core.commands import canaille.core.commands
import canaille.oidc.commands import canaille.oidc.commands
import click
from canaille import create_app from canaille import create_app
from flask.cli import FlaskGroup
@click.group(cls=FlaskGroup, create_app=create_app) @click.group(cls=FlaskGroup, create_app=create_app)

View file

@ -1,7 +1,8 @@
import click import click
from canaille.app.commands import with_backendcontext
from flask.cli import with_appcontext from flask.cli import with_appcontext
from canaille.app.commands import with_backendcontext
try: try:
HAS_FAKER = True HAS_FAKER = True
except ImportError: except ImportError:

View file

@ -7,6 +7,19 @@ from importlib import metadata
from typing import List from typing import List
import wtforms 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 b64_to_obj
from canaille.app import build_hash from canaille.app import build_hash
from canaille.app import default_fields 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 smtp_needed
from canaille.app.flask import user_needed from canaille.app.flask import user_needed
from canaille.app.forms import IDToModel from canaille.app.forms import IDToModel
from canaille.app.forms import TableForm
from canaille.app.forms import is_readonly from canaille.app.forms import is_readonly
from canaille.app.forms import set_readonly from canaille.app.forms import set_readonly
from canaille.app.forms import set_writable 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 gettext as _
from canaille.app.i18n import reload_translations from canaille.app.i18n import reload_translations
from canaille.app.themes import render_template from canaille.app.themes import render_template
from canaille.backends import BaseBackend 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_confirmation_email
from ..mails import send_invitation_mail from ..mails import send_invitation_mail
from ..mails import send_password_initialization_mail from ..mails import send_password_initialization_mail
from ..mails import send_password_reset_mail from ..mails import send_password_reset_mail
from ..mails import send_registration_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 EmailConfirmationForm
from .forms import InvitationForm from .forms import InvitationForm
from .forms import JoinForm from .forms import JoinForm
from .forms import MINIMUM_PASSWORD_LENGTH from .forms import build_profile_form
bp = Blueprint("account", __name__) bp = Blueprint("account", __name__)

View file

@ -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 Blueprint
from flask import current_app from flask import current_app
from flask import flash from flask import flash
@ -14,6 +6,14 @@ from flask import url_for
from wtforms import StringField from wtforms import StringField
from wtforms.validators import DataRequired 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") bp = Blueprint("admin", __name__, url_prefix="/admin")

View file

@ -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 build_hash
from canaille.app import models from canaille.app import models
from canaille.app.flask import current_user 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.i18n import gettext as _
from canaille.app.themes import render_template from canaille.app.themes import render_template
from canaille.backends import BaseBackend 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_initialization_mail
from ..mails import send_password_reset_mail from ..mails import send_password_reset_mail

View file

@ -1,22 +1,22 @@
import wtforms.form import wtforms.form
import wtforms.validators 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 import models
from canaille.app.forms import BaseForm from canaille.app.forms import BaseForm
from canaille.app.forms import DateTimeUTCField from canaille.app.forms import DateTimeUTCField
from canaille.app.forms import email_validator
from canaille.app.forms import Form from canaille.app.forms import Form
from canaille.app.forms import IDToModel 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 is_uri
from canaille.app.forms import phone_number from canaille.app.forms import phone_number
from canaille.app.forms import set_readonly from canaille.app.forms import set_readonly
from canaille.app.forms import unique_values from canaille.app.forms import unique_values
from canaille.app.i18n import lazy_gettext as _ from canaille.app.i18n import lazy_gettext as _
from canaille.app.i18n import native_language_name_from_code 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 MINIMUM_PASSWORD_LENGTH = 8

View file

@ -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 import models
from canaille.app.flask import permissions_needed from canaille.app.flask import permissions_needed
from canaille.app.flask import render_htmx_template from canaille.app.flask import render_htmx_template
from canaille.app.forms import TableForm from canaille.app.forms import TableForm
from canaille.app.i18n import gettext as _ from canaille.app.i18n import gettext as _
from canaille.app.themes import render_template 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 CreateGroupForm
from .forms import EditGroupForm from .forms import EditGroupForm

View file

@ -1,10 +1,11 @@
from flask import current_app
from flask import url_for
from canaille.app import build_hash from canaille.app import build_hash
from canaille.app.i18n import gettext as _ from canaille.app.i18n import gettext as _
from canaille.app.mails import logo from canaille.app.mails import logo
from canaille.app.mails import send_email from canaille.app.mails import send_email
from canaille.app.themes import render_template from canaille.app.themes import render_template
from flask import current_app
from flask import url_for
def send_test_mail(email): def send_test_mail(email):

View file

@ -1,9 +1,10 @@
import random import random
import faker import faker
from faker.config import AVAILABLE_LOCALES
from canaille.app import models from canaille.app import models
from canaille.app.i18n import available_language_codes from canaille.app.i18n import available_language_codes
from faker.config import AVAILABLE_LOCALES
def faker_generator(locales=None): def faker_generator(locales=None):

View file

@ -1,7 +1,8 @@
import click import click
from flask.cli import with_appcontext
from canaille.app import models from canaille.app import models
from canaille.app.commands import with_backendcontext from canaille.app.commands import with_backendcontext
from flask.cli import with_appcontext
@click.command() @click.command()

View file

@ -1,12 +1,12 @@
from flask import Blueprint
from flask import abort
from flask import request
from canaille.app import models from canaille.app import models
from canaille.app.flask import permissions_needed from canaille.app.flask import permissions_needed
from canaille.app.flask import render_htmx_template from canaille.app.flask import render_htmx_template
from canaille.app.forms import TableForm from canaille.app.forms import TableForm
from canaille.app.themes import render_template 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") bp = Blueprint("authorizations", __name__, url_prefix="/admin/authorization")

View file

@ -1,22 +1,22 @@
import datetime 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 import models
from canaille.app.flask import permissions_needed from canaille.app.flask import permissions_needed
from canaille.app.flask import render_htmx_template from canaille.app.flask import render_htmx_template
from canaille.app.forms import TableForm from canaille.app.forms import TableForm
from canaille.app.i18n import gettext as _ from canaille.app.i18n import gettext as _
from canaille.app.themes import render_template 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 from .forms import ClientAddForm
bp = Blueprint("clients", __name__, url_prefix="/admin/client") bp = Blueprint("clients", __name__, url_prefix="/admin/client")

View file

@ -1,17 +1,17 @@
import datetime import datetime
import uuid 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 Blueprint
from flask import flash from flask import flash
from flask import redirect from flask import redirect
from flask import url_for 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") bp = Blueprint("consents", __name__, url_prefix="/consent")

View file

@ -1,8 +1,9 @@
import wtforms import wtforms
from canaille.app import models from canaille.app import models
from canaille.app.forms import email_validator
from canaille.app.forms import Form from canaille.app.forms import Form
from canaille.app.forms import IDToModel 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 is_uri
from canaille.app.forms import unique_values from canaille.app.forms import unique_values
from canaille.app.i18n import lazy_gettext as _ from canaille.app.i18n import lazy_gettext as _

View file

@ -5,15 +5,8 @@ from authlib.integrations.flask_oauth2 import current_token
from authlib.jose import jwt from authlib.jose import jwt
from authlib.jose.errors import JoseError from authlib.jose.errors import JoseError
from authlib.oauth2 import OAuth2Error 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 Blueprint
from flask import abort
from flask import current_app from flask import current_app
from flask import flash from flask import flash
from flask import jsonify from flask import jsonify
@ -23,21 +16,28 @@ from flask import session
from flask import url_for from flask import url_for
from werkzeug.datastructures import CombinedMultiDict 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 ClientConfigurationEndpoint
from ..oauth import ClientRegistrationEndpoint 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 generate_user_info
from ..oauth import get_issuer from ..oauth import get_issuer
from ..oauth import get_jwks from ..oauth import get_jwks
from ..oauth import IntrospectionEndpoint
from ..oauth import require_oauth from ..oauth import require_oauth
from ..oauth import RevocationEndpoint
from ..utils import SCOPE_DETAILS from ..utils import SCOPE_DETAILS
from .forms import AuthorizeForm from .forms import AuthorizeForm
from .forms import LogoutForm from .forms import LogoutForm
from .well_known import openid_configuration from .well_known import openid_configuration
bp = Blueprint("endpoints", __name__, url_prefix="/oauth") bp = Blueprint("endpoints", __name__, url_prefix="/oauth")

View file

@ -1,15 +1,16 @@
import datetime 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 import models
from canaille.app.flask import permissions_needed from canaille.app.flask import permissions_needed
from canaille.app.flask import render_htmx_template from canaille.app.flask import render_htmx_template
from canaille.app.forms import TableForm from canaille.app.forms import TableForm
from canaille.app.i18n import gettext as _ from canaille.app.i18n import gettext as _
from canaille.app.themes import render_template 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 from .forms import TokenRevokationForm

View file

@ -5,7 +5,6 @@ from flask import request
from ..oauth import oauth_authorization_server from ..oauth import oauth_authorization_server
from ..oauth import openid_configuration from ..oauth import openid_configuration
bp = Blueprint("home", __name__, url_prefix="/.well-known") bp = Blueprint("home", __name__, url_prefix="/.well-known")

View file

@ -4,6 +4,7 @@ from authlib.oauth2.rfc6749 import AuthorizationCodeMixin
from authlib.oauth2.rfc6749 import ClientMixin from authlib.oauth2.rfc6749 import ClientMixin
from authlib.oauth2.rfc6749 import TokenMixin from authlib.oauth2.rfc6749 import TokenMixin
from authlib.oauth2.rfc6749 import util from authlib.oauth2.rfc6749 import util
from canaille.app import models from canaille.app import models
from .basemodels import AuthorizationCode as BaseAuthorizationCode from .basemodels import AuthorizationCode as BaseAuthorizationCode

View file

@ -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 OpenIDHybridGrant as _OpenIDHybridGrant
from authlib.oidc.core.grants import OpenIDImplicitGrant as _OpenIDImplicitGrant from authlib.oidc.core.grants import OpenIDImplicitGrant as _OpenIDImplicitGrant
from authlib.oidc.core.grants.util import generate_id_token from authlib.oidc.core.grants.util import generate_id_token
from canaille.app import models
from flask import current_app from flask import current_app
from flask import g from flask import g
from flask import request from flask import request
from flask import url_for from flask import url_for
from werkzeug.security import gen_salt from werkzeug.security import gen_salt
from canaille.app import models
DEFAULT_JWT_KTY = "RSA" DEFAULT_JWT_KTY = "RSA"
DEFAULT_JWT_ALG = "RS256" DEFAULT_JWT_ALG = "RS256"

View file

@ -4,15 +4,14 @@ from urllib.parse import urlunsplit
from authlib.common.errors import AuthlibBaseError from authlib.common.errors import AuthlibBaseError
from authlib.integrations.flask_client import OAuth from authlib.integrations.flask_client import OAuth
from authlib.oidc.discovery import get_well_known_url from authlib.oidc.discovery import get_well_known_url
from flask import Flask
from flask import current_app from flask import current_app
from flask import flash from flask import flash
from flask import Flask
from flask import redirect from flask import redirect
from flask import render_template from flask import render_template
from flask import session from flask import session
from flask import url_for from flask import url_for
oauth = OAuth() oauth = OAuth()

View file

@ -2,7 +2,6 @@ import datetime
import os import os
import sys import sys
if os.path.exists("../canaille"): if os.path.exists("../canaille"):
sys.path.append("../canaille") sys.path.append("../canaille")

View file

@ -170,7 +170,7 @@ exclude_lines = [
"if app.debug", "if app.debug",
] ]
[tool.ruff] [tool.ruff.lint]
ignore = ["E501", "E722"] ignore = ["E501", "E722"]
[tool.tox] [tool.tox]

View file

@ -1,10 +1,11 @@
import os import os
import pytest import pytest
from flask_webtest import TestApp
from canaille import create_app from canaille import create_app
from canaille.app.configuration import ConfigurationException from canaille.app.configuration import ConfigurationException
from canaille.app.configuration import validate from canaille.app.configuration import validate
from flask_webtest import TestApp
def test_configuration_file_suffix(tmp_path, backend, configuration): def test_configuration_file_suffix(tmp_path, backend, configuration):

View file

@ -2,9 +2,10 @@ import os
import pytest import pytest
import toml import toml
from flask_webtest import TestApp
from canaille import create_app from canaille import create_app
from canaille.app.flask import set_parameter_in_url_query from canaille.app.flask import set_parameter_in_url_query
from flask_webtest import TestApp
def test_set_parameter_in_url_query(): def test_set_parameter_in_url_query():

View file

@ -3,11 +3,12 @@ import datetime
import pytest import pytest
import wtforms import wtforms
from babel.dates import LOCALTZ from babel.dates import LOCALTZ
from canaille.app.forms import DateTimeUTCField
from canaille.app.forms import phone_number
from flask import current_app from flask import current_app
from werkzeug.datastructures import ImmutableMultiDict 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): def test_datetime_utc_field_no_timezone_is_local_timezone(testclient):
del current_app.config["TIMEZONE"] del current_app.config["TIMEZONE"]

View file

@ -3,9 +3,10 @@ import warnings
from unittest import mock from unittest import mock
import pytest import pytest
from canaille import create_app
from flask_webtest import TestApp from flask_webtest import TestApp
from canaille import create_app
@pytest.fixture @pytest.fixture
def configuration(configuration, httpserver): def configuration(configuration, httpserver):

View file

@ -1,4 +1,5 @@
import pytest import pytest
from canaille.backends.ldap.backend import Backend from canaille.backends.ldap.backend import Backend
from tests.backends.ldap import CustomSlapdObject from tests.backends.ldap import CustomSlapdObject

View file

@ -1,7 +1,8 @@
import pytest import pytest
from canaille import create_app
from flask_webtest import TestApp from flask_webtest import TestApp
from canaille import create_app
@pytest.fixture @pytest.fixture
def configuration(slapd_server, ldap_configuration): def configuration(slapd_server, ldap_configuration):

View file

@ -1,10 +1,11 @@
import pytest import pytest
from flask_webtest import TestApp
from canaille import create_app from canaille import create_app
from canaille.app.installation import InstallationException from canaille.app.installation import InstallationException
from canaille.backends.ldap.backend import Backend from canaille.backends.ldap.backend import Backend
from canaille.backends.ldap.ldapobject import LDAPObject from canaille.backends.ldap.ldapobject import LDAPObject
from canaille.commands import cli from canaille.commands import cli
from flask_webtest import TestApp
from . import CustomSlapdObject from . import CustomSlapdObject

View file

@ -3,15 +3,16 @@ from unittest import mock
import ldap.dn import ldap.dn
import pytest import pytest
from canaille.app import models from canaille.app import models
from canaille.app.configuration import ConfigurationException from canaille.app.configuration import ConfigurationException
from canaille.app.configuration import validate from canaille.app.configuration import validate
from canaille.backends.ldap.backend import setup_ldap_models from canaille.backends.ldap.backend import setup_ldap_models
from canaille.backends.ldap.ldapobject import LDAPObject from canaille.backends.ldap.ldapobject import LDAPObject
from canaille.backends.ldap.ldapobject import python_attrs_to_ldap 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 ldap_to_python
from canaille.backends.ldap.utils import python_to_ldap from canaille.backends.ldap.utils import python_to_ldap
from canaille.backends.ldap.utils import Syntax
# TODO: tester le changement de cardinalité des attributs # TODO: tester le changement de cardinalité des attributs

View file

@ -1,4 +1,5 @@
import pytest import pytest
from canaille.backends.memory.backend import Backend from canaille.backends.memory.backend import Backend

View file

@ -1,4 +1,5 @@
import pytest import pytest
from canaille.backends.sql.backend import Backend from canaille.backends.sql.backend import Backend

View file

@ -1,4 +1,5 @@
import pytest import pytest
from canaille.backends import BaseBackend from canaille.backends import BaseBackend

View file

@ -1,4 +1,5 @@
import pytest import pytest
from canaille.app import models from canaille.app import models
from canaille.backends.models import Model from canaille.backends.models import Model

View file

@ -2,14 +2,15 @@ import os
import pytest import pytest
from babel.messages.frontend import compile_catalog 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 flask_webtest import TestApp
from jinja2 import StrictUndefined from jinja2 import StrictUndefined
from pytest_lazyfixture import lazy_fixture from pytest_lazyfixture import lazy_fixture
from werkzeug.security import gen_salt 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") @pytest.fixture(autouse=True, scope="session")
def babel_catalogs(): def babel_catalogs():

View file

@ -1,9 +1,10 @@
import datetime import datetime
from unittest import mock from unittest import mock
from canaille.app import models
from flask import g from flask import g
from canaille.app import models
def test_index(testclient, user): def test_index(testclient, user):
res = testclient.get("/", status=302) res = testclient.get("/", status=302)

View file

@ -2,9 +2,10 @@ import datetime
from unittest import mock from unittest import mock
import freezegun import freezegun
from flask import url_for
from canaille.core.endpoints.account import EmailConfirmationPayload from canaille.core.endpoints.account import EmailConfirmationPayload
from canaille.core.endpoints.account import RegistrationPayload from canaille.core.endpoints.account import RegistrationPayload
from flask import url_for
def test_confirmation_disabled_email_editable(testclient, backend, logged_user): def test_confirmation_disabled_email_editable(testclient, backend, logged_user):

View file

@ -1,8 +1,9 @@
import datetime import datetime
from flask import g
from canaille.app import models from canaille.app import models
from canaille.core.endpoints.account import RegistrationPayload from canaille.core.endpoints.account import RegistrationPayload
from flask import g
def test_invitation(testclient, logged_admin, foo_group, smtpd): def test_invitation(testclient, logged_admin, foo_group, smtpd):

View file

@ -1,4 +1,5 @@
import pytest import pytest
from canaille.app import models from canaille.app import models
from canaille.core.models import Group from canaille.core.models import Group
from canaille.core.models import User from canaille.core.models import User

View file

@ -1,8 +1,9 @@
import pytest import pytest
from canaille.core.populate import fake_users
from flask import g from flask import g
from webtest import Upload from webtest import Upload
from canaille.core.populate import fake_users
@pytest.fixture @pytest.fixture
def configuration(configuration): def configuration(configuration):

View file

@ -1,8 +1,9 @@
import datetime import datetime
from canaille.app import models
from webtest import Upload from webtest import Upload
from canaille.app import models
def test_photo(testclient, user, jpeg_photo): def test_photo(testclient, user, jpeg_photo):
user.photo = jpeg_photo user.photo = jpeg_photo

View file

@ -1,9 +1,10 @@
import datetime import datetime
from unittest import mock from unittest import mock
from canaille.app import models
from flask import g from flask import g
from canaille.app import models
def test_edition( def test_edition(
testclient, testclient,

View file

@ -1,9 +1,10 @@
from unittest import mock from unittest import mock
import freezegun import freezegun
from flask import url_for
from canaille.app import models from canaille.app import models
from canaille.core.endpoints.account import RegistrationPayload from canaille.core.endpoints.account import RegistrationPayload
from flask import url_for
def test_registration_without_email_validation(testclient, backend, foo_group): def test_registration_without_email_validation(testclient, backend, foo_group):

View file

@ -1,8 +1,9 @@
import datetime import datetime
from werkzeug.security import gen_salt
from canaille.app import models from canaille.app import models
from canaille.commands import cli from canaille.commands import cli
from werkzeug.security import gen_salt
def test_clean_command(testclient, backend, client, user): def test_clean_command(testclient, backend, client, user):

View file

@ -4,11 +4,12 @@ import uuid
import pytest import pytest
from authlib.oidc.core.grants.util import generate_id_token from authlib.oidc.core.grants.util import generate_id_token
from werkzeug.security import gen_salt
from canaille.app import models from canaille.app import models
from canaille.oidc.installation import generate_keypair from canaille.oidc.installation import generate_keypair
from canaille.oidc.oauth import generate_user_info from canaille.oidc.oauth import generate_user_info
from canaille.oidc.oauth import get_jwt_config from canaille.oidc.oauth import get_jwt_config
from werkzeug.security import gen_salt
@pytest.fixture @pytest.fixture

View file

@ -4,11 +4,12 @@ from urllib.parse import urlsplit
import freezegun import freezegun
from authlib.jose import jwt from authlib.jose import jwt
from authlib.oauth2.rfc7636 import create_s256_code_challenge 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 flask import g
from werkzeug.security import gen_salt from werkzeug.security import gen_salt
from canaille.app import models
from canaille.oidc.oauth import setup_oauth
from . import client_credentials from . import client_credentials

View file

@ -2,14 +2,16 @@
https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint https://openid.net/specs/openid-connect-core-1_0.html#AuthorizationEndpoint
""" """
import datetime import datetime
import uuid import uuid
from urllib.parse import parse_qs from urllib.parse import parse_qs
from urllib.parse import urlsplit from urllib.parse import urlsplit
from flask import url_for
from canaille.app import models from canaille.app import models
from canaille.core.endpoints.account import RegistrationPayload from canaille.core.endpoints.account import RegistrationPayload
from flask import url_for
def test_prompt_none(testclient, logged_user, client): def test_prompt_none(testclient, logged_user, client):

View file

@ -1,8 +1,9 @@
import datetime import datetime
from canaille.app import models
from werkzeug.security import gen_salt from werkzeug.security import gen_salt
from canaille.app import models
def test_no_logged_no_access(testclient): def test_no_logged_no_access(testclient):
testclient.get("/admin/client", status=403) testclient.get("/admin/client", status=403)

View file

@ -1,6 +1,7 @@
from canaille.app import models
from werkzeug.security import gen_salt from werkzeug.security import gen_salt
from canaille.app import models
def test_no_logged_no_access(testclient): def test_no_logged_no_access(testclient):
testclient.get("/admin/authorization", status=403) testclient.get("/admin/authorization", status=403)

View file

@ -1,6 +1,7 @@
import warnings import warnings
import pytest import pytest
from canaille.app.configuration import ConfigurationException from canaille.app.configuration import ConfigurationException
from canaille.app.configuration import validate from canaille.app.configuration import validate
from canaille.oidc.oauth import get_issuer from canaille.oidc.oauth import get_issuer

View file

@ -1,6 +1,7 @@
from unittest import mock from unittest import mock
from authlib.jose import jwt from authlib.jose import jwt
from canaille.app import models from canaille.app import models

View file

@ -1,4 +1,5 @@
from authlib.oidc.core.grants.util import generate_id_token from authlib.oidc.core.grants.util import generate_id_token
from canaille.oidc.oauth import generate_user_info from canaille.oidc.oauth import generate_user_info
from canaille.oidc.oauth import get_jwt_config from canaille.oidc.oauth import get_jwt_config

View file

@ -2,6 +2,7 @@ from urllib.parse import parse_qs
from urllib.parse import urlsplit from urllib.parse import urlsplit
from authlib.jose import jwt from authlib.jose import jwt
from canaille.app import models from canaille.app import models

View file

@ -2,6 +2,7 @@ from urllib.parse import parse_qs
from urllib.parse import urlsplit from urllib.parse import urlsplit
from authlib.jose import jwt from authlib.jose import jwt
from canaille.app import models from canaille.app import models

View file

@ -1,8 +1,9 @@
import datetime import datetime
from canaille.app import models
from werkzeug.security import gen_salt from werkzeug.security import gen_salt
from canaille.app import models
def test_no_logged_no_access(testclient): def test_no_logged_no_access(testclient):
testclient.get("/admin/token", status=403) testclient.get("/admin/token", status=403)

View file

@ -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 DEFAULT_JWT_MAPPING
from canaille.oidc.oauth import claims_from_scope
from canaille.oidc.oauth import generate_user_claims from canaille.oidc.oauth import generate_user_claims