Приведение в порядок сообщений об ошибке и алгоритма ее выдачи

Issue #392 resolved
Oleg Sychev repo owner created an issue

Есть проблемы которые надо решить совместно в функциях user_active_sessions в блоке и prevent_access в правиле:

а) выдавать сообщение об ошибке при полном отсутствии активных сессий б) иметь корректные приоритеты выдачи ошибок в любых ситуациях - сейчас возвращается error от последней откинутой сессии как я понимаю, что есть безобразие на отсутствие которого должны быть юнит-тесты в) возвращать пустую error если подходящая сессия найдена г) устранить развилку по содержимому $error в правиле - ограничившись чем-то типа get_string($error, 'quizaccess_supervisedcheck');

Для этого я думаю надо сделать примерно следующее. В user_active_sessions а) инициализировать error значением самой приоритетной ошибки - grouperror (и кавычки там двойные зачем когда одинарные можно?) - это автоматически даст нам выдачу такой ошибки если не существует активных сессий и дополнительные проверки в правиле будут не нужны б) сделать в конце проверку - если оставшийся массив сессий не пустой, то очистить error в пустую строку или false - а то ведь она на каждой откинутой исправляется; в) в развилке из 3х веток начинающейся на https://bitbucket.org/AnastasiyaPotseluico/moodle-plugins-supervised/src/d2d2f356a60d6d7f8d7ef6fbdd75cde547b2ab23/blocks/supervised/lib.php?at=default&fileviewer=file-view-default#lib.php-194 сделать дополнительные проверки - grouperror присваивается только если текущим значением не было iperror или lessontypeerror, iperror присваивается только если раньше не было lessontypeerror и только lessontypeerror присваивается всегда (но при этом порядок альтернатив и else if остается прежний!). Таким образом мы сможем обеспечить их правильный приоритет - например если одна сессия дает ошибку lessontypeerror а другая iperror , то должна показываться lessontypeerror (т.е. если для одной сессии не хватает типа урока, а для другой - кривой айпишник, то юзер должен увидеть сообщение о типе урока ибо он сидит в классе таки на уроке, просто не для этого теста - а в другом классе может проходить другой урок у другой подгруппы например одновременно).

Можно сделать также флажок что хоть одна сессия найдена и если он поставлен, то уже сделать error пустой и не трогать его больше. г) в правиле сообщение юзеру $string['noaccess'] мне кажется излишним, оно по сути своей повторяет $string['lessontypeerror']. Возможно оно было написано когда lessontypeerror еще не существовало. Если это так, то это сообщение удаляем и $string['noaccessall'] переименовываем в $string['iperror '] после чего развилка становится ненужной - берем get_string($error, 'quizaccess_supervisedcheck'); и все д) причесать сообщения в правиле так, чтобы не пугать русского студента "сессиями" - а называть их все "занятиями" как в других сообщениях - сравните$string['iperror'] = 'Вы не можете выполнять тест. Вы должны находится в классе, где проходит занятие и работать на компьютерах, с которых разрешено тестирование.'; $string['noaccess'] = 'Вы не можете выполнять тест. Дождитесь необходимого занятия в вашей группе.'; $string['noaccessall'] = 'Вы не можете выполнять тест. Для вашей группы нет активной сессии.'; И сделайте русскую версию $string['lessontypeerror'] - пожалейте наших студентов.

Уф, кажется что много - на самом деле дела тут чуть, надеюсь на очень оперативное исправление. Сложную работу выношу в отдельные issue.

Comments (5)

  1. Oleg Sychev reporter

    Вы не поняли правил приоритета относительно коммита https://bitbucket.org/AnastasiyaPotseluico/moodle-plugins-supervised/commits/37d3feb7b3dbc7eadc53e397bf340ca49a0c2f56 - там неверно написано.

    Цитирую "делать дополнительные проверки - grouperror присваивается только если ТЕКУЩИМ ЗНАЧЕНИЕМ не было iperror или lessontypeerror". Здесь речь идет не о сравнении между собой трех флагов в рамках определения ошибки для данной сессии, как вы написали - здесь речь идет о приоритетах ошибок двух разных сессий. Представьте себе ситуацию когда несколько сессий не подходят, все активные - но не подходят по разному. Т.е. представьте что одна сессия дает grouperror ,а другая (мы же в цикле) - iperror. Т.е. надо сравнивать флаг (он, остается один как был раньше в этом условии) - и старое значение $error. Ведь если одна из двух текущих сессий для чужой группы, а другая - для его (но студент не в аудитории например) - то он должен получить сообщение что не в аудитории - т.к. сессия с его группой ему подходит больше, чем сессия чужой группы. Аналогично если есть сессия с его группой и IP - но другим типом занятия - то он должен получить сообщение о несовпадении типа занятия. Текущий же код заносит в $error ошибку от ПОСЛЕДНЕЙ провальной сессии, которая совсем не факт что наиболее подходящая для данного пользователя. Ну то есть студент, сидя на своем уроке и попытавшись залезть в тест неподходящий по типу занятия может получить сообщение что мол в его группе нет занятий, если последней в массиве оказалась сессия другой группы в совсем другом классе. Это ж не дело... В юнит-тестах надо такие ситуации учесть тоже.

    Если так и не поняли - я первую половину дня пятницы буду в политехе...

  2. Анастасия Поцелуйко

    Вытолкнула изменения. Олег Александрович, я не могу менять тип Issue здесь, у меня не высвечивается как у вас окно.

  3. Oleg Sychev reporter

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

  4. Oleg Sychev reporter

    Сделал, теперь нужно тщательно протестировать - что всерьез возможно только юнит-тестами. Так что надо делать #393

  5. Log in to comment