diff --git a/classquiz/__init__.py b/classquiz/__init__.py index bdfdd83..dc2d025 100644 --- a/classquiz/__init__.py +++ b/classquiz/__init__.py @@ -77,12 +77,25 @@ async def auth_middleware_wrapper(request: Request, call_next): return await rememberme_middleware(request, call_next) -app.include_router(moderation.router, tags=["moderation"], prefix="/api/v1/moderation", include_in_schema=True) +app.include_router( + moderation.router, + tags=["moderation"], + prefix="/api/v1/moderation", + include_in_schema=True, +) app.include_router(pixabay.router, tags=["pixabay"], prefix="/api/v1/pixabay", include_in_schema=True) -app.include_router(quiztivity.router, tags=["quiztivity"], prefix="/api/v1/quiztivity", include_in_schema=True) +app.include_router( + quiztivity.router, + tags=["quiztivity"], + prefix="/api/v1/quiztivity", + include_in_schema=True, +) app.include_router( - box_controller.router, tags=["boxcontroller"], prefix="/api/v1/box-controller", include_in_schema=True + box_controller.router, + tags=["boxcontroller"], + prefix="/api/v1/box-controller", + include_in_schema=True, ) app.include_router(results.router, tags=["results"], prefix="/api/v1/results", include_in_schema=True) app.include_router(remote.router, tags=["remote"], prefix="/api/v1/remote", include_in_schema=True) @@ -94,15 +107,28 @@ app.include_router(quiz.router, tags=["quiz"], prefix="/api/v1/quiz", include_in app.include_router(utils.router, tags=["utils"], prefix="/api/v1/utils", include_in_schema=True) app.include_router(stats.router, tags=["stats"], prefix="/api/v1/stats", include_in_schema=True) app.include_router(storage.router, tags=["storage"], prefix="/api/v1/storage", include_in_schema=True) -app.include_router(search.router, tags=["search"], prefix="/api/v1/search", include_in_schema=True), +app.include_router(search.router, tags=["search"], prefix="/api/v1/search", include_in_schema=True) app.include_router(live.router, tags=["live"], prefix="/api/v1/live", include_in_schema=True) app.include_router( - testing_routes.router, tags=["internal", "testing"], prefix="/api/v1/internal/testing", include_in_schema=False + testing_routes.router, + tags=["internal", "testing"], + prefix="/api/v1/internal/testing", + include_in_schema=False, ) app.include_router(editor.router, tags=["editor"], prefix="/api/v1/editor", include_in_schema=True) -app.include_router(eximport.router, tags=["export", "import"], prefix="/api/v1/eximport", include_in_schema=True) +app.include_router( + eximport.router, + tags=["export", "import"], + prefix="/api/v1/eximport", + include_in_schema=True, +) app.include_router(sitemap.router, tags=["sitemap"], prefix="/api/v1/sitemap", include_in_schema=True) -app.include_router(community.router, tags=["community"], prefix="/api/v1/community", include_in_schema=True) +app.include_router( + community.router, + tags=["community"], + prefix="/api/v1/community", + include_in_schema=True, +) app.include_router(avatar.router, tags=["avatar"], prefix="/api/v1/avatar", include_in_schema=True) app.include_router(admin.router, tags=["admin"], prefix="/api/v1/admin", include_in_schema=True) app.mount("/", ASGIApp(sio)) diff --git a/classquiz/config.py b/classquiz/config.py index f88ae93..383cd8f 100644 --- a/classquiz/config.py +++ b/classquiz/config.py @@ -12,9 +12,12 @@ from pydantic_settings import BaseSettings, SettingsConfigDict import meilisearch as MeiliSearch from arq import create_pool from arq.connections import RedisSettings, ArqRedis +import logging from classquiz.storage import Storage +LOGGER = logging.getLogger(f"uvicorn.{__name__}") + class CustomOpenIDProvider(BaseModel): scopes: str | None = "openid email profile" @@ -29,7 +32,10 @@ class Settings(BaseSettings): """ model_config = SettingsConfigDict( - env_file=".env", extra="ignore", env_nested_delimiter="__", env_file_encoding="utf-8" + env_file=".env", + extra="ignore", + env_nested_delimiter="__", + env_file_encoding="utf-8", ) root_address: str = "http://127.0.0.1:8000" redis: RedisDsn = "redis://localhost:6379/0?decode_responses=True" diff --git a/classquiz/helpers/__init__.py b/classquiz/helpers/__init__.py index f6679bc..0f20b85 100644 --- a/classquiz/helpers/__init__.py +++ b/classquiz/helpers/__init__.py @@ -18,7 +18,7 @@ import xlsxwriter from aiohttp import ClientSession from io import BytesIO from PIL import Image -from classquiz.config import meilisearch, settings +from classquiz.config import meilisearch, settings, LOGGER from classquiz.helpers.hashcash import check as hc_check settings = settings() @@ -147,7 +147,10 @@ async def handle_import_from_excel(data: BinaryIO, user: User) -> Quiz: if answer is None: continue if len(str(answer)) > 150: - raise HTTPException(status_code=400, detail=f"Answer {a + 1} in Question {i + 1} is longer than 150") + raise HTTPException( + status_code=400, + detail=f"Answer {a + 1} in Question {i + 1} is longer than 150", + ) if len(answers) < 2: raise HTTPException(status_code=400, detail=f"Less than 2 answers in Question {i + 1}") correct_answers: str = str(row[6]) @@ -200,7 +203,7 @@ async def meilisearch_init(): classquiz_index_found = False # +++ Check if the index does not exist and creates it if not classquiz_index_found: - print("Creating MeiliSearch Index") + LOGGER.debug("Creating MeiliSearch Index") meilisearch.create_index(settings.meilisearch_index) await asyncio.sleep(1) # --- END @@ -211,7 +214,7 @@ async def meilisearch_init(): number_of_docs = i[1] break if number_of_docs != quiz_count: - print("MeiliSearch and Database got out of sync, syncthing them") + LOGGER.warn("MeiliSearch and Database got out of sync, syncthing them") meilisearch.delete_index(settings.meilisearch_index) meilisearch.create_index(settings.meilisearch_index) quizzes = await Quiz.objects.filter(public=True).all() @@ -221,7 +224,7 @@ async def meilisearch_init(): meilisearch.index(settings.meilisearch_index).add_documents(meili_data) # --- END --- meilisearch.index(settings.meilisearch_index).update_settings({"sortableAttributes": ["created_at"]}) - print("Finished MeiliSearch synchronisation") + LOGGER.info("Finished MeiliSearch synchronisation") async def telemetry_ping(): diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 1bfc10f..91b546b 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -4,10 +4,10 @@ services: db: -# build: -# context: pg_uuidv7 -# args: -# PG_MAJOR_VERSION: 16 + # build: + # context: pg_uuidv7 + # args: + # PG_MAJOR_VERSION: 16 image: postgres:16 environment: POSTGRES_PASSWORD: mysecretpassword @@ -34,21 +34,24 @@ services: privileged: true restart: unless-stopped minio: - image: bitnami/minio + image: docker.io/minio/minio environment: - MINIO_ROOT_USER: fediprint - MINIO_ROOT_PASSWORD: fediprint + MINIO_ROOT_USER: classquiz + MINIO_ROOT_PASSWORD: classquiz + MINIO_ADDRESS: ":9000" + MINIO_CONSOLE_ADDRESS: ":9001" volumes: - - minio:/bitnami/minio/data + - minio:/data ports: - 9000:9000 - 9001:9001 restart: unless-stopped + command: minio server /data redis: image: redis:alpine restart: always healthcheck: - test: [ "CMD", "redis-cli","ping" ] + test: ["CMD", "redis-cli", "ping"] ports: - 6379:6379 volumes: diff --git a/frontend/src/lib/i18n/locales/je.json.license b/frontend/src/lib/i18n/locales/je.json.license new file mode 100644 index 0000000..37230df --- /dev/null +++ b/frontend/src/lib/i18n/locales/je.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025 Marlon W (Mawoka) + +SPDX-License-Identifier: MPL-2.0 diff --git a/frontend/src/lib/i18n/locales/lb.json.license b/frontend/src/lib/i18n/locales/lb.json.license new file mode 100644 index 0000000..37230df --- /dev/null +++ b/frontend/src/lib/i18n/locales/lb.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025 Marlon W (Mawoka) + +SPDX-License-Identifier: MPL-2.0 diff --git a/frontend/src/lib/i18n/locales/pt_BR.json.license b/frontend/src/lib/i18n/locales/pt_BR.json.license new file mode 100644 index 0000000..37230df --- /dev/null +++ b/frontend/src/lib/i18n/locales/pt_BR.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025 Marlon W (Mawoka) + +SPDX-License-Identifier: MPL-2.0 diff --git a/frontend/src/lib/i18n/locales/ro.json.license b/frontend/src/lib/i18n/locales/ro.json.license new file mode 100644 index 0000000..37230df --- /dev/null +++ b/frontend/src/lib/i18n/locales/ro.json.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2025 Marlon W (Mawoka) + +SPDX-License-Identifier: MPL-2.0