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 orm.topic import Topic
|
||||||
from services.auth import login_accepted
|
from services.auth import login_accepted
|
||||||
from services.db import json_array_builder, json_builder, local_session
|
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.search import search_text
|
||||||
from services.viewed import ViewedStorage
|
from services.viewed import ViewedStorage
|
||||||
from utils.logger import root_logger as logger
|
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,
|
"pic": a.pic,
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasattr(row, "stat"):
|
if has_field(info, "stat"):
|
||||||
stat = {}
|
stat = {}
|
||||||
if isinstance(row.stat, str):
|
if isinstance(row.stat, str):
|
||||||
stat = json.loads(row.stat)
|
stat = json.loads(row.stat)
|
||||||
elif isinstance(row.stat, dict):
|
elif isinstance(row.stat, dict):
|
||||||
stat = row.stat
|
stat = row.stat
|
||||||
else:
|
|
||||||
logger.warning(f"Строка {idx} - неизвестный тип stat: {type(row.stat)}")
|
|
||||||
viewed = ViewedStorage.get_shout(shout_id=shout_id) or 0
|
viewed = ViewedStorage.get_shout(shout_id=shout_id) or 0
|
||||||
shout_dict["stat"] = {**stat, "viewed": viewed, "commented": stat.get("comments_count", 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"):
|
if has_field(info, "topics") and hasattr(row, "topics"):
|
||||||
shout_dict["topics"] = json.loads(row.topics) if isinstance(row.topics, str) else 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)
|
shouts.append(shout_dict)
|
||||||
|
|
||||||
except Exception as row_error:
|
except Exception as row_error:
|
||||||
|
@ -468,32 +476,3 @@ async def load_shouts_random_top(_, info, options):
|
||||||
q = q.order_by(func.random())
|
q = q.order_by(func.random())
|
||||||
limit = options.get("limit", 10)
|
limit = options.get("limit", 10)
|
||||||
return get_shouts_with_links(info, q, limit)
|
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
|
from ariadne import MutationType, QueryType
|
||||||
|
|
||||||
import httpx
|
|
||||||
from ariadne import MutationType, ObjectType, QueryType
|
|
||||||
|
|
||||||
from settings import AUTH_URL
|
|
||||||
|
|
||||||
query = QueryType()
|
query = QueryType()
|
||||||
mutation = MutationType()
|
mutation = MutationType()
|
||||||
|
|
||||||
|
|
||||||
def type_(name: str) -> ObjectType:
|
|
||||||
"""
|
|
||||||
Создает резолвер для объектного типа
|
|
||||||
|
|
||||||
:param name: Имя типа в схеме GraphQL
|
|
||||||
:return: Резолвер объектного типа
|
|
||||||
"""
|
|
||||||
resolver = ObjectType(name)
|
|
||||||
resolvers.append(resolver)
|
|
||||||
return resolver
|
|
||||||
|
|
||||||
|
|
||||||
resolvers = [query, mutation]
|
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