Untitled
4ae4d
plain_text
3 months ago
7.5 kB
4
Indexable
diff --git a/src/backend/app/db/models/territorial_bank.py b/src/backend/app/db/models/territorial_bank.py
index 4b70c44..e2d0728 100644
--- a/src/backend/app/db/models/territorial_bank.py
+++ b/src/backend/app/db/models/territorial_bank.py
@@ -10,6 +10,7 @@ from .base import Model
if TYPE_CHECKING:
from .gosb import Gosb
from .project import Project
+ from .user import User
class TerritorialBank(Model):
@@ -20,3 +21,4 @@ class TerritorialBank(Model):
gosb_list: Mapped[list[Gosb]] = relationship(back_populates="territorial_bank")
projects: Mapped[list[Project]] = relationship(back_populates="territorial_bank")
+ users: Mapped[list[User]] = relationship(back_populates="territorial_bank")
diff --git a/src/backend/app/db/models/user.py b/src/backend/app/db/models/user.py
index 26aeefe..1e45694 100644
--- a/src/backend/app/db/models/user.py
+++ b/src/backend/app/db/models/user.py
@@ -15,6 +15,7 @@ if TYPE_CHECKING:
from .participation import Participation
from .project import Project
from .request import Request
+ from .territorial_bank import TerritorialBank
from .user_tag import UserTag
@@ -27,9 +28,14 @@ class User(Model):
role: Mapped[str] = mapped_column(Text, default=RoleType.user.value)
points: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
city_id: Mapped[UUID | None] = mapped_column(ForeignKey("cities.id"), nullable=True)
+ territorial_bank_id: Mapped[UUID | None] = mapped_column(
+ ForeignKey("territorial_bank"),
+ nullable=True,
+ )
# Relationships
city: Mapped["City"] = relationship(back_populates="users")
+ territorial_bank: Mapped["TerritorialBank | None"] = relationship(back_populates="users")
custom_tags: Mapped[list["CustomTag"]] = relationship(
back_populates="user", cascade="all, delete-orphan", uselist=True
)
@@ -69,6 +75,9 @@ class User(Model):
"employee_number": self.employee_number,
"points": self.points,
"city_id": str(self.city_id) if self.city_id else None,
+ "territorial_bank_id": (
+ str(self.territorial_bank_id) if self.territorial_bank_id else None
+ ),
"created_at": self.created_at.isoformat() if self.created_at else None,
"updated_at": self.updated_at.isoformat() if self.updated_at else None,
}
diff --git a/src/backend/app/policy/event_access.py b/src/backend/app/policy/event_access.py
index 926eb1e..2ca297d 100644
--- a/src/backend/app/policy/event_access.py
+++ b/src/backend/app/policy/event_access.py
@@ -3,6 +3,20 @@ from __future__ import annotations
from ..db.models import Event, User
+def _role_value(role: object) -> str | None:
+ if role is None:
+ return None
+ return str(getattr(role, "value", role))
+
+
+def _user_tb_id(user: User | None) -> str | None:
+ if user is None:
+ return None
+
+ tb_id = getattr(user, "territorial_bank_id", None)
+ return str(tb_id) if tb_id is not None else None
+
+
def _event_tb_id(event: Event | None) -> str | None:
if event is None:
return None
@@ -15,19 +29,12 @@ def _event_tb_id(event: Event | None) -> str | None:
return str(tb_id) if tb_id is not None else None
-def _role_value(role: object) -> str | None:
- if role is None:
- return None
- return str(getattr(role, "value", role))
-
-
def is_in_tb_scope(user: User | None, event: Event | None) -> bool:
"""
- читаем event -> gosb -> tb и сравниваем с tb юзера в случае, если он модератор
- совпадает -> true
- иначе -> false
-
- пока что заглушка, поскольку не реализована привязка tb <-> moderator
+ читаем [event -> gosb -> tb] и сравниваем с tb юзера в случае, если он модератор
+ достали None -> false
+ иначе, не совпадает -> false
+ иначе -> true
"""
if user is None or event is None:
return False
@@ -35,10 +42,13 @@ def is_in_tb_scope(user: User | None, event: Event | None) -> bool:
if not is_moderator(user):
return False
- if _event_tb_id(event) is None:
+ user_tb_id = _user_tb_id(user)
+ event_tb_id = _event_tb_id(event)
+
+ if user_tb_id is None or event_tb_id is None:
return False
- return False # TODO вернуть: является ли пользователь модератором в _event_tb_id
+ return user_tb_id == event_tb_id
def is_admin(user: User | None) -> bool:
diff --git a/src/backend/app/repositories/event.py b/src/backend/app/repositories/event.py
index 8a233dc..6135b3f 100644
--- a/src/backend/app/repositories/event.py
+++ b/src/backend/app/repositories/event.py
@@ -20,7 +20,7 @@ class EventRepository(SQLRepository):
.options(selectinload(self.model.app_tag_events).selectinload(AppTagEvent.app_tag))
.options(selectinload(self.model.gosb).selectinload("territorial_bank"))
.options(selectinload(self.model.event_organizers))
- .options("territorial_bank")
+ .options(selectinload(self.model.creator))
)
def _base_city_events_query(self, city_id: UUID):
diff --git a/src/backend/app/repositories/user.py b/src/backend/app/repositories/user.py
index 20bd13a..84fba8e 100644
--- a/src/backend/app/repositories/user.py
+++ b/src/backend/app/repositories/user.py
@@ -15,6 +15,7 @@ class UserRepository(SQLRepository):
select(self.model)
.options(
selectinload(self.model.city),
+ selectinload(self.model.territorial_bank),
selectinload(self.model.user_tags).selectinload(UserTag.app_tag),
selectinload(self.model.custom_tags),
selectinload(self.model.participations)
diff --git a/src/backend/app/schemas/user.py b/src/backend/app/schemas/user.py
index 4302c0f..ee60355 100644
--- a/src/backend/app/schemas/user.py
+++ b/src/backend/app/schemas/user.py
@@ -24,6 +24,7 @@ class BaseUser(BaseModel):
role: RoleType
points: int
city_id: UUID
+ territorial_bank_id: UUID | None = None
class RequestUserSchema(BaseUser):
@@ -39,6 +40,7 @@ class ResponseUserSchema(TimestampSchema):
role: RoleType
points: int
city_id: UUID | None = None
+ territorial_bank_id: UUID | None = None
class UpdateUserSchema(BaseModel, UpdateValidator):
@@ -46,6 +48,7 @@ class UpdateUserSchema(BaseModel, UpdateValidator):
role: RoleType | None = None
points: ChangeOnDelta | None = None
city_id: UUID | None = None
+ territorial_bank_id: UUID | None = None
class ResponseDetailUserSchema(BaseUser, TimestampSchema):
diff --git a/src/backend/app/services/user.py b/src/backend/app/services/user.py
index 25cb608..cd85da4 100644
--- a/src/backend/app/services/user.py
+++ b/src/backend/app/services/user.py
@@ -38,6 +38,9 @@ class UserService:
async with self.administrator.start() as administrator:
current_user = await self.get_user_by_messenger_id(id)
+ if "role" in data and data["role"] is not None:
+ data["role"] = data["role"].value
+
if "points" in data:
delta = data["points"]["delta"]
if current_user.points + delta < 0:
Editor is loading...
Leave a Comment