settings_type: Extract new module for types used in settings.

This breaks an import cycle that prevented django-stubs from inferring
types for django.conf.settings.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2022-09-23 21:44:08 -07:00 committed by Tim Abbott
parent 106b19ea42
commit 02be415122
6 changed files with 51 additions and 52 deletions

View File

@ -76,34 +76,6 @@ class LinkifierDict(TypedDict):
id: int id: int
class SAMLIdPConfigDict(TypedDict, total=False):
entity_id: str
url: str
slo_url: str
attr_user_permanent_id: str
attr_first_name: str
attr_last_name: str
attr_username: str
attr_email: str
attr_org_membership: str
auto_signup: bool
display_name: str
display_icon: str
limit_to_subdomains: List[str]
extra_attrs: List[str]
x509cert: str
x509cert_path: str
class OIDCIdPConfigDict(TypedDict, total=False):
oidc_url: str
display_name: str
display_icon: Optional[str]
client_id: str
secret: Optional[str]
auto_signup: bool
class UnspecifiedValue: class UnspecifiedValue:
"""In most API endpoints, we use a default value of `None"` to encode """In most API endpoints, we use a default value of `None"` to encode
parameters that the client did not pass, which is nicely Pythonic. parameters that the client did not pass, which is nicely Pythonic.
@ -317,9 +289,3 @@ class RealmPlaygroundDict(TypedDict):
name: str name: str
pygments_language: str pygments_language: str
url_prefix: str url_prefix: str
class SCIMConfigDict(TypedDict):
bearer_token: str
scim_client_name: str
name_formatted_included: bool

View File

