Skip to content

Instantly share code, notes, and snippets.

@codedokode
Last active June 23, 2025 12:42
Show Gist options
  • Save codedokode/8733007 to your computer and use it in GitHub Desktop.
Save codedokode/8733007 to your computer and use it in GitHub Desktop.

Revisions

  1. codedokode revised this gist Jun 28, 2018. 1 changed file with 33 additions and 30 deletions.
    63 changes: 33 additions & 30 deletions задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -2,22 +2,22 @@

    *Примечание*: раньше тут были другие условия задачи. Их можно найти в предыдущих ревизиях этого задания по ссылке https://gist.github.com/codedokode/8733007/e8e73b0255b3d899cb4e17dc9446fe694a8f5f7c

    Cделать сайт TestHub, который позволяет создавать и проходить тесты. Их могут использовать например, преподаватели для проверки знаний студентов, работодатели для отсеивания кандидатов на вакансию, маркетологи для проведения опросов.
    Cделать сайт TestHub, который позволяет создавать и проходить тесты (с вопросами и ответами). Их могут использовать например, преподаватели для проверки знаний студентов, работодатели для отсеивания кандидатов на вакансию, маркетологи для проведения опросов. Далее мы будем называть того, кто создает тесты, *экзаменатором*, а того, кто сдает, *студентом*, это лишь условные названия.

    - **Предлагаемые технологии**: фреймворк (Symfony 2 (сложнее, но интереснее) или Yii2), MySQL, шаблонизатор Twig, ORM Doctrine
    - **Предлагаемые технологии**: фреймворк (Symfony 3-4 (сложнее, но интереснее), Yii2, Laravel), MySQL или Postgres, шаблонизатор Twig, ORM Doctrine
    - **Время выполнения**: все зависит от тебя, но я бы смотрел на 4-6 недель
    - **Уровень**: продвинутый новичок
    - **Требуемые знания**: PHP, ООП, HTML/CSS, SQL, основы JS
    - **Уровень**: очень продвинутый новичок
    - **Требуемые знания**: PHP, MVC, ООП, HTML/CSS, SQL, основы JS

    Для проверки, что сайт работает правильно, мы будем использовать автоматизированное тестирование (у меня есть урок на эту тему).
    Для проверки, что сайт работает правильно, мы будем использовать автоматизированное тестирование (у меня есть [урок на эту тему](https://gist.github.com/codedokode/a455bde7d0748c0a351a)).

    ## Порядок выполнения

    Так как задача большая, то ты можешь захотеть делать ее по частям. Можно выбрать такой порядок:

    - создание и прохождение тестов без регистрации
    - покрыть это тестами
    - просмотр статистики и результатов
    - просмотр экзаменатором таблицы результатов сдачи тестов
    - покрыть тестами
    - регистрация/логин
    - покрыть тестами
    @@ -32,11 +32,11 @@ Cделать сайт TestHub, который позволяет создава

    `/tests` - **Список тестов**. Содержит список всех тестов на сайте, с постраничным отображением. Кликнув на тему, можно отобразить только тесты из этой темы (при этом она будет вписана в поле поиска). Есть поле поиска, в которое можно ввести тему или слово из названия теста, для отображения только тестов на эту тему или содержащих слово в названии (можно подумать над тем, чтобы искать не только в названии, но и в описании теста). Поле ввода поддерживает автодополнение названий тем.

    `/new` - **Создать тест**. Начальная страница для создания теста (эта же страница используется для редактирования тестов). Мы не требуем регистрации для того, чтобы создавать тесты (но если человек, создавший тест анонимно, зарегистрируется, тест должен перенестись в его аккаунт). Для создания теста надо указать обязательное название, небязательные теги-темы (работает автодополнение названий тем), необязательное ограничение по времени. Можно добавить предисловие (с возможностью форматирования в wysiwyg редакторе).
    `/new` - **Создать тест**. Начальная страница для создания теста (эта же страница используется для редактирования тестов). Мы не требуем регистрации для того, чтобы создавать тесты (но регистрация дает возможность смотреть все созданные тесты и результаты их прохождения в личном кабинете). Для создания теста надо указать обязательное название, небязательные теги-темы (работает автодополнение названий тем), необязательное ограничение по времени. Можно добавить предисловие (с возможностью форматирования в wysiwyg редакторе).

    Теги (темы) — можно указать любые, через запятую, при этом все введенные теги собираются в таблицу и используются для автодополнения. Регистр букв в теге не имеет значения, «физика» и «Физика» — один тег (возможно стоит их принудительно переводить в нижний регистр). Если теги различаются только знаками пунктуации, то же самое (теги могут содержать только знаки дефис, запятая, точка (не в конце названия)).

    Ниже расположен редактор вопросов. Можно добавить любое число вопросов, каждый вопрос может быть олного из нескольких типов:
    Ниже расположен редактор вопросов. Можно добавить любое число вопросов, каждый вопрос может быть одного из нескольких типов:

    - один ответ из списка
    - несколько вариантов из списка
    @@ -45,51 +45,51 @@ Cделать сайт TestHub, который позволяет создава

    Для вопроса указывается число баллов за ответ на него, варианты ответа.

    Вопросы можно переупорядочивать. Так как вопросы большие и таскать их неудобно, можно при попытке перетащить вопрос выводить слева уменьшенный список номеров, на который можно перетащить сам вопрос. Также. можно разрешить редактировать номер вопроса для этой цели.
    Вопросы можно переупорядочивать. Так как вопросы большие и таскать их неудобно, можно при попытке перетащить вопрос выводить слева уменьшенный список номеров, на который можно перетащить сам вопрос. Также, можно разрешить редактировать номер вопроса для этой цели.

    Один из вопросов находится в редиме редактирования, другие вопросы просто выводятся (с указанием числа баллов и отмеченным правильным ответом). Клик по неактивному вопросу переводит его в режим редактирования.
    Один из вопросов находится в режиме редактирования, другие вопросы просто выводятся (с указанием числа баллов и отмеченным правильным ответом). Клик по неактивному вопросу (или по кнопке "редактировать" у него) переводит его в режим редактирования.

    Желательно проверять правильность заполнения полей до отправки формы на сервер, например, если не заполнено название, то клик по кнопке «Создать тест» должен прокручивать страницу к нему и выводить рядом сообщение о том, что это обязательное поле.

    После нажатия кнопки «Создать тест», если все правильно, пользователь попадает на страницу публикации теста.
    После нажатия кнопки «Создать тест», если все правильно, экзаменатор попадает на страницу публикации теста.

    `/publish/NNN`**страница публикации** теста. Здесь, если пользователь не зарегистрирован, мы рассказываем ему о преимуществах регистрации и предлагаем быструю регистрацию.
    `/publish/NNN`**страница публикации** теста. Здесь, если пользователь не зарегистрирован, мы неназойливо рассказываем ему о преимуществах регистрации и предлагаем быструю регистрацию.

    Также, предлагаем указать email для отправки уведомлений о прохождении теста. По идее, этот email надо бы подтверждать (мы не хотим рассылать письма на неподтвержденные адреса, чтобы не попасть в спамеры), но пока можно сделать без подтверждения. Если пользователь зарегистрирован, то тут выводится его email, и он может указать другой или очистить поле.
    Также, предлагаем указать email для отправки уведомлений о прохождении теста (с возможностью просмотреть список ответов ). По идее, этот email надо бы подтверждать (мы не хотим рассылать письма на неподтвержденные адреса, чтобы не попасть в спамеры), но пока можно сделать без подтверждения. Если пользователь зарегистрирован, то тут выводится его email, и он может указать другой или очистить поле.

    На этот email выслается напоминание со всей нужной информацией и ссылками после публикации теста, чтобы пользователь всегда мог иметь их под рукой.

    Ниже выводится крупная заметная ссылка на прохождени теста, которую легко скопировать и опубликовать в соцсетях (для особо ленивых сделаны кнопки) или отправить по почте. При публикации ссылки в соцсети должно выводиться название теста, название сайта «Пройти тест «XXX» на сайте testhub», ссылка для перехода и логотип сайта. Если не боишься трудностей, можно также (через публикацию картинки) выводить число прошедших тест и средний балл.
    Ниже выводится крупная заметная ссылка на прохождение теста, которую легко скопировать и опубликовать в соцсетях (для особо ленивых сделаны кнопки) или отправить по почте. При публикации ссылки в соцсети должно выводиться название теста, название сайта «Пройти тест «XXX» на сайте testhub», ссылка для перехода и логотип сайта (для этого есть [микроразметка OpenGraph](http://ogp.me/)). Если не боишься трудностей, можно также (через публикацию картинки) выводить число прошедших тест и средний балл.

    Также, есть ссылка «просмотреть», по которой можно увидеть как тест будет выглядеть для ученика.
    Также, есть ссылка «просмотреть», по которой можно увидеть как тест будет выглядеть для студента.

    Еще ниже выводится ссылка просмотра результатов тестов (она высылается после публикации на почту, чтобы не забыть ее). Если пользователь зарегистрирован, то он всегда может увидеть результаты в своем аккаунте, а если нет то только имея ссылку.
    Еще ниже выводится специальная ссылка просмотра результатов тестов экзаменатором (если известен адрес почты экзаменатора, то она высылается в письме после публикации). Если пользователь зарегистрирован, то он всегда может увидеть результаты в своем аккаунте, а если нет то только по секретной ссылке. Ссылка дает доступ только к одному тесту, потому ей можно поделиться, например, с коллегами-экзаменаторами.

    Ниже находится ссылка «перейти к списку моих тестов». Она выводится для зарегистрированных пользователей.

    `/register`**страница регистрации**. Почти на каждой странице есть ссылка на нее. При этом надо сохранять исходный URL, откуда пришел пользователь, и после регистрации, возвращать его на ту же страницу. Также, надо перенести в аккаунт все созданные им анонимно тесты и результаты тестов.

    Для регистрации требуется Email (подтверждение не обязательно, но письмо для подтверждения высылается. Для неподтвержденного email могут не работать некоторые функции, например отправка уведомлений на почту), имя (которое отображается на сайте) и пароль (не разрешаем вводить слишком простые вроде 123456).
    Мы с уважением относимся к приватности, потому для регистрации требуется только логин и пароль (не разрешаем вводить слишком простые вроде 123456). Мы также рекомендуем, но не требуем, указать Email (при этом высылается письмо для подтверждения. Пока адрес не подтвержден, на него не высылаются уведомления) и имя (которое отображается на сайте). Так как пользователи забывчивы, при входе на сайт можно вводить либо email, либо логин.

    Также, пользователь может зарегистрироваться через соцсети (первый вход через соцсеть и есть регистрация). Если соцсеть не отдает email пользователя, то показываем окошко или страницу с предложением его ввести (можно отказаться). У одного пользователя может быть несколько аккаунтов соцсетей (а также вход через email + пароль), это надо предусмотреть в архитектуре БД, но делать склеивание аккаунтов пока не треуется (но можно и сделать если хочется).
    Также, пользователь может зарегистрироваться через соцсети (первый вход через соцсеть и есть регистрация). Если соцсеть не отдает email пользователя, то показываем окошко или страницу с предложением его ввести (можно отказаться). У одного пользователя может быть несколько аккаунтов соцсетей (а также вход через логин + пароль), это надо предусмотреть в архитектуре БД, но делать склеивание аккаунтов пока не треуется (но можно и сделать если хочется).

    Зарегистрировавшись, пользователь получает аккаунт, в котором собраны все созданные тесты, результаты их прохождения и пройденные пользователем тесты.

    `/login` - страница **входа на сайт**. Ссылка «войти с паролем», которая есть почти на каждой странице, ведет сюда (как альтернатива, можно сделать вместо перехода на страницу открытие всплывающего окна, это будет неплохо). После логина пользователь перенаправляется на ту же страницу, откуда пришел.
    `/login` - страница **входа на сайт**. Ссылка «войти с паролем», которая есть почти на каждой странице, ведет сюда (как альтернатива, можно сделать вместо перехода на страницу открытие всплывающего окна, это будет неплохо). После логина пользователь перенаправляется на ту же страницу, откуда пришел. Пользователь может ввести как логин, так и email (различить их можно по наличию символа `@`).

    Стоит предусмотреть защиту от перебора паролей ограничением попыток ввода пароля с одного IP в одну единицу времени.

    Также, войти можно через соцсети, при этом первый вход по сути является регистрацией.

    Если пользователь забыл пароль, он может ввести email и получить ссылку. Пользователь, у которого нет пароля и который вошел через соцсети, может таким способом задать пароль (если конечно он указал email при регистрации).
    Если пользователь забыл пароль, он может ввести email и получить ссылку. Пользователь, у которого нет пароля и который вошел через соцсети, может таким способом задать пароль (если конечно он указал email при регистрации). Пользователь, который не указал email, не может восстановить пароль.

    `/test/NNNN`**входная страница теста**. На ней выводится название, описание теста, правила его сдачи и краткая статистика, а ниже находится кнопка «Начать тест». По нажатию на нее начинается тест и отсчет времени.

    `/test/NNN/question` - **страница вопроса теста**. Показывается сколько осталось времени, текущий вопрос и дается возможность ответить на него. Можно возвращаться к предыдущим вопросам. Можно не отвечать на вопрос. Контроль времени должен вестись на сервере, чтобы его нельзя было обойти.

    `/test/NNN/result`**страница результатов теста**. Показывает число набранных баллов. Если пользователь не зарегистрирован, то предлагается ввести имя, под которым он будет виден в таблице результатов у преподавателя. Также, тут находится возможность быстро загрегистрироваться.

    Если преподаватель разрешил это, можно перейти на страницу просмотра списка неправильных и правильных ответов.
    Если экзаменатор при создании теста разрешил это, можно перейти на страницу просмотра списка неправильных и правильных ответов.

    ### Личный кабинет

    @@ -151,7 +151,7 @@ Cделать импорт тестов из популярных формато

    #### Улучшенные вопросы

    Возможность оформлять текст вопроса в редакторе, добавлять картинки перетаскиванием, а также прикладывать аудио/видео.
    Возможность оформлять текст вопроса в редакторе, добавлять картинки перетаскиванием из папки в браузер, а также прикладывать аудио/видео.

    Сделать поддержку MathML + редактор для вставки формул в вопросы и варианты ответов. Сделать поддержку какого-нибудь языка разметки для химических формул.

    @@ -173,36 +173,39 @@ Cделать импорт тестов из популярных формато

    Для поиска тестов достаточно использовать SQL запрос вроде `name LIKE '%квантовая%' AND name LIKE '%физика%'`, если тестов будет немного, если много (и тебе хочется сделать посложнее), то стоит сделать полнотекстовый поиск или подключить Sphinx.

    Для реализации редактора вопросов можно попробовать обойтись HTML формой + дополнительными скриптами. Например, для перетаскивания вопросов попробовать jQuery UI Sortable или jQuery UI draggable. Сама информация в вопросах сохраняется в видимых или скрытых полях и отправляется на сервер как обычная форма. Проверку правильности надо сделать как на клиенте, яваскриптом, так и на сервере. Желательно, чтобы описания полей брались из одного источника, а не дублировались.
    Реализовать редактор вопросов можно разными способами. Можно попробовать обойтись HTML формой + дополнительными JS-скриптами. Например, для перетаскивания вопросов попробовать jQuery UI Sortable или jQuery UI draggable. Сама информация в вопросах сохраняется в видимых или скрытых полях и отправляется на сервер как обычная форма. Проверку правильности надо сделать как на клиенте, яваскриптом, так и на сервере. Желательно, чтобы описания полей брались из одного источника, а не дублировались.

    Реализовать переход вопроса из редактируемого в обычное состояние можно за счет средств CSS, стилизовать поля ввода и textarea в неактивном вопросе так, чтобы они выглядели как обычный текст.

    У меня еще есть альтернативная идея, сделать редактор вопросов на явакрипте с использованием библиотеки вроде Knockout. Тогда список вопросов будет загружаться и сохраняться на сервер в виде JSON-массива, но я не уверен что это будет проще (но с другой стороны, научишься c knockout работать). Это потребует хороших знаний JS.
    Другой вариант - написать мини-приложение для редактирования вопросов на каком-нибудь JS фреймворке вроде Vue, React, Angular, Knockout итд. С сервером оно может общаться через AJAX API. API желательно документировать в формате вроде Swagger или OpenAPI. Тогда список вопросов будет загружаться и сохраняться на сервер в виде JSON-массива, но я не уверен что это будет проще. Это потребует хороших знаний JS, но даст возможность сделать более мощный редактор.

    В базе данных логично сделать одну таблицу для тестов, одну для вопросов и может быть еще одну для вариантов ответов и связать их внешними ключами.

    Поля ввода, которые позволяют вводить форматированный текст, надо реализовать на основе какого-нибудь (желательно нетяжелого) wysiwyg-редактора. Если редактор состоит из кучи мелких файлов, надо изучить докуменатцию и освоить автоматическую их сборку, иначе страница будет грузиться очень медленно. Естественно, HTML который вводится в это поле, может содержать что угодно, потому на сервере надо его очистить от опасных конструкций. Для этого можно использовать мощную библиотеку HTMLPurifier или встроенный в Yii (если он используется) HTML-фильтр.

    Как реализовать перенос созданных анонимно тестов в аккаунт после регистрации? Очень просто, можно выдавать каждому гостю сайта уникальный id в куках. Как только он создает или проходит тест, мы создаем анонимного пользователя в таблице и привязываем к нему тест или результаты. Соответственно, когда он зарегистрируется, мы просто добавляем этому анонимному пользователю имя и возможность логиниться на сайт, а все тесты остаются в аккаунте. Таким образом нам удается с одной стороны отказаться от обязательной регистрации, с другой не терять созданные тесты.
    Как реализовать доступ экзаменатора к тестам и результатам их сдачи без регистрации? Один из вариантов - генерировать для каждого теста специальный код доступа. Его можно встроить в ссылку и выслать ссылку на почту, если она известна. Также, после создания теста можно добавить пользователю куку для доступа к нему с того же компьютера. Что лучше - использовать одну куку для всех созданных тестов, или новую куку на каждый тест - это отдельный вопрос. Опционально можно подумать, как добавить в аккаунт ранее созданные анонимно тесты. Один из вариантов - это предложить пользователю ввести секретную ссылку для подтверждения, что у него есть доступ к тесту.

    Раньше у меня была еще такая идея: для переноса созданных анонимно тестов в аккаунт после регистрации можно выдавать каждому гостю сайта уникальный id в куках. Как только он создает или проходит тест, мы создаем анонимного пользователя в таблице и привязываем к нему тест или результаты. Соответственно, когда он зарегистрируется, мы просто добавляем этому анонимному пользователю имя и возможность логиниться на сайт, а все тесты остаются в аккаунте. Таким образом нам удается с одной стороны отказаться от обязательной регистрации, с другой не терять созданные тесты.

    Этот подход имеет тот недостаток, что создает путаницу. Ну например, один человек на компьютере создал тест, другой позже завел аккаунт и ему приписался этот тест. Также, непонятно что делать, если человек сначала создал тест анонимно, а потом залогинился. А потом разлогинился. Добавится ли тест в аккаунт? Останется ли доступ к нему после выхода? Такие вещи неочевидны для пользователей, никак не отображаются на сайте и будут их путать.

    Отдельная тема — регистрация. Вот какие особенности стоит учесть:

    - у пользователя может быть не указан email (если он вошел через соцсеть)
    - у пользователя может быть не указан email (если он вошел через соцсеть или не захотел его указывать)
    - у пользователя может не быть пароля, при этом войти через форму логина невозможно
    - у пользователя может быть несколько аккаунтов соцсетей + вход через пароль (хотя возможности пока такой нет, но предусмотреть это стоит)
    - есть анонимные пользователи, которые не могут войти на сайт, но к которым привязываются тесты и результаты

    Для реализации этого стоит сделать 2 таблицы: пользователи и внешние аккаунты.

    Для реализации входа через соцсети надо иметь аккаунт и зарегистрировать там приложение. Если ты не хочешь их заводить, проще всего реализовывать вход через twitter — там вроде ничего кроме email не требуется, в facebook/vk придется подтвердить телефон.

    Если соцсеть отдает больше данных, чем нам требуется, стоит сохранить их на будущее (вдруг завтра мы добавим аватарки?).

    Не указывай токены и id приложений в коде или конфигах, которые ты выгружаешь в репозиторий.
    Не указывай секретные токены и id приложений в коде или конфигах, которые ты выгружаешь в репозиторий.

    Когда ты будешь реализовывать вход через внешние сети, постарайся сделать все в стиле ООП, например, HTTP-клиент сделать в виде отдельного объекта, а не встраивать в код, и писать так, чтобы без изменений систему входа можно было перенести на любой другой сайт. Тогда тестировать эту систему потом будет гораздо легче.
    Когда ты будешь реализовывать вход через внешние сети, постарайся сделать все в стиле ООП, например, HTTP-клиент сделать в виде отдельного объекта, а не встраивать в код, и писать так, чтобы без изменений систему входа можно было перенести на любой другой сайт. Тогда тестировать эту систему потом будет гораздо легче.

    Многие сервисы сейчас используют протокол OAuth (или OAuth 2) для входа через них, но каждый немного по-своему. Это упрощает жизнь разработчикам. Если соцсеть предоставляет возможность получить email, не забудь его попросить.
    Многие сервисы сейчас используют протокол OAuth (или OAuth 2) для входа через них, но каждый немного по-своему. Это упрощает жизнь разработчикам. Если соцсеть предоставляет возможность получить email, не забудь его попросить. Есть готовые библиотеки для реализации входа через соцсети, например, [SocialConnect/auth](https://github.com/SocialConnect/auth), [HybridAuth](https://hybridauth.github.io/), [HWIOAuthBundle](https://github.com/hwi/HWIOAuthBundle), [knpuniversity/oauth2-client-bundle](https://github.com/knpuniversity/oauth2-client-bundle). Этот список, конечно, может устареть со временем.

    Ссылки на описание API:

  2. codedokode revised this gist Aug 27, 2016. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -4,7 +4,7 @@

    Cделать сайт TestHub, который позволяет создавать и проходить тесты. Их могут использовать например, преподаватели для проверки знаний студентов, работодатели для отсеивания кандидатов на вакансию, маркетологи для проведения опросов.

    - **Предлагаемые технологии**: фреймворк (Yii1, Yii2 или Symfony 2), MySQL, шаблонизатор Twig
    - **Предлагаемые технологии**: фреймворк (Symfony 2 (сложнее, но интереснее) или Yii2), MySQL, шаблонизатор Twig, ORM Doctrine
    - **Время выполнения**: все зависит от тебя, но я бы смотрел на 4-6 недель
    - **Уровень**: продвинутый новичок
    - **Требуемые знания**: PHP, ООП, HTML/CSS, SQL, основы JS
    @@ -236,7 +236,7 @@ Cделать импорт тестов из популярных формато

    ## Тестирование

    Если ты не писал раньше тесты, у меня есть урок по ним и по используемым для этого инструментам.
    Если ты не писал раньше тесты, у меня есть урок по ним и по используемым для этого инструментам: https://gist.github.com/codedokode/a455bde7d0748c0a351a .

    Разумеется, такой сложный сайт надо покрыть тестами (иначе как проверить что все работает? Вручную прокликивать десятки кнопок и ссылок?). Чтобы помочь тебе, я составил примерный план тестирования. Он большой и сложный, но как иначе научиться тестировать? У тебя же есть голова, подумай как сделать это с минимумом усилий.

  3. codedokode revised this gist Dec 16, 2014. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -361,7 +361,7 @@ Cделать импорт тестов из популярных формато

    Источники данных для генератора:

    UPD: есть библиотека faker https://github.com/stympy/faker/ которая все это умеет генерировать, так что списки ниже тебе наверно не понадобятся.
    UPD: есть библиотека faker https://github.com/fzaninotto/Faker которая все это умеет генерировать (в случае использования Doctrine — сразу заполнять сущности), так что списки ниже тебе наверно не понадобятся.

    **Имена**:

  4. codedokode revised this gist Dec 16, 2014. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -361,6 +361,8 @@ Cделать импорт тестов из популярных формато

    Источники данных для генератора:

    UPD: есть библиотека faker https://github.com/stympy/faker/ которая все это умеет генерировать, так что списки ниже тебе наверно не понадобятся.

    **Имена**:

    - можно попробовать сгенерировать и получить список здесь: http://www.fakenamegenerator.com/order.php
  5. codedokode revised this gist Dec 16, 2014. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -121,7 +121,7 @@ Cделать сайт TestHub, который позволяет создава

    #### Импорт/экспорт

    Cделать импорт тестов из популярных форматов Moodle XML и Moodle GIFT. [Moodle](https://moodle.org/) — это популярная open source платформа для создания электронных курсов. Это позволит нам переменить преподавателей, которые уже сделали тесты в этой системе.
    Cделать импорт тестов из популярных форматов Moodle XML и Moodle GIFT. [Moodle](https://moodle.org/) — это популярная open source платформа для создания электронных курсов. Это позволит нам переманить преподавателей, которые уже сделали тесты в этой системе.

    Ссылки:

  6. codedokode revised this gist Dec 16, 2014. 1 changed file with 13 additions and 10 deletions.
    23 changes: 13 additions & 10 deletions задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -34,7 +34,7 @@ Cделать сайт TestHub, который позволяет создава

    `/new` - **Создать тест**. Начальная страница для создания теста (эта же страница используется для редактирования тестов). Мы не требуем регистрации для того, чтобы создавать тесты (но если человек, создавший тест анонимно, зарегистрируется, тест должен перенестись в его аккаунт). Для создания теста надо указать обязательное название, небязательные теги-темы (работает автодополнение названий тем), необязательное ограничение по времени. Можно добавить предисловие (с возможностью форматирования в wysiwyg редакторе).

    Теги (темы) — можно указать любые, через запятую, при этом все введенные теги собираются в таблицу и используются для автодополнения. Регистр букв в теге не имеет значения, «физика» и «Физика» — один тег (возможно стоит их принудительно переводить в нижний регистр).
    Теги (темы) — можно указать любые, через запятую, при этом все введенные теги собираются в таблицу и используются для автодополнения. Регистр букв в теге не имеет значения, «физика» и «Физика» — один тег (возможно стоит их принудительно переводить в нижний регистр). Если теги различаются только знаками пунктуации, то же самое (теги могут содержать только знаки дефис, запятая, точка (не в конце названия)).

    Ниже расположен редактор вопросов. Можно добавить любое число вопросов, каждый вопрос может быть олного из нескольких типов:

    @@ -57,7 +57,7 @@ Cделать сайт TestHub, который позволяет создава

    Также, предлагаем указать email для отправки уведомлений о прохождении теста. По идее, этот email надо бы подтверждать (мы не хотим рассылать письма на неподтвержденные адреса, чтобы не попасть в спамеры), но пока можно сделать без подтверждения. Если пользователь зарегистрирован, то тут выводится его email, и он может указать другой или очистить поле.

    На этот email выслается напоминанияе со всей нужной информацией и ссылками после публикации теста, чтобы пользователь всегда мог иметь их под рукой.
    На этот email выслается напоминание со всей нужной информацией и ссылками после публикации теста, чтобы пользователь всегда мог иметь их под рукой.

    Ниже выводится крупная заметная ссылка на прохождени теста, которую легко скопировать и опубликовать в соцсетях (для особо ленивых сделаны кнопки) или отправить по почте. При публикации ссылки в соцсети должно выводиться название теста, название сайта «Пройти тест «XXX» на сайте testhub», ссылка для перехода и логотип сайта. Если не боишься трудностей, можно также (через публикацию картинки) выводить число прошедших тест и средний балл.

    @@ -67,7 +67,7 @@ Cделать сайт TestHub, который позволяет создава

    Ниже находится ссылка «перейти к списку моих тестов». Она выводится для зарегистрированных пользователей.

    `/register` — страница регистрации. Почти на каждой странице есть ссылка на нее. При этом надо сохранять исходный URL, откуда пришел пользователь, и после регистрации, возвращать его на ту же страницу. Также, надо перенести в аккаунт все созданные им анонимно тесты и результаты тестов.
    `/register`**страница регистрации**. Почти на каждой странице есть ссылка на нее. При этом надо сохранять исходный URL, откуда пришел пользователь, и после регистрации, возвращать его на ту же страницу. Также, надо перенести в аккаунт все созданные им анонимно тесты и результаты тестов.

    Для регистрации требуется Email (подтверждение не обязательно, но письмо для подтверждения высылается. Для неподтвержденного email могут не работать некоторые функции, например отправка уведомлений на почту), имя (которое отображается на сайте) и пароль (не разрешаем вводить слишком простые вроде 123456).

    @@ -89,7 +89,7 @@ Cделать сайт TestHub, который позволяет создава

    `/test/NNN/result`**страница результатов теста**. Показывает число набранных баллов. Если пользователь не зарегистрирован, то предлагается ввести имя, под которым он будет виден в таблице результатов у преподавателя. Также, тут находится возможность быстро загрегистрироваться.

    Если преподаватель разрешил это, можно перейти на страницу просмотра списка неприавильных и правильных ответов.
    Если преподаватель разрешил это, можно перейти на страницу просмотра списка неправильных и правильных ответов.

    ### Личный кабинет

    @@ -107,6 +107,8 @@ Cделать сайт TestHub, который позволяет создава

    Результаты можно фильтровать по имени (выводятся все имена, содержащие введенную строку), числу баллов (выводятся все результаты с равным или выше указанного числа баллов или ниже, если введено число в форме `< 200`) или дате (при вводе конструкций вроде `2014-01-01`, `> 01.12.2014`).

    Надо подумать, как рассказать пользователю о возможностях фильтра. Можно показывать подсказку при установке курсора в поле, можно выводить кнопки «до даты», «после даты», вставляющие нужные конструкции в поле.

    Таблицу можно сортировать по дате, имени, числу баллов, числу попыток.

    `/stat/passed`**сданные мной тесты**. Выводится список сданных ранее тестов, по умолчанию сортируется по убыанию даты. Для каждого теста можно просмотреть подробности, если преподаватель это разрешил.
    @@ -163,23 +165,23 @@ Cделать импорт тестов из популярных формато

    ## Подсказки по реализации

    Все формы должны быть защишены от CSRF токеном.
    Все формы (а также ссылки вроде разлогинивания) должны быть защишены от CSRF токеном.

    Старайся максимально использовать возможности фреймворка, а не писать велосипед. Например, формы, гриды, защиту от CSRF, модели, миграции БД.

    На странице списка тестов можно использовать jQuery UI Autocomplete для автодополнения тем (а может быть и названий тестов?).

    Для поиска тестов достаточно использовать SQL запрос вроде name LIKE '%квантовая%' AND name LIKE '%физика%', если тестов будет немного, если много (и тебе хочется сделать посложнее), то стоит сделать полнотекстовый поиск или подключить Sphinx.
    Для поиска тестов достаточно использовать SQL запрос вроде `name LIKE '%квантовая%' AND name LIKE '%физика%'`, если тестов будет немного, если много (и тебе хочется сделать посложнее), то стоит сделать полнотекстовый поиск или подключить Sphinx.

    Для реализации редактора вопросов можно попробовать обойтись HTML формой + дополнительными скриптами. Например, для перетаскивания вопросов попробовать jQUery UI Sortable или jQuery UI draggable. Сама информация в вопросах сохраняется в видимых или скрытых полях и отправляется на сервер как обычная форма. Проверку правильности надо сделать как на клиенте, яваскриптом, так и на сервере. Желательно, чтобы описания полей брались из одного источника, а не дублировались.
    Для реализации редактора вопросов можно попробовать обойтись HTML формой + дополнительными скриптами. Например, для перетаскивания вопросов попробовать jQuery UI Sortable или jQuery UI draggable. Сама информация в вопросах сохраняется в видимых или скрытых полях и отправляется на сервер как обычная форма. Проверку правильности надо сделать как на клиенте, яваскриптом, так и на сервере. Желательно, чтобы описания полей брались из одного источника, а не дублировались.

    Реализовать переход вопроса из редактируемого в обычное состояние можно за счет средств CSS, стилизовать поля ввода и textarea в неактивном вопросе так, чтобы они выглядели как обычный текст.

    У меня еще есть альтернативная идея, сделать редактор вопросов на явакрипте с использованием библиотеки вроде Knockout. Тогда список вопросов будет загружаться и сохраняться на сервер в виде JSON-массива, но я не уверен что это будет проще (но с другой стороны, научишься c knockout работать). Это потребует хороших знаний JS.

    В базе данных логично сделать одну таблицу для тестов, одну для вопросов и может быть еще одну для вариантов ответов и связать их внешними ключами.

    Поля ввода, которые позволяют вводить форматированный текст, надо реализовать на основе какого-нибудь (желательно нетяжелого) wysiwyg-редактора. Если редактор состоит из кучи мелких файлов, надо изучить докуменатцию и осовить автоматическую их сборку, иначе страница будет грузиться очень медленно. Естественно, HTML который вводится в это поле, может содержать что угодно, потому на сервере надо его очистить от опасных конструкций. Для этого можно использовать мощную библиотеку HTMLPurifier или встроенный в Yii (если он используется) HTML-фильтр.
    Поля ввода, которые позволяют вводить форматированный текст, надо реализовать на основе какого-нибудь (желательно нетяжелого) wysiwyg-редактора. Если редактор состоит из кучи мелких файлов, надо изучить докуменатцию и освоить автоматическую их сборку, иначе страница будет грузиться очень медленно. Естественно, HTML который вводится в это поле, может содержать что угодно, потому на сервере надо его очистить от опасных конструкций. Для этого можно использовать мощную библиотеку HTMLPurifier или встроенный в Yii (если он используется) HTML-фильтр.

    Как реализовать перенос созданных анонимно тестов в аккаунт после регистрации? Очень просто, можно выдавать каждому гостю сайта уникальный id в куках. Как только он создает или проходит тест, мы создаем анонимного пользователя в таблице и привязываем к нему тест или результаты. Соответственно, когда он зарегистрируется, мы просто добавляем этому анонимному пользователю имя и возможность логиниться на сайт, а все тесты остаются в аккаунте. Таким образом нам удается с одной стороны отказаться от обязательной регистрации, с другой не терять созданные тесты.

    @@ -228,7 +230,7 @@ Cделать импорт тестов из популярных формато

    Для работы с XML при экспорте/импорте стоит использовать DOM XML или SimpleXML. При экспорте давай нормальные имена файлам, например `Основы физики.txt` или `Результаты теста Основы физики (c фильтром).xls`, а не бессмысленный набор цифр. Сам подумай, удобно ли когда у тебя полная папка файлов типа test_sdas4d423asd.txt?

    Для экспорта в XLS стоит использовать https://github.com/PHPOffice/PHPExcel (там еще ест библиотека для чтения/записи DOC https://github.com/PHPOffice/PHPWord ).
    Для экспорта в XLS стоит использовать https://github.com/PHPOffice/PHPExcel (там еще есть библиотека для чтения/записи DOC https://github.com/PHPOffice/PHPWord ).

    Для экспорта в PDF можно использовать либо wkhtmltopdf (он конвертирует HTML в PDF) либо DOMPDF: http://habrahabr.ru/post/190364/

    @@ -312,9 +314,10 @@ Cделать импорт тестов из популярных формато
    - Проверить вход через соцсети если возможно сделать это с заглушкой
    - Проверить если возможно что первый вход через соцсети работает как регистрация
    - Проверить если возможно что email спрашивается если соцсеть его не отдала
    - Проверить разлогинивание
    - **Восстановление пароля**
    - Проверить можно выслать письмо со ссылкой
    - Проверить ввод неприавльного email
    - Проверить ввод неправильного email
    - Проверить что ссылка восстановления пароля работает
    - Проверить что ссылка восстановления пароля работает ограниченное время
    - Проверить что ссылка восстановления пароля работает только один раз
  7. codedokode revised this gist Dec 16, 2014. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    # Задача

    *Примечание*: раньше тут были другие условия задачи. Их можно найти в предыдущих ревизиях этого задания.
    *Примечание*: раньше тут были другие условия задачи. Их можно найти в предыдущих ревизиях этого задания по ссылке https://gist.github.com/codedokode/8733007/e8e73b0255b3d899cb4e17dc9446fe694a8f5f7c

    Cделать сайт TestHub, который позволяет создавать и проходить тесты. Их могут использовать например, преподаватели для проверки знаний студентов, работодатели для отсеивания кандидатов на вакансию, маркетологи для проведения опросов.

  8. codedokode revised this gist Dec 16, 2014. 1 changed file with 301 additions and 87 deletions.
    388 changes: 301 additions & 87 deletions задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -1,123 +1,356 @@
    ## Задача
    # Задача

    Cделать сайт TestHub, который позволяет преподавателям проверять знания студентов в автоматическом режиме с помощью тестов.
    *Примечание*: раньше тут были другие условия задачи. Их можно найти в предыдущих ревизиях этого задания.

    - **Предлагаемые технологии**: фреймворк Yii/MySQL/Twig
    - **Время выполнения**: все зависит от тебя
    Cделать сайт TestHub, который позволяет создавать и проходить тесты. Их могут использовать например, преподаватели для проверки знаний студентов, работодатели для отсеивания кандидатов на вакансию, маркетологи для проведения опросов.

    ### Описание страниц сайта
    - **Предлагаемые технологии**: фреймворк (Yii1, Yii2 или Symfony 2), MySQL, шаблонизатор Twig
    - **Время выполнения**: все зависит от тебя, но я бы смотрел на 4-6 недель
    - **Уровень**: продвинутый новичок
    - **Требуемые знания**: PHP, ООП, HTML/CSS, SQL, основы JS

    `/` - **Главная**. Содержит информацию о сервисе, кнопки регистрации преподавателей и список лучших студентов и групп.
    Для проверки, что сайт работает правильно, мы будем использовать автоматизированное тестирование (у меня есть урок на эту тему).

    `/reg/student` - **Регистрация студента**. Содержит поля имя/фамилия/пол(опр. по возможности автоматически)/номер группы/аватарка. Есть возможность войти через вконтакте/фейсбук чтобы не заполнять поля.
    ## Порядок выполнения

    `/reg/teacher` - **Регистрация преподавателя** Содержит то же + список групп, у которых ведет занятия преподаватель. Чтобы получить доступ, преподаватель должен быть подтвержден администратором.
    Так как задача большая, то ты можешь захотеть делать ее по частям. Можно выбрать такой порядок:

    Если студент залогинен, то он попадает на свою страницу со списком тестов ( `/tests/my` ). Выводятся тесты в 2 списка: уже сданные (выводится результат), и которые надо сдать (выводится срок). В первую очередь выводятся тесты, до сдачи которых осталось мало времени.
    - создание и прохождение тестов без регистрации
    - покрыть это тестами
    - просмотр статистики и результатов
    - покрыть тестами
    - регистрация/логин
    - покрыть тестами
    - продвинутая статистика, экспорт/импорт
    - покрыть тестами

    Также выводятся успехи других студентов группы.
    ## Описание сайта

    Если нажать на сданный тест, то попадаем на **страницу результатов** `/results/12345` . На этой странице виден список вопросов, и выведено правильно или неправильно дан ответ. Страница результатов может быть общедоступна, а может быть закрыта. Тут же можно расшарить ссылку на страницу в соцсетях или закрыть доступ.
    Вот вайрфреймы для страниц: https://gomockingbird.com/mockingbird/#l0bk13j . Дизайна пока нет, есть только такие наброски, из которых видно какие страницы должны быть на сайте и что на них расположено. Далее я опишу их подробнее:

    Тут еще надо подумать, а нет ли здесь уязвимости что можно посмотреть как другие сдали тесты и методом исключения подобрать правильные ответы.
    `/` - **Главная**. Содержит информацию о сервисе, кнопки для входа/регистрации и список из нескольких самых популярных за последний месяц тестов. Для теста выводятся теги (темы), число прошедших и число пробовавших сдать тест.

    Если нажать на несданный тест, то попадаем на **входную страницу теста** `/tests/1234`. На ней выводится информация о тесте: название, число баллов, нужно для сдачи, преподаватель, предисловие, правила прохождения теста. И большая кнопка «Начать тест». И кнопка возврата назад к списку.
    `/tests` - **Список тестов**. Содержит список всех тестов на сайте, с постраничным отображением. Кликнув на тему, можно отобразить только тесты из этой темы (при этом она будет вписана в поле поиска). Есть поле поиска, в которое можно ввести тему или слово из названия теста, для отображения только тестов на эту тему или содержащих слово в названии (можно подумать над тем, чтобы искать не только в названии, но и в описании теста). Поле ввода поддерживает автодополнение названий тем.

    В самом тесте просто показываются вопросы по очереди, и отсчиытвается оставшееся время. После сдачи студент попадает на страницу с результатами. Можно отказаться сдавать тест, но в любом случае все попытки сдачи учитываются. Если все попытки потрачены, то нужно просить преподавателя добавить еще.
    `/new` - **Создать тест**. Начальная страница для создания теста (эта же страница используется для редактирования тестов). Мы не требуем регистрации для того, чтобы создавать тесты (но если человек, создавший тест анонимно, зарегистрируется, тест должен перенестись в его аккаунт). Для создания теста надо указать обязательное название, небязательные теги-темы (работает автодополнение названий тем), необязательное ограничение по времени. Можно добавить предисловие (с возможностью форматирования в wysiwyg редакторе).

    **Страница со списком групп** `/manage/groups` — выводися список групп, по клику можно перейти на страницу со списком студентов. Для каждой группы выводится статистика по успешно сдавшим/провалившим/сдающим тесты.
    Теги (темы) — можно указать любые, через запятую, при этом все введенные теги собираются в таблицу и используются для автодополнения. Регистр букв в теге не имеет значения, «физика» и «Физика» — один тег (возможно стоит их принудительно переводить в нижний регистр).

    **Страница группы** `/manage/groups/62501` — выводится студентов и результаты сдачи тестов. Тут же можно добавить попыток, просмотреть ответы или аннулировать результаты. Можно редактировать студентов.
    Ниже расположен редактор вопросов. Можно добавить любое число вопросов, каждый вопрос может быть олного из нескольких типов:

    **Страница со списком преподавателей** `/manage/teachers` — выводится список преподавателей, можно их блокировать или подтверждать.
    - один ответ из списка
    - несколько вариантов из списка
    - ввод числа (с указанием допустимой погрешности)
    - ввод текста (можно указать несколько вариантов ответа, которые будут считаться правильными)

    **Список тестов** Преподаватель может редактировать только свои тесты, администратор — все. Выводится статистика по тестам, число сдавших, медианный балл. Можно кликнуть чтобы увидеть поименный список сдавших/проваливших тест.
    Для вопроса указывается число баллов за ответ на него, варианты ответа.

    ### Тесты
    Вопросы можно переупорядочивать. Так как вопросы большие и таскать их неудобно, можно при попытке перетащить вопрос выводить слева уменьшенный список номеров, на который можно перетащить сам вопрос. Также. можно разрешить редактировать номер вопроса для этой цели.

    Тест имеет такие свойства: название, номера групп, ограничение по времени, число попыток, сложность, порог сдачи, доступен с, сдать до. Вопросы могут содержать картинку, текст, число баллов, способ ответа (олиночный, множественный, числом, строкой). Вопросы можно добавлять, удалять, перемещать.
    Один из вопросов находится в редиме редактирования, другие вопросы просто выводятся (с указанием числа баллов и отмеченным правильным ответом). Клик по неактивному вопросу переводит его в режим редактирования.

    Старые тесты отправляются в архив.
    Желательно проверять правильность заполнения полей до отправки формы на сервер, например, если не заполнено название, то клик по кнопке «Создать тест» должен прокручивать страницу к нему и выводить рядом сообщение о том, что это обязательное поле.

    Надо подумать про тесты с параметрами (вида Сколько бит содержится в {n} байтах?).
    После нажатия кнопки «Создать тест», если все правильно, пользователь попадает на страницу публикации теста.

    Тесты можно экспортировать/импортировать в XML, в текст, распечатывать с правильными ответами или без. Тесты можно создавать на основе старых.
    `/publish/NNN`**страница публикации** теста. Здесь, если пользователь не зарегистрирован, мы рассказываем ему о преимуществах регистрации и предлагаем быструю регистрацию.

    #### Картинки
    Также, предлагаем указать email для отправки уведомлений о прохождении теста. По идее, этот email надо бы подтверждать (мы не хотим рассылать письма на неподтвержденные адреса, чтобы не попасть в спамеры), но пока можно сделать без подтверждения. Если пользователь зарегистрирован, то тут выводится его email, и он может указать другой или очистить поле.

    Картинки пока не нарисованы. Есть вайрфреймы, то есть набросок как это будет выглядеть:
    На этот email выслается напоминанияе со всей нужной информацией и ссылками после публикации теста, чтобы пользователь всегда мог иметь их под рукой.

    - Страница редактирования теста: http://tau.rghost.ru/52059323/image.png
    - Страница успехов группы: http://higgs.rghost.ru/52059340/image.png
    Ниже выводится крупная заметная ссылка на прохождени теста, которую легко скопировать и опубликовать в соцсетях (для особо ленивых сделаны кнопки) или отправить по почте. При публикации ссылки в соцсети должно выводиться название теста, название сайта «Пройти тест «XXX» на сайте testhub», ссылка для перехода и логотип сайта. Если не боишься трудностей, можно также (через публикацию картинки) выводить число прошедших тест и средний балл.

    Верстать их пока не надо, так как я их еще перерисую.
    Также, есть ссылка «просмотреть», по которой можно увидеть как тест будет выглядеть для ученика.

    #### Наполнение БД
    Еще ниже выводится ссылка просмотра результатов тестов (она высылается после публикации на почту, чтобы не забыть ее). Если пользователь зарегистрирован, то он всегда может увидеть результаты в своем аккаунте, а если нет то только имея ссылку.

    Надо будет написать скрипт, который генерирует нужное число студентов, преподавателей, тестов, результатов сдачи, чтобы мы могли тестировать сайт на непустой базе.
    Ниже находится ссылка «перейти к списку моих тестов». Она выводится для зарегистрированных пользователей.

    #### Миграции
    `/register` — страница регистрации. Почти на каждой странице есть ссылка на нее. При этом надо сохранять исходный URL, откуда пришел пользователь, и после регистрации, возвращать его на ту же страницу. Также, надо перенести в аккаунт все созданные им анонимно тесты и результаты тестов.

    Изменения в Бд надо делать через миграции: http://www.yiiframework.com/doc/guide/1.1/ru/database.migration Миграции нужны, чтобы мне например не надо было дропать и пересоздавать базу когда ты туда добавишь новое поле.
    Для регистрации требуется Email (подтверждение не обязательно, но письмо для подтверждения высылается. Для неподтвержденного email могут не работать некоторые функции, например отправка уведомлений на почту), имя (которое отображается на сайте) и пароль (не разрешаем вводить слишком простые вроде 123456).

    #### Формы и гриды
    Также, пользователь может зарегистрироваться через соцсети (первый вход через соцсеть и есть регистрация). Если соцсеть не отдает email пользователя, то показываем окошко или страницу с предложением его ввести (можно отказаться). У одного пользователя может быть несколько аккаунтов соцсетей (а также вход через email + пароль), это надо предусмотреть в архитектуре БД, но делать склеивание аккаунтов пока не треуется (но можно и сделать если хочется).

    В задании много работы с формами и таблицами. Для них надо использовать соотв. возможности Yii
    Зарегистрировавшись, пользователь получает аккаунт, в котором собраны все созданные тесты, результаты их прохождения и пройденные пользователем тесты.

    #### Права доступа
    `/login` - страница **входа на сайт**. Ссылка «войти с паролем», которая есть почти на каждой странице, ведет сюда (как альтернатива, можно сделать вместо перехода на страницу открытие всплывающего окна, это будет неплохо). После логина пользователь перенаправляется на ту же страницу, откуда пришел.

    У нас есть пользователи с разными правами доступа. Например, преподаватель может редактировать тесты — но только свои, администратор - все что угодно. Можно использовать для управления правами какие-то стандартные компоненты.
    Стоит предусмотреть защиту от перебора паролей ограничением попыток ввода пароля с одного IP в одну единицу времени.

    ### Поиск
    Также, войти можно через соцсети, при этом первый вход по сути является регистрацией.

    Нужно будет сделать всюду удобный поиск: поиск студента по имени, поиск теста по названию.
    Если пользователь забыл пароль, он может ввести email и получить ссылку. Пользователь, у которого нет пароля и который вошел через соцсети, может таким способом задать пароль (если конечно он указал email при регистрации).

    ## Сущности и их свойства
    `/test/NNNN`**входная страница теста**. На ней выводится название, описание теста, правила его сдачи и краткая статистика, а ниже находится кнопка «Начать тест». По нажатию на нее начинается тест и отсчет времени.

    **Группы**: номер (возможно потом добавим еще факультеты и номер курса)
    `/test/NNN/question` - **страница вопроса теста**. Показывается сколько осталось времени, текущий вопрос и дается возможность ответить на него. Можно возвращаться к предыдущим вопросам. Можно не отвечать на вопрос. Контроль времени должен вестись на сервере, чтобы его нельзя было обойти.

    **Пользователи**:
    `/test/NNN/result`**страница результатов теста**. Показывает число набранных баллов. Если пользователь не зарегистрирован, то предлагается ввести имя, под которым он будет виден в таблице результатов у преподавателя. Также, тут находится возможность быстро загрегистрироваться.

    - У всех есть имя, фамилия, пол, email (мб пустым при входе через соцсеть), аватар, телефон (не обяз.)
    - Пользователи могут входить на сайт через email + пароль либо же через соцсеть
    - Email/телефон может использоваться для напоминаний (срочно сдать тест) и уведомлений.
    - Насчет телефона не уверен — насколько безопасно хранить их на сайте. Может и не стоит.
    - Нужно подумать, реально ли при логине из фейсбука конвертировать англоязычное написание имени в русское
    - Хорошо бы при регистрации автоматом определять пол по имени/фамилии, подумай как это сделать
    Если преподаватель разрешил это, можно перейти на страницу просмотра списка неприавильных и правильных ответов.

    Свойства:
    ### Личный кабинет

    - Студент: группа в которой учится
    - Препод: группы у которых он ведет занятия, ссылка на личную страницу, рабочий телефон, название кафедры
    - Куратор: как и препод
    - Администратор: ?
    Для зарегистрированных пользователей доступен личный кабинет, в котором можно смотреть созданные тесты, результаты их прохождения, результаты прохождения других тестов. Для незарегистрированных пользователей доступны только результаты прохождения созданных ими тестов по специальной ссылке.

    Права:
    Результаты и списки отображаются в виде таблиц. Таблицы можно сортировать по доступным колонкам и фильтровать с помощью строки поиска.

    - студент — сдавать тесты
    - препод — создавать тесты, аннулировать результаты, разрешать пересдачу но только в своих группах
    - куратор — подтверждает и блокирует кураторов и преподов, просматривает все результаты, аннулирует тесты, разрешает пересдачу
    - администратор — может все
    Таблицу можно экспортировать (скачать) в форматах CSV, XLS, XML, JSON, TXT (просто текстовый список). При этом они будут отсортированы и отфильтрованы так же, как отсортирована таблица на экране (об этом должно выводиться предупреждение).

    Заметь, здесь есть хороший вопрос, как хранить разные типы пользвоателей. Можешь погуглить про наследование таблиц, есть разные способы.
    В меню справа цифры вроде `(+2)` показывают число новых (с момента последнего просмотра результатов) результатов тестов. Выводятся несколько тестов с наибольшим числом новых результатов.

    **Тесты**: автор, название, предисловие, сколько баллов для сдачи, доступен с, сдать до (но препод может продлевать срок отдельным студентам), число попыток (препод может дать дополнительные лично), номера групп которым предназначен тест.
    Должна быть ссылка для выхода из личного кабинета.

    Старые-старые тесты отправляются в архив, чтобы не мозолить глаза.
    `/stat/result/NNN`**результаты сдачи теста**. Выводится список учеников, сдавших тест, дата, число попыток, набранные баллы. По умолчанию сортируется по убыванию даты. Для каждого результата можно просмотреть подробности (список отвеченных/неотвеченных вопросов и потраченное время), аннулировать результаты, дать дополнительные попытки.

    **Вопросы теста**: текст (наверно стоит предусмотреть возможность HTML), картинка, сложность в баллах, тип ответа, ответ
    Результаты можно фильтровать по имени (выводятся все имена, содержащие введенную строку), числу баллов (выводятся все результаты с равным или выше указанного числа баллов или ниже, если введено число в форме `< 200`) или дате (при вводе конструкций вроде `2014-01-01`, `> 01.12.2014`).

    **Виды ответов**: выбрать один из вариантов, выбрать 0-N вариантов, число (с погрешностью, например, 1.23 ±10%), строка (сравнивается без учета пробелов и регистра).
    Таблицу можно сортировать по дате, имени, числу баллов, числу попыток.

    **Резлультат теста**: результаты сдачи всех тестов хранятся в БД, включая время ответа на каждый вопрос и выбранный ответ.
    `/stat/passed`**сданные мной тесты**. Выводится список сданных ранее тестов, по умолчанию сортируется по убыанию даты. Для каждого теста можно просмотреть подробности, если преподаватель это разрешил.

    Тут стоит подумать, а что если потом тест или вопросы поменяются? Не нарушатся ли данные в архиве результатов?
    Фильтровать можно по названию, дате, числу баллов.

    Вроде как все. Если я что-то забыл — можешь добавить.
    `/stat/results`**список созданных мной тестов**. Отображается список тестов и число новых непросмотренных результатов. По умолчанию список сортируется по числу новых результатов, а далее по дате последней сдачи теста.

    ### Генератор данных
    Дополнительные задачи:

    Нам также нужен консольный скрипт-генератор для набивания базы. Я вижу примерно такой вариант:
    #### Импорт/экспорт

    Cделать импорт тестов из популярных форматов Moodle XML и Moodle GIFT. [Moodle](https://moodle.org/) — это популярная open source платформа для создания электронных курсов. Это позволит нам переменить преподавателей, которые уже сделали тесты в этой системе.

    Ссылки:

    - формат Moodle XML (англ) https://docs.moodle.org/28/en/Moodle_XML_format
    - формат GIFT (англ) https://docs.moodle.org/23/en/GIFT_format
    - формат GIFT (рус) http://www.edu.ru/moodle/help.php?module=quiz&file=formatgift.html
    - пример файла GIFT: http://www.edu.ru/moodle/question/format/gift/examples.txt
    - пример Moodle XML: http://moodle.net/pluginfile.php/23214/mod_data/content/1348/Identifying%20oxidising%20and%20reducing%20agents.xml
    - архив тестов: http://moodle.net/mod/data/view.php?id=3


    Сделать импорт из WebCT: http://glow.williams.edu/help.php?file=formatwebct.html&module=quiz

    Сделать экспорт тестов в форматах Moodle XML, GIFT, DOC, TXT. Последние 2 нужны на случай когда преподаватель хочет послать тест например на утверждение. В них должно быть название теста, описание, время на прохождение и макс. число баллов, вопросы, варианты ответов, прямоугольники для ввода/выбора ответа (в случае если файл распечатать).

    Можно дополнительно добавить еще экспорт в PDF.

    #### Печать

    Печать теста. Преподаватель может захотеть распечатать тест для заполнения ручкой. Стоит сделать тест компактным (бумагу надо экономить). Вывести на странице необходимо название, опичание теста, время на прохождение, максю число баллов, вопросы, варианты, поля для заполнения.

    Печать результатов теста (или любой другой таблицы из личного кабинета). Надо скрыть лишние элементы страницы, оставив только таблицу с данными. Постарайся сделать ее компактной, чтобы не тратить бумагу. При этом таблица дложна быть отсортирована и отфильтрована в соответствии с выбранными настройками (об этом должно быть выведено предупреждение).

    #### Настройки профиля

    Сделать возможность редактировать имя, email, менять пароль.

    #### Улучшенные вопросы

    Возможность оформлять текст вопроса в редакторе, добавлять картинки перетаскиванием, а также прикладывать аудио/видео.

    Сделать поддержку MathML + редактор для вставки формул в вопросы и варианты ответов. Сделать поддержку какого-нибудь языка разметки для химических формул.

    #### Адаптивная верстка

    Сделать верстку для удобного просмотра сайта на маленьких (мобильных) экранах.

    #### Достижения

    Возможность после прохождения теста запостить результаты в соцсеть.

    ## Подсказки по реализации

    Все формы должны быть защишены от CSRF токеном.

    Старайся максимально использовать возможности фреймворка, а не писать велосипед. Например, формы, гриды, защиту от CSRF, модели, миграции БД.

    На странице списка тестов можно использовать jQuery UI Autocomplete для автодополнения тем (а может быть и названий тестов?).

    Для поиска тестов достаточно использовать SQL запрос вроде name LIKE '%квантовая%' AND name LIKE '%физика%', если тестов будет немного, если много (и тебе хочется сделать посложнее), то стоит сделать полнотекстовый поиск или подключить Sphinx.

    Для реализации редактора вопросов можно попробовать обойтись HTML формой + дополнительными скриптами. Например, для перетаскивания вопросов попробовать jQUery UI Sortable или jQuery UI draggable. Сама информация в вопросах сохраняется в видимых или скрытых полях и отправляется на сервер как обычная форма. Проверку правильности надо сделать как на клиенте, яваскриптом, так и на сервере. Желательно, чтобы описания полей брались из одного источника, а не дублировались.

    Реализовать переход вопроса из редактируемого в обычное состояние можно за счет средств CSS, стилизовать поля ввода и textarea в неактивном вопросе так, чтобы они выглядели как обычный текст.

    У меня еще есть альтернативная идея, сделать редактор вопросов на явакрипте с использованием библиотеки вроде Knockout. Тогда список вопросов будет загружаться и сохраняться на сервер в виде JSON-массива, но я не уверен что это будет проще (но с другой стороны, научишься c knockout работать). Это потребует хороших знаний JS.

    В базе данных логично сделать одну таблицу для тестов, одну для вопросов и может быть еще одну для вариантов ответов и связать их внешними ключами.

    Поля ввода, которые позволяют вводить форматированный текст, надо реализовать на основе какого-нибудь (желательно нетяжелого) wysiwyg-редактора. Если редактор состоит из кучи мелких файлов, надо изучить докуменатцию и осовить автоматическую их сборку, иначе страница будет грузиться очень медленно. Естественно, HTML который вводится в это поле, может содержать что угодно, потому на сервере надо его очистить от опасных конструкций. Для этого можно использовать мощную библиотеку HTMLPurifier или встроенный в Yii (если он используется) HTML-фильтр.

    Как реализовать перенос созданных анонимно тестов в аккаунт после регистрации? Очень просто, можно выдавать каждому гостю сайта уникальный id в куках. Как только он создает или проходит тест, мы создаем анонимного пользователя в таблице и привязываем к нему тест или результаты. Соответственно, когда он зарегистрируется, мы просто добавляем этому анонимному пользователю имя и возможность логиниться на сайт, а все тесты остаются в аккаунте. Таким образом нам удается с одной стороны отказаться от обязательной регистрации, с другой не терять созданные тесты.

    Отдельная тема — регистрация. Вот какие особенности стоит учесть:

    - у пользователя может быть не указан email (если он вошел через соцсеть)
    - у пользователя может не быть пароля, при этом войти через форму логина невозможно
    - у пользователя может быть несколько аккаунтов соцсетей + вход через пароль (хотя возможности пока такой нет, но предусмотреть это стоит)
    - есть анонимные пользователи, которые не могут войти на сайт, но к которым привязываются тесты и результаты

    Для реализации этого стоит сделать 2 таблицы: пользователи и внешние аккаунты.

    Для реализации входа через соцсети надо иметь аккаунт и зарегистрировать там приложение. Если ты не хочешь их заводить, проще всего реализовывать вход через twitter — там вроде ничего кроме email не требуется, в facebook/vk придется подтвердить телефон.

    Если соцсеть отдает больше данных, чем нам требуется, стоит сохранить их на будущее (вдруг завтра мы добавим аватарки?).

    Не указывай токены и id приложений в коде или конфигах, которые ты выгружаешь в репозиторий.

    Когда ты будешь реализовывать вход через внешние сети, постарайся сделать все в стиле ООП, например, HTTP-клиент сделать в виде отдельного объекта, а не встраивать в код, и писать так, чтобы без изменений систему входа можно было перенести на любой другой сайт. Тогда тестировать эту систему потом будет гораздо легче.

    Многие сервисы сейчас используют протокол OAuth (или OAuth 2) для входа через них, но каждый немного по-своему. Это упрощает жизнь разработчикам. Если соцсеть предоставляет возможность получить email, не забудь его попросить.

    Ссылки на описание API:

    - Twitter: https://dev.twitter.com/web/sign-in/implementing (англ.)
    - Vk: http://vk.com/dev/auth_sites (у вконтакте еще есть их собственное OpenAPI, рекомендую его не использовать)
    - Facebook: https://developers.facebook.com/docs/reference/dialogs/oauth?locale=ru_RU (англ.)
    - Ok: http://apiok.ru/wiki/pages/viewpage.action?pageId=42476652

    Также, раньше был еще протокол OpenID, который позволял пользователю хранить информацию о себе не в соцсетях, а на своем сервере и авторизовываться через id вроде [email protected], но он как я понимаю, так и не взлетел, используется мало где, а люди предпочли сдать свои данные соцсетям.

    Статьи:

    - http://habrahabr.ru/company/mailru/blog/115163/ (про OAuth 2)
    - http://geektimes.ru/post/77648/
    - http://habrahabr.ru/post/145988/
    - http://geektimes.ru/post/117211/

    Также, есть сервисы вроде ulogin, которые предосталвяют простой вход через соцсети добавлением скрипта на страницу. Не используй их. Во-первых, так ты ничему не научишься, во-вторых, они следят за твоими посетителями (даже если они не логинятся), и подгружают кучу сомнительных ифреймов в страницу (найди какой-нибудь сайт с такой системой и посмотри сам инспектором).

    Для взаимодействия с API нужно отправлять HTTP-запросы. Используй какую-нибудь готовую библиотеку, например Guzzle сейча популярен.

    На фейсбуке ты можешь для тестов входа через сайт создавать специальных фейковых пользователей — это удобно.

    Для вывода таблиц с результатами в твоем фреймворке наверняка что-то есть. В Yii есть grid, в Symfony 2 есть какой-нибудь сторонний плагин.

    Для работы с XML при экспорте/импорте стоит использовать DOM XML или SimpleXML. При экспорте давай нормальные имена файлам, например `Основы физики.txt` или `Результаты теста Основы физики (c фильтром).xls`, а не бессмысленный набор цифр. Сам подумай, удобно ли когда у тебя полная папка файлов типа test_sdas4d423asd.txt?

    Для экспорта в XLS стоит использовать https://github.com/PHPOffice/PHPExcel (там еще ест библиотека для чтения/записи DOC https://github.com/PHPOffice/PHPWord ).

    Для экспорта в PDF можно использовать либо wkhtmltopdf (он конвертирует HTML в PDF) либо DOMPDF: http://habrahabr.ru/post/190364/

    ## Тестирование

    Если ты не писал раньше тесты, у меня есть урок по ним и по используемым для этого инструментам.

    Разумеется, такой сложный сайт надо покрыть тестами (иначе как проверить что все работает? Вручную прокликивать десятки кнопок и ссылок?). Чтобы помочь тебе, я составил примерный план тестирования. Он большой и сложный, но как иначе научиться тестировать? У тебя же есть голова, подумай как сделать это с минимумом усилий.

    ### Юнит- и интеграционные тесты

    - Проверить что число баллов при сдаче теста считается правильно
    - Проверить что «самые популярные за месяц» тесты считаются правильно

    ### Браузерные тесты

    - **Создание теста** (так как тут используется JS то некоторые тесты возможно надо писать c его поддержкой)
    - Проверить добавление одного нового вопроса
    - Проверить переключение типа вопроса
    - Проверить что при переключении типа вопроса варианты ответа не теряются
    - Проверить добавление/удаление/перемещение вариантов ответа
    - Попробовать неправильно заполнить свойства теста
    - Попробовать неправильно заполнить свойства вопроса
    - Проверить что удаление вопроса работает
    - Проверить что изменение порядка вопросов работает
    - Проверить работу кнопок «добавить предисловие», «убрать ограничение времени»
    - Проверить сохранение теста с вопросами всех возможных типов
    - Проверить сохранение тегов
    - Проверить автодополнение тегов
    - **Редактирование теста**
    - Проверить что можно открыть редактирование теста из БД
    - Проверить удаление/добавление/перемещение вопросов с сохранением
    - Проверить удаление/добавление/перемещение вариантов ответа с сохранением
    - Проверить изменение свойств вопроса с сохранением
    - Проверить изменение типа вопроса с сохранением
    - Проверить изменение свойств теста с сохранением
    - **Публикация теста**
    - Проверить для зарегистрированного пользователя подставляется его email и выводится ссылка «мои тесты», а для гостя нет
    - Проверить что введенный email (а также пустой email) сохраняется
    - Проверить что выводится рабочая ссылка на тест и просмотр резуьтатов
    - Проверить что работает ссылка на предпросмотр теста
    - Проверить что кнопки шаринга не вызывают JS-ошибок и вызывают появление окон или еще чего-нибудь
    - Проверить что работает кнопка быстрой регистрации
    - Проверить что преподаватель получает email уведомление со ссылками
    - **Входная страница теста**
    - Проверить что выводится название, описание, автор теста
    - Проверить что выводится верная статистика по тесту
    - Проверить кнопку «Начать тест»
    - **Сдача теста**
    - Проверить что вопросы показываются
    - Проверить что ответы сохраняются
    - Проверить что можно перемещаться вперед/назад не теряя введенных ответов
    - Проверить что время учитывается
    - Проверить что нет JS ошибок
    - **Результат теста**
    - Проверить что показывается число набранных баллов
    - Проверить что можно ввести и сохранить имя
    - Проверить что для авторизованного пользователя имя не спрашивается и нельзя сохранить даже прямой отправкой аякс-запроса
    - Проверить работу кнопки быстрой регистрации
    - Проверить что если разрешено, показана ссылка просмотра ошибок
    - Проверить что если запрещено, просмотреть ошибки в тесте нельзя
    - **Главная**
    - Проверить что выводится список популярных за последний месяц тестов
    - **Тесты**
    - Проверить что можно искать тесты по тегу
    - Проверить что можно искать тесты по части названия
    - Проверить постраничную навигацию в сочетании с поиском
    - **Регистрация**
    - Проверить что регистрация возможна
    - Проверить ввод неправильных данных в форму
    - Проверить что после регистрации пользователь залогинен
    - Проверить что после регистрации пользователь перенаправляется на исходную страницу
    - Проверить что тесты и результаты сдачи переносятся в аккаунт пользователя
    - Проверить что высылается письмо со ссылкой подтверждения email
    - Проверить что ссылка подтверждения работает
    - **Логин**
    - Проверить логин при вводе правильных данных
    - Проверить форму логина на неправильных данных
    - Проверить что после логина пользователь перенаправляется на исходную страницу
    - Проверить что кнопка вход через соцсети открывает нужное окно
    - Проверить вход через соцсети если возможно сделать это с заглушкой
    - Проверить если возможно что первый вход через соцсети работает как регистрация
    - Проверить если возможно что email спрашивается если соцсеть его не отдала
    - **Восстановление пароля**
    - Проверить можно выслать письмо со ссылкой
    - Проверить ввод неприавльного email
    - Проверить что ссылка восстановления пароля работает
    - Проверить что ссылка восстановления пароля работает ограниченное время
    - Проверить что ссылка восстановления пароля работает только один раз
    - **Личный кабинет**
    - Проверить что неавторизованный пользователь не может попасть в ЛК
    - Проверить что неавторизованный пользователь может смотреть результаты своего теста по ссылке
    - Проверить что выводится список сдавших тест
    - Проверить постраничную навигацию в сочетании с сортировкой и фильтром (что фильтр/сортировка не сбрасывается)
    - Проверить что сортируется список сдавших тест
    - Проверить что фильтруется список
    - Проверить что экспортируется список с учетом фильтра и сортировки
    - Проверить вывод дополнительной информации в сайдбаре
    - **Smoke тесты**
    - Обойти страницы и проверить отстутвие битых ссылок
    - Обойти страницы и проверить отсутствие JS ошибок
    - Обойти страницы и проверить отсутствие JS ошибок при нажатии любых кнопок, установки курсора в поле, ввода любых символов, отправке форм

    Сайт использует внешние сервисы (соцсети). Нехорошо в тестах взаимодействовать с ними без надобности, надо подумать как заменить их (и отправляемые ими данные) заранее заготовленными заглушками.

    ## Дизайн

    Пока не сделан. Вот наброски:

    - создание теста http://i.imgur.com/LUwoqvH.png
    - регистрация http://i.imgur.com/ajJXtZC.png
    - ЛК http://i.imgur.com/OBBKmbJ.png

    ## Нагрузочное тестирование

    Интересно изучить, как сделать, чтобы сайт мог выдержать большой поток посетителей? Тогда надо наполнить базу сущностями, и протестировать его с помощью Apache Benchmark или, что лучше, Siege. Возможно, где-то стоит запрос оптимизировать, где-то кеш добавить.

    ## Заполнение базы

    Если тебе станет грустно смотреть на полупустой сайт, или захочется проверить, а как он поведет себя если добавить много данных, можно написать генератор данных для создания преподавателей, студентов, тестов, вопросов, ответов, результатов.

    Я вижу примерно такой вариант:

    yiic fill students:90 teachers:5 tests:7 questions:200 results:35

    @@ -131,35 +364,16 @@ Cделать сайт TestHub, который позволяет препода
    - Можно взять отсюда (здесь с синонимами): http://web.archive.org/web/20120615234550/http://kovtun-andrei.narod2.ru/habr/synonym_name.txt
    - Можно отсюда (большой годный список): http://www.gramota.ru/slovari/info/petr/imsm/

    Список с синонимами может пригодится, чтобы например при входе из соцсети конвертировать имя в строгую форму. Но это если мы захотим это делать.

    **Фамилии**:

    - http://ru.wikipedia.org/wiki/Список_общерусских_фамилий
    - http://pppz.wordpress.com/2012/08/19/база-фамилий-скачать/
    - http://www.familytree.ru/ru/dbf.htm

    Склонение имен и фамилий. Возможно, стоит сделать склонялку или же в базу забить имена в 6 падежах (их можно получить через inflector яндекса, который конечно не предназаначен для такого использования но работает вполне ок). Ну может не будем делать склонение. Ты сам-то что думаешь?

    **email** — можно сгенерировать в fakenamegenerator или как-нибудь самому, из имен например.

    **аватар** — гм, не знаю пока где их брать. Можно взять картинки какие-нибудь или ничего не стаивть.

    **Номера групп**: можно сделать как тут http://isu.ifmo.ru/pls/apex/f?p=2005:4:121700718774411::NO::SCH:2
    Названия кафедр: http://isu.ifmo.ru/pls/apex/f?p=2005:2:0::NO:RP:STRUCT,STRUCT_TYPE_W,STRUCT_TYPE_H,STRUCTURE_FILTER:1,777,4,

    **Названия тестов**: http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B0%D0%BA%D0%B0%D0%B4%D0%B5%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%B4%D0%B8%D1%81%D1%86%D0%B8%D0%BF%D0%BB%D0%B8%D0%BD

    **Вопросы для тестов с ответами**: http://moydocs.ru/geografiya/73061/index.html (удобен тем, что можно скопировать текст в файл и расковырять регулярками по словам «Вопрос», «A», «B» ... это займет строчек 20).

    Попробуй сделать списки (не знаю, в каком формате — можно txt файл с значениями на отдельных строках, или json) исходных данных и прикрутить генератор. Совсем сильно заморачиваться не надо, главное чтобы мы могли заплнить базу правдоподобными значениями.

    В боевой базе должно быть примерно столько сущностей:

    - 1-2 куратора
    - 15 преподов
    - 60 групп по ~25 студентов
    - в среднем 8 тестов на студента, тест на 3-4 группы => около 120 тестов
    - 10-50 вопросов в каждом тесте
    - 3-4 варианта ответа на вопрос
    - половина студентов не сдавала тесты, четверть сдала ок, четверть пробовала сдать но провалила (это сложно сгенерировать?)
    Вот пример моего генератора случайных текстов: https://github.com/codedokode/board-test-scripts
  9. codedokode revised this gist Jan 31, 2014. 1 changed file with 2 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -77,13 +77,15 @@ Cделать сайт TestHub, который позволяет препода
    **Группы**: номер (возможно потом добавим еще факультеты и номер курса)

    **Пользователи**:

    - У всех есть имя, фамилия, пол, email (мб пустым при входе через соцсеть), аватар, телефон (не обяз.)
    - Пользователи могут входить на сайт через email + пароль либо же через соцсеть
    - Email/телефон может использоваться для напоминаний (срочно сдать тест) и уведомлений.
    - Насчет телефона не уверен — насколько безопасно хранить их на сайте. Может и не стоит.
    - Нужно подумать, реально ли при логине из фейсбука конвертировать англоязычное написание имени в русское
    - Хорошо бы при регистрации автоматом определять пол по имени/фамилии, подумай как это сделать

    Свойства:

    - Студент: группа в которой учится
    - Препод: группы у которых он ведет занятия, ссылка на личную страницу, рабочий телефон, название кафедры
  10. codedokode created this gist Jan 31, 2014.
    163 changes: 163 additions & 0 deletions задача-сайт-testhub.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,163 @@
    ## Задача

    Cделать сайт TestHub, который позволяет преподавателям проверять знания студентов в автоматическом режиме с помощью тестов.

    - **Предлагаемые технологии**: фреймворк Yii/MySQL/Twig
    - **Время выполнения**: все зависит от тебя

    ### Описание страниц сайта

    `/` - **Главная**. Содержит информацию о сервисе, кнопки регистрации преподавателей и список лучших студентов и групп.

    `/reg/student` - **Регистрация студента**. Содержит поля имя/фамилия/пол(опр. по возможности автоматически)/номер группы/аватарка. Есть возможность войти через вконтакте/фейсбук чтобы не заполнять поля.

    `/reg/teacher` - **Регистрация преподавателя** Содержит то же + список групп, у которых ведет занятия преподаватель. Чтобы получить доступ, преподаватель должен быть подтвержден администратором.

    Если студент залогинен, то он попадает на свою страницу со списком тестов ( `/tests/my` ). Выводятся тесты в 2 списка: уже сданные (выводится результат), и которые надо сдать (выводится срок). В первую очередь выводятся тесты, до сдачи которых осталось мало времени.

    Также выводятся успехи других студентов группы.

    Если нажать на сданный тест, то попадаем на **страницу результатов** `/results/12345` . На этой странице виден список вопросов, и выведено правильно или неправильно дан ответ. Страница результатов может быть общедоступна, а может быть закрыта. Тут же можно расшарить ссылку на страницу в соцсетях или закрыть доступ.

    Тут еще надо подумать, а нет ли здесь уязвимости что можно посмотреть как другие сдали тесты и методом исключения подобрать правильные ответы.

    Если нажать на несданный тест, то попадаем на **входную страницу теста** `/tests/1234`. На ней выводится информация о тесте: название, число баллов, нужно для сдачи, преподаватель, предисловие, правила прохождения теста. И большая кнопка «Начать тест». И кнопка возврата назад к списку.

    В самом тесте просто показываются вопросы по очереди, и отсчиытвается оставшееся время. После сдачи студент попадает на страницу с результатами. Можно отказаться сдавать тест, но в любом случае все попытки сдачи учитываются. Если все попытки потрачены, то нужно просить преподавателя добавить еще.

    **Страница со списком групп** `/manage/groups` — выводися список групп, по клику можно перейти на страницу со списком студентов. Для каждой группы выводится статистика по успешно сдавшим/провалившим/сдающим тесты.

    **Страница группы** `/manage/groups/62501` — выводится студентов и результаты сдачи тестов. Тут же можно добавить попыток, просмотреть ответы или аннулировать результаты. Можно редактировать студентов.

    **Страница со списком преподавателей** `/manage/teachers` — выводится список преподавателей, можно их блокировать или подтверждать.

    **Список тестов** Преподаватель может редактировать только свои тесты, администратор — все. Выводится статистика по тестам, число сдавших, медианный балл. Можно кликнуть чтобы увидеть поименный список сдавших/проваливших тест.

    ### Тесты

    Тест имеет такие свойства: название, номера групп, ограничение по времени, число попыток, сложность, порог сдачи, доступен с, сдать до. Вопросы могут содержать картинку, текст, число баллов, способ ответа (олиночный, множественный, числом, строкой). Вопросы можно добавлять, удалять, перемещать.

    Старые тесты отправляются в архив.

    Надо подумать про тесты с параметрами (вида Сколько бит содержится в {n} байтах?).

    Тесты можно экспортировать/импортировать в XML, в текст, распечатывать с правильными ответами или без. Тесты можно создавать на основе старых.

    #### Картинки

    Картинки пока не нарисованы. Есть вайрфреймы, то есть набросок как это будет выглядеть:

    - Страница редактирования теста: http://tau.rghost.ru/52059323/image.png
    - Страница успехов группы: http://higgs.rghost.ru/52059340/image.png

    Верстать их пока не надо, так как я их еще перерисую.

    #### Наполнение БД

    Надо будет написать скрипт, который генерирует нужное число студентов, преподавателей, тестов, результатов сдачи, чтобы мы могли тестировать сайт на непустой базе.

    #### Миграции

    Изменения в Бд надо делать через миграции: http://www.yiiframework.com/doc/guide/1.1/ru/database.migration Миграции нужны, чтобы мне например не надо было дропать и пересоздавать базу когда ты туда добавишь новое поле.

    #### Формы и гриды

    В задании много работы с формами и таблицами. Для них надо использовать соотв. возможности Yii

    #### Права доступа

    У нас есть пользователи с разными правами доступа. Например, преподаватель может редактировать тесты — но только свои, администратор - все что угодно. Можно использовать для управления правами какие-то стандартные компоненты.

    ### Поиск

    Нужно будет сделать всюду удобный поиск: поиск студента по имени, поиск теста по названию.

    ## Сущности и их свойства

    **Группы**: номер (возможно потом добавим еще факультеты и номер курса)

    **Пользователи**:
    - У всех есть имя, фамилия, пол, email (мб пустым при входе через соцсеть), аватар, телефон (не обяз.)
    - Пользователи могут входить на сайт через email + пароль либо же через соцсеть
    - Email/телефон может использоваться для напоминаний (срочно сдать тест) и уведомлений.
    - Насчет телефона не уверен — насколько безопасно хранить их на сайте. Может и не стоит.
    - Нужно подумать, реально ли при логине из фейсбука конвертировать англоязычное написание имени в русское
    - Хорошо бы при регистрации автоматом определять пол по имени/фамилии, подумай как это сделать


    - Студент: группа в которой учится
    - Препод: группы у которых он ведет занятия, ссылка на личную страницу, рабочий телефон, название кафедры
    - Куратор: как и препод
    - Администратор: ?

    Права:

    - студент — сдавать тесты
    - препод — создавать тесты, аннулировать результаты, разрешать пересдачу но только в своих группах
    - куратор — подтверждает и блокирует кураторов и преподов, просматривает все результаты, аннулирует тесты, разрешает пересдачу
    - администратор — может все

    Заметь, здесь есть хороший вопрос, как хранить разные типы пользвоателей. Можешь погуглить про наследование таблиц, есть разные способы.

    **Тесты**: автор, название, предисловие, сколько баллов для сдачи, доступен с, сдать до (но препод может продлевать срок отдельным студентам), число попыток (препод может дать дополнительные лично), номера групп которым предназначен тест.

    Старые-старые тесты отправляются в архив, чтобы не мозолить глаза.

    **Вопросы теста**: текст (наверно стоит предусмотреть возможность HTML), картинка, сложность в баллах, тип ответа, ответ

    **Виды ответов**: выбрать один из вариантов, выбрать 0-N вариантов, число (с погрешностью, например, 1.23 ±10%), строка (сравнивается без учета пробелов и регистра).

    **Резлультат теста**: результаты сдачи всех тестов хранятся в БД, включая время ответа на каждый вопрос и выбранный ответ.

    Тут стоит подумать, а что если потом тест или вопросы поменяются? Не нарушатся ли данные в архиве результатов?

    Вроде как все. Если я что-то забыл — можешь добавить.

    ### Генератор данных

    Нам также нужен консольный скрипт-генератор для набивания базы. Я вижу примерно такой вариант:

    yiic fill students:90 teachers:5 tests:7 questions:200 results:35

    Синтаксис можно поменять. Должны генерироваться и связываться между собой все указанные сущности в нужном числе.

    Источники данных для генератора:

    **Имена**:

    - можно попробовать сгенерировать и получить список здесь: http://www.fakenamegenerator.com/order.php
    - Можно взять отсюда (здесь с синонимами): http://web.archive.org/web/20120615234550/http://kovtun-andrei.narod2.ru/habr/synonym_name.txt
    - Можно отсюда (большой годный список): http://www.gramota.ru/slovari/info/petr/imsm/

    Список с синонимами может пригодится, чтобы например при входе из соцсети конвертировать имя в строгую форму. Но это если мы захотим это делать.

    **Фамилии**:

    - http://ru.wikipedia.org/wiki/Список_общерусских_фамилий
    - http://pppz.wordpress.com/2012/08/19/база-фамилий-скачать/
    - http://www.familytree.ru/ru/dbf.htm

    Склонение имен и фамилий. Возможно, стоит сделать склонялку или же в базу забить имена в 6 падежах (их можно получить через inflector яндекса, который конечно не предназаначен для такого использования но работает вполне ок). Ну может не будем делать склонение. Ты сам-то что думаешь?

    **email** — можно сгенерировать в fakenamegenerator или как-нибудь самому, из имен например.

    **аватар** — гм, не знаю пока где их брать. Можно взять картинки какие-нибудь или ничего не стаивть.

    **Номера групп**: можно сделать как тут http://isu.ifmo.ru/pls/apex/f?p=2005:4:121700718774411::NO::SCH:2
    Названия кафедр: http://isu.ifmo.ru/pls/apex/f?p=2005:2:0::NO:RP:STRUCT,STRUCT_TYPE_W,STRUCT_TYPE_H,STRUCTURE_FILTER:1,777,4,

    **Названия тестов**: http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%B0%D0%BA%D0%B0%D0%B4%D0%B5%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D0%B4%D0%B8%D1%81%D1%86%D0%B8%D0%BF%D0%BB%D0%B8%D0%BD

    **Вопросы для тестов с ответами**: http://moydocs.ru/geografiya/73061/index.html (удобен тем, что можно скопировать текст в файл и расковырять регулярками по словам «Вопрос», «A», «B» ... это займет строчек 20).

    Попробуй сделать списки (не знаю, в каком формате — можно txt файл с значениями на отдельных строках, или json) исходных данных и прикрутить генератор. Совсем сильно заморачиваться не надо, главное чтобы мы могли заплнить базу правдоподобными значениями.

    В боевой базе должно быть примерно столько сущностей:

    - 1-2 куратора
    - 15 преподов
    - 60 групп по ~25 студентов
    - в среднем 8 тестов на студента, тест на 3-4 группы => около 120 тестов
    - 10-50 вопросов в каждом тесте
    - 3-4 варианта ответа на вопрос
    - половина студентов не сдавала тесты, четверть сдала ок, четверть пробовала сдать но провалила (это сложно сгенерировать?)