simpler-reader-field
This commit is contained in:
parent
4a26e4f75b
commit
cc837288bb
|
@ -11,7 +11,7 @@ from orm.shout import Shout, ShoutAuthor, ShoutTopic
|
|||
from orm.topic import Topic
|
||||
from services.auth import login_accepted
|
||||
from services.db import json_array_builder, json_builder, local_session
|
||||
from services.schema import query, type_
|
||||
from services.schema import query
|
||||
from services.search import search_text
|
||||
from services.viewed import ViewedStorage
|
||||
from utils.logger import root_logger as logger
|
||||
|
@ -215,14 +215,12 @@ def get_shouts_with_links(info, q, limit=20, offset=0):
|
|||
"pic": a.pic,
|
||||
}
|
||||
|
||||
if hasattr(row, "stat"):
|
||||
if has_field(info, "stat"):
|
||||
stat = {}
|
||||
if isinstance(row.stat, str):
|
||||
stat = json.loads(row.stat)
|
||||
elif isinstance(row.stat, dict):
|
||||
stat = row.stat
|
||||
else:
|
||||
logger.warning(f"Строка {idx} - неизвестный тип stat: {type(row.stat)}")
|
||||
viewed = ViewedStorage.get_shout(shout_id=shout_id) or 0
|
||||
shout_dict["stat"] = {**stat, "viewed": viewed, "commented": stat.get("comments_count", 0)}
|
||||
|
||||
|
@ -237,6 +235,16 @@ def get_shouts_with_links(info, q, limit=20, offset=0):
|
|||
if has_field(info, "topics") and hasattr(row, "topics"):
|
||||
shout_dict["topics"] = json.loads(row.topics) if isinstance(row.topics, str) else row.topics
|
||||
|
||||
if has_field(info, "media") and shout.media:
|
||||
# Обработка поля media
|
||||
media_data = shout.media
|
||||
if isinstance(media_data, str):
|
||||
try:
|
||||
media_data = json.loads(media_data)
|
||||
except json.JSONDecodeError:
|
||||
media_data = []
|
||||
shout_dict["media"] = [media_data] if isinstance(media_data, dict) else media_data
|
||||
|
||||
shouts.append(shout_dict)
|
||||
|
||||
except Exception as row_error:
|
||||
|
@ -468,32 +476,3 @@ async def load_shouts_random_top(_, info, options):
|
|||
q = q.order_by(func.random())
|
||||
limit = options.get("limit", 10)
|
||||
return get_shouts_with_links(info, q, limit)
|
||||
|
||||
|
||||
shout = type_("Shout")
|
||||
|
||||
|
||||
@shout.field("media")
|
||||
def resolve_shout_media(shout, _):
|
||||
"""
|
||||
Резолвер для поля media типа Shout
|
||||
Преобразует JSON из БД в список MediaItem
|
||||
"""
|
||||
if not shout.media:
|
||||
return []
|
||||
|
||||
# Если media это строка JSON, парсим её
|
||||
if isinstance(shout.media, str):
|
||||
try:
|
||||
media_data = json.loads(shout.media)
|
||||
except json.JSONDecodeError:
|
||||
return []
|
||||
else:
|
||||
media_data = shout.media
|
||||
|
||||
# Если media_data это словарь, оборачиваем его в список
|
||||
if isinstance(media_data, dict):
|
||||
return [media_data]
|
||||
elif isinstance(media_data, list):
|
||||
return media_data
|
||||
return []
|
||||
|
|
|
@ -1,50 +1,5 @@
|
|||
from asyncio.log import logger
|
||||
|
||||
import httpx
|
||||
from ariadne import MutationType, ObjectType, QueryType
|
||||
|
||||
from settings import AUTH_URL
|
||||
from ariadne import MutationType, QueryType
|
||||
|
||||
query = QueryType()
|
||||
mutation = MutationType()
|
||||
|
||||
|
||||
def type_(name: str) -> ObjectType:
|
||||
"""
|
||||
Создает резолвер для объектного типа
|
||||
|
||||
:param name: Имя типа в схеме GraphQL
|
||||
:return: Резолвер объектного типа
|
||||
"""
|
||||
resolver = ObjectType(name)
|
||||
resolvers.append(resolver)
|
||||
return resolver
|
||||
|
||||
|
||||
resolvers = [query, mutation]
|
||||
|
||||
|
||||
async def request_graphql_data(gql, url=AUTH_URL, headers=None):
|
||||
if not url:
|
||||
return None
|
||||
if headers is None:
|
||||
headers = {"Content-Type": "application/json"}
|
||||
try:
|
||||
# logger.debug(f"{url}:\n{headers}\n{gql}")
|
||||
async with httpx.AsyncClient() as client:
|
||||
response = await client.post(url, json=gql, headers=headers)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
errors = data.get("errors")
|
||||
if errors:
|
||||
logger.error(f"{url} response: {data}")
|
||||
else:
|
||||
return data
|
||||
else:
|
||||
logger.error(f"{url}: {response.status_code} {response.text}")
|
||||
except Exception as _e:
|
||||
# Handling and logging exceptions during authentication check
|
||||
import traceback
|
||||
|
||||
logger.error(f"request_graphql_data error: {traceback.format_exc()}")
|
||||
return None
|
||||
|
|
Loading…
Reference in New Issue
Block a user