Untitled

 avatar
4ae4d
plain_text
3 months ago
7.5 kB
5
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