@ -86,7 +86,7 @@ from zerver.lib.redis_utils import get_dict_from_redis, get_redis_client, put_di
from zerver.lib.request import RequestNotes from zerver.lib.request import RequestNotes
from zerver.lib.sessions import delete_user_sessions from zerver.lib.sessions import delete_user_sessions
from zerver.lib.subdomains import get_subdomain from zerver.lib.subdomains import get_subdomain
from zerver.lib.types import OIDCIdPConfigDict, ProfileDataElementUpdateDict from zerver.lib.types import ProfileDataElementUpdateDict
from zerver.lib.url_encoding import append_url_query_string from zerver.lib.url_encoding import append_url_query_string
from zerver.lib.users import check_full_name, validate_user_custom_profile_field from zerver.lib.users import check_full_name, validate_user_custom_profile_field
from zerver.models import ( from zerver.models import (
@ -105,6 +105,7 @@ from zerver.models import (
remote_user_to_email, remote_user_to_email,
supported_auth_backends, supported_auth_backends,
) )
from zproject.settings_types import OIDCIdPConfigDict
redis_client = get_redis_client() redis_client = get_redis_client()

View File

@ -1,16 +1,15 @@
import os import os
from email.headerregistry import Address from email.headerregistry import Address
from typing import TYPE_CHECKING, Any, Dict, List, Optional, TypedDict from typing import TYPE_CHECKING, Any, Dict, List, Optional
from scripts.lib.zulip_tools import deport from scripts.lib.zulip_tools import deport
from zproject.settings_types import JwtAuthKey, OIDCIdPConfigDict, SAMLIdPConfigDict
from .config import DEVELOPMENT, PRODUCTION, get_secret from .config import DEVELOPMENT, PRODUCTION, get_secret
if TYPE_CHECKING: if TYPE_CHECKING:
from django_auth_ldap.config import LDAPSearch from django_auth_ldap.config import LDAPSearch
from zerver.lib.types import OIDCIdPConfigDict, SAMLIdPConfigDict
if PRODUCTION: if PRODUCTION:
from .prod_settings import EXTERNAL_HOST, ZULIP_ADMINISTRATOR from .prod_settings import EXTERNAL_HOST, ZULIP_ADMINISTRATOR
else: else:
@ -85,7 +84,7 @@ SOCIAL_AUTH_SAML_SP_PRIVATE_KEY = ""
SOCIAL_AUTH_SAML_ORG_INFO: Optional[Dict[str, Dict[str, str]]] = None SOCIAL_AUTH_SAML_ORG_INFO: Optional[Dict[str, Dict[str, str]]] = None
SOCIAL_AUTH_SAML_TECHNICAL_CONTACT: Optional[Dict[str, str]] = None SOCIAL_AUTH_SAML_TECHNICAL_CONTACT: Optional[Dict[str, str]] = None
SOCIAL_AUTH_SAML_SUPPORT_CONTACT: Optional[Dict[str, str]] = None SOCIAL_AUTH_SAML_SUPPORT_CONTACT: Optional[Dict[str, str]] = None
SOCIAL_AUTH_SAML_ENABLED_IDPS: Dict[str, "SAMLIdPConfigDict"] = {} SOCIAL_AUTH_SAML_ENABLED_IDPS: Dict[str, SAMLIdPConfigDict] = {}
SOCIAL_AUTH_SAML_SECURITY_CONFIG: Dict[str, Any] = {} SOCIAL_AUTH_SAML_SECURITY_CONFIG: Dict[str, Any] = {}
# Set this to True to enforce that any configured IdP needs to specify # Set this to True to enforce that any configured IdP needs to specify
# the limit_to_subdomains setting to be considered valid: # the limit_to_subdomains setting to be considered valid:
@ -102,7 +101,7 @@ SOCIAL_AUTH_APPLE_SCOPE = ["name", "email"]
SOCIAL_AUTH_APPLE_EMAIL_AS_USERNAME = True SOCIAL_AUTH_APPLE_EMAIL_AS_USERNAME = True
# Generic OpenID Connect: # Generic OpenID Connect:
SOCIAL_AUTH_OIDC_ENABLED_IDPS: Dict[str, "OIDCIdPConfigDict"] = {} SOCIAL_AUTH_OIDC_ENABLED_IDPS: Dict[str, OIDCIdPConfigDict] = {}
SOCIAL_AUTH_OIDC_FULL_NAME_VALIDATED = False SOCIAL_AUTH_OIDC_FULL_NAME_VALIDATED = False
SOCIAL_AUTH_SYNC_CUSTOM_ATTRS_DICT: Dict[str, Dict[str, Dict[str, str]]] = {} SOCIAL_AUTH_SYNC_CUSTOM_ATTRS_DICT: Dict[str, Dict[str, Dict[str, str]]] = {}
@ -374,16 +373,7 @@ TERMS_OF_SERVICE_MESSAGE: Optional[str] = None
STATSD_HOST = "" STATSD_HOST = ""
# Configuration for JWT auth. # Configuration for JWT auth.
if TYPE_CHECKING: JWT_AUTH_KEYS: Dict[str, JwtAuthKey] = {}
class JwtAuthKey(TypedDict):
key: str
# See https://pyjwt.readthedocs.io/en/latest/algorithms.html for a list
# of supported algorithms.
algorithms: List[str]
JWT_AUTH_KEYS: Dict[str, "JwtAuthKey"] = {}
# https://docs.djangoproject.com/en/3.2/ref/settings/#std:setting-SERVER_EMAIL # https://docs.djangoproject.com/en/3.2/ref/settings/#std:setting-SERVER_EMAIL
# Django setting for what from address to use in error emails. # Django setting for what from address to use in error emails.

View File

@ -3,7 +3,7 @@ import pwd
from typing import Dict, Optional, Set, Tuple from typing import Dict, Optional, Set, Tuple
from scripts.lib.zulip_tools import deport from scripts.lib.zulip_tools import deport
from zerver.lib.types import SCIMConfigDict from zproject.settings_types import SCIMConfigDict
ZULIP_ADMINISTRATOR = "desdemona+admin@zulip.com" ZULIP_ADMINISTRATOR = "desdemona+admin@zulip.com"

View File

@ -0,0 +1,42 @@
from typing import List, Optional, TypedDict
class JwtAuthKey(TypedDict):
key: str
# See https://pyjwt.readthedocs.io/en/latest/algorithms.html for a list
# of supported algorithms.
algorithms: List[str]
class SAMLIdPConfigDict(TypedDict, total=False):
entity_id: str
url: str
slo_url: str
attr_user_permanent_id: str
attr_first_name: str
attr_last_name: str
attr_username: str
attr_email: str
attr_org_membership: str
auto_signup: bool
display_name: str
display_icon: str
limit_to_subdomains: List[str]
extra_attrs: List[str]
x509cert: str
x509cert_path: str
class OIDCIdPConfigDict(TypedDict, total=False):
oidc_url: str
display_name: str
display_icon: Optional[str]
client_id: str
secret: Optional[str]
auto_signup: bool
class SCIMConfigDict(TypedDict):
bearer_token: str
scim_client_name: str
name_formatted_included: bool

View File

@ -5,7 +5,7 @@ import ldap
from django_auth_ldap.config import LDAPSearch from django_auth_ldap.config import LDAPSearch
from zerver.lib.db import TimeTrackingConnection, TimeTrackingCursor from zerver.lib.db import TimeTrackingConnection, TimeTrackingCursor
from zerver.lib.types import OIDCIdPConfigDict, SAMLIdPConfigDict, SCIMConfigDict from zproject.settings_types import OIDCIdPConfigDict, SAMLIdPConfigDict, SCIMConfigDict
from .config import DEPLOY_ROOT, get_from_file_if_exists from .config import DEPLOY_ROOT, get_from_file_if_exists
from .settings import ( from .settings import (