postquery-topics-authors3
This commit is contained in:
parent
ad320ae83e
commit
3febfff1db
|
@ -25,7 +25,7 @@ from services.search import search_text
|
||||||
|
|
||||||
def query_shouts():
|
def query_shouts():
|
||||||
"""
|
"""
|
||||||
Базовый запрос для получения публикаций, с подзапросами статистики, авторов и тем.
|
Базовый запрос для получения публикаций, с подзапросами статистики.
|
||||||
|
|
||||||
:return: (Запрос для получения публикаций, aliased_reaction)
|
:return: (Запрос для получения публикаций, aliased_reaction)
|
||||||
"""
|
"""
|
||||||
|
@ -68,7 +68,7 @@ def query_shouts():
|
||||||
|
|
||||||
def get_shouts_with_stats(q, limit, offset=0, author_id=None):
|
def get_shouts_with_stats(q, limit, offset=0, author_id=None):
|
||||||
"""
|
"""
|
||||||
Получение публикаций с статистикой комментариев и рейтинга.
|
Получение публикаций со статистикой, и подзапросами авторов и тем.
|
||||||
|
|
||||||
:param q: Запрос
|
:param q: Запрос
|
||||||
:param limit: Ограничение на количество результатов.
|
:param limit: Ограничение на количество результатов.
|
||||||
|
@ -81,7 +81,7 @@ def get_shouts_with_stats(q, limit, offset=0, author_id=None):
|
||||||
shout_author = aliased(ShoutAuthor)
|
shout_author = aliased(ShoutAuthor)
|
||||||
shout_topic = aliased(ShoutTopic)
|
shout_topic = aliased(ShoutTopic)
|
||||||
|
|
||||||
# Выполнение запроса и обработка результатов
|
# Выполнение запроса и обработка результатов
|
||||||
with local_session() as session:
|
with local_session() as session:
|
||||||
results = session.execute(q, {"author_id": author_id}).all() if author_id else session.execute(q).all()
|
results = session.execute(q, {"author_id": author_id}).all() if author_id else session.execute(q).all()
|
||||||
|
|
||||||
|
@ -104,31 +104,36 @@ def get_shouts_with_stats(q, limit, offset=0, author_id=None):
|
||||||
.all()
|
.all()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Группировка авторов и тем по публикациям
|
||||||
|
authors_by_shout = {}
|
||||||
|
for author in authors:
|
||||||
|
shout_id = author[0] # ID публикации
|
||||||
|
if shout_id not in authors_by_shout:
|
||||||
|
authors_by_shout[shout_id] = []
|
||||||
|
authors_by_shout[shout_id].append({
|
||||||
|
"id": author[1],
|
||||||
|
"name": author[2],
|
||||||
|
"slug": author[3],
|
||||||
|
"pic": author[4],
|
||||||
|
})
|
||||||
|
|
||||||
|
topics_by_shout = {}
|
||||||
|
for topic in topics:
|
||||||
|
shout_id = topic[0] # ID публикации
|
||||||
|
if shout_id not in topics_by_shout:
|
||||||
|
topics_by_shout[shout_id] = []
|
||||||
|
topics_by_shout[shout_id].append({
|
||||||
|
"id": topic[1],
|
||||||
|
"title": topic[2],
|
||||||
|
"body": topic[3],
|
||||||
|
"slug": topic[4],
|
||||||
|
})
|
||||||
|
|
||||||
# Формирование списка публикаций с их данными
|
# Формирование списка публикаций с их данными
|
||||||
shouts = []
|
shouts = []
|
||||||
for shout, comments_stat, rating_stat, last_reacted_at in results:
|
for shout, comments_stat, rating_stat, last_reacted_at in results:
|
||||||
shout.authors = [
|
shout.authors = authors_by_shout.get(shout.id, [])
|
||||||
{
|
shout.topics = topics_by_shout.get(shout.id, [])
|
||||||
"id": author.id,
|
|
||||||
"name": author.name,
|
|
||||||
"slug": author.slug,
|
|
||||||
"pic": author.pic,
|
|
||||||
}
|
|
||||||
for author in authors
|
|
||||||
if author.shout == shout.id
|
|
||||||
]
|
|
||||||
|
|
||||||
shout.topics = [
|
|
||||||
{
|
|
||||||
"id": topic.id,
|
|
||||||
"slug": topic.slug,
|
|
||||||
"title": topic.title,
|
|
||||||
"body": topic.body,
|
|
||||||
}
|
|
||||||
for topic in topics
|
|
||||||
if topic.shout == shout.id
|
|
||||||
]
|
|
||||||
|
|
||||||
shout.stat = {
|
shout.stat = {
|
||||||
"viewed": 0, # FIXME: use separate resolver
|
"viewed": 0, # FIXME: use separate resolver
|
||||||
"followers": 0, # FIXME: implement followers_stat
|
"followers": 0, # FIXME: implement followers_stat
|
||||||
|
|
Loading…
Reference in New Issue
Block a user