forked from Github-Mirrors/canaille
chore: use isort instead of reoder-python-imports
This commit is contained in:
parent
bd57d69765
commit
4edffcaa9f
70 changed files with 207 additions and 154 deletions
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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__))
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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__)
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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 _
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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]
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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"]
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from canaille.backends.memory.backend import Backend
|
from canaille.backends.memory.backend import Backend
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from canaille.backends.sql.backend import Backend
|
from canaille.backends.sql.backend import Backend
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from canaille.backends import BaseBackend
|
from canaille.backends import BaseBackend
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue