From ab7aaecc7fff3193ed5821eefed5989a0fbff426 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Thu, 29 Feb 2024 20:18:53 +0100 Subject: [PATCH 01/15] chore: added dependencies (openai, black, isort) --- requirements.lock.txt | 35 +++++++++++++++++++++++++++++++++++ requirements.txt | 3 +++ 2 files changed, 38 insertions(+) diff --git a/requirements.lock.txt b/requirements.lock.txt index 7cedba7..1d93ef3 100644 --- a/requirements.lock.txt +++ b/requirements.lock.txt @@ -15,6 +15,8 @@ annotated-types==0.6.0 anyio==4.3.0 # via # -r requirements.txt + # httpx + # openai # starlette asttokens==2.4.1 # via stack-data @@ -24,12 +26,18 @@ billiard==4.2.0 # via # -r requirements.txt # celery +black==24.2.0 + # via -r requirements.txt build==1.0.3 # via # -r requirements.txt # pip-tools celery==5.3.6 # via -r requirements.txt +certifi==2024.2.2 + # via + # httpcore + # httpx cfgv==3.4.0 # via # -r requirements.txt @@ -37,6 +45,7 @@ cfgv==3.4.0 click==8.1.7 # via # -r requirements.txt + # black # celery # click-didyoumean # click-plugins @@ -61,6 +70,8 @@ distlib==0.3.8 # via # -r requirements.txt # virtualenv +distro==1.9.0 + # via openai dnspython==2.6.1 # via # -r requirements.txt @@ -80,7 +91,12 @@ filelock==3.13.1 h11==0.14.0 # via # -r requirements.txt + # httpcore # uvicorn +httpcore==1.0.4 + # via httpx +httpx==0.27.0 + # via openai identify==2.5.35 # via # -r requirements.txt @@ -89,8 +105,11 @@ idna==3.6 # via # -r requirements.txt # anyio + # httpx ipython==8.22.1 # via -r requirements.txt +isort==5.13.2 + # via -r requirements.txt jedi==0.19.1 # via ipython kombu==5.3.5 @@ -101,16 +120,23 @@ matplotlib-inline==0.1.6 # via ipython motor==3.3.2 # via -r requirements.txt +mypy-extensions==1.0.0 + # via black nodeenv==1.8.0 # via # -r requirements.txt # pre-commit +openai==1.13.3 + # via -r requirements.txt packaging==23.2 # via # -r requirements.txt + # black # build parso==0.8.3 # via jedi +pathspec==0.12.1 + # via black pexpect==4.9.0 # via ipython pip-tools==7.4.0 @@ -118,6 +144,7 @@ pip-tools==7.4.0 platformdirs==4.2.0 # via # -r requirements.txt + # black # virtualenv pre-commit==3.6.2 # via -r requirements.txt @@ -134,6 +161,7 @@ pydantic==2.6.2 # via # -r requirements.txt # fastapi + # openai # pydantic-settings pydantic-core==2.16.3 # via @@ -175,6 +203,8 @@ sniffio==1.3.0 # via # -r requirements.txt # anyio + # httpx + # openai stack-data==0.6.3 # via ipython starlette==0.36.3 @@ -183,9 +213,12 @@ starlette==0.36.3 # fastapi tomli==2.0.1 # via + # black # build # pip-tools # pyproject-hooks +tqdm==4.66.2 + # via openai traitlets==5.14.1 # via # ipython @@ -194,7 +227,9 @@ typing-extensions==4.9.0 # via # -r requirements.txt # anyio + # black # fastapi + # openai # pydantic # pydantic-core # uvicorn diff --git a/requirements.txt b/requirements.txt index e01f280..c772392 100644 --- a/requirements.txt +++ b/requirements.txt @@ -45,3 +45,6 @@ virtualenv==20.25.1 wcwidth==0.2.13 wheel==0.42.0 ipython==8.22.1 +openai==1.13.3 +isort==5.13.2 +black==24.2.0 From ff0a8c76c4ffcccf25888d3bdd4a5da9ce0b45d0 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Thu, 29 Feb 2024 20:19:43 +0100 Subject: [PATCH 02/15] chore: added .env to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 7be6d32..51ff8df 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ Parser/json_file.json venv/ __pycache__/ data +.env From 9d2d7d7f703694c6b47b110196b6b1e1ec6ead92 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Thu, 29 Feb 2024 20:20:55 +0100 Subject: [PATCH 03/15] feat: CategoriesEnum class implemented --- apps/models.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 apps/models.py diff --git a/apps/models.py b/apps/models.py new file mode 100644 index 0000000..e9d1d91 --- /dev/null +++ b/apps/models.py @@ -0,0 +1,9 @@ +from enum import Enum + + +class CategoriesEnum(Enum): + IDIOMS: str = "idioms" + TRANSPORT: str = "transport" + SCHOOL: str = "school" + PROFESSIONS: str = "professions" + IT: str = "it" From bbcaa486021de8c97063ed60d00d61ccfa3b7555 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Thu, 29 Feb 2024 20:22:15 +0100 Subject: [PATCH 04/15] feat: get words (& cleanup) from AI - done --- apps/celery/worker.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 apps/celery/worker.py diff --git a/apps/celery/worker.py b/apps/celery/worker.py new file mode 100644 index 0000000..af821a6 --- /dev/null +++ b/apps/celery/worker.py @@ -0,0 +1,31 @@ +import random + +import openai +from celery import Celery + +from apps.models import CategoriesEnum +from settings import settings + +celery_worker: Celery = Celery("open_ai_downloader", broker=settings.REDIS_BROKER_URL) + + +def get_random_category(category: CategoriesEnum) -> str: + return random.choice(list(CategoriesEnum)).value + + +def get_new_words_from_AI(category: CategoriesEnum) -> str: + client = openai.OpenAI(api_key=settings.OPENAI_API_KEY) + response = client.chat.completions.create( + model="gpt-3.5-turbo", + messages=[ + {"role": "user", "content": f"Give me 10 of most common English words in {category}."} + ], + ) + raw_words: str = response.choices[0].message.content + return raw_words + + +def clean_response_from_AI(words: str) -> list[str]: + return [ + word for word in words.split() if not any(char.isdigit() for char in word.replace(".", "")) + ] From 9a28039c9ea42e604d167600a59f7b8dbe5f046b Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Fri, 1 Mar 2024 19:53:22 +0100 Subject: [PATCH 05/15] chore: implemented enum class as a placeholder for level of english words --- apps/models.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/models.py b/apps/models.py index e9d1d91..ce367df 100644 --- a/apps/models.py +++ b/apps/models.py @@ -7,3 +7,11 @@ class CategoriesEnum(Enum): SCHOOL: str = "school" PROFESSIONS: str = "professions" IT: str = "it" + + +class EnglishLevelEnum(Enum): + A1: str = "A1" + A2: str = "A2" + B1: str = "B1" + B2: str = "B2" + C1: str = "C1" From a53a83ade2dc5105351ffdab2498b2cddd76fb02 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Fri, 1 Mar 2024 21:03:57 +0100 Subject: [PATCH 06/15] chore: removed it category --- apps/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/models.py b/apps/models.py index ce367df..14ea70e 100644 --- a/apps/models.py +++ b/apps/models.py @@ -6,7 +6,6 @@ class CategoriesEnum(Enum): TRANSPORT: str = "transport" SCHOOL: str = "school" PROFESSIONS: str = "professions" - IT: str = "it" class EnglishLevelEnum(Enum): From 391826a3cd72e3639b211b696b29d036d036d9c6 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Fri, 1 Mar 2024 21:05:07 +0100 Subject: [PATCH 07/15] refactor: implemented getter of a random english level & passed it's usage in get_new_words_from_AI --- apps/celery/worker.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/celery/worker.py b/apps/celery/worker.py index af821a6..9d8089b 100644 --- a/apps/celery/worker.py +++ b/apps/celery/worker.py @@ -3,7 +3,7 @@ import openai from celery import Celery -from apps.models import CategoriesEnum +from apps.models import CategoriesEnum, EnglishLevelEnum from settings import settings celery_worker: Celery = Celery("open_ai_downloader", broker=settings.REDIS_BROKER_URL) @@ -13,16 +13,25 @@ def get_random_category(category: CategoriesEnum) -> str: return random.choice(list(CategoriesEnum)).value -def get_new_words_from_AI(category: CategoriesEnum) -> str: +def get_random_english_level(level: EnglishLevelEnum) -> str: + return random.choice(list(EnglishLevelEnum)).value + + +def get_new_words_from_AI(category: str, level: str) -> list[str]: client = openai.OpenAI(api_key=settings.OPENAI_API_KEY) response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[ - {"role": "user", "content": f"Give me 10 of most common English words in {category}."} + { + "role": "user", + "content": ( + f"Give me 10 of most common English words about {category} on {level} level." + ), + } ], ) raw_words: str = response.choices[0].message.content - return raw_words + return {"category": category, "level": level, "raw_words": raw_words} def clean_response_from_AI(words: str) -> list[str]: From f848037835e9d64504accc38ae8ec6c0a463df51 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Wed, 6 Mar 2024 18:15:30 +0100 Subject: [PATCH 08/15] feat: implemented UnvalidatedWord --- apps/models.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/apps/models.py b/apps/models.py index 14ea70e..9dbbfbe 100644 --- a/apps/models.py +++ b/apps/models.py @@ -1,5 +1,8 @@ +import uuid from enum import Enum +from pydantic import BaseModel, Field + class CategoriesEnum(Enum): IDIOMS: str = "idioms" @@ -14,3 +17,20 @@ class EnglishLevelEnum(Enum): B1: str = "B1" B2: str = "B2" C1: str = "C1" + + +class UnvalidatedWord(BaseModel): + _id: str = Field(default_factory=uuid.uuid4, alias="_id") + word: str + category: str + level: str + + class Config: + allow_population_by_field_name = True + schema_extra = { + "example": { + "word": "Break the ice", + "category": "idioms", + "level": "A1", + } + } From 50b5141aeec9483b59804811d9f836739f8ebf1e Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Wed, 6 Mar 2024 18:17:10 +0100 Subject: [PATCH 09/15] refactor: removed unused arg --- apps/celery/worker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/celery/worker.py b/apps/celery/worker.py index 9d8089b..0e5e487 100644 --- a/apps/celery/worker.py +++ b/apps/celery/worker.py @@ -9,11 +9,11 @@ celery_worker: Celery = Celery("open_ai_downloader", broker=settings.REDIS_BROKER_URL) -def get_random_category(category: CategoriesEnum) -> str: +def get_random_category() -> str: return random.choice(list(CategoriesEnum)).value -def get_random_english_level(level: EnglishLevelEnum) -> str: +def get_random_english_level() -> str: return random.choice(list(EnglishLevelEnum)).value From 505d10e4134c96d63dc8566b86a2cfac23c66a30 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Wed, 6 Mar 2024 19:29:21 +0100 Subject: [PATCH 10/15] refactor: changed _id to id & modified default_factory of id --- apps/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/models.py b/apps/models.py index 9dbbfbe..3616912 100644 --- a/apps/models.py +++ b/apps/models.py @@ -20,14 +20,14 @@ class EnglishLevelEnum(Enum): class UnvalidatedWord(BaseModel): - _id: str = Field(default_factory=uuid.uuid4, alias="_id") + id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id") word: str category: str level: str class Config: - allow_population_by_field_name = True - schema_extra = { + populate_by_name = True + json_schema_extra = { "example": { "word": "Break the ice", "category": "idioms", From e51dbb5a8159df07bfc662cfbcec483382357ea1 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Thu, 7 Mar 2024 20:06:02 +0100 Subject: [PATCH 11/15] refactor: imports --- apps/celery/worker.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/celery/worker.py b/apps/celery/worker.py index 0e5e487..cdf86a1 100644 --- a/apps/celery/worker.py +++ b/apps/celery/worker.py @@ -1,9 +1,11 @@ import random +from typing import Any import openai from celery import Celery -from apps.models import CategoriesEnum, EnglishLevelEnum +from apps.db import get_mongo_db +from apps.models import CategoriesEnum, EnglishLevelEnum, UnvalidatedWord from settings import settings celery_worker: Celery = Celery("open_ai_downloader", broker=settings.REDIS_BROKER_URL) From d65cb8b4959690398b744a887a21e32c2e5ee7c5 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Thu, 7 Mar 2024 20:07:04 +0100 Subject: [PATCH 12/15] refactor: no need to return a dict (from get_new_words_from_AI) --- apps/celery/worker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/celery/worker.py b/apps/celery/worker.py index cdf86a1..5ac86bb 100644 --- a/apps/celery/worker.py +++ b/apps/celery/worker.py @@ -19,7 +19,7 @@ def get_random_english_level() -> str: return random.choice(list(EnglishLevelEnum)).value -def get_new_words_from_AI(category: str, level: str) -> list[str]: +def get_new_words_from_AI(category: str, level: str) -> str: client = openai.OpenAI(api_key=settings.OPENAI_API_KEY) response = client.chat.completions.create( model="gpt-3.5-turbo", From 0c95d4b6e71d9abc4181ae5006c59d0270ee1a81 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Thu, 7 Mar 2024 20:07:32 +0100 Subject: [PATCH 13/15] feat: save_into_mongodb & draft of celery task --- apps/celery/worker.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/celery/worker.py b/apps/celery/worker.py index 5ac86bb..e73fa8a 100644 --- a/apps/celery/worker.py +++ b/apps/celery/worker.py @@ -32,11 +32,25 @@ def get_new_words_from_AI(category: str, level: str) -> str: } ], ) - raw_words: str = response.choices[0].message.content - return {"category": category, "level": level, "raw_words": raw_words} + return response.choices[0].message.content def clean_response_from_AI(words: str) -> list[str]: return [ word for word in words.split() if not any(char.isdigit() for char in word.replace(".", "")) ] + + +def save_into_mongodb(collection: str, document: dict[str, Any]) -> None: + return get_mongo_db()[collection].insert_one(document) + + +@celery_worker.add_periodic_task +async def get_words_parse_and_store_in_database(): + category: str = get_random_category() + level: str = get_random_english_level() + words_before_cleaning: dict[str, Any] = get_new_words_from_AI(category=category, level=level) + cleaned_words = clean_response_from_AI(words_before_cleaning) + for word in cleaned_words: + document = UnvalidatedWord(level=level, category=category, word=word).model_dump() + save_into_mongodb(collection="unvalidated_words", document=document) From 4282940e69f7eb6cc4185d5c5dec745f466099d6 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Sun, 10 Mar 2024 14:44:19 +0100 Subject: [PATCH 14/15] refactor: enum.Enum -> enum.StrEnum --- apps/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/models.py b/apps/models.py index 3616912..cd0f0d6 100644 --- a/apps/models.py +++ b/apps/models.py @@ -1,17 +1,17 @@ import uuid -from enum import Enum +from enum import StrEnum from pydantic import BaseModel, Field -class CategoriesEnum(Enum): +class CategoriesEnum(StrEnum): IDIOMS: str = "idioms" TRANSPORT: str = "transport" SCHOOL: str = "school" PROFESSIONS: str = "professions" -class EnglishLevelEnum(Enum): +class EnglishLevelEnum(StrEnum): A1: str = "A1" A2: str = "A2" B1: str = "B1" From 6cc548f93cfd4a0d5391f4095d2fe68c5ed47420 Mon Sep 17 00:00:00 2001 From: Wojciech Ziarnik Date: Sun, 24 Nov 2024 17:07:32 +0100 Subject: [PATCH 15/15] chore: committing all files, work stopped on this branch --- .env.template | 16 +++++++ TODO.md | 16 +++++++ apps/celery/celery_app.py | 15 +++++++ apps/celery/worker.py | 52 +++-------------------- apps/utils.py | 42 ++++++++++++++++++ ci/entrypoint.sh | 2 +- docker-compose.yml | 15 +++++++ docx_files/wbudowane funkcje pythona.docx | 0 old_version.py | 25 +++++++++++ 9 files changed, 137 insertions(+), 46 deletions(-) create mode 100644 .env.template create mode 100644 TODO.md create mode 100644 apps/celery/celery_app.py create mode 100644 apps/utils.py create mode 100644 docx_files/wbudowane funkcje pythona.docx create mode 100644 old_version.py diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..0414e87 --- /dev/null +++ b/.env.template @@ -0,0 +1,16 @@ +############### +# OPEN AI API # +############### +OPENAI_API_KEY= + +######### +# MONGO # +######### +MONGO_INITDB_ROOT_USERNAME= +MONGO_INITDB_ROOT_PASSWORD= +MONGO_INITDB_DATABASE= + +######### +# REDIS # +######### +REDIS_BROKER_URL= diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..517a438 --- /dev/null +++ b/TODO.md @@ -0,0 +1,16 @@ +- dockerize +- mongodb connection +- model of flashcard +- parsing document +- logging +- settings +- ci/cd + + +[x] <- docker compose: app + mongo + celery worker & redis +[x] <- mongodb: connect +[ ] <- tests +[ ] <- celery: create task +[x] <- pyproject: adapt +[ ] <- endpoint for web's healthcheck +[ ] <- configure dockerignore diff --git a/apps/celery/celery_app.py b/apps/celery/celery_app.py new file mode 100644 index 0000000..1a4022b --- /dev/null +++ b/apps/celery/celery_app.py @@ -0,0 +1,15 @@ +from celery import Celery +from celery.schedules import crontab + +from settings import settings + +celery_app: Celery = Celery( + "open_ai_downloader", broker=settings.REDIS_BROKER_URL, backend=settings.REDIS_BROKER_URL +) + +celery_app.conf.beat_schedule = { + "get-new-words-each-five-minutes": { + "task": "apps.celery.worker.get_words_parse_and_store_in_database", + "schedule": crontab(minute="*/5"), + }, +} diff --git a/apps/celery/worker.py b/apps/celery/worker.py index e73fa8a..d287af9 100644 --- a/apps/celery/worker.py +++ b/apps/celery/worker.py @@ -1,52 +1,14 @@ -import random from typing import Any -import openai -from celery import Celery +from apps.celery.celery_app import celery_app +from apps.models import UnvalidatedWord +from apps.utils import (clean_response_from_AI, get_new_words_from_AI, + get_random_category, get_random_english_level, + save_into_mongodb) -from apps.db import get_mongo_db -from apps.models import CategoriesEnum, EnglishLevelEnum, UnvalidatedWord -from settings import settings -celery_worker: Celery = Celery("open_ai_downloader", broker=settings.REDIS_BROKER_URL) - - -def get_random_category() -> str: - return random.choice(list(CategoriesEnum)).value - - -def get_random_english_level() -> str: - return random.choice(list(EnglishLevelEnum)).value - - -def get_new_words_from_AI(category: str, level: str) -> str: - client = openai.OpenAI(api_key=settings.OPENAI_API_KEY) - response = client.chat.completions.create( - model="gpt-3.5-turbo", - messages=[ - { - "role": "user", - "content": ( - f"Give me 10 of most common English words about {category} on {level} level." - ), - } - ], - ) - return response.choices[0].message.content - - -def clean_response_from_AI(words: str) -> list[str]: - return [ - word for word in words.split() if not any(char.isdigit() for char in word.replace(".", "")) - ] - - -def save_into_mongodb(collection: str, document: dict[str, Any]) -> None: - return get_mongo_db()[collection].insert_one(document) - - -@celery_worker.add_periodic_task -async def get_words_parse_and_store_in_database(): +@celery_app.shared_task() +def get_words_parse_and_store_in_database(*args, **kwargs): category: str = get_random_category() level: str = get_random_english_level() words_before_cleaning: dict[str, Any] = get_new_words_from_AI(category=category, level=level) diff --git a/apps/utils.py b/apps/utils.py new file mode 100644 index 0000000..bb4a601 --- /dev/null +++ b/apps/utils.py @@ -0,0 +1,42 @@ +import random +from typing import Any + +import openai + +from apps.db import get_mongo_db +from apps.models import CategoriesEnum, EnglishLevelEnum +from settings import settings + + +def get_random_category() -> str: + return random.choice(list(CategoriesEnum)).value + + +def get_random_english_level() -> str: + return random.choice(list(EnglishLevelEnum)).value + + +def get_new_words_from_AI(category: str, level: str) -> str: + client = openai.OpenAI(api_key=settings.OPENAI_API_KEY) + response = client.chat.completions.create( + model="gpt-3.5-turbo", + messages=[ + { + "role": "user", + "content": ( + f"Give me 10 of most common English words about {category} on {level} level." + ), + } + ], + ) + return response.choices[0].message.content + + +def clean_response_from_AI(words: str) -> list[str]: + return [ + word for word in words.split() if not any(char.isdigit() for char in word.replace(".", "")) + ] + + +def save_into_mongodb(collection: str, document: dict[str, Any]) -> None: + return get_mongo_db()[collection].insert_one(document) diff --git a/ci/entrypoint.sh b/ci/entrypoint.sh index 784f1da..920d1af 100755 --- a/ci/entrypoint.sh +++ b/ci/entrypoint.sh @@ -6,7 +6,7 @@ case "$1" in uvicorn main:app --host 0.0.0.0 --port 8000 ;; run-celery) - celery -A your_celery_app_name worker --loglevel=info # TODO + celery -A apps.celery.celery_app.celery_app worker --loglevel=info -E # TODO ;; *) echo "Użycie: $0 {run-uvicorn|run-celery}" diff --git a/docker-compose.yml b/docker-compose.yml index 3aa8878..299d6ff 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,6 +26,19 @@ services: start_period: 20s timeout: 10s + celery: + build: + context: . + dockerfile: ./ci/dockerfiles/Dockerfile + entrypoint: ./ci/entrypoint.sh run-celery + env_file: + - .env + restart: always + networks: + - app-network + depends_on: + - redis + mongodb: image: mongo:7.0 env_file: @@ -42,6 +55,8 @@ services: redis: image: redis:7-alpine + networks: + - app-network networks: app-network: diff --git a/docx_files/wbudowane funkcje pythona.docx b/docx_files/wbudowane funkcje pythona.docx new file mode 100644 index 0000000..e69de29 diff --git a/old_version.py b/old_version.py new file mode 100644 index 0000000..73a8288 --- /dev/null +++ b/old_version.py @@ -0,0 +1,25 @@ +# if form.is_valid(): +# """ +# Here app is checking if form is valid (if the user is uploading correct files). +# Than document is parsed by paragraphs and paragraphs becomes variables used in creating flashcards. +# """ +# uploaded_document = request.FILES['document'] +# document_to_parse = Document(uploaded_document) +# category = str() +# title = str() +# flashcards_dict = dict() +# for paragraph in document_to_parse.paragraphs: +# if paragraph.style.name == 'Title': +# category = paragraph.text +# flashcard_category_instance = FlashcardCategory(name=category) +# flashcard_category_instance.save() +# elif paragraph.style.name == "Heading 1": +# title = paragraph.text +# elif paragraph.style.name == "normal": +# content = paragraph.text +# flashcards_dict[title] = content + +# for key in flashcards_dict.keys(): +# flashcard_instance = Flashcard(category=FlashcardCategory.objects.get(name=category), # type: ignore +# title=key, +# content=flashcards_dict[key])