Разработать класс контроллера MoodleUserWS с реализациями функций для работы...
Java client library for Moodle 2.x REST Web Services
Status: Planning
Brought to you by:
kolgenpav
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
Геннадий Павлович не могу понять как правильно в методах core_user_create_users,
core_user_get_users, core_user_update_users написать переменные usercustomfields и userpreferences? И есть вопрос по методу core_user_delete_users для него нужно создавать такой же класс как и для категорий(MoodleCategoryToDelete) и в нем описать подобные методы только для Пользователей?
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
И можно ли в коммите исправить текст? а то там что-то лишнего накидало очень много.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
Посмотрите настройки какого-либо пользователя на сайте Moodle. Сопоставьте поля класса MoodleUser с настройками и отразите это в JavaDoc полей класса (напишите название соответствующего поля в настройках, например для lang - Preferences-Preffered languauge - list of languages in User Settings).
В настройках я не нашёл полей calendartype, theme - нужно в Интернете поискать, где оно в Moodle настраивается.
Некоторые из полей находятся в разделе Preferences настроек (например, mailformat и lang), а вот остальные могут быть добавлены в Set<UserPreference> userPreferences как пары ключ-значение. Я так понимаю, что для ключей (имена предпочтений) можно создать перечисление (Enumeration) (UserPreferenceEnum), попытайтесь найти в Интернете, как с ними работать.
Аналогично можно работать и с customsFiled - сюда попадёт всё, что не попало в класс MoodleUser как его поля или ключи userPreferences.
По поводу коммита не беспокойтесь, следующий запишет тот текст, что Вы напишите.
По поводу методов контроллера - давайте по порядку:
1. Метод public Set<MoodleUser> createUsers(Set<MoodleUser> newUsers) throws MoodleException, ParseException принимает набор новых пользователей, т.е. пользователей с заполненными полями с помощью конструктора MoodleUser, использующегося при создании нового пользователя (кстати напишите к нему JavaDoc на английском). Я так понимаю, что к этому конструктору нужно добавить поля userpreference и usercustomfields в соответствии с Web Service API. В конструкторе пусть они будут просто наборами, а вот заполнять их нужно попробовать в тесте. Вообще правильность написания методов и идеи возникают при их модульном тестировании. так что пишите и методы и тесты к ним параллельно.
Предлагаю пока поработать над core_user_create_users и core_user_get_users, а потом перейдём к остальным, так что вопрос по поводу MoodleCategoryToDelete я пока опускаю.
Status: Started
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
создал тест для контролера с пользователями, что-то пока не проходит метод создания пользователя.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
На первый взгляд всё ОК. Используйте пошаговую отладку. Тест создания объектов в MoodleCategoryWSTest (тестовый метод testCreateCategories) я дополнил кодом, удаляющим созданные категории после выполнения теста. Это правильный подход - тест можно запускать не изменяя в конечном итоге данные на сервере. Пользуйтесь такой стратегией для тестов, изменяющих данные.
Также в MoodleCategoryWS добавил вспомагательные методы getCategoryById(int categoryId) и getCategoryByName(String categoryName), которые используют универсальный метод Set<MoodleCategory> getCategories(Map<String, String> criteria, int addSubcategories). Необходимость методов стала очевидной при тестировании.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
В MoodleUserWS в методе createUsers не добавлены параметры:
users[0][middlename]= string
users[0][alternatename]= string
users[0][preferences][0][type]= string
users[0][preferences][0][value]= string
users[0][customfields][0][type]= string
users[0][customfields][0][value]= string
Оациональность означает, что их значения могут не указываться, но в запросе они должны быть
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
Я завершил разработку класса контроллера MoodleCategoryWS и модульного теста MoodleCategoryWSTest к нему. Контроллер содержит реализации универсальных методов - тех что описаны в Moodle Web Service API, а также вспомогательных методов (supplementary), которые удобны при работе с данными объектами. Тесты методов проходят в неизменяемых данные сайта стиле: т.е. в случае тестирования методов удаления объектов вначале создаются объекты, с ними выполняются тесты, а после тестирования эти объекты удаляются. Это правильная стратегия, она позволяет запустить все тесты, убедиться в их прохождении, при этом данные на сайте после тестирования не изменяются по сравнению с данными до тестирования.
Используйте также этот подход в своей работе.
Если что-то не получается, пишите, будем вместе разбирать.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
Хорошо, на выходных планирую посидеть поделать.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
Геннадий Павлович, что-то не могу понять как вот эти поля usercustomfields и userpreferences правильно задавать, может во вторник на паре посмотрим?
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
Попробуйте реализовать в тесте метод testGetUsers для одного из реальных пользователей сайта и в отладке посмотрите, что сервер отдаёт. Исходя из документации он должен для пользователя возвращать
customfields Optional //User custom fields (also known as user profile fields)
list of (
object {
type string //The type of the custom field - text field, checkbox...
value string //The value of the custom field
name string //The name of the custom field
shortname string //The shortname of the custom field - to be able to build the field class in the code
}
,
preferences Optional //Users preferences
list of (
object {
name string //The name of the preferences
value string //The value of the custom field
}
)
и
warnings Optional //list of warnings
list of (
//warning
object {
item string Optional //always set to 'key'
itemid int Optional //faulty key name
warningcode string //the warning code can be used by the client app to implement specific behaviour
message string //untranslated english message to explain the warning
}
)
Поле Set<UserEnrolledCourse> userenrolledCourses объекта MoodleUser, очевидно заполняет другой метод: core_enrol_get_users_courses
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
Геннадий Павлович, а как правильно в конструкторе задать аргументы customfields, через запятую писать Set<UserCustomField>, или usercustomfields, а потом в самом конструкторе this.usercustomfields = usercustomfields?
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
Сергей,
метод парсинга JSON-ответа, возвращаемого в методе Set<MoodleUser> getUsers(Map<String, String> criteria) выглядит так:
//Request to Web-service's function invoke
String response = MoodleRestWSConnector.moodleWSRestCall(restformat, domainName, token, functionName, urlParameters.toString());
/*Use TreeSet for getting users in sorted order*/
Set<MoodleUser> users = new HashSet<MoodleUser>();
//Parsing of JSON-response
Object obj = parser.parse(response);
JSONObject jsonObj = (JSONObject) obj;
JSONArray jsonUsers = (JSONArray) jsonObj.get("users");
//Fore some id it was empty array
if (jsonUsers.size() != 0) {
for (Object arrayItem : jsonUsers) {
JSONObject jsonUserObj = (JSONObject) arrayItem;
long id = (long) jsonUserObj.get("id");
String username = jsonUserObj.get("username").toString();
String firstname = jsonUserObj.get("firstname").toString();
String lastname = jsonUserObj.get("lastname").toString();
String fullname = jsonUserObj.get("fullname").toString(); //change to surname
String email = jsonUserObj.get("email").toString();
String department = jsonUserObj.get("department").toString();
String idnumber = jsonUserObj.get("idnumber").toString();
long firstaccess =(long) jsonUserObj.get("firstaccess");
long lastaccess =(long) jsonUserObj.get("lastaccess");
String description = jsonUserObj.get("description").toString();
long descriptionformat =(long) jsonUserObj.get("descriptionformat");
String city = jsonUserObj.get("city").toString();
String country = jsonUserObj.get("country").toString();
String profileimageurlsmall = jsonUserObj.get("profileimageurlsmall").toString();
String profileimageurl = jsonUserObj.get("profileimageurl").toString();
MoodleUser user = new MoodleUser(id, username, firstname,
lastname, fullname, email, department, idnumber, firstaccess, lastaccess,
description, descriptionformat, city, country,
profileimageurlsmall, profileimageurl);
users.add(user);
}
Здесь я сменил тип набора с TreeSet на HashSet (не будет выполняться сортировка пользователей в наборе - нужно подумать стоит ли их сортировать и как и релизовать метод в comparable MoodleUser - это можно сделать позже).
В MoodleUser пришлось добавить поле private String fullname; и изменить конструктор, удалив-добавив поля, которые есть в JSON:
/**
* Used for JSON response wrapping in to the MoodleUser object
* in Set<MoodleUser> getUsers(Map<String, String> criteria) method.
*/
public MoodleUser(long id, String username, String firstname, String lastname, String fullname, String email,
String department, String idnumber, long firstaccess, long lastaccess, String description, long descriptionformat,
String city, String country, String profileimageurlsmall, String profileimageurl) {
this.id = id;
this.username = username;
this.firstname = firstname;
this.lastname = lastname;
this.email = email;
this.department = department;
this.idnumber = idnumber;
this.firstaccess = firstaccess;
this.lastaccess = lastaccess;
this.description = description;
this.descriptionformat = descriptionformat;
this.city = city;
this.country = country;
this.profileimageurlsmall = profileimageurlsmall;
this.profileimageurl = profileimageurl;
}
Тест метода проходит.
Я изменения в классах не сохранил, сделайте Вы их.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
В будущем нужно будет выяснить, что собой представляет массив JSON-объектов warnings, возвращаемый сайтом и как-то его обработать. Кроме того, когда будем создавать пользователя через Веб-сервис, нужно будет создать одного "по-полной" - с заполнением всех полей, а затем его получить, чтобы увидеть не появятся ли ещё опциональные данные в JSON-ответе
Напишите это в комментарий
//TODO
в классе контроллера, чтобы не забыть. Это общепринятый способ. Впоследствии по
//TODO можно будет искать все напоминания по проекту.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
Геннадий Павлович, у меня чего то наша библиотека не отображается как проект, просто папка(не открывается в нетбинсе), можно ли как-то обновить его, или нужно заново скачать с code.google.com/p/moodle-javalib?
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
Нужно просто обновить проект: правой кнопкой по проекту Систему упр версиями Subversion - Обновить - Сохранить в HEAD
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
Нетбинс не видит библиотеку как проект, а видит как папку, и не открывает его.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
Сергей в комментарии #12 я привёл код парсинга JSON-ответа только первого из массивов: users. Однако после него в JSON-ответе размещён ещё массив "warnings".
Его нужно получить аналогичным образом
JSONArray jsonWarnings = (JSONArray) jsonObj.get("warnings");
и брать из него значения (хотя в тестах он пустой).
Ка брать неизвестные значения в неизвестном количестве из массива можно посмотреть в парсинге метода Set<MoodleCourse> getCourses(Set<Long> ids) класса MoodleCourseWS на примере массива "courseformatoptions".
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
сделал то что вы написали в 12 комментарии, только пока не трогал массив "warnings", тест проходит, что делать дальше?
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
ОК. Теперь напишите и заставьте работать в классе MoodleUserWSTest методы testCreateUsers, testUpdateUsers, testDeleteUsers. При этом используйте стратегию, как в классе MoodleCategoryWSTest, когда для изменяющих данные методы сначала в тесте создаётся объект, затем проводится тест, а затем объект удаляется.
После отладки универсальных методов, нужно добавить в MoodleUserWS вспомогательные методы: получающие пользователя по логину, по полному имени, создающий одного пользователя, удаляющий одного пользователя, обновляющие данные одного пользователя. Такие методы сделать просто, т.к. они используют универсальные. Ну и нужно написать тесты на все эти методы.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
Здравствуйте, Геннадий Павлович вот проверял метод create user отладчиком, он возвращает поле usercustomfields, как правильно его добавить в конструктор в классе MoodleUser? Так же как и обычные переменные?(this.usercustomfields = usercustomfields;), и как потом в контролере? там же тип получается у него не строковый, а набор (Set<UserCustomField> usercustomfields). Не могу как-то с этим разобраться.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
Посмотрите метод Set<MoodleCourse> createCourses(Set<MoodleCourse> newCourses) класса MoodleCourseWS. В MoodleCourse есть свойство List<CourseFormatOption> courseformatoptions, аналогичное свойствам Set<UserCustomField> usercustomfields и Set<UserPreference> userpreferences, которые могут использоваться при создании пользователя. В MoodleCourse есть конструктор, в котором используется это поле. Попробуйте создать аналогично. У Вас должен быть конструктор со всеми свойствами, включая три сета, конструктор со свойствами usercustomfields и userpreferences, который может использоваться при создании пользователя с заполнением всех полей, включая опциональные и конструктор с минимальным количеством полей (не включая опциональные), достаточным для создания пользователя. Смотрите для примера MoodleCourse. Также смотрите метод testCreateCourses класса MoodleCourseWSTest, в нём используется заполнение коллекции-свойства.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
добавил в контролер по пользователям usercustomfields, проверьте так или нет, если да то добавлю и userpreferences, Геннадий Павлович, мне тут числа 10 нужно уехать в Днепропетровск, вернусь где то в 20 числах, и потом буду делать дальше, хорошо?
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: kolgen...@gmail.com
Да, всё нормально, добавляйте аналогично и остальные поля-коллекции. Только также добавьте поля-коллекции и ко второму конструктору класса MoodleUser (с полным набором свойств). И напишите тест для метода Set<MoodleUser> createUsers(Set<MoodleUser> newUsers) с полным набором параметров, включая коллекции. Смотрите для примера метод testCreateCourses() класса MoodleCourseWSTest.
Да, конечно, поезжайте, отдыхайте. К сожалению, оценка нашего проекта на конкурсе невысокая 54.65%, но и ответственность теперь меньшая, будем развивать проект для Ваших дипломных работ и для нашего общего самообразования.
С праздниками Вас.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
Значит будем делать для себя) Вас тоже с праздниками.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: MEXAHIK3...@gmail.com
здравствуйте, я добавил в котроллер MoodleUserWS поле-коллекции UserPreference, теперь можно делать тест для метода "core_user_create_users"?