refactor: add some typing to models

This commit is contained in:
Éloi Rivard 2024-04-07 16:39:05 +02:00
parent 1fbb074cc5
commit b6c59b3eda
No known key found for this signature in database
GPG key ID: 7EDA204EA57DD184
3 changed files with 25 additions and 15 deletions

View file

@ -2,6 +2,8 @@ import copy
import datetime import datetime
import typing import typing
import uuid import uuid
from typing import ClassVar
from typing import Dict
import canaille.core.models import canaille.core.models
import canaille.oidc.models import canaille.oidc.models
@ -239,8 +241,8 @@ class MemoryModel(BackendModel):
class User(canaille.core.models.User, MemoryModel): class User(canaille.core.models.User, MemoryModel):
identifier_attribute = "user_name" identifier_attribute: ClassVar[str] = "user_name"
model_attributes = { model_attributes: ClassVar[Dict[str, str]] = {
"groups": ("Group", "members"), "groups": ("Group", "members"),
} }
@ -266,30 +268,30 @@ class User(canaille.core.models.User, MemoryModel):
class Group(canaille.core.models.Group, MemoryModel): class Group(canaille.core.models.Group, MemoryModel):
model_attributes = { model_attributes: ClassVar[Dict[str, str]] = {
"members": ("User", "groups"), "members": ("User", "groups"),
} }
identifier_attribute = "display_name" identifier_attribute: ClassVar[str] = "display_name"
class Client(canaille.oidc.models.Client, MemoryModel): class Client(canaille.oidc.models.Client, MemoryModel):
identifier_attribute = "client_id" identifier_attribute: ClassVar[str] = "client_id"
model_attributes = { model_attributes: ClassVar[Dict[str, str]] = {
"audience": ("Client", None), "audience": ("Client", None),
} }
class AuthorizationCode(canaille.oidc.models.AuthorizationCode, MemoryModel): class AuthorizationCode(canaille.oidc.models.AuthorizationCode, MemoryModel):
identifier_attribute = "authorization_code_id" identifier_attribute: ClassVar[str] = "authorization_code_id"
model_attributes = { model_attributes: ClassVar[Dict[str, str]] = {
"client": ("Client", None), "client": ("Client", None),
"subject": ("User", None), "subject": ("User", None),
} }
class Token(canaille.oidc.models.Token, MemoryModel): class Token(canaille.oidc.models.Token, MemoryModel):
identifier_attribute = "token_id" identifier_attribute: ClassVar[str] = "token_id"
model_attributes = { model_attributes: ClassVar[Dict[str, str]] = {
"client": ("Client", None), "client": ("Client", None),
"subject": ("User", None), "subject": ("User", None),
"audience": ("Client", None), "audience": ("Client", None),
@ -297,8 +299,8 @@ class Token(canaille.oidc.models.Token, MemoryModel):
class Consent(canaille.oidc.models.Consent, MemoryModel): class Consent(canaille.oidc.models.Consent, MemoryModel):
identifier_attribute = "consent_id" identifier_attribute: ClassVar[str] = "consent_id"
model_attributes = { model_attributes: ClassVar[Dict[str, str]] = {
"client": ("Client", None), "client": ("Client", None),
"subject": ("User", None), "subject": ("User", None),
} }

View file

@ -46,13 +46,19 @@ class Model:
@classproperty @classproperty
def attributes(cls): def attributes(cls):
return ChainMap( annotations = ChainMap(
*( *(
typing.get_type_hints(klass) typing.get_type_hints(klass)
for klass in reversed(cls.__mro__) for klass in reversed(cls.__mro__)
if issubclass(klass, Model) if issubclass(klass, Model)
) )
) )
# only keep types that are not typing.ClassVar
return {
key: value
for key, value in annotations.items()
if typing.get_origin(value) is not typing.ClassVar
}
class BackendModel: class BackendModel:

View file

@ -1,4 +1,6 @@
import datetime import datetime
from typing import ClassVar
from typing import List
from authlib.oauth2.rfc6749 import AuthorizationCodeMixin from authlib.oauth2.rfc6749 import AuthorizationCodeMixin
from authlib.oauth2.rfc6749 import ClientMixin from authlib.oauth2.rfc6749 import ClientMixin
@ -14,14 +16,14 @@ from .basemodels import Token as BaseToken
class Client(BaseClient, ClientMixin): class Client(BaseClient, ClientMixin):
client_info_attributes = [ client_info_attributes: ClassVar[List[str]] = [
"client_id", "client_id",
"client_secret", "client_secret",
"client_id_issued_at", "client_id_issued_at",
"client_secret_expires_at", "client_secret_expires_at",
] ]
client_metadata_attributes = [ client_metadata_attributes: ClassVar[List[str]] = [
"client_name", "client_name",
"contacts", "contacts",
"client_uri", "client_uri",