✨ Migrated to deta from imgur for image-storing
This commit is contained in:
@@ -7,44 +7,51 @@ import html
|
||||
from classquiz.db.models import Quiz, QuizAnswer, QuizQuestion, User
|
||||
from classquiz.kahoot_importer.get import get as get_quiz
|
||||
from classquiz.config import settings
|
||||
from classquiz.storage import Storage
|
||||
|
||||
settings = settings()
|
||||
|
||||
|
||||
async def _download_image(url: str) -> bytes:
|
||||
async with ClientSession() as session:
|
||||
async with session.get(url) as resp:
|
||||
return await resp.read()
|
||||
|
||||
|
||||
async def _upload_to_imgur(image: bytes, album_id: str | None) -> str:
|
||||
"""
|
||||
Uploads an image to Imgur.
|
||||
:param image: The image to upload.
|
||||
:return: The URL of the image on Imgur.
|
||||
"""
|
||||
|
||||
formdata = FormData()
|
||||
formdata.add_field('image', image, filename='image.png')
|
||||
if album_id:
|
||||
formdata.add_field('album', album_id)
|
||||
async with ClientSession(headers={"Authorization": f"Client-ID {settings.imgur_client_id}"}) as session:
|
||||
async with session.post("https://api.imgur.com/3/image", data=image) as resp:
|
||||
data = await resp.json()
|
||||
return data["data"]["link"]
|
||||
|
||||
|
||||
async def _generate_imgur_album(quiz_id: str) -> str:
|
||||
"""
|
||||
Generates an album on Imgur.
|
||||
:param quiz_id: The ID of the quiz.
|
||||
:return: The URL of the album on Imgur.
|
||||
"""
|
||||
formdata = FormData()
|
||||
formdata.add_field('title', quiz_id)
|
||||
async with ClientSession(headers={"Authorization": f"Client-ID {settings.imgur_client_id}"}) as session:
|
||||
async with session.post("https://api.imgur.com/3/album", data={"title": "Quiz: " + quiz_id}, ) as resp:
|
||||
data = await resp.json()
|
||||
return data["data"]["id"]
|
||||
|
||||
# async def _upload_to_imgur(image: bytes, album_id: str | None) -> str:
|
||||
# """
|
||||
# Uploads an image to Imgur.
|
||||
# :param image: The image to upload.
|
||||
# :return: The URL of the image on Imgur.
|
||||
# """
|
||||
#
|
||||
# formdata = FormData()
|
||||
# formdata.add_field('image', image, filename='image.png')
|
||||
# if album_id:
|
||||
# formdata.add_field('album', album_id)
|
||||
# async with ClientSession(headers={"Authorization": f"Client-ID {settings.imgur_client_id}"}) as session:
|
||||
# print(settings.imgur_client_id)
|
||||
# async with session.post("https://api.imgur.com/3/image", data=image) as resp:
|
||||
# data = await resp.json()
|
||||
# print(resp.headers)
|
||||
# try:
|
||||
# return data["data"]["link"]
|
||||
# except KeyError:
|
||||
# raise Exception(data)
|
||||
#
|
||||
#
|
||||
# async def _generate_imgur_album(quiz_id: str) -> str:
|
||||
# # """
|
||||
# # Generates an album on Imgur.
|
||||
# # :param quiz_id: The ID of the quiz.
|
||||
# # :return: The URL of the album on Imgur.
|
||||
# # """
|
||||
# formdata = FormData()
|
||||
# formdata.add_field('title', quiz_id)
|
||||
# async with ClientSession(headers={"Authorization": f"Client-ID {settings.imgur_client_id}"}) as session:
|
||||
# async with session.post("https://api.imgur.com/3/album", data={"title": "Quiz: " + quiz_id}, ) as resp:
|
||||
# data = await resp.json()
|
||||
# return data["data"]["id"]
|
||||
|
||||
async def import_quiz(quiz_id: str, user: User) -> Quiz | str:
|
||||
"""
|
||||
@@ -57,20 +64,24 @@ async def import_quiz(quiz_id: str, user: User) -> Quiz | str:
|
||||
if quiz is None:
|
||||
return "quiz not found"
|
||||
quiz_questions: list[dict] = []
|
||||
imgur_album_id = await _generate_imgur_album(quiz_id)
|
||||
quiz_id = uuid.uuid4()
|
||||
storage = Storage(backend=settings.storage_backend, deta_key=settings.deta_project_key,
|
||||
deta_id=settings.deta_project_id)
|
||||
|
||||
for q in quiz.kahoot.questions:
|
||||
answers: list[QuizAnswer] = []
|
||||
image = None
|
||||
if q.image is not None and q.image != "":
|
||||
image_bytes = await _download_image(q.image)
|
||||
image = await _upload_to_imgur(image_bytes, imgur_album_id)
|
||||
image_name= f"{quiz_id}--{uuid.uuid4()}"
|
||||
image = await storage.upload(file_name=image_name, file_data=image_bytes)
|
||||
image = f"{settings.root_address}/api/v1/storage/download/{image_name}"
|
||||
# image = q.image
|
||||
for a in q.choices:
|
||||
answers.append((QuizAnswer(right=a.correct, answer=html.unescape(a.answer))))
|
||||
quiz_questions.append(
|
||||
QuizQuestion(question=q.question, answers=answers, time=str(q.time / 1000), image=image).dict())
|
||||
quiz_data = Quiz(id=uuid.uuid4(), public=False, title=quiz.kahoot.title, description=quiz.kahoot.description,
|
||||
quiz_data = Quiz(id=quiz_id, public=False, title=quiz.kahoot.title, description=quiz.kahoot.description,
|
||||
created_at=datetime.now(), updated_at=datetime.now(), user_id=user.id,
|
||||
questions=json.dumps(quiz_questions))
|
||||
return await quiz_data.save()
|
||||
|
||||
Reference in New Issue
Block a user