diff --git a/tildes/tildes/json.py b/tildes/tildes/json.py index 7ec8a0b..7e0101b 100644 --- a/tildes/tildes/json.py +++ b/tildes/tildes/json.py @@ -11,7 +11,7 @@ from tildes.models import DatabaseModel from tildes.models.group import Group from tildes.models.topic import Topic from tildes.models.user import User -from tildes.schemas.context import TildesSchemaContext, TildesContext +from tildes.schemas.context import TildesSchemaContext, TildesSchemaContextDict def serialize_model(model_item: DatabaseModel, request: Request) -> dict: @@ -26,7 +26,7 @@ def serialize_model(model_item: DatabaseModel, request: Request) -> dict: def serialize_topic(topic: Topic, request: Request) -> dict: """Return serializable data for a Topic.""" - context: TildesContext = {} + context: TildesSchemaContextDict = {} if not request.has_permission("view_author", topic): context["hide_username"] = True diff --git a/tildes/tildes/resources/group.py b/tildes/tildes/resources/group.py index 5a4d8f6..e39447b 100644 --- a/tildes/tildes/resources/group.py +++ b/tildes/tildes/resources/group.py @@ -10,14 +10,14 @@ from sqlalchemy_utils import Ltree from tildes.models.group import Group, GroupWikiPage from tildes.resources import get_resource -from tildes.schemas.context import TildesSchemaContext, TildesContext +from tildes.schemas.context import TildesSchemaContext, TildesSchemaContextDict from tildes.schemas.group import GroupSchema from tildes.views.decorators import use_kwargs @use_kwargs( GroupSchema(only=("path",)), - context=TildesSchemaContext(TildesContext(fix_path_capitalization=True)), + context=TildesSchemaContext(TildesSchemaContextDict(fix_path_capitalization=True)), location="matchdict", ) def group_by_path(request: Request, path: str) -> Group: diff --git a/tildes/tildes/schemas/context.py b/tildes/tildes/schemas/context.py index 495d900..1064486 100644 --- a/tildes/tildes/schemas/context.py +++ b/tildes/tildes/schemas/context.py @@ -7,7 +7,7 @@ import typing from marshmallow.experimental.context import Context -class TildesContext(typing.TypedDict, total=False): +class TildesSchemaContextDict(typing.TypedDict, total=False): """Context for Tildes Marshmallow schemas. For convenience, we use one unified class instead of one per schema, @@ -27,4 +27,4 @@ class TildesContext(typing.TypedDict, total=False): fix_path_capitalization: bool -TildesSchemaContext = Context[TildesContext] +TildesSchemaContext = Context[TildesSchemaContextDict] diff --git a/tildes/tildes/schemas/group.py b/tildes/tildes/schemas/group.py index 0bd674e..cecfd91 100644 --- a/tildes/tildes/schemas/group.py +++ b/tildes/tildes/schemas/group.py @@ -12,7 +12,7 @@ from marshmallow.exceptions import ValidationError from marshmallow.fields import DateTime from marshmallow.types import UnknownOption -from tildes.schemas.context import TildesSchemaContext, TildesContext +from tildes.schemas.context import TildesSchemaContext, TildesSchemaContextDict from tildes.schemas.fields import Ltree, Markdown, SimpleString @@ -48,7 +48,7 @@ class GroupSchema(Schema): ) -> dict: """Prepare the path value before it's validated.""" # pylint: disable=unused-argument - if not TildesSchemaContext.get(default=TildesContext()).get( + if not TildesSchemaContext.get(default=TildesSchemaContextDict()).get( "fix_path_capitalization" ): return data diff --git a/tildes/tildes/schemas/user.py b/tildes/tildes/schemas/user.py index b1ca227..31bdc6f 100644 --- a/tildes/tildes/schemas/user.py +++ b/tildes/tildes/schemas/user.py @@ -13,7 +13,7 @@ from marshmallow.types import UnknownOption from marshmallow.validate import Length, Regexp from tildes.lib.password import is_breached_password -from tildes.schemas.context import TildesSchemaContext, TildesContext +from tildes.schemas.context import TildesSchemaContext, TildesSchemaContextDict from tildes.schemas.fields import Markdown @@ -65,7 +65,9 @@ class UserSchema(Schema): def anonymize_username(self, data: dict, many: bool) -> dict: """Hide the username if the dumping context specifies to do so.""" # pylint: disable=unused-argument - if not TildesSchemaContext.get(default=TildesContext()).get("hide_username"): + if not TildesSchemaContext.get(default=TildesSchemaContextDict()).get( + "hide_username" + ): return data if "username" not in data: @@ -104,7 +106,7 @@ class UserSchema(Schema): Requires check_breached_passwords be True in the schema's context. """ # pylint: disable=unused-argument - if not TildesSchemaContext.get(default=TildesContext()).get( + if not TildesSchemaContext.get(default=TildesSchemaContextDict()).get( "check_breached_passwords" ): return @@ -124,7 +126,7 @@ class UserSchema(Schema): Requires username_trim_whitespace be True in the schema's context. """ # pylint: disable=unused-argument - if not TildesSchemaContext.get(default=TildesContext()).get( + if not TildesSchemaContext.get(default=TildesSchemaContextDict()).get( "username_trim_whitespace" ): return data diff --git a/tildes/tildes/views/api/web/user.py b/tildes/tildes/views/api/web/user.py index a16a91a..c5aa2ee 100644 --- a/tildes/tildes/views/api/web/user.py +++ b/tildes/tildes/views/api/web/user.py @@ -23,7 +23,7 @@ from tildes.lib.datetime import SimpleHoursPeriod from tildes.lib.string import separate_string from tildes.models.log import Log from tildes.models.user import User, UserInviteCode -from tildes.schemas.context import TildesSchemaContext, TildesContext +from tildes.schemas.context import TildesSchemaContext, TildesSchemaContextDict from tildes.schemas.fields import Enum, ShortTimePeriod from tildes.schemas.topic import TopicSchema from tildes.schemas.user import UserSchema @@ -55,7 +55,7 @@ def patch_change_password( user = request.context # enable checking the new password against the breached-passwords list - context: TildesContext = {"check_breached_passwords": True} + context: TildesSchemaContextDict = {"check_breached_passwords": True} if new_password != new_password_confirm: raise HTTPUnprocessableEntity("New password and confirmation do not match.") diff --git a/tildes/tildes/views/decorators.py b/tildes/tildes/views/decorators.py index f79f2a1..bd4d880 100644 --- a/tildes/tildes/views/decorators.py +++ b/tildes/tildes/views/decorators.py @@ -15,7 +15,7 @@ from pyramid.request import Request from pyramid.view import view_config from webargs import pyramidparser -from tildes.schemas.context import TildesSchemaContext, TildesContext +from tildes.schemas.context import TildesSchemaContext, TildesSchemaContextDict def use_kwargs( @@ -35,7 +35,7 @@ def use_kwargs( almost always is, especially because of Intercooler). """ if context is None: - context = TildesSchemaContext(TildesContext()) + context = TildesSchemaContext(TildesSchemaContextDict()) with context: # convert a dict argmap to a Schema (the same way webargs would on its own) diff --git a/tildes/tildes/views/login.py b/tildes/tildes/views/login.py index ba42336..e7ce532 100644 --- a/tildes/tildes/views/login.py +++ b/tildes/tildes/views/login.py @@ -19,7 +19,7 @@ from tildes.enums import LogEventType from tildes.metrics import incr_counter from tildes.models.log import Log from tildes.models.user import User -from tildes.schemas.context import TildesSchemaContext, TildesContext +from tildes.schemas.context import TildesSchemaContext, TildesSchemaContextDict from tildes.schemas.user import UserSchema from tildes.views.decorators import not_logged_in, rate_limit_view, use_kwargs @@ -62,7 +62,7 @@ def finish_login(request: Request, user: User, redirect_url: str) -> HTTPFound: ) @use_kwargs( UserSchema(only=("username", "password")), - context=TildesSchemaContext(TildesContext(username_trim_whitespace=True)), + context=TildesSchemaContext(TildesSchemaContextDict(username_trim_whitespace=True)), location="form", ) @use_kwargs({"from_url": String(load_default="")}, location="form") diff --git a/tildes/tildes/views/register.py b/tildes/tildes/views/register.py index 527da50..d1d4e3b 100644 --- a/tildes/tildes/views/register.py +++ b/tildes/tildes/views/register.py @@ -15,7 +15,7 @@ from tildes.metrics import incr_counter from tildes.models.group import Group, GroupSubscription from tildes.models.log import Log from tildes.models.user import User, UserInviteCode -from tildes.schemas.context import TildesSchemaContext, TildesContext +from tildes.schemas.context import TildesSchemaContext, TildesSchemaContextDict from tildes.schemas.user import UserSchema from tildes.views.decorators import not_logged_in, rate_limit_view, use_kwargs @@ -36,7 +36,7 @@ def get_register(request: Request, code: str) -> dict: ) @use_kwargs( UserSchema(only=("username", "password")), - context=TildesSchemaContext(TildesContext(check_breached_passwords=True)), + context=TildesSchemaContext(TildesSchemaContextDict(check_breached_passwords=True)), location="form", ) @use_kwargs( diff --git a/tildes/tildes/views/settings.py b/tildes/tildes/views/settings.py index 42e0cdd..280e446 100644 --- a/tildes/tildes/views/settings.py +++ b/tildes/tildes/views/settings.py @@ -22,7 +22,7 @@ from tildes.models.comment import Comment, CommentLabel, CommentTree from tildes.models.group import Group from tildes.models.topic import Topic from tildes.models.user import User -from tildes.schemas.context import TildesContext, TildesSchemaContext +from tildes.schemas.context import TildesSchemaContextDict, TildesSchemaContext from tildes.schemas.user import ( BIO_MAX_LENGTH, EMAIL_ADDRESS_NOTE_MAX_LENGTH, @@ -152,7 +152,7 @@ def post_settings_password_change( ) -> Response: """Change the logged-in user's password.""" # enable checking the new password against the breached-passwords list - context: TildesContext = {"check_breached_passwords": True} + context: TildesSchemaContextDict = {"check_breached_passwords": True} if new_password != new_password_confirm: raise HTTPUnprocessableEntity("New password and confirmation do not match.")