This commit is contained in:
parent
d88f905609
commit
3247a3674f
|
@ -16,7 +16,7 @@ from utils.logger import root_logger as logger
|
||||||
def apply_options(q, options, reactions_created_by=0):
|
def apply_options(q, options, reactions_created_by=0):
|
||||||
"""
|
"""
|
||||||
Применяет опции фильтрации и сортировки
|
Применяет опции фильтрации и сортировки
|
||||||
[опционально] выбирая те публикации, на которые есть реакции от указанного автора
|
[опционально] выбирая те публикации, на которые есть реакции/комментарии от указанного автора
|
||||||
|
|
||||||
:param q: Исходный запрос.
|
:param q: Исходный запрос.
|
||||||
:param options: Опции фильтрации и сортировки.
|
:param options: Опции фильтрации и сортировки.
|
||||||
|
@ -27,16 +27,10 @@ def apply_options(q, options, reactions_created_by=0):
|
||||||
if isinstance(filters, dict):
|
if isinstance(filters, dict):
|
||||||
q = apply_filters(q, filters)
|
q = apply_filters(q, filters)
|
||||||
if reactions_created_by:
|
if reactions_created_by:
|
||||||
if "reacted" in filters or "commented" in filters:
|
|
||||||
commented = filters.get("commented")
|
|
||||||
reacted = filters.get("reacted") or commented
|
|
||||||
q = q.join(Reaction, Reaction.shout == Shout.id)
|
q = q.join(Reaction, Reaction.shout == Shout.id)
|
||||||
if commented:
|
|
||||||
q = q.filter(Reaction.body.is_not(None))
|
|
||||||
if reacted:
|
|
||||||
q = q.filter(Reaction.created_by == reactions_created_by)
|
q = q.filter(Reaction.created_by == reactions_created_by)
|
||||||
else:
|
if "commented" in filters:
|
||||||
q = q.filter(Reaction.created_by != reactions_created_by)
|
q = q.filter(Reaction.body.is_not(None))
|
||||||
q = apply_sorting(q, options)
|
q = apply_sorting(q, options)
|
||||||
limit = options.get("limit", 10)
|
limit = options.get("limit", 10)
|
||||||
offset = options.get("offset", 0)
|
offset = options.get("offset", 0)
|
||||||
|
@ -98,7 +92,6 @@ def shouts_by_follower(info, follower_id: int, options):
|
||||||
reader_followed_authors = select(AuthorFollower.author).where(AuthorFollower.follower == follower_id)
|
reader_followed_authors = select(AuthorFollower.author).where(AuthorFollower.follower == follower_id)
|
||||||
reader_followed_topics = select(TopicFollower.topic).where(TopicFollower.follower == follower_id)
|
reader_followed_topics = select(TopicFollower.topic).where(TopicFollower.follower == follower_id)
|
||||||
reader_followed_shouts = select(ShoutReactionsFollower.shout).where(ShoutReactionsFollower.follower == follower_id)
|
reader_followed_shouts = select(ShoutReactionsFollower.shout).where(ShoutReactionsFollower.follower == follower_id)
|
||||||
|
|
||||||
followed_subquery = (
|
followed_subquery = (
|
||||||
select(Shout.id)
|
select(Shout.id)
|
||||||
.join(ShoutAuthor, ShoutAuthor.shout == Shout.id)
|
.join(ShoutAuthor, ShoutAuthor.shout == Shout.id)
|
||||||
|
@ -108,6 +101,7 @@ def shouts_by_follower(info, follower_id: int, options):
|
||||||
| ShoutTopic.topic.in_(reader_followed_topics)
|
| ShoutTopic.topic.in_(reader_followed_topics)
|
||||||
| Shout.id.in_(reader_followed_shouts)
|
| Shout.id.in_(reader_followed_shouts)
|
||||||
)
|
)
|
||||||
|
.scalar_subquery()
|
||||||
)
|
)
|
||||||
q = q.filter(Shout.id.in_(followed_subquery))
|
q = q.filter(Shout.id.in_(followed_subquery))
|
||||||
q, limit, offset = apply_options(q, options)
|
q, limit, offset = apply_options(q, options)
|
||||||
|
@ -152,6 +146,11 @@ async def load_shouts_feed(_, info, options) -> List[Shout]:
|
||||||
async def load_shouts_authored_by(_, info, slug: str, options) -> List[Shout]:
|
async def load_shouts_authored_by(_, info, slug: str, options) -> List[Shout]:
|
||||||
"""
|
"""
|
||||||
Загружает публикации, написанные автором по slug.
|
Загружает публикации, написанные автором по slug.
|
||||||
|
|
||||||
|
:param info: Информация о контексте GraphQL.
|
||||||
|
:param slug: Slug автора.
|
||||||
|
:param options: Опции фильтрации и сортировки.
|
||||||
|
:return: Список публикаций.
|
||||||
"""
|
"""
|
||||||
with local_session() as session:
|
with local_session() as session:
|
||||||
author = session.query(Author).filter(Author.slug == slug).first()
|
author = session.query(Author).filter(Author.slug == slug).first()
|
||||||
|
@ -176,6 +175,11 @@ async def load_shouts_authored_by(_, info, slug: str, options) -> List[Shout]:
|
||||||
async def load_shouts_with_topic(_, info, slug: str, options) -> List[Shout]:
|
async def load_shouts_with_topic(_, info, slug: str, options) -> List[Shout]:
|
||||||
"""
|
"""
|
||||||
Загружает публикации, связанные с темой по slug.
|
Загружает публикации, связанные с темой по slug.
|
||||||
|
|
||||||
|
:param info: Информация о контексте GraphQL.
|
||||||
|
:param slug: Slug темы.
|
||||||
|
:param options: Опции фильтрации и сортировки.
|
||||||
|
:return: Список публикаций.
|
||||||
"""
|
"""
|
||||||
with local_session() as session:
|
with local_session() as session:
|
||||||
topic = session.query(Topic).filter(Topic.slug == slug).first()
|
topic = session.query(Topic).filter(Topic.slug == slug).first()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user