This commit is contained in:
@@ -13,15 +13,15 @@ from sqlalchemy import (
|
||||
UniqueConstraint,
|
||||
distinct,
|
||||
func,
|
||||
text,
|
||||
)
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
from auth.orm import Author
|
||||
from orm.base import BaseModel
|
||||
from orm.shout import Shout
|
||||
from services.db import local_session
|
||||
from auth.rbac_interface import get_rbac_operations
|
||||
from rbac.interface import get_rbac_operations
|
||||
from storage.db import local_session
|
||||
|
||||
# Словарь названий ролей
|
||||
role_names = {
|
||||
@@ -355,7 +355,13 @@ class CommunityStats:
|
||||
|
||||
@property
|
||||
def shouts(self) -> int:
|
||||
return self.community.session.query(func.count(Shout.id)).filter(Shout.community == self.community.id).scalar()
|
||||
return (
|
||||
self.community.session.query(func.count(1))
|
||||
.select_from(text("shout"))
|
||||
.filter(text("shout.community_id = :community_id"))
|
||||
.params(community_id=self.community.id)
|
||||
.scalar()
|
||||
)
|
||||
|
||||
@property
|
||||
def followers(self) -> int:
|
||||
@@ -370,12 +376,10 @@ class CommunityStats:
|
||||
# author has a shout with community id and its featured_at is not null
|
||||
return (
|
||||
self.community.session.query(func.count(distinct(Author.id)))
|
||||
.join(Shout)
|
||||
.filter(
|
||||
Shout.community == self.community.id,
|
||||
Shout.featured_at.is_not(None),
|
||||
Author.id.in_(Shout.authors),
|
||||
)
|
||||
.select_from(text("author"))
|
||||
.join(text("shout"), text("author.id IN (SELECT author_id FROM shout_author WHERE shout_id = shout.id)"))
|
||||
.filter(text("shout.community_id = :community_id"), text("shout.featured_at IS NOT NULL"))
|
||||
.params(community_id=self.community.id)
|
||||
.scalar()
|
||||
)
|
||||
|
||||
@@ -498,7 +502,7 @@ class CommunityAuthor(BaseModel):
|
||||
# Используем fallback на проверку ролей
|
||||
return permission in self.role_list
|
||||
except Exception:
|
||||
# FIXME: Fallback: проверяем роли (старый способ)
|
||||
# TODO: Fallback: проверяем роли (старый способ)
|
||||
return any(permission == role for role in self.role_list)
|
||||
|
||||
def dict(self, access: bool = False) -> dict[str, Any]:
|
||||
|
||||
@@ -8,6 +8,7 @@ from auth.orm import Author
|
||||
from orm.base import BaseModel as Base
|
||||
from orm.topic import Topic
|
||||
|
||||
|
||||
# Author уже импортирован в начале файла
|
||||
def get_author_model():
|
||||
"""Возвращает модель Author для использования в запросах"""
|
||||
|
||||
@@ -10,6 +10,7 @@ from auth.orm import Author
|
||||
from orm.base import BaseModel as Base
|
||||
from utils.logger import root_logger as logger
|
||||
|
||||
|
||||
# Author уже импортирован в начале файла
|
||||
def get_author_model():
|
||||
"""Возвращает модель Author для использования в запросах"""
|
||||
|
||||
@@ -7,6 +7,7 @@ from sqlalchemy.orm import Mapped, mapped_column
|
||||
from auth.orm import Author
|
||||
from orm.base import BaseModel as Base
|
||||
|
||||
|
||||
# Author уже импортирован в начале файла
|
||||
def get_author_model():
|
||||
"""Возвращает модель Author для использования в запросах"""
|
||||
|
||||
19
orm/shout.py
19
orm/shout.py
@@ -4,19 +4,10 @@ from typing import Any
|
||||
from sqlalchemy import JSON, Boolean, ForeignKey, Index, Integer, PrimaryKeyConstraint, String
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
# Импорт Author отложен для избежания циклических импортов
|
||||
from auth.orm import Author
|
||||
from orm.base import BaseModel as Base
|
||||
from orm.reaction import Reaction
|
||||
from orm.topic import Topic
|
||||
|
||||
# Author уже импортирован в начале файла
|
||||
def get_author_model():
|
||||
"""Возвращает модель Author для использования в запросах"""
|
||||
return Author
|
||||
from orm.base import BaseModel
|
||||
|
||||
|
||||
class ShoutTopic(Base):
|
||||
class ShoutTopic(BaseModel):
|
||||
"""
|
||||
Связь между публикацией и темой.
|
||||
|
||||
@@ -40,7 +31,7 @@ class ShoutTopic(Base):
|
||||
)
|
||||
|
||||
|
||||
class ShoutReactionsFollower(Base):
|
||||
class ShoutReactionsFollower(BaseModel):
|
||||
__tablename__ = "shout_reactions_followers"
|
||||
|
||||
follower: Mapped[int] = mapped_column(ForeignKey("author.id"), index=True)
|
||||
@@ -57,7 +48,7 @@ class ShoutReactionsFollower(Base):
|
||||
)
|
||||
|
||||
|
||||
class ShoutAuthor(Base):
|
||||
class ShoutAuthor(BaseModel):
|
||||
"""
|
||||
Связь между публикацией и автором.
|
||||
|
||||
@@ -81,7 +72,7 @@ class ShoutAuthor(Base):
|
||||
)
|
||||
|
||||
|
||||
class Shout(Base):
|
||||
class Shout(BaseModel):
|
||||
"""
|
||||
Публикация в системе.
|
||||
"""
|
||||
|
||||
@@ -14,6 +14,7 @@ from sqlalchemy.orm import Mapped, mapped_column
|
||||
from auth.orm import Author
|
||||
from orm.base import BaseModel as Base
|
||||
|
||||
|
||||
# Author уже импортирован в начале файла
|
||||
def get_author_model():
|
||||
"""Возвращает модель Author для использования в запросах"""
|
||||
|
||||
Reference in New Issue
Block a user