spanish-task-generator / pages /2_👨‍🏫_Начало_работы.py
a-v-bely
Update interface
8cde930
raw
history blame
No virus
15.9 kB
import datetime
import streamlit as st
from utilities_database.user_database_utils import load_user_tasks_data
from utilities_database.user_database_utils import save_data_in_database
from utilities_database.user_database_widgets import user_save_text_table
from utilities_database.user_database_utils import load_users_particular_task
# Interface
if st.session_state.get('-LOGGED_IN_BOOL-'):
st.set_page_config(page_title='GenLexTasks', layout="wide", page_icon=':es:')
INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=False)
INSTRUCTION.markdown(
'**_I. Выберите режим работы._**'
'\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
'\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
'\n\n1. Придумайте **название** для файла с заданиями. '
'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов'
' введенного Вами текста.'
'\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите'
' создать задания. '
'\n\n3. Укажите *способ выбора целевых слов*:'
'\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
'\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме,'
' в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда'
' дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
'\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите'
' *:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при'
' подборе дистракторов.'
'\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее'
' поле. ️ ❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
'\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_'
' дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_'
' вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
'\n7. Выберите **способы вывода** готовых материалов.'
'\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно,'
' начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
'\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
'\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
'\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий,'
' которые Вы сохранили, языковой уровень и дата их создания.'
' Для загрузки определенного файла с заданиями:'
'\n1. Введите (или скопируйте из таблицы) название.'
'\n2. Укажите соответсвующий языковой уровень.'
'\n3. Нажмите на кнопку **"Загрузить"**.'
'\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
'\n\n\nДля того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**,'
' кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
WHAT_TO_DO = st.radio(
label='**Выберите режим работы**',
options=[
'Создать новые задания',
'Загрузить задания из моего архива'],
key='-WHAT_TO_DO_MODE-',
horizontal=True)
if WHAT_TO_DO == 'Загрузить задания из моего архива':
LOAD_FORM = st.form('LOAD_FORM')
UPLOAD_CLOUD_USER_NAME = st.session_state.get('-USER_NAME-')
loaded_data = load_user_tasks_data(
user_task_database=user_save_text_table,
save_type='download',
creator_name=UPLOAD_CLOUD_USER_NAME)
LOAD_FORM.table(loaded_data)
COL1, COL2 = LOAD_FORM.columns([1, 1])
UPLOAD_CLOUD_FILE_NAME = COL1.text_input('Введите название заданий', placeholder='Жду название')
with COL2:
UPLOAD_CLOUD_CEFR_LEVEL = st.selectbox(
label='Выберите языковой уровень',
options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
index=None,
placeholder='-Выберите языковой уровень-')
st.session_state['-UPLOAD_CLOUD_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL
LOAD_BUTTON = LOAD_FORM.form_submit_button('Загрузить')
if LOAD_BUTTON:
if UPLOAD_CLOUD_USER_NAME in (None, '') or UPLOAD_CLOUD_FILE_NAME in (None, ''):
st.error('Вы не заполнили все поля')
st.stop()
__TASK_DATA__ = load_users_particular_task(
user_task_database=user_save_text_table,
load_mode='download',
creator_name=UPLOAD_CLOUD_USER_NAME,
save_name=UPLOAD_CLOUD_FILE_NAME,
cefr_level=UPLOAD_CLOUD_CEFR_LEVEL)
# In order to bypass further
st.session_state['UPLOAD_CLOUD_USER_NAME'] = UPLOAD_CLOUD_USER_NAME
st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = UPLOAD_CLOUD_FILE_NAME
st.session_state['RESULT'] = __TASK_DATA__
st.session_state['-LOADED_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL
st.session_state['-DISPLAY_READY-'] = True
st.session_state['-DISPLAY_VERSION-'] = True
st.session_state['-DOWNLOAD_VERSION-'] = True
st.session_state['-ONLINE_TEST_READY-'] = True
st.success('Данные загружены. Можете переходить на следующие страницы.')
else:
# Upload text form
FORM = st.form('CREATE_FORM')
USER__SAVE_IN_CLOUD_FILE_NAME = FORM.text_input(
'**Введите название**',
placeholder='Жду название',
key='-USER__SAVE_IN_CLOUD_FILE_NAME-')
UPLOAD_TEXT = FORM.text_area(
label='**Вставьте текст:**',
value='',
placeholder='Жду текст',
key='-USER_INPUT_TEXT-')
UPLOAD_FILE = FORM.file_uploader(
label='**Или выберите файл:**',
type='txt',
key='-USER_INPUT_FILE-')
TW_MODE_COL, DISTRACTOR_MODEL_COL = FORM.columns(2)
TARGET_WORDS_MODE = TW_MODE_COL.radio(
label='**Как выбирать целевые слова?**',
options=['Автоматически', 'Самостоятельно'],
key='-TARGET_WORDS_MODE-', horizontal=True)
DISTRACTOR_MODEL = DISTRACTOR_MODEL_COL.radio(
label='**Модель для выбора неправильных вариантов**',
options=['Модель-1', 'Модель-2', 'Модель-3'],
key='-DISTRACTOR_MODEL_MODE-', horizontal=True)
CEFR_NUM_DISTRACTORS_COL, UTW_COL = FORM.columns([2, 2])
with CEFR_NUM_DISTRACTORS_COL:
CEFR_TEXT_LEVEL = st.selectbox(
label='Выберите языковой уровень',
options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
index=None,
placeholder='-Выберите языковой уровень-')
st.session_state['-CEFR_TEXT_LEVEL-'] = CEFR_TEXT_LEVEL
NUMBER_DISTRACTORS = CEFR_NUM_DISTRACTORS_COL.number_input(
label='**Выберите количество дистракторов в задании:**',
min_value=1,
max_value=9,
value=3,
key='-NUM_DISTRACTORS-')
TARGET_WORDS = UTW_COL.text_area(
label='**Если "Самостоятельно", введите целевые слова:**',
value='',
height=120,
placeholder='Через запятую',
key='-INPUT_TARGET_WORDS-')
FORM.markdown('**Выберите формат(-ы) вывода:**')
col1, col2, col3 = FORM.columns(3)
SAVE_IN_CLOUD = col1.checkbox(
label='**Сохранить в облаке**',
value=False,
key='-SAVE_IN_CLOUD-')
DOWNLOAD_VERSION = col2.checkbox(
label='**Скачать**',
value=False,
key='-DOWNLOAD_VERSION-')
ONLINE_TEST_VERSION = col3.checkbox(
label='**Онлайн тест**',
value=True,
key='-ONLINE_TEST_VERSION-')
START_COL, RERUN_COL, EXIT_COL = FORM.columns([1, 1, 1])
START_BUTTON = START_COL.form_submit_button(
label='**Запуск**',
use_container_width=True)
RERUN_BUTTON = RERUN_COL.form_submit_button(
label='**Перезагрузка**',
use_container_width=True)
EXIT_BUTTON = EXIT_COL.form_submit_button(
label='**Выход**',
use_container_width=True)
if START_BUTTON:
# Initiate interface structure
LOGS = st.status(label='Прогресс выполнения', expanded=True)
PROGRESS_BAR = LOGS.progress(0)
PROGRESS_BAR_DISTRACTORS = LOGS.progress(0)
# Start generation process. Everything happens inside main_workflow func
if DISTRACTOR_MODEL == 'Модель-3':
from utilities_language_bert.esp_main_workflow_bert import main_workflow
__TASK_DATA__ = main_workflow(
file=UPLOAD_FILE,
text=UPLOAD_TEXT,
logs=LOGS,
progress=PROGRESS_BAR,
progress_d=PROGRESS_BAR_DISTRACTORS,
level=CEFR_TEXT_LEVEL,
tw_mode_automatic_mode=TARGET_WORDS_MODE,
target_words=TARGET_WORDS,
num_distractors=NUMBER_DISTRACTORS,
save_name=USER__SAVE_IN_CLOUD_FILE_NAME)
else:
from utilities_language_w2v.esp_main_workflow_w2v import main_workflow
__TASK_DATA__ = main_workflow(
file=UPLOAD_FILE,
text=UPLOAD_TEXT,
logs=LOGS,
progress=PROGRESS_BAR,
progress_d=PROGRESS_BAR_DISTRACTORS,
level=CEFR_TEXT_LEVEL,
tw_mode_automatic_mode=TARGET_WORDS_MODE,
target_words=TARGET_WORDS,
num_distractors=NUMBER_DISTRACTORS,
save_name=USER__SAVE_IN_CLOUD_FILE_NAME,
model_name=DISTRACTOR_MODEL)
# In order to bypass further
USER__SAVE_IN_CLOUD_FILE_NAME = USER__SAVE_IN_CLOUD_FILE_NAME if USER__SAVE_IN_CLOUD_FILE_NAME != '' \
else __TASK_DATA__['name']
st.session_state['RESULT'] = __TASK_DATA__
st.session_state['-DISPLAY_READY-'] = True
st.session_state['-DISPLAY_VERSION-'] = True
st.session_state['-ONLINE_TEST_READY-'] = True
st.session_state['-LOADED_CEFR_LEVEL-'] = CEFR_TEXT_LEVEL
st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = USER__SAVE_IN_CLOUD_FILE_NAME
PROGRESS_BAR.progress(100)
PROGRESS_BAR_DISTRACTORS.progress(100)
LOGS.update(label='**Все готово! Готовые задания и/или онлайн-тест доступны в соответствующих вкладках.**',
state='complete', expanded=False)
save_data_in_database(
user_task_database=user_save_text_table,
save_type='download',
save_name=USER__SAVE_IN_CLOUD_FILE_NAME,
cefr_level=CEFR_TEXT_LEVEL,
time_stamp=str(datetime.datetime.now())[:-7],
creator_name=st.session_state.get('-USER_NAME-'),
generated_result=__TASK_DATA__,
distractor_model=DISTRACTOR_MODEL, allow=SAVE_IN_CLOUD)
if EXIT_BUTTON:
for key in st.session_state:
del st.session_state[key]
st.error('Я устал. Я ухожу')
st.session_state["START_GENERATION"] = False
st.stop()
if RERUN_BUTTON:
for key in st.session_state:
del st.session_state[key]
st.error('Что-то пошло не так?! Перезагружаюсь!')
st.session_state["START_GENERATION"] = False
st.stop()
st.rerun()
# LABEL
st.markdown('*Автор-разработчик: А.В.Белый, кафедра математической лингвистики, филологический факультет СПбГУ,'
' 3 курс, бакалавриат, "Прикладная, компьютерная и математическая лингвистика (английский язык)"*'
'\n\n*Научный руководитель: канд. филол. наук, доц. О.А.Митрофанова*')
st.markdown('*E-mail: st087202@student.spbu.ru*')
else:
st.warning('**Войдите или зарегистрируйтесь**')