invites-table-creating
All checks were successful
Deploy on push / deploy (push) Successful in 6s

This commit is contained in:
Untone 2025-07-01 00:01:20 +03:00
parent 71f26a76c3
commit 2683982180
3 changed files with 127 additions and 45 deletions

View File

@ -8,6 +8,7 @@
- Исправлена ошибка в функции `admin_get_invites` - заменен несуществующий атрибут `Shout.created_by_author` на правильное получение автора через поле `created_by` - Исправлена ошибка в функции `admin_get_invites` - заменен несуществующий атрибут `Shout.created_by_author` на правильное получение автора через поле `created_by`
- Исправлена функция `admin_delete_invites_batch` - завершена реализация для корректной обработки пакетного удаления приглашений - Исправлена функция `admin_delete_invites_batch` - завершена реализация для корректной обработки пакетного удаления приглашений
- Исправлена ошибка в функции `get_shouts_with_links` в файле `resolvers/reader.py` - добавлено значение по умолчанию для поля `slug` у авторов публикаций в полях `authors` и `created_by`, чтобы избежать ошибки "Cannot return null for non-nullable field Author.slug" - Исправлена ошибка в функции `get_shouts_with_links` в файле `resolvers/reader.py` - добавлено значение по умолчанию для поля `slug` у авторов публикаций в полях `authors` и `created_by`, чтобы избежать ошибки "Cannot return null for non-nullable field Author.slug"
- Исправлена ошибка в функции `admin_get_shouts` в файле `resolvers/admin.py` - добавлена полная загрузка информации об авторах для полей `created_by`, `updated_by` и `deleted_by` с корректной обработкой поля `slug` и значениями по умолчанию, чтобы избежать ошибки "Cannot return null for non-nullable field Author.slug"
### Улучшения админ-панели для приглашений ### Улучшения админ-панели для приглашений

View File

@ -9,6 +9,7 @@ from sqlalchemy.sql import func, select
from auth.decorators import admin_auth_required from auth.decorators import admin_auth_required
from auth.orm import Author, AuthorRole, Role from auth.orm import Author, AuthorRole, Role
from orm.community import Community
from orm.invite import Invite, InviteStatus from orm.invite import Invite, InviteStatus
from orm.shout import Shout from orm.shout import Shout
from services.db import local_session from services.db import local_session
@ -499,22 +500,100 @@ async def admin_get_shouts(
"deleted_at": getattr(shout, "deleted_at", None) "deleted_at": getattr(shout, "deleted_at", None)
if not isinstance(shout, dict) if not isinstance(shout, dict)
else shout.get("deleted_at"), else shout.get("deleted_at"),
"created_by": { }
"id": getattr(shout, "created_by", None)
if not isinstance(shout, dict) # Обрабатываем поле created_by - получаем полную информацию об авторе
else shout.get("created_by"), created_by_id = (
"email": "unknown", # Заполним при необходимости getattr(shout, "created_by", None) if not isinstance(shout, dict) else shout.get("created_by")
)
if created_by_id:
created_author = session.query(Author).filter(Author.id == created_by_id).first()
if created_author:
shout_dict["created_by"] = {
"id": created_author.id,
"email": created_author.email,
"name": created_author.name,
"slug": created_author.slug or f"user-{created_author.id}",
}
else:
shout_dict["created_by"] = {
"id": created_by_id,
"email": "unknown",
"name": "unknown", "name": "unknown",
}, "slug": f"user-{created_by_id}",
"updated_by": None, # Заполним при необходимости }
"deleted_by": None, # Заполним при необходимости else:
"community": { shout_dict["created_by"] = None
"id": getattr(shout, "community", None)
if not isinstance(shout, dict) # Обрабатываем поле updated_by - получаем полную информацию об авторе
else shout.get("community"), updated_by_id = (
"name": "unknown", # Заполним при необходимости getattr(shout, "updated_by", None) if not isinstance(shout, dict) else shout.get("updated_by")
}, )
"authors": [ if updated_by_id:
updated_author = session.query(Author).filter(Author.id == updated_by_id).first()
if updated_author:
shout_dict["updated_by"] = {
"id": updated_author.id,
"email": updated_author.email,
"name": updated_author.name,
"slug": updated_author.slug or f"user-{updated_author.id}",
}
else:
shout_dict["updated_by"] = {
"id": updated_by_id,
"email": "unknown",
"name": "unknown",
"slug": f"user-{updated_by_id}",
}
else:
shout_dict["updated_by"] = None
# Обрабатываем поле deleted_by - получаем полную информацию об авторе
deleted_by_id = (
getattr(shout, "deleted_by", None) if not isinstance(shout, dict) else shout.get("deleted_by")
)
if deleted_by_id:
deleted_author = session.query(Author).filter(Author.id == deleted_by_id).first()
if deleted_author:
shout_dict["deleted_by"] = {
"id": deleted_author.id,
"email": deleted_author.email,
"name": deleted_author.name,
"slug": deleted_author.slug or f"user-{deleted_author.id}",
}
else:
shout_dict["deleted_by"] = {
"id": deleted_by_id,
"email": "unknown",
"name": "unknown",
"slug": f"user-{deleted_by_id}",
}
else:
shout_dict["deleted_by"] = None
# Обрабатываем поле community - получаем полную информацию о сообществе
community_id = (
getattr(shout, "community", None) if not isinstance(shout, dict) else shout.get("community")
)
if community_id:
community = session.query(Community).filter(Community.id == community_id).first()
if community:
shout_dict["community"] = {
"id": community.id,
"name": community.name,
"slug": community.slug,
}
else:
shout_dict["community"] = {
"id": community_id,
"name": "unknown",
"slug": f"community-{community_id}",
}
else:
shout_dict["community"] = None
# Обрабатываем поля authors и topics как раньше
shout_dict["authors"] = [
{ {
"id": getattr(author, "id", None), "id": getattr(author, "id", None),
"email": getattr(author, "email", None), "email": getattr(author, "email", None),
@ -522,12 +601,11 @@ async def admin_get_shouts(
"slug": getattr(author, "slug", None) or f"user-{getattr(author, 'id', 'unknown')}", "slug": getattr(author, "slug", None) or f"user-{getattr(author, 'id', 'unknown')}",
} }
for author in ( for author in (
getattr(shout, "authors", []) getattr(shout, "authors", []) if not isinstance(shout, dict) else shout.get("authors", [])
if not isinstance(shout, dict)
else shout.get("authors", [])
) )
], ]
"topics": [
shout_dict["topics"] = [
{ {
"id": getattr(topic, "id", None), "id": getattr(topic, "id", None),
"title": getattr(topic, "title", None), "title": getattr(topic, "title", None),
@ -536,13 +614,16 @@ async def admin_get_shouts(
for topic in ( for topic in (
getattr(shout, "topics", []) if not isinstance(shout, dict) else shout.get("topics", []) getattr(shout, "topics", []) if not isinstance(shout, dict) else shout.get("topics", [])
) )
], ]
"version_of": getattr(shout, "version_of", None)
if not isinstance(shout, dict) shout_dict["version_of"] = (
else shout.get("version_of"), getattr(shout, "version_of", None) if not isinstance(shout, dict) else shout.get("version_of")
"draft": getattr(shout, "draft", None) if not isinstance(shout, dict) else shout.get("draft"), )
"stat": None, # Заполним при необходимости shout_dict["draft"] = (
} getattr(shout, "draft", None) if not isinstance(shout, dict) else shout.get("draft")
)
shout_dict["stat"] = None # Заполним при необходимости
shouts_data.append(shout_dict) shouts_data.append(shout_dict)
else: else:
# Используем существующую функцию для получения публикаций со статистикой # Используем существующую функцию для получения публикаций со статистикой

View File

@ -16,7 +16,7 @@ resolvers: List[SchemaBindable] = [query, mutation, type_draft, type_community,
def create_all_tables() -> None: def create_all_tables() -> None:
"""Create all database tables in the correct order.""" """Create all database tables in the correct order."""
from auth.orm import Author, AuthorBookmark, AuthorFollower, AuthorRating from auth.orm import Author, AuthorBookmark, AuthorFollower, AuthorRating
from orm import collection, community, draft, notification, reaction, shout, topic from orm import collection, community, draft, invite, notification, reaction, shout, topic
# Порядок важен - сначала таблицы без внешних ключей, затем зависимые таблицы # Порядок важен - сначала таблицы без внешних ключей, затем зависимые таблицы
models_in_order = [ models_in_order = [
@ -46,7 +46,7 @@ def create_all_tables() -> None:
notification.NotificationSeen, # Зависит от Notification notification.NotificationSeen, # Зависит от Notification
collection.Collection, # Зависит от Author collection.Collection, # Зависит от Author
collection.ShoutCollection, # Зависит от Collection и Shout collection.ShoutCollection, # Зависит от Collection и Shout
# invite.Invite invite.Invite, # Зависит от Author и Shout
] ]
with local_session() as session: with local_session() as session: