Skip to content

Commit 7829134

Browse files
committed
[DOP-25282] Make User.email field optional
1 parent 9bc712b commit 7829134

File tree

9 files changed

+22
-33
lines changed

9 files changed

+22
-33
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ repos:
3939
- id: chmod
4040
args: ['644']
4141
exclude_types: [shell]
42-
exclude: ^(.*__main__\.py|syncmaster/server/scripts/export_openapi_schema\.py)$
42+
exclude: ^(.*__main__\.py|syncmaster/server/scripts/.*\.py)$
4343
- id: chmod
4444
args: ['755']
4545
types: [shell]
4646
- id: chmod
4747
args: ['755']
48-
files: ^(.*__main__\.py|syncmaster/server/scripts/export_openapi_schema\.py)$
48+
files: ^(.*__main__\.py|syncmaster/server/scripts/.*\.py)$
4949
- id: insert-license
5050
types: [python]
5151
exclude: ^(syncmaster/server/dependencies/stub.py|docs/.*\.py|tests/.*\.py)$

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ per-file-ignores = [
456456
# WPS102 Found incorrect module name pattern
457457
# WPS432 Found magic number: 256
458458
"*migrations/*.py:WPS102,WPS432",
459+
"*db/models/*.py:WPS102,WPS432",
459460
# WPS237 Found a too complex `f` string
460461
"*exceptions/*.py:WPS237",
461462
"*exceptions/__init__.py:F40,WPS410",

syncmaster/db/migrations/versions/2023-11-23_0001_create_user_table.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def upgrade():
2222
"user",
2323
sa.Column("id", sa.BigInteger(), nullable=False),
2424
sa.Column("username", sa.String(length=256), nullable=False),
25-
sa.Column("email", sa.String(length=256), nullable=False),
25+
sa.Column("email", sa.String(length=256), nullable=True),
2626
sa.Column("first_name", sa.String(length=256), nullable=True),
2727
sa.Column("last_name", sa.String(length=256), nullable=True),
2828
sa.Column("middle_name", sa.String(length=256), nullable=True),
@@ -32,7 +32,6 @@ def upgrade():
3232
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
3333
sa.Column("is_deleted", sa.Boolean(), nullable=False),
3434
sa.PrimaryKeyConstraint("id", name=op.f("pk__user")),
35-
sa.UniqueConstraint("email", name=op.f("uq__user__email")),
3635
)
3736
op.create_index(op.f("ix__user__username"), "user", ["username"], unique=True)
3837

syncmaster/db/models/user.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
class User(Base, TimestampMixin, DeletableMixin):
1313
id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
1414
username: Mapped[str] = mapped_column(String(256), nullable=False, unique=True, index=True)
15-
email: Mapped[str] = mapped_column(String(256), nullable=False, unique=True)
16-
first_name: Mapped[str] = mapped_column(String(256), nullable=True)
17-
last_name: Mapped[str] = mapped_column(String(256), nullable=True)
18-
middle_name: Mapped[str] = mapped_column(String(256), nullable=True)
15+
email: Mapped[str | None] = mapped_column(String(256), nullable=True)
16+
first_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
17+
last_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
18+
middle_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
1919
is_superuser: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
20-
is_active: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
20+
is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
2121

2222
def __repr__(self) -> str:
2323
return f"User(username={self.username}, is_superuser={self.is_superuser}, is_active={self.is_active})"

syncmaster/db/repositories/user.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ async def update(self, user_id: int, data: dict) -> User:
5858
async def create(
5959
self,
6060
username: str,
61-
email: str,
62-
is_active: bool,
61+
email: str | None = None,
6362
first_name: str | None = None,
6463
middle_name: str | None = None,
6564
last_name: str | None = None,
@@ -73,7 +72,6 @@ async def create(
7372
first_name=first_name,
7473
middle_name=middle_name,
7574
last_name=last_name,
76-
is_active=is_active,
7775
is_superuser=is_superuser,
7876
)
7977
.returning(User)

syncmaster/server/providers/auth/dummy_provider.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,7 @@ async def get_token_password_grant(
6262
try:
6363
user = await self._uow.user.read_by_username(login)
6464
except EntityNotFoundError:
65-
user = await self._uow.user.create(
66-
username=login,
67-
email=f"{login}@example.com",
68-
is_active=True,
69-
)
65+
user = await self._uow.user.create(username=login)
7066

7167
log.info("User with id %r found", user.id)
7268
if not user.is_active:

syncmaster/server/providers/auth/keycloak_provider.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ async def get_token_authorization_code_grant(
7272
except Exception as e:
7373
raise AuthorizationError("Failed to get token") from e
7474

75-
async def get_current_user(self, access_token: str, *args, **kwargs) -> Any:
75+
async def get_current_user(self, access_token: str, *args, **kwargs) -> Any: # noqa: WPS231
7676
request: Request = kwargs["request"]
7777
refresh_token = request.session.get("refresh_token")
7878

@@ -113,16 +113,12 @@ async def get_current_user(self, access_token: str, *args, **kwargs) -> Any:
113113
# these names are hardcoded in keycloak:
114114
# https://github.com/keycloak/keycloak/blob/3ca3a4ad349b4d457f6829eaf2ae05f1e01408be/core/src/main/java/org/keycloak/representations/IDToken.java
115115
# TODO: make sure which fields are guaranteed
116-
user_id = token_info.get("sub")
117116
login = token_info["preferred_username"]
118-
email = token_info["email"]
117+
email = token_info.get("email")
119118
first_name = token_info.get("given_name")
120119
middle_name = token_info.get("middle_name")
121120
last_name = token_info.get("family_name")
122121

123-
if not user_id:
124-
raise AuthorizationError("Invalid token payload")
125-
126122
async with self._uow:
127123
try:
128124
user = await self._uow.user.read_by_username(login)
@@ -133,7 +129,6 @@ async def get_current_user(self, access_token: str, *args, **kwargs) -> Any:
133129
first_name=first_name,
134130
middle_name=middle_name,
135131
last_name=last_name,
136-
is_active=True,
137132
)
138133
return user
139134

syncmaster/server/scripts/manage_superusers.py

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ async def add_superusers(session: AsyncSession, usernames: list[str]) -> None:
2929

3030
if not_found:
3131
for username in not_found:
32-
session.add(User(username=username, email=f"{username}@mts.ru", is_active=True, is_superuser=True))
32+
session.add(User(username=username, is_superuser=True))
3333
logging.info(" %r (new user)", username)
3434

3535
await session.commit()

tests/test_unit/utils.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ async def create_user_cm(
3535
is_active: bool = False,
3636
is_superuser: bool = False,
3737
is_deleted: bool = False,
38-
email: str = None,
39-
first_name: str = None,
40-
middle_name: str = None,
41-
last_name: str = None,
38+
email: str | None = None,
39+
first_name: str | None = None,
40+
middle_name: str | None = None,
41+
last_name: str | None = None,
4242
) -> AsyncGenerator[User, None]:
4343
email = email or f"{username}@user.user"
4444
first_name = first_name or f"{username}_first"
@@ -68,10 +68,10 @@ async def create_user(
6868
is_active: bool = False,
6969
is_superuser: bool = False,
7070
is_deleted: bool = False,
71-
email: str = None,
72-
first_name: str = None,
73-
middle_name: str = None,
74-
last_name: str = None,
71+
email: str | None = None,
72+
first_name: str | None = None,
73+
middle_name: str | None = None,
74+
last_name: str | None = None,
7575
) -> User:
7676
email = email or f"{username}@user.user"
7777
first_name = first_name or f"{username}_first"

0 commit comments

Comments
 (0)