Added rudimentary image-support via imgur

This commit is contained in:
Mawoka
2022-03-29 21:46:37 +02:00
parent 19c44d6765
commit 0d011bdb26
8 changed files with 61 additions and 5 deletions
+1
View File
@@ -52,6 +52,7 @@ class QuizQuestion(BaseModel):
question: str question: str
time: str # in Secs time: str # in Secs
answers: list[QuizAnswer] answers: list[QuizAnswer]
image: str | None = None
class QuizInput(BaseModel): class QuizInput(BaseModel):
+6
View File
@@ -6,6 +6,7 @@ from random import randint
from classquiz.kahoot_importer.import_quiz import import_quiz from classquiz.kahoot_importer.import_quiz import import_quiz
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
import re
from classquiz.auth import get_current_user, get_current_user_optional from classquiz.auth import get_current_user, get_current_user_optional
from classquiz.config import redis from classquiz.config import redis
@@ -16,6 +17,11 @@ router = APIRouter()
@router.post("/create") @router.post("/create")
async def create_quiz_lol(quiz_input: QuizInput, user: User = Depends(get_current_user)): async def create_quiz_lol(quiz_input: QuizInput, user: User = Depends(get_current_user)):
imgur_regex = r"^https://i\.imgur\.com\/.{7}.(jpg|png|gif)$"
for question in quiz_input.questions:
if question.image is not None:
if not re.match(imgur_regex, question.image):
raise HTTPException(status_code=400, detail="image url is not valid")
quiz = Quiz(**quiz_input.dict(), user_id=user.id, id=uuid.uuid4()) quiz = Quiz(**quiz_input.dict(), user_id=user.id, id=uuid.uuid4())
await redis.delete("global_quiz_count") await redis.delete("global_quiz_count")
return await quiz.save() return await quiz.save()
+1
View File
@@ -27,6 +27,7 @@ export interface QuizData {
export interface Question { export interface Question {
time: string; time: string;
question: string; question: string;
image?: string;
answers: Answer[]; answers: Answer[];
} }
+37 -1
View File
@@ -13,6 +13,7 @@
interface Question { interface Question {
question: string; question: string;
time: string; time: string;
image?: string;
answers: Answer[]; answers: Answer[];
} }
@@ -21,12 +22,15 @@
answer: string; answer: string;
} }
export let data: Data; export let data: Data;
export let submit_button_text = 'Create'; export let submit_button_text = 'Create';
let imgur_links_valid = false;
const empty_question: Question = { const empty_question: Question = {
question: '', question: '',
time: '20', time: '20',
image: '',
answers: [ answers: [
{ {
right: false, right: false,
@@ -35,6 +39,21 @@
] ]
}; };
const checkIfAllQuestionImagesComplyWithRegex = (questions: Array<Question>) => {
let NoteverythingValid = false;
const regex = /^https:\/\/i\.imgur\.com\/.{7}.(jpg|png|gif)$/;
for (let i = 0; i < questions.length; i++) {
const question = questions[i];
if (question.image && !regex.test(question.image)) {
console.log('not valid');
NoteverythingValid = true;
}
}
return NoteverythingValid;
};
$: imgur_links_valid = checkIfAllQuestionImagesComplyWithRegex(data.questions);
const empty_answer: Answer = { const empty_answer: Answer = {
right: false, right: false,
answer: '' answer: ''
@@ -69,6 +88,17 @@
class='text-black w-3/5 bg-inherit border-dotted border-b-2 border-black' class='text-black w-3/5 bg-inherit border-dotted border-b-2 border-black'
/> />
</label>
<label class='m-1'>
{$t('words.image')}:
<input
type='text'
placeholder='https://i.imgur.com/kSPCidY.png'
bind:value={question.image}
class='text-black w-3/5 bg-inherit border-dotted border-b-2 border-black'
/>
</label> </label>
<label class='m-1'> <label class='m-1'>
{$t('editor.time_in_seconds')}: {$t('editor.time_in_seconds')}:
@@ -141,4 +171,10 @@
> >
{$t('editor.add_new_question')} {$t('editor.add_new_question')}
</button> </button>
<button type='submit' class='text-xl'>{submit_button_text}</button> {#if imgur_links_valid}
<p class='text-blue-600 text-xl text-center w-fit mx-auto'>
Not all links are imgur-links! <!-- TODO: Add translation -->
</p>
{/if}
<button type='submit' class='text-xl disabled:cursor-not-allowed disabled:border disabled:border-red-500 w-fit mx-auto'
disabled={imgur_links_valid}>{submit_button_text}</button>
+2 -1
View File
@@ -80,7 +80,8 @@
"username": "Nutzername", "username": "Nutzername",
"password": "Passwort", "password": "Passwort",
"email": "Email", "email": "Email",
"description": "Beschreibung" "description": "Beschreibung",
"image": "Bild"
}, },
"editor": { "editor": {
"time_in_seconds": "Zeit in Sekunden", "time_in_seconds": "Zeit in Sekunden",
+2 -1
View File
@@ -80,7 +80,8 @@
"docs": "Docs", "docs": "Docs",
"close": "Close", "close": "Close",
"save": "Save", "save": "Save",
"description": "Description" "description": "Description",
"image": "Image"
}, },
"editor": { "editor": {
"time_in_seconds": "Time in seconds", "time_in_seconds": "Time in seconds",
+3
View File
@@ -48,6 +48,9 @@
</h1> </h1>
<span class="text-center py-2 text-lg">{timer_res}</span> <span class="text-center py-2 text-lg">{timer_res}</span>
</div> </div>
<div>
<img src='{question.image}' class="w-full h-full object-cover" alt='Question image'>
</div>
{#if timer_res !== '0'} {#if timer_res !== '0'}
<div class="flex flex-wrap"> <div class="flex flex-wrap">
{#each question.answers as answer} {#each question.answers as answer}
+9 -2
View File
@@ -1,4 +1,4 @@
<script context="module" lang="ts"> <script context='module' lang='ts'>
export async function load({ url }) { export async function load({ url }) {
const token = url.searchParams.get('pin'); const token = url.searchParams.get('pin');
return { return {
@@ -9,7 +9,7 @@
} }
</script> </script>
<script lang="ts"> <script lang='ts'>
import { socket } from '$lib/socket'; import { socket } from '$lib/socket';
import JoinGame from '$lib/play/join.svelte'; import JoinGame from '$lib/play/join.svelte';
import type { Answer, QuizData } from '../app'; import type { Answer, QuizData } from '../app';
@@ -71,6 +71,13 @@
<svelte:head> <svelte:head>
<title>ClassQuiz - Play</title> <title>ClassQuiz - Play</title>
{#if gameData !== undefined}
{#each gameData.questions as question}
{#if question.image !== undefined}
<link rel='preload' as='image' href={question.image} />
{/if}
{/each}
{/if}
</svelte:head> </svelte:head>
<div> <div>
{#if !gameMeta.started && gameData === undefined} {#if !gameMeta.started && gameData === undefined}