Menu

#10 Разработать класс контроллера MoodleUserWS с реализациями функций для работы с пользователями сайта Moodle

Started
nobody
None
Medium
Review
2015-03-09
2014-11-24
Anonymous
No

Originally created by: kolgen...@gmail.com
Originally owned by: MEXAHIK3...@gmail.com

Нужно разработать контроллер MoodleUserWS с реализациями функций:
core_user_create_users
core_user_get_users
core_user_update_users
core_user_delete_users

Для образца используйте MoodleCategoryWS.

Также нужно создать модульный тест MoodleUserWSTest для тестирования методов реализации указанных функций. Для образца используйте MoodleCategoryWSTest.

Discussion

1 2 > >> (Page 1 of 2)
  • Anonymous

    Anonymous - 2014-11-30

    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) и в нем описать подобные методы только для Пользователей?

     
  • Anonymous

    Anonymous - 2014-11-30

    Originally posted by: MEXAHIK3...@gmail.com

    И можно ли в коммите исправить текст? а то там что-то лишнего накидало очень много.

     
  • Anonymous

    Anonymous - 2014-12-01

    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

     
  • Anonymous

    Anonymous - 2014-12-02

    Originally posted by: MEXAHIK3...@gmail.com

    создал тест для контролера с пользователями, что-то пока не проходит метод создания пользователя.

     
  • Anonymous

    Anonymous - 2014-12-02

    Originally posted by: kolgen...@gmail.com

    На первый взгляд всё ОК. Используйте пошаговую отладку. Тест создания объектов в MoodleCategoryWSTest (тестовый метод testCreateCategories) я дополнил кодом, удаляющим созданные категории после выполнения теста. Это правильный подход - тест можно запускать не изменяя в конечном итоге данные на сервере. Пользуйтесь такой стратегией для тестов, изменяющих данные.
    Также в MoodleCategoryWS добавил вспомагательные методы getCategoryById(int categoryId) и getCategoryByName(String categoryName), которые используют универсальный метод Set<MoodleCategory> getCategories(Map<String, String> criteria, int addSubcategories). Необходимость методов стала очевидной при тестировании.

     
  • Anonymous

    Anonymous - 2014-12-02

    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

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

     
  • Anonymous

    Anonymous - 2014-12-05

    Originally posted by: kolgen...@gmail.com

    Я завершил разработку класса контроллера MoodleCategoryWS и модульного теста MoodleCategoryWSTest к нему. Контроллер содержит реализации универсальных методов - тех что описаны в Moodle Web Service API, а также вспомогательных методов (supplementary), которые удобны при работе с данными объектами. Тесты методов проходят в неизменяемых данные сайта стиле: т.е. в случае тестирования методов удаления объектов вначале создаются объекты, с ними выполняются тесты, а после тестирования эти объекты удаляются. Это правильная стратегия, она позволяет запустить все тесты, убедиться в их прохождении, при этом данные на сайте после тестирования не изменяются по сравнению с данными до тестирования.
    Используйте также этот подход в своей работе.
    Если что-то не получается, пишите, будем вместе разбирать.

     
  • Anonymous

    Anonymous - 2014-12-05

    Originally posted by: MEXAHIK3...@gmail.com

    Хорошо, на выходных планирую посидеть поделать.

     
  • Anonymous

    Anonymous - 2014-12-07

    Originally posted by: MEXAHIK3...@gmail.com

    Геннадий Павлович, что-то не могу понять как вот эти поля usercustomfields и userpreferences правильно задавать, может во вторник на паре посмотрим?

     
  • Anonymous

    Anonymous - 2014-12-08

    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

     
  • Anonymous

    Anonymous - 2014-12-12

    Originally posted by: MEXAHIK3...@gmail.com

    Геннадий Павлович, а как правильно в конструкторе задать аргументы customfields, через запятую писать Set<UserCustomField>, или usercustomfields, а потом в самом конструкторе this.usercustomfields = usercustomfields?

     
  • Anonymous

    Anonymous - 2014-12-12

    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;
        }

    Тест метода проходит.

    Я изменения в классах не сохранил, сделайте Вы их.

     
  • Anonymous

    Anonymous - 2014-12-12

    Originally posted by: kolgen...@gmail.com

    В будущем нужно будет выяснить, что собой представляет массив JSON-объектов warnings, возвращаемый сайтом и как-то его обработать. Кроме того, когда будем создавать пользователя через Веб-сервис, нужно будет создать одного "по-полной" - с заполнением всех полей, а затем его получить, чтобы увидеть не появятся ли ещё опциональные данные в JSON-ответе
    Напишите это в комментарий
    //TODO
    в классе контроллера, чтобы не забыть. Это общепринятый способ. Впоследствии по
    //TODO можно будет искать все напоминания по проекту.

     
  • Anonymous

    Anonymous - 2014-12-17

    Originally posted by: MEXAHIK3...@gmail.com

    Геннадий Павлович, у меня чего то наша библиотека не отображается как проект, просто папка(не открывается в нетбинсе), можно ли как-то обновить его, или нужно заново скачать с code.google.com/p/moodle-javalib?

     
  • Anonymous

    Anonymous - 2014-12-17

    Originally posted by: kolgen...@gmail.com

    Нужно просто обновить проект: правой кнопкой по проекту Систему упр версиями Subversion - Обновить - Сохранить в HEAD

     
  • Anonymous

    Anonymous - 2014-12-17

    Originally posted by: MEXAHIK3...@gmail.com

    Нетбинс не видит библиотеку как проект, а видит как папку, и не открывает его.

     
  • Anonymous

    Anonymous - 2014-12-17

    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".

     
  • Anonymous

    Anonymous - 2014-12-21

    Originally posted by: MEXAHIK3...@gmail.com

    сделал то что вы написали в 12 комментарии, только пока не трогал массив "warnings", тест проходит, что делать дальше?

     
  • Anonymous

    Anonymous - 2014-12-21

    Originally posted by: kolgen...@gmail.com

    ОК. Теперь напишите и заставьте работать в классе MoodleUserWSTest методы testCreateUsers, testUpdateUsers, testDeleteUsers. При этом используйте стратегию, как в классе MoodleCategoryWSTest, когда для изменяющих данные методы сначала в тесте создаётся объект, затем проводится тест, а затем объект удаляется.
    После отладки универсальных методов, нужно добавить в MoodleUserWS вспомогательные методы: получающие пользователя по логину, по полному имени, создающий одного пользователя, удаляющий одного пользователя, обновляющие данные одного пользователя. Такие методы сделать просто, т.к. они используют универсальные. Ну и нужно написать тесты на все эти методы.

     
  • Anonymous

    Anonymous - 2015-01-04

    Originally posted by: MEXAHIK3...@gmail.com

    Здравствуйте, Геннадий Павлович вот проверял метод create user отладчиком, он возвращает поле usercustomfields, как правильно его добавить в конструктор в классе MoodleUser? Так же как и обычные переменные?(this.usercustomfields = usercustomfields;), и как потом в контролере? там же тип получается у него не строковый, а набор (Set<UserCustomField> usercustomfields). Не могу как-то с этим разобраться.

     
  • Anonymous

    Anonymous - 2015-01-04

    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, в нём используется заполнение коллекции-свойства.

     
  • Anonymous

    Anonymous - 2015-01-05

    Originally posted by: MEXAHIK3...@gmail.com

    добавил в контролер по пользователям usercustomfields, проверьте так или нет, если да то добавлю и userpreferences, Геннадий Павлович, мне тут числа 10 нужно уехать в Днепропетровск, вернусь где то в 20 числах, и потом буду делать дальше, хорошо?

     
  • Anonymous

    Anonymous - 2015-01-07

    Originally posted by: kolgen...@gmail.com

    Да, всё нормально, добавляйте аналогично и остальные поля-коллекции. Только также добавьте поля-коллекции и ко второму конструктору класса MoodleUser (с полным набором свойств). И напишите тест для метода Set<MoodleUser> createUsers(Set<MoodleUser> newUsers) с полным набором параметров, включая коллекции. Смотрите для примера метод testCreateCourses() класса MoodleCourseWSTest.
    Да, конечно, поезжайте, отдыхайте. К сожалению, оценка нашего проекта на конкурсе невысокая 54.65%, но и ответственность теперь меньшая, будем развивать проект для Ваших дипломных работ и для нашего общего самообразования.
    С праздниками Вас.

     
  • Anonymous

    Anonymous - 2015-01-07

    Originally posted by: MEXAHIK3...@gmail.com

    Значит будем делать для себя) Вас тоже с праздниками.

     
  • Anonymous

    Anonymous - 2015-01-24

    Originally posted by: MEXAHIK3...@gmail.com

    здравствуйте, я добавил в котроллер MoodleUserWS поле-коллекции UserPreference, теперь можно делать тест для метода "core_user_create_users"?

     
1 2 > >> (Page 1 of 2)

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.