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('**Войдите или зарегистрируйтесь**')