invites-fix3

This commit is contained in:
Untone 2025-06-30 23:44:13 +03:00
parent 6c95b0575a
commit 5f48ec465a
2 changed files with 57 additions and 47 deletions

View File

@ -5,6 +5,8 @@
### auth/internal fix ### auth/internal fix
- Исправлена ошибка в функции `authenticate` в файле `auth/internal.py` - неправильное создание объекта `AuthState` и использование `TokenManager` вместо прямого создания `SessionTokenManager` - Исправлена ошибка в функции `authenticate` в файле `auth/internal.py` - неправильное создание объекта `AuthState` и использование `TokenManager` вместо прямого создания `SessionTokenManager`
- Исправлена ошибка в функции `admin_get_invites` в файле `resolvers/admin.py` - добавлено значение по умолчанию для поля `slug` в объектах `Author`, чтобы избежать ошибки "Cannot return null for non-nullable field Author.slug" - Исправлена ошибка в функции `admin_get_invites` в файле `resolvers/admin.py` - добавлено значение по умолчанию для поля `slug` в объектах `Author`, чтобы избежать ошибки "Cannot return null for non-nullable field Author.slug"
- Исправлена ошибка в функции `admin_get_invites` - заменен несуществующий атрибут `Shout.created_by_author` на правильное получение автора через поле `created_by`
- Исправлена функция `admin_delete_invites_batch` - завершена реализация для корректной обработки пакетного удаления приглашений
### Улучшения админ-панели для приглашений ### Улучшения админ-панели для приглашений

View File

@ -715,7 +715,7 @@ async def admin_get_invites(
query = session.query(Invite).options( query = session.query(Invite).options(
joinedload(Invite.inviter), joinedload(Invite.inviter),
joinedload(Invite.author), joinedload(Invite.author),
joinedload(Invite.shout).joinedload(Shout.created_by_author), joinedload(Invite.shout),
) )
# Фильтр по статусу # Фильтр по статусу
@ -769,9 +769,14 @@ async def admin_get_invites(
) )
# Преобразуем в формат для API # Преобразуем в формат для API
return { result_invites = []
"invites": [ for invite in invites:
{ # Получаем автора публикации
created_by_author = None
if invite.shout and invite.shout.created_by:
created_by_author = session.query(Author).filter(Author.id == invite.shout.created_by).first()
invite_dict = {
"inviter_id": invite.inviter_id, "inviter_id": invite.inviter_id,
"author_id": invite.author_id, "author_id": invite.author_id,
"shout_id": invite.shout_id, "shout_id": invite.shout_id,
@ -780,8 +785,7 @@ async def admin_get_invites(
"id": invite.inviter.id, "id": invite.inviter.id,
"name": invite.inviter.name or "Без имени", "name": invite.inviter.name or "Без имени",
"email": invite.inviter.email, "email": invite.inviter.email,
"slug": invite.inviter.slug "slug": invite.inviter.slug or f"user-{invite.inviter.id}", # Добавляем значение по умолчанию
or f"user-{invite.inviter.id}", # Добавляем значение по умолчанию
}, },
"author": { "author": {
"id": invite.author.id, "id": invite.author.id,
@ -793,18 +797,25 @@ async def admin_get_invites(
"id": invite.shout.id, "id": invite.shout.id,
"title": invite.shout.title, "title": invite.shout.title,
"slug": invite.shout.slug, "slug": invite.shout.slug,
"created_by": {
"id": invite.shout.created_by_author.id,
"name": invite.shout.created_by_author.name or "Без имени",
"email": invite.shout.created_by_author.email,
"slug": invite.shout.created_by_author.slug
or f"user-{invite.shout.created_by_author.id}", # Добавляем значение по умолчанию
},
}, },
"created_at": None, # У приглашений нет created_at поля в текущей модели "created_at": None, # У приглашений нет created_at поля в текущей модели
} }
for invite in invites
], # Добавляем информацию о создателе публикации, если она доступна
if created_by_author:
invite_dict["shout"]["created_by"] = {
"id": created_by_author.id,
"name": created_by_author.name or "Без имени",
"email": created_by_author.email,
"slug": created_by_author.slug or f"user-{created_by_author.id}",
}
else:
invite_dict["shout"]["created_by"] = None
result_invites.append(invite_dict)
return {
"invites": result_invites,
"total": total_count, "total": total_count,
"page": current_page, "page": current_page,
"perPage": per_page, "perPage": per_page,
@ -1028,11 +1039,7 @@ async def admin_delete_invites_batch(
# Находим приглашение для удаления # Находим приглашение для удаления
invite = ( invite = (
session.query(Invite) session.query(Invite)
.filter( .filter(Invite.inviter_id == inviter_id, Invite.author_id == author_id, Invite.shout_id == shout_id)
Invite.inviter_id == inviter_id,
Invite.author_id == author_id,
Invite.shout_id == shout_id,
)
.first() .first()
) )
@ -1047,15 +1054,16 @@ async def admin_delete_invites_batch(
# Сохраняем все изменения за раз # Сохраняем все изменения за раз
if deleted_count > 0: if deleted_count > 0:
session.commit() session.commit()
logger.info(f"Пакетное удаление: удалено {deleted_count} приглашений") logger.info(f"Пакетное удаление приглашений: удалено {deleted_count} приглашений")
# Формируем результат
result = {"success": True, "error": None}
if errors: if errors:
error_message = f"Удалено {deleted_count} из {len(invites)} приглашений. Ошибки: {', '.join(errors)}" result["error"] = f"Удалено {deleted_count} приглашений. Ошибки: {', '.join(errors)}"
return {"success": deleted_count > 0, "error": error_message}
return {"success": True, "error": None} return result
except Exception as e: except Exception as e:
logger.error(f"Ошибка при пакетном удалении приглашений: {e!s}") logger.error(f"Ошибка при пакетном удалении приглашений: {e!s}")
msg = f"Не удалось удалить приглашения: {e!s}" msg = f"Не удалось выполнить пакетное удаление приглашений: {e!s}"
raise GraphQLError(msg) from e raise GraphQLError(msg) from e