Skip to content

Commit 77b88a0

Browse files
committed
add env_types array to userroles assignment
1 parent 69fe112 commit 77b88a0

6 files changed

Lines changed: 68 additions & 14 deletions

File tree

src/api/_util/role.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ async def clone_user_role_assignment(
2727
branch_id=target.id,
2828
role_id=assignment.role_id,
2929
user_id=assignment.user_id,
30-
env_type=assignment.env_type,
30+
env_types=assignment.env_types,
3131
)
3232
)
3333
await session.commit()

src/api/access_right_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ async def get_user_rights(session: AsyncSession, user_id: UUID, context: Permiss
5151
if context.branch_id is not None:
5252
stmt = stmt.where(RoleUserLink.branch_id == context.branch_id)
5353
if context.env_type is not None:
54-
stmt = stmt.where(RoleUserLink.env_type == context.env_type)
54+
stmt = stmt.where(RoleUserLink.env_types.contains([context.env_type]))
5555

5656
result = await session.execute(stmt)
5757
return list(result.scalars().all())

src/api/organization/role.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ async def list_role_assignments(
186186
branch_id=link.branch_id,
187187
role_id=link.role_id,
188188
user_id=link.user_id,
189-
env_type=link.env_type,
189+
env_types=link.env_types,
190190
)
191191
for link in result.scalars().all()
192192
]
@@ -286,9 +286,25 @@ async def assign_role(
286286
session.add(link)
287287
created_links.append(link)
288288

289-
for env_type in payload.env_types:
290-
link = RoleUserLink(organization_id=organization.id, role_id=role.id, user_id=user_id, env_type=env_type)
291-
session.add(link)
289+
if payload.env_types:
290+
stmt = select(RoleUserLink).where(
291+
RoleUserLink.organization_id == organization.id,
292+
RoleUserLink.role_id == role.id,
293+
RoleUserLink.user_id == user_id,
294+
)
295+
result = await session.execute(stmt)
296+
link = result.scalar_one_or_none()
297+
if link is None:
298+
link = RoleUserLink(
299+
organization_id=organization.id,
300+
role_id=role.id,
301+
user_id=user_id,
302+
env_types=payload.env_types,
303+
)
304+
session.add(link)
305+
else:
306+
existing = link.env_types or []
307+
link.env_types = list(dict.fromkeys(existing + payload.env_types))
292308
created_links.append(link)
293309

294310
for branch_id in payload.branch_ids:
@@ -309,7 +325,7 @@ async def assign_role(
309325
branch_id=link.branch_id,
310326
role_id=link.role_id,
311327
user_id=link.user_id,
312-
env_type=link.env_type,
328+
env_types=link.env_types,
313329
)
314330
for link in created_links
315331
]

src/api/user.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ async def list_user_roles(
118118
branch_id=row.branch_id,
119119
role_id=row.role_id,
120120
user_id=row.user_id,
121-
env_type=row.env_type,
121+
env_types=row.env_types,
122122
)
123123
for row in result.scalars().all()
124124
]
@@ -135,7 +135,7 @@ async def list_user_permissions(
135135
RoleUserLink.organization_id,
136136
RoleUserLink.project_id,
137137
RoleUserLink.branch_id,
138-
RoleUserLink.env_type,
138+
RoleUserLink.env_types,
139139
)
140140
.select_from(RoleUserLink)
141141
.join(Role, Role.id == RoleUserLink.role_id)
@@ -152,15 +152,15 @@ async def list_user_permissions(
152152
result = await session.execute(stmt)
153153

154154
def is_organization_level_permission(row):
155-
return row.project_id is None and row.branch_id is None and row.env_type is None
155+
return row.project_id is None and row.branch_id is None and not row.env_types
156156

157157
return [
158158
UserPermissionPublic(
159159
permission=row.entry,
160160
organization_id=row.organization_id if is_organization_level_permission(row) else None,
161161
project_id=row.project_id,
162162
branch_id=row.branch_id,
163-
env_type=row.env_type,
163+
env_types=row.env_types,
164164
)
165165
for row in result.all()
166166
]
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"""roleuserlink_env
2+
3+
Revision ID: 347a38e298e1
4+
Revises: 49c6c4bb94a2
5+
Create Date: 2026-01-07 15:51:27.330621
6+
7+
"""
8+
from typing import Sequence, Union
9+
10+
from alembic import op
11+
import sqlalchemy as sa
12+
import sqlmodel
13+
import sqlmodel.sql
14+
from sqlalchemy.dialects import postgresql
15+
16+
# revision identifiers, used by Alembic.
17+
revision: str = '347a38e298e1'
18+
down_revision: Union[str, Sequence[str], None] = '49c6c4bb94a2'
19+
branch_labels: Union[str, Sequence[str], None] = None
20+
depends_on: Union[str, Sequence[str], None] = None
21+
22+
23+
def upgrade() -> None:
24+
"""Upgrade schema."""
25+
# ### commands auto generated by Alembic - please adjust! ###
26+
op.add_column('roleuserlink', sa.Column('env_types', postgresql.ARRAY(sa.String()), nullable=True))
27+
op.drop_column('roleuserlink', 'env_type')
28+
# ### end Alembic commands ###
29+
30+
31+
def downgrade() -> None:
32+
"""Downgrade schema."""
33+
# ### commands auto generated by Alembic - please adjust! ###
34+
op.add_column('roleuserlink', sa.Column('env_type', sa.VARCHAR(), autoincrement=False, nullable=True))
35+
op.drop_column('roleuserlink', 'env_types')
36+
# ### end Alembic commands ###

src/models/role.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from uuid import UUID
44

55
from pydantic import BaseModel
6+
from sqlalchemy import Column, String
7+
from sqlalchemy.dialects.postgresql import ARRAY
68
from sqlalchemy.ext.asyncio import AsyncAttrs
79
from sqlmodel import Field, Relationship, SQLModel
810

@@ -102,7 +104,7 @@ class RoleUserLink(AsyncAttrs, SQLModel, table=True):
102104
organization_id: Identifier = Model.foreign_key_field("organization", nullable=False, primary_key=True)
103105
role_id: Identifier = Model.foreign_key_field("role", nullable=False, primary_key=True)
104106
user_id: UUID = Field(foreign_key="user.id", primary_key=True)
105-
env_type: str | None
107+
env_types: list[str] | None = Field(default=None, sa_column=Column(ARRAY(String), nullable=True))
106108
project_id: Identifier | None = Model.foreign_key_field("project", nullable=True)
107109
branch_id: Identifier | None = Model.foreign_key_field("branch", nullable=True)
108110

@@ -169,7 +171,7 @@ class RoleUserLinkPublic(BaseModel):
169171
branch_id: Identifier | None
170172
role_id: Identifier
171173
user_id: UUID
172-
env_type: str | None
174+
env_types: list[str] | None
173175

174176

175177
class RoleAssignmentPublic(BaseModel):
@@ -211,4 +213,4 @@ class UserPermissionPublic(BaseModel):
211213
organization_id: Identifier | None
212214
project_id: Identifier | None
213215
branch_id: Identifier | None
214-
env_type: str | None
216+
env_types: list[str] | None

0 commit comments

Comments
 (0)