a-v-bely commited on
Commit
8cde930
1 Parent(s): 2285feb

Update interface

Browse files
app.py CHANGED
@@ -5,8 +5,8 @@ from utilities_database.user_database_widgets import LogIn
5
 
6
  warnings.filterwarnings('ignore')
7
  st.header('Добро пожаловать!')
8
- st.subheader('Вы используете инструмент по автоматической генерации лексико-грамматических заданий по '
9
- 'испанскому языку!')
10
  st.write('**Зарегистрируйтесь или войдите в аккаунт**')
11
  __login__obj = LogIn(auth_token=st.secrets['COURIER_AUTH_TOKEN'],
12
  company_name=st.secrets['COMPANY_NAME'],
 
5
 
6
  warnings.filterwarnings('ignore')
7
  st.header('Добро пожаловать!')
8
+ st.subheader('Вы используете инструмент по автоматической генерации лексико-грамматических заданий по'
9
+ ' испанскому языку!')
10
  st.write('**Зарегистрируйтесь или войдите в аккаунт**')
11
  __login__obj = LogIn(auth_token=st.secrets['COURIER_AUTH_TOKEN'],
12
  company_name=st.secrets['COMPANY_NAME'],
pages/1_⚙️_Инструкция.py CHANGED
@@ -5,18 +5,18 @@ st.set_page_config(page_title='GenLexTasks', layout="wide", page_icon=':es:')
5
  if st.session_state.get('-LOGGED_IN_BOOL-'):
6
  ANNOUNCES = st.expander('**ВАЖНАЯ ИНФОРМАЦИЯ**', expanded=True)
7
  ANNOUNCES.success(
8
- '**Уважаемые пользователи, пожалуйста, после генерации заданий перейдите на вкладку "📝Онлайн-тест" '
9
- 'и заполните там опросник. Таким образом Вы очень поможете в улучшении качества заданий! Спасибо!🤗**')
10
  ANNOUNCES.warning(
11
- '**Сейчас генератор проходит завершающую настройку и отладку, для которой необходимо большое количество '
12
- 'данных об уместности выбранных целевых слов и дистракторов к ним. Поэтому просим Вас отнестись с пониманием '
13
- 'к излишне большому количеству заданий.**')
14
  ANNOUNCES.warning(
15
- '**❗️ㅤУбедительно просим Вас дожидаться окончания генерации или загрузки и не переходить на '
16
- 'другие вкладки до выведения соответствующего сообщения.**')
17
  ANNOUNCES.warning(
18
- '**❗ㅤВ случае появления красных сообщений об ошибке, как правило, проблема решается '
19
- 'повторными нажатиями на нужный Вам элемент. Приносим извинения за неудобства.**')
20
 
21
  INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=True)
22
  INSTRUCTION.markdown(
@@ -24,38 +24,38 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
24
  '\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
25
  '\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
26
  '\n\n1. Придумайте **название** для файла с заданиями. '
27
- 'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов '
28
- 'введенного Вами текста.'
29
- '\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите '
30
  'создать задания. '
31
  '\n\n3. Укажите *способ выбора целевых слов*:'
32
  '\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
33
- '\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме, '
34
- 'в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда '
35
- 'дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
36
- '\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите '
37
- '*:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при '
38
- 'подборе дистракторов.'
39
- '\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее '
40
- 'поле. ️ \n❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
41
- '\n\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_ '
42
- 'дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_ '
43
- 'вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
44
  '\n7. Выберите **способы вывода** готовых материалов.'
45
- '\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно, '
46
- 'начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
47
  '\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
48
  'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
49
  '\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
50
- '\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий, '
51
- 'которые Вы сохранили, языковой уровень и дата их создания.'
52
  ' Для загрузки определенного файла с заданиями:'
53
  '\n1. Введите (или скопируйте из таблицы) название.'
54
  '\n2. Укажите соответсвующий языковой уровень.'
55
  '\n3. Нажмите на кнопку **"Загрузить"**.'
56
  '\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
57
- '\n\n\nДля того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**, '
58
- 'кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
59
 
60
  INSTRUCTION_ONLINE_TEST = st.expander(label='**ИНСТРУКЦИЯ ОНЛАЙН-ТЕСТ**', expanded=True)
61
  INSTRUCTION_ONLINE_TEST.markdown(
@@ -64,10 +64,10 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
64
  '\n\n- В **первом столбце** приводится ответ - слово, удаленное из оригинального текста.'
65
  '\n\n- Отметьте во **втором столбце**, уместно ли создавать задание с данным словом.'
66
  '\n\n- В **третьем столбце** приведены подобранные программой дистракторы.'
67
- '\n\n- Введите в **четвертый столбец** дистракторы (целиком или букву), которые, по Вашему мнению, '
68
- '**:red[не уместны]**. '
69
- '\n\n**:green[Уместными дистракторами]** мы предлагаем считать те, которые одновременно удовлетворяют '
70
- 'следующим условиям в рамках языкового уровня, для которого они созданы:'
71
  '\n\n1. не слишком очевидно являются неправильными вариантами (*варить суп/стол*);'
72
  '\n\n2. и при этом не могут быть полноценной заменой удаленного слова (*варить суп/кашу*)'
73
  )
 
5
  if st.session_state.get('-LOGGED_IN_BOOL-'):
6
  ANNOUNCES = st.expander('**ВАЖНАЯ ИНФОРМАЦИЯ**', expanded=True)
7
  ANNOUNCES.success(
8
+ '**Уважаемые пользователи, пожалуйста, после генерации заданий перейдите на вкладку "📝Онлайн-тест"'
9
+ ' и заполните там опросник. Таким образом Вы очень поможете в улучшении качества заданий! Спасибо!🤗**')
10
  ANNOUNCES.warning(
11
+ '**Сейчас генератор проходит завершающую настройку и отладку, для которой необходимо большое количество'
12
+ ' данных об уместности выбранных целевых слов и дистракторов к ним. Поэтому просим Вас отнестись с пониманием'
13
+ ' к излишне большому количеству заданий.**')
14
  ANNOUNCES.warning(
15
+ '**❗️ㅤУбедительно просим Вас дожидаться окончания генерации или загрузки и не переходить на'
16
+ ' другие вкладки до выведения соответствующего сообщения.**')
17
  ANNOUNCES.warning(
18
+ '**❗ㅤВ случае появления сообщений об ошибке, как правило, проблема решается'
19
+ ' повторными нажатиями на нужный Вам элемент. Приносим извинения за неудобства.**')
20
 
21
  INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=True)
22
  INSTRUCTION.markdown(
 
24
  '\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
25
  '\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
26
  '\n\n1. Придумайте **название** для файла с заданиями. '
27
+ 'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов'
28
+ ' введенного Вами текста.'
29
+ '\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите'
30
  'создать задания. '
31
  '\n\n3. Укажите *способ выбора целевых слов*:'
32
  '\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
33
+ '\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме,'
34
+ ' в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда'
35
+ ' дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
36
+ '\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите'
37
+ ' *:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при'
38
+ ' подборе дистракторов.'
39
+ '\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее'
40
+ ' поле. ️ \n❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
41
+ '\n\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_'
42
+ ' дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_'
43
+ ' вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
44
  '\n7. Выберите **способы вывода** готовых материалов.'
45
+ '\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно,'
46
+ ' начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
47
  '\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
48
  'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
49
  '\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
50
+ '\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий,'
51
+ ' которые Вы сохранили, языковой уровень и дата их создания.'
52
  ' Для загрузки определенного файла с заданиями:'
53
  '\n1. Введите (или скопируйте из таблицы) название.'
54
  '\n2. Укажите соответсвующий языковой уровень.'
55
  '\n3. Нажмите на кнопку **"Загрузить"**.'
56
  '\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
57
+ '\n\n\nДля того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**,'
58
+ ' кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
59
 
60
  INSTRUCTION_ONLINE_TEST = st.expander(label='**ИНСТРУКЦИЯ ОНЛАЙН-ТЕСТ**', expanded=True)
61
  INSTRUCTION_ONLINE_TEST.markdown(
 
64
  '\n\n- В **первом столбце** приводится ответ - слово, удаленное из оригинального текста.'
65
  '\n\n- Отметьте во **втором столбце**, уместно ли создавать задание с данным словом.'
66
  '\n\n- В **третьем столбце** приведены подобранные программой дистракторы.'
67
+ '\n\n- Введите в **четвертый столбец** дистракторы (целиком или букву), которые, по Вашему мнению,'
68
+ ' **:red[не уместны]**. '
69
+ '\n\n**:green[Уместными дистракторами]** мы предлагаем считать те, которые одновременно удовлетворяют'
70
+ ' следующим условиям в рамках языкового уровня, для которого они созданы:'
71
  '\n\n1. не слишком очевидно являются неправильными вариантами (*варить суп/стол*);'
72
  '\n\n2. и при этом не могут быть полноценной заменой удаленного слова (*варить суп/кашу*)'
73
  )
pages/2_👨‍🏫_Начало_работы.py CHANGED
@@ -4,7 +4,6 @@ from utilities_database.user_database_utils import load_user_tasks_data
4
  from utilities_database.user_database_utils import save_data_in_database
5
  from utilities_database.user_database_widgets import user_save_text_table
6
  from utilities_database.user_database_utils import load_users_particular_task
7
- from streamlit_extras.no_default_selectbox import selectbox as custom_select_box
8
 
9
  # Interface
10
  if st.session_state.get('-LOGGED_IN_BOOL-'):
@@ -15,52 +14,38 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
15
  '\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
16
  '\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
17
  '\n\n1. Придумайте **название** для файла с заданиями. '
18
- 'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов '
19
- 'введенного Вами текста.'
20
- '\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите '
21
- 'создать задания. '
22
  '\n\n3. Укажите *способ выбора целевых слов*:'
23
  '\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
24
- '\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме, '
25
- 'в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда '
26
- 'дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
27
- '\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите '
28
- '*:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при '
29
- 'подборе дистракторов.'
30
- '\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее '
31
- 'поле. ️ ❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
32
- '\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_ '
33
- 'дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_ '
34
- 'вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
35
  '\n7. Выберите **способы вывода** готовых материалов.'
36
- '\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно, '
37
- 'начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
38
  '\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
39
  'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
40
  '\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
41
- '\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий, '
42
- 'которые Вы сохранили, языковой уровень и дата их создания.'
43
  ' Для загрузки определенного файла с заданиями:'
44
  '\n1. Введите (или скопируйте из таблицы) название.'
45
  '\n2. Укажите соответсвующий языковой уровень.'
46
  '\n3. Нажмите на кнопку **"Загрузить"**.'
47
  '\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
48
- '\n\n\nДля того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**, '
49
- 'кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
50
- ANNOUNCES = st.expander('**ВАЖНАЯ ИНФОРМАЦИЯ**', expanded=False)
51
- ANNOUNCES.success(
52
- '**Уважаемые пользователи, пожалуйста, после генерации заданий перейдите на вкладку "📝Онлайн-тест" '
53
- 'и заполните там опросник. Таким образом Вы очень поможете в улучшении качества заданий! Спасибо!🤗**')
54
- ANNOUNCES.warning(
55
- '**Сейчас генератор проходит завершающую настройку и отладку, для которой необходимо большое количество '
56
- 'данных об уместности выбранных целевых слов и дистракторов к ним. Поэтому просим Вас отнестись с пониманием '
57
- 'к излишне большому количеству заданий.**')
58
- ANNOUNCES.warning(
59
- '**❗️ㅤУбедительно просим Вас дожидаться окончания генерации или загрузки и не переходить на '
60
- 'другие вкладки до выведения соответствующего сообщения.**')
61
- ANNOUNCES.warning(
62
- '**❗ㅤВ случае появления красных сообщений об ошибке, как правило, проблема решается '
63
- 'повторными нажатиями на нужный Вам элемент. Приносим извинения за неудобства.**')
64
  WHAT_TO_DO = st.radio(
65
  label='**Выберите режим работы**',
66
  options=[
@@ -79,10 +64,11 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
79
  COL1, COL2 = LOAD_FORM.columns([1, 1])
80
  UPLOAD_CLOUD_FILE_NAME = COL1.text_input('Введите название заданий', placeholder='Жду название')
81
  with COL2:
82
- UPLOAD_CLOUD_CEFR_LEVEL = custom_select_box(
83
- 'Выберите языковой уровень',
84
- ['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'Без уровня'],
85
- no_selection_label='-Выберите языковой уровень-')
 
86
  st.session_state['-UPLOAD_CLOUD_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL
87
  LOAD_BUTTON = LOAD_FORM.form_submit_button('Загрузить')
88
  if LOAD_BUTTON:
@@ -132,22 +118,23 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
132
  key='-DISTRACTOR_MODEL_MODE-', horizontal=True)
133
  CEFR_NUM_DISTRACTORS_COL, UTW_COL = FORM.columns([2, 2])
134
  with CEFR_NUM_DISTRACTORS_COL:
135
- CEFR_TEXT_LEVEL = custom_select_box(
136
- 'Укажите уровень по CEFR:',
137
- ['Без уровня', 'A1', 'A2', 'B1', 'B2', 'C1', 'C2'],
138
- no_selection_label='-Выберите языковой уровень-')
 
139
  st.session_state['-CEFR_TEXT_LEVEL-'] = CEFR_TEXT_LEVEL
140
  NUMBER_DISTRACTORS = CEFR_NUM_DISTRACTORS_COL.number_input(
141
  label='**Выберите количество дистракторов в задании:**',
142
  min_value=1,
143
  max_value=9,
144
- value=2,
145
  key='-NUM_DISTRACTORS-')
146
  TARGET_WORDS = UTW_COL.text_area(
147
  label='**Если "Самостоятельно", введите целевые слова:**',
148
  value='',
149
  height=120,
150
- placeholder='Через запятую и пробел',
151
  key='-INPUT_TARGET_WORDS-')
152
  FORM.markdown('**Выберите формат(-ы) вывода:**')
153
  col1, col2, col3 = FORM.columns(3)
@@ -176,14 +163,11 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
176
  use_container_width=True)
177
 
178
  if START_BUTTON:
179
- LOGS = st.empty()
180
- LOGS.success('**Готовые задания или онлайн-тест появятся на отдельных страницах**')
181
-
182
  # Initiate interface structure
183
- PROGRESS_BAR = st.progress(0)
184
- LOGS_D = st.empty()
185
- PROGRESS_BAR_D = st.progress(0)
186
- PROGRESS_BAR_S = st.progress(0)
187
 
188
  # Start generation process. Everything happens inside main_workflow func
189
  if DISTRACTOR_MODEL == 'Модель-3':
@@ -192,9 +176,8 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
192
  file=UPLOAD_FILE,
193
  text=UPLOAD_TEXT,
194
  logs=LOGS,
195
- logs_d=LOGS_D,
196
  progress=PROGRESS_BAR,
197
- progress_s=PROGRESS_BAR_S,
198
  level=CEFR_TEXT_LEVEL,
199
  tw_mode_automatic_mode=TARGET_WORDS_MODE,
200
  target_words=TARGET_WORDS,
@@ -206,10 +189,8 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
206
  file=UPLOAD_FILE,
207
  text=UPLOAD_TEXT,
208
  logs=LOGS,
209
- logs_d=LOGS_D,
210
  progress=PROGRESS_BAR,
211
- progress_d=PROGRESS_BAR_D,
212
- progress_s=PROGRESS_BAR_S,
213
  level=CEFR_TEXT_LEVEL,
214
  tw_mode_automatic_mode=TARGET_WORDS_MODE,
215
  target_words=TARGET_WORDS,
@@ -228,8 +209,9 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
228
  st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = USER__SAVE_IN_CLOUD_FILE_NAME
229
 
230
  PROGRESS_BAR.progress(100)
231
- PROGRESS_BAR_S.progress(100)
232
- LOGS.success('**Все готово! Готовые задания и/или онлайн-тест доступны в соответствующих вкладках.**')
 
233
  save_data_in_database(
234
  user_task_database=user_save_text_table,
235
  save_type='download',
@@ -240,10 +222,6 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
240
  generated_result=__TASK_DATA__,
241
  distractor_model=DISTRACTOR_MODEL, allow=SAVE_IN_CLOUD)
242
 
243
- PROGRESS_BAR = ''
244
- PROGRESS_BAR_S = ''
245
- LOGS_D = ''
246
-
247
  if EXIT_BUTTON:
248
  for key in st.session_state:
249
  del st.session_state[key]
@@ -256,7 +234,7 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
256
  st.error('Что-то пошло не так?! Перезагружаюсь!')
257
  st.session_state["START_GENERATION"] = False
258
  st.stop()
259
- st.experimental_rerun()
260
 
261
  # LABEL
262
  st.markdown('*Автор-разработчик: А.В.Белый, кафедра математической лингвистики, филологический факультет СПбГУ,'
 
4
  from utilities_database.user_database_utils import save_data_in_database
5
  from utilities_database.user_database_widgets import user_save_text_table
6
  from utilities_database.user_database_utils import load_users_particular_task
 
7
 
8
  # Interface
9
  if st.session_state.get('-LOGGED_IN_BOOL-'):
 
14
  '\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
15
  '\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
16
  '\n\n1. Придумайте **название** для файла с заданиями. '
17
+ 'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов'
18
+ ' введенного Вами текста.'
19
+ '\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите'
20
+ ' создать задания. '
21
  '\n\n3. Укажите *способ выбора целевых слов*:'
22
  '\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
23
+ '\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме,'
24
+ ' в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда'
25
+ ' дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
26
+ '\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите'
27
+ ' *:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при'
28
+ ' подборе дистракторов.'
29
+ '\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее'
30
+ ' поле. ️ ❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
31
+ '\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_'
32
+ ' дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_'
33
+ ' вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
34
  '\n7. Выберите **способы вывода** готовых материалов.'
35
+ '\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно,'
36
+ ' начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
37
  '\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
38
  'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
39
  '\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
40
+ '\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий,'
41
+ ' которые Вы сохранили, языковой уровень и дата их создания.'
42
  ' Для загрузки определенного файла с заданиями:'
43
  '\n1. Введите (или скопируйте из таблицы) название.'
44
  '\n2. Укажите соответсвующий языковой уровень.'
45
  '\n3. Нажмите на кнопку **"Загрузить"**.'
46
  '\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
47
+ '\n\n\nДля того, чтоб�� свернуть/развернуть блоки **Инструкций** или **Важной информации**,'
48
+ ' кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  WHAT_TO_DO = st.radio(
50
  label='**Выберите режим работы**',
51
  options=[
 
64
  COL1, COL2 = LOAD_FORM.columns([1, 1])
65
  UPLOAD_CLOUD_FILE_NAME = COL1.text_input('Введите название заданий', placeholder='Жду название')
66
  with COL2:
67
+ UPLOAD_CLOUD_CEFR_LEVEL = st.selectbox(
68
+ label='Выберите языковой уровень',
69
+ options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
70
+ index=None,
71
+ placeholder='-Выберите языковой уровень-')
72
  st.session_state['-UPLOAD_CLOUD_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL
73
  LOAD_BUTTON = LOAD_FORM.form_submit_button('Загрузить')
74
  if LOAD_BUTTON:
 
118
  key='-DISTRACTOR_MODEL_MODE-', horizontal=True)
119
  CEFR_NUM_DISTRACTORS_COL, UTW_COL = FORM.columns([2, 2])
120
  with CEFR_NUM_DISTRACTORS_COL:
121
+ CEFR_TEXT_LEVEL = st.selectbox(
122
+ label='Выберите языковой уровень',
123
+ options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
124
+ index=None,
125
+ placeholder='-Выберите языковой уровень-')
126
  st.session_state['-CEFR_TEXT_LEVEL-'] = CEFR_TEXT_LEVEL
127
  NUMBER_DISTRACTORS = CEFR_NUM_DISTRACTORS_COL.number_input(
128
  label='**Выберите количество дистракторов в задании:**',
129
  min_value=1,
130
  max_value=9,
131
+ value=3,
132
  key='-NUM_DISTRACTORS-')
133
  TARGET_WORDS = UTW_COL.text_area(
134
  label='**Если "Самостоятельно", введите целевые слова:**',
135
  value='',
136
  height=120,
137
+ placeholder='Через запятую',
138
  key='-INPUT_TARGET_WORDS-')
139
  FORM.markdown('**Выберите формат(-ы) вывода:**')
140
  col1, col2, col3 = FORM.columns(3)
 
163
  use_container_width=True)
164
 
165
  if START_BUTTON:
 
 
 
166
  # Initiate interface structure
167
+ LOGS = st.status(label='Прогресс выполнения', expanded=True)
168
+
169
+ PROGRESS_BAR = LOGS.progress(0)
170
+ PROGRESS_BAR_DISTRACTORS = LOGS.progress(0)
171
 
172
  # Start generation process. Everything happens inside main_workflow func
173
  if DISTRACTOR_MODEL == 'Модель-3':
 
176
  file=UPLOAD_FILE,
177
  text=UPLOAD_TEXT,
178
  logs=LOGS,
 
179
  progress=PROGRESS_BAR,
180
+ progress_d=PROGRESS_BAR_DISTRACTORS,
181
  level=CEFR_TEXT_LEVEL,
182
  tw_mode_automatic_mode=TARGET_WORDS_MODE,
183
  target_words=TARGET_WORDS,
 
189
  file=UPLOAD_FILE,
190
  text=UPLOAD_TEXT,
191
  logs=LOGS,
 
192
  progress=PROGRESS_BAR,
193
+ progress_d=PROGRESS_BAR_DISTRACTORS,
 
194
  level=CEFR_TEXT_LEVEL,
195
  tw_mode_automatic_mode=TARGET_WORDS_MODE,
196
  target_words=TARGET_WORDS,
 
209
  st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = USER__SAVE_IN_CLOUD_FILE_NAME
210
 
211
  PROGRESS_BAR.progress(100)
212
+ PROGRESS_BAR_DISTRACTORS.progress(100)
213
+ LOGS.update(label='**Все готово! Готовые задания и/или онлайн-тест доступны в соответствующих вкладках.**',
214
+ state='complete', expanded=False)
215
  save_data_in_database(
216
  user_task_database=user_save_text_table,
217
  save_type='download',
 
222
  generated_result=__TASK_DATA__,
223
  distractor_model=DISTRACTOR_MODEL, allow=SAVE_IN_CLOUD)
224
 
 
 
 
 
225
  if EXIT_BUTTON:
226
  for key in st.session_state:
227
  del st.session_state[key]
 
234
  st.error('Что-то пошло не так?! Перезагружаюсь!')
235
  st.session_state["START_GENERATION"] = False
236
  st.stop()
237
+ st.rerun()
238
 
239
  # LABEL
240
  st.markdown('*Автор-разработчик: А.В.Белый, кафедра математической лингвистики, филологический факультет СПбГУ,'
pages/3_📥_Скачать.py CHANGED
@@ -1,7 +1,7 @@
1
  import streamlit as st
2
  from utilities_ui.custom_download_button import download_button as d_button
3
 
4
- st.set_page_config(page_title='Скачать', layout="wide", page_icon=':es:')
5
  if st.session_state.get('-LOGGED_IN_BOOL-') and (st.session_state.get('-DISPLAY_READY-')
6
  or st.session_state.get('-DOWNLOAD_VERSION-')):
7
  result = st.session_state.get('RESULT')
 
1
  import streamlit as st
2
  from utilities_ui.custom_download_button import download_button as d_button
3
 
4
+ st.set_page_config(page_title='Скачать', layout="wide", page_icon=':es:', initial_sidebar_state='collapsed')
5
  if st.session_state.get('-LOGGED_IN_BOOL-') and (st.session_state.get('-DISPLAY_READY-')
6
  or st.session_state.get('-DOWNLOAD_VERSION-')):
7
  result = st.session_state.get('RESULT')
pages/{4_📝_Онлайн-тест (эксперимент).py → 4_📝_Онлайн-тест.py} RENAMED
@@ -4,19 +4,19 @@ import streamlit as st
4
  from utilities_database.user_database_utils import save_data_in_database
5
  from utilities_database.user_database_widgets import user_save_text_table
6
 
7
- st.set_page_config(page_title='Онлайн-тест', layout="wide", page_icon=':es:')
8
  if st.session_state.get('-ONLINE_TEST_READY-') and st.session_state.get('-LOGGED_IN_BOOL-'):
9
- INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=True)
10
  INSTRUCTION.markdown(
11
  'Уважаемые пользователи, предлагаем Вам заполнить опросник по оценке качества созданных заданий. '
12
  '\n\nНиже находится анкета с заданиями в таблице.'
13
  '\n\n- В **первом столбце** приводится ответ - слово, удаленное из оригинального текста.'
14
  '\n\n- Отметьте во **втором столбце**, уместно ли создавать задание с данным словом.'
15
  '\n\n- В **третьем столбце** приведены подобранные программой дистракторы.'
16
- '\n\n- Введите в **четвертый столбец** дистракторы (целиком или букву), которые, по Вашему мнению, '
17
- '**:red[не уместны]**. '
18
- '\n\n**:green[Уместными дистракторами]** мы предлагаем считать те, которые одновременно удовлетворяют '
19
- 'следующим условиям в рамках языкового уровня, для которого они созданы:'
20
  '\n\n1. не слишком очевидно являются неправильными вариантами (*варить суп/стол*);'
21
  '\n\n2. и при этом не могут быть полноценной заменой удаленного слова (*варить суп/кашу*)'
22
  )
@@ -30,18 +30,19 @@ if st.session_state.get('-ONLINE_TEST_READY-') and st.session_state.get('-LOGGED
30
  st.header('Онлайн-тест')
31
  ONLINE_TEST = st.form('Онлайн тест')
32
  ONLINE_TEST.write(result['TEXT_WITH_GAPS'].replace('_', '\_'))
33
- BAD_DISTRACTORS_AND_ANSWERS_temp = ONLINE_TEST.experimental_data_editor(
34
- pd.DataFrame([{"Задание №": i+1,
35
  "Ответ": [answers[i][1]],
36
  "Задание уместно": False,
37
  "Дистракторы": tasks[i][1],
38
  "Неуместные дистракторы": ''}
39
  for i in range(len(tasks))]),
40
  num_rows="fixed",
41
- height=45*len_answers,
 
42
  use_container_width=True)
43
- COMMENTS = ONLINE_TEST.text_input(label='**Прокомментировать**',
44
- placeholder='Напишите комментарий')
45
  SUBMIT = ONLINE_TEST.form_submit_button('READY')
46
  if SUBMIT:
47
  points = test_mark = 'Teacher'
@@ -49,7 +50,7 @@ if st.session_state.get('-ONLINE_TEST_READY-') and st.session_state.get('-LOGGED
49
  inappropriate_distractors = BAD_DISTRACTORS_AND_ANSWERS_temp["Неуместные дистракторы"].values.tolist()
50
  RETURN_TEST_DATA = [{'ANSWER': answers[i],
51
  'APPROPRIATE_TASK': appropriate_tasks[i],
52
- 'INAPPROPRIATE_DISTRACTORS': inappropriate_distractors[i]} for i in range(len_answers)]
53
  save_data_in_database(user_task_database=user_save_text_table,
54
  save_type='online_test',
55
  save_name=st.session_state['-UPLOAD_CLOUD_FILE_NAME-'],
 
4
  from utilities_database.user_database_utils import save_data_in_database
5
  from utilities_database.user_database_widgets import user_save_text_table
6
 
7
+ st.set_page_config(page_title='Онлайн-тест', layout="wide", page_icon=':es:', initial_sidebar_state='collapsed')
8
  if st.session_state.get('-ONLINE_TEST_READY-') and st.session_state.get('-LOGGED_IN_BOOL-'):
9
+ INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=False)
10
  INSTRUCTION.markdown(
11
  'Уважаемые пользователи, предлагаем Вам заполнить опросник по оценке качества созданных заданий. '
12
  '\n\nНиже находится анкета с заданиями в таблице.'
13
  '\n\n- В **первом столбце** приводится ответ - слово, удаленное из оригинального текста.'
14
  '\n\n- Отметьте во **втором столбце**, уместно ли создавать задание с данным словом.'
15
  '\n\n- В **третьем столбце** приведены подобранные программой дистракторы.'
16
+ '\n\n- Введите в **четвертый столбец** дистракторы (целиком или букву), которые, по Вашему мнению,'
17
+ ' **:red[не уместны]**. '
18
+ '\n\n**:green[Уместными дистракторами]** мы предлагаем считать те, которые одновременно удовлетворяют'
19
+ ' следующим условиям в рамках языкового уровня, для которого они созданы:'
20
  '\n\n1. не слишком очевидно являются неправильными вариантами (*варить суп/стол*);'
21
  '\n\n2. и при этом не могут быть полноценной заменой удаленного слова (*варить суп/кашу*)'
22
  )
 
30
  st.header('Онлайн-тест')
31
  ONLINE_TEST = st.form('Онлайн тест')
32
  ONLINE_TEST.write(result['TEXT_WITH_GAPS'].replace('_', '\_'))
33
+ BAD_DISTRACTORS_AND_ANSWERS_temp = ONLINE_TEST.data_editor(
34
+ pd.DataFrame([{"Задание №": i + 1,
35
  "Ответ": [answers[i][1]],
36
  "Задание уместно": False,
37
  "Дистракторы": tasks[i][1],
38
  "Неуместные дистракторы": ''}
39
  for i in range(len(tasks))]),
40
  num_rows="fixed",
41
+ height=40 * len_answers,
42
+ hide_index=True,
43
  use_container_width=True)
44
+ COMMENTS = ONLINE_TEST.text_area(label='**Прокомментировать**',
45
+ placeholder='Напишите комментарий')
46
  SUBMIT = ONLINE_TEST.form_submit_button('READY')
47
  if SUBMIT:
48
  points = test_mark = 'Teacher'
 
50
  inappropriate_distractors = BAD_DISTRACTORS_AND_ANSWERS_temp["Неуместные дистракторы"].values.tolist()
51
  RETURN_TEST_DATA = [{'ANSWER': answers[i],
52
  'APPROPRIATE_TASK': appropriate_tasks[i],
53
+ 'INAPPROPRIATE_DISTRACTORS': inappropriate_distractors[i]} for i in range(len_answers)]
54
  save_data_in_database(user_task_database=user_save_text_table,
55
  save_type='online_test',
56
  save_name=st.session_state['-UPLOAD_CLOUD_FILE_NAME-'],