From 56e78dd25a44f5e7342675396151e4c87cded23d Mon Sep 17 00:00:00 2001 From: Mawoka Date: Mon, 29 Aug 2022 16:05:37 +0200 Subject: [PATCH] :globe_with_meridians: Integrated Italian translation --- classquiz/__init__.py | 3 +- classquiz/config.py | 1 + classquiz/db/models.py | 9 +++++ classquiz/helpers/__init__.py | 21 +++++++++++- frontend/src/lib/i18n/i18n-service.ts | 2 ++ frontend/src/lib/language-toggle.svelte | 5 +++ .../src/routes/docs/attribution/+page.svelte | 3 ++ .../3f63c0130bce_added_instance_data.py | 34 +++++++++++++++++++ 8 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/3f63c0130bce_added_instance_data.py diff --git a/classquiz/__init__.py b/classquiz/__init__.py index e633370..4eda081 100644 --- a/classquiz/__init__.py +++ b/classquiz/__init__.py @@ -12,7 +12,7 @@ from classquiz.config import settings from classquiz.db import database from classquiz.routers import users, quiz, utils, stats, storage, search, testing_routes, editor from classquiz.socket_server import sio -from classquiz.helpers import meilisearch_init +from classquiz.helpers import meilisearch_init, telemetry_ping settings = settings() if settings.sentry_dsn: @@ -39,6 +39,7 @@ async def startup() -> None: if not database_.is_connected: await database_.connect() await meilisearch_init() + await telemetry_ping() @app.on_event("shutdown") diff --git a/classquiz/config.py b/classquiz/config.py index 3652fba..ada8b20 100644 --- a/classquiz/config.py +++ b/classquiz/config.py @@ -38,6 +38,7 @@ class Settings(BaseSettings): google_client_secret: Optional[str] github_client_id: Optional[str] github_client_secret: Optional[str] + telemetry_enabled: bool = True # storage_backend storage_backend: str | None = "deta" diff --git a/classquiz/db/models.py b/classquiz/db/models.py index f7b5103..8ce627c 100644 --- a/classquiz/db/models.py +++ b/classquiz/db/models.py @@ -119,6 +119,15 @@ class Quiz(ormar.Model): database = database +class InstanceData(ormar.Model): + instance_id: uuid.UUID = ormar.UUID(primary_key=True, default=uuid.uuid4(), nullable=False, unique=True) + + class Meta: + tablename = "instance_data" + metadata = metadata + database = database + + class Token(BaseModel): """ For JWT diff --git a/classquiz/helpers/__init__.py b/classquiz/helpers/__init__.py index 92b3f52..200cde8 100644 --- a/classquiz/helpers/__init__.py +++ b/classquiz/helpers/__init__.py @@ -5,7 +5,9 @@ import asyncio from typing import Optional -from classquiz.db.models import Quiz, User +import ormar.exceptions + +from classquiz.db.models import Quiz, User, InstanceData import xlsxwriter from aiohttp import ClientSession from io import BytesIO @@ -114,6 +116,23 @@ async def meilisearch_init(): print("Finished MeiliSearch synchronisation") +async def telemetry_ping(): + try: + instance_data = await InstanceData.objects.first() + except ormar.exceptions.NoMatch: + instance_data = InstanceData() + await instance_data.save() + async with ClientSession() as session, session.post( + f"https://cit.mawoka.eu.org/public/{instance_data.instance_id}", + json={ + "public_quizzes": await Quiz.objects.filter(public=True).count(), + "private_quizzes": await Quiz.objects.filter(public=False).count(), + "users": await User.objects.count(), + }, + ): + return + + def check_hashcash(data: str, input_data: str, claim_in: Optional[str] = "19") -> bool: """ It checks that the hashcash is valid, and if it is, it returns True diff --git a/frontend/src/lib/i18n/i18n-service.ts b/frontend/src/lib/i18n/i18n-service.ts index 1fe0520..17ea9ff 100644 --- a/frontend/src/lib/i18n/i18n-service.ts +++ b/frontend/src/lib/i18n/i18n-service.ts @@ -12,6 +12,7 @@ import fr from './locales/fr.json'; import tr from './locales/tr.json'; import id from './locales/id.json'; import ca from './locales/ca.json'; +import it from './locales/it.json'; import LanguageDetector from 'i18next-browser-languagedetector'; import type { i18n, Resource } from 'i18next'; @@ -61,6 +62,7 @@ export class I18nService { this.i18n.addResourceBundle('fr', 'translation', fr); this.i18n.addResourceBundle('tr', 'translation', tr); this.i18n.addResourceBundle('id', 'translation', id); + this.i18n.addResourceBundle('it', 'translation', it); this.i18n.addResourceBundle('ca', 'translation', ca); } diff --git a/frontend/src/lib/language-toggle.svelte b/frontend/src/lib/language-toggle.svelte index 627cc79..e0538e3 100644 --- a/frontend/src/lib/language-toggle.svelte +++ b/frontend/src/lib/language-toggle.svelte @@ -82,6 +82,11 @@ code: 'ca', name: 'Català', flag: '🇪🇸' + }, + { + code: 'it', + name: 'Italiano', + flag: '🇮🇹' } ]; const get_selected_language = (): string => { diff --git a/frontend/src/routes/docs/attribution/+page.svelte b/frontend/src/routes/docs/attribution/+page.svelte index 90b7916..58696e0 100644 --- a/frontend/src/routes/docs/attribution/+page.svelte +++ b/frontend/src/routes/docs/attribution/+page.svelte @@ -44,6 +44,9 @@
  • Joan Montané (Catalan)
  • +
  • + Max (Italian) +
  • ...Maybe you?

    diff --git a/migrations/versions/3f63c0130bce_added_instance_data.py b/migrations/versions/3f63c0130bce_added_instance_data.py new file mode 100644 index 0000000..d851579 --- /dev/null +++ b/migrations/versions/3f63c0130bce_added_instance_data.py @@ -0,0 +1,34 @@ +"""added instance_data + +Revision ID: 3f63c0130bce +Revises: ff573859eb32 +Create Date: 2022-08-28 20:20:28.932854 + +""" +from alembic import op +import sqlalchemy as sa +import ormar + + +# revision identifiers, used by Alembic. +revision = "3f63c0130bce" +down_revision = "ff573859eb32" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "instance_data", + sa.Column("instance_id", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=False), + sa.PrimaryKeyConstraint("instance_id"), + sa.UniqueConstraint("instance_id"), + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("instance_data") + # ### end Alembic commands ###