Merge branch 'MDL-64018_master' of git://github.com/markn86/moodle

This commit is contained in:
Andrew Nicols 2018-11-22 11:03:58 +08:00
commit c746921e6e
11 changed files with 376 additions and 5 deletions

View File

@ -1075,8 +1075,18 @@ $functions = array(
'classname' => 'core_message_external',
'methodname' => 'get_contacts',
'classpath' => 'message/externallib.php',
'description' => '** DEPRECATED ** Please do not call this function any more.
Retrieve the contact list',
'type' => 'read',
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
),
'core_message_get_user_contacts' => array(
'classname' => 'core_message_external',
'methodname' => 'get_user_contacts',
'classpath' => 'message/externallib.php',
'description' => 'Retrieve the contact list',
'type' => 'read',
'ajax' => true,
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
),
'core_message_get_conversations' => array(

View File

@ -1 +1 @@
define(["jquery","core/notification","core/pubsub","core/templates","core_message/message_repository","core_message/message_drawer_events","core_message/message_drawer_lazy_load_list"],function(a,b,c,d,e,f,g){var h=100,i=0,j={BLOCK_ICON_CONTAINER:'[data-region="block-icon-container"]',CONTACT:'[data-region="contact"]',CONTENT_CONTAINER:'[data-region="contacts-content-container"]'},k={CONTACTS_LIST:"core_message/message_drawer_contacts_list"},l=function(a,b){return a.find('[data-contact-user-id="'+b+'"]')},m=function(c,e){var f=e.map(function(b){return a.extend(b,{id:b.userid})});return d.render(k.CONTACTS_LIST,{contacts:f}).then(function(a){return c.append(a),a})["catch"](b.exception)},n=function(a,c){return e.getContacts(c,h+1,i).then(function(a){return a.contacts}).then(function(b){return b.length>h?b.pop():g.setLoadedAll(a,!0),b}).then(function(a){return i+=h,a})["catch"](b.exception)},o=function(a,b){l(a,b).remove()},p=function(a,b){var c=l(a,b);c.length&&c.find(j.BLOCK_ICON_CONTAINER).removeClass("hidden")},q=function(a,b){var c=l(a,b);c.length&&c.find(j.BLOCK_ICON_CONTAINER).addClass("hidden")},r=function(a){c.subscribe(f.CONTACT_ADDED,function(b){var c=g.getContentContainer(a);m(c,[b]),g.hideEmptyMessage(a),g.showContent(a)}),c.subscribe(f.CONTACT_REMOVED,function(b){o(a,b);var c=a.find(j.CONTACT);c.length||(g.hideContent(a),g.showEmptyMessage(a))}),c.subscribe(f.CONTACT_BLOCKED,function(b){p(a,b)}),c.subscribe(f.CONTACT_UNBLOCKED,function(b){q(a,b)})},s=function(a){a.attr("data-contacts-init")||(r(a),a.attr("data-contacts-init",!0)),g.show(a,n,m)};return{show:s}});
define(["jquery","core/notification","core/pubsub","core/templates","core_message/message_repository","core_message/message_drawer_events","core_message/message_drawer_lazy_load_list"],function(a,b,c,d,e,f,g){var h=100,i=0,j={BLOCK_ICON_CONTAINER:'[data-region="block-icon-container"]',CONTACT:'[data-region="contact"]',CONTENT_CONTAINER:'[data-region="contacts-content-container"]'},k={CONTACTS_LIST:"core_message/message_drawer_contacts_list"},l=function(a,b){return a.find('[data-contact-user-id="'+b+'"]')},m=function(c,e){var f=e.map(function(b){return a.extend(b,{id:b.userid})});return d.render(k.CONTACTS_LIST,{contacts:f}).then(function(a){return c.append(a),a})["catch"](b.exception)},n=function(a,c){return e.getContacts(c,h+1,i).then(function(a){return a}).then(function(b){return b.length>h?b.pop():g.setLoadedAll(a,!0),b}).then(function(a){return i+=h,a})["catch"](b.exception)},o=function(a,b){l(a,b).remove()},p=function(a,b){var c=l(a,b);c.length&&c.find(j.BLOCK_ICON_CONTAINER).removeClass("hidden")},q=function(a,b){var c=l(a,b);c.length&&c.find(j.BLOCK_ICON_CONTAINER).addClass("hidden")},r=function(a){c.subscribe(f.CONTACT_ADDED,function(b){var c=g.getContentContainer(a);m(c,[b]),g.hideEmptyMessage(a),g.showContent(a)}),c.subscribe(f.CONTACT_REMOVED,function(b){o(a,b);var c=a.find(j.CONTACT);c.length||(g.hideContent(a),g.showEmptyMessage(a))}),c.subscribe(f.CONTACT_BLOCKED,function(b){p(a,b)}),c.subscribe(f.CONTACT_UNBLOCKED,function(b){q(a,b)})},s=function(a){a.attr("data-contacts-init")||(r(a),a.attr("data-contacts-init",!0)),g.show(a,n,m)};return{show:s}});

File diff suppressed because one or more lines are too long

View File

@ -94,7 +94,7 @@ function(
var load = function(listRoot, userId) {
return MessageRepository.getContacts(userId, (limit + 1), offset)
.then(function(result) {
return result.contacts;
return result;
})
.then(function(contacts) {
if (contacts.length > limit) {

View File

@ -132,7 +132,7 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat
}
var request = {
methodname: 'core_message_data_for_messagearea_contacts',
methodname: 'core_message_get_user_contacts',
args: args
};

View File

@ -1029,6 +1029,36 @@ class api {
return [];
}
/**
* Get the contacts for a given user.
*
* @param int $userid
* @param int $limitfrom
* @param int $limitnum
* @return array An array of contacts
*/
public static function get_user_contacts(int $userid, int $limitfrom = 0, int $limitnum = 0) {
global $DB;
$sql = "SELECT *
FROM {message_contacts} mc
WHERE mc.userid = ? OR mc.contactid = ?
ORDER BY timecreated DESC, id ASC";
if ($contacts = $DB->get_records_sql($sql, [$userid, $userid], $limitfrom, $limitnum)) {
$userids = [];
foreach ($contacts as $contact) {
if ($contact->userid == $userid) {
$userids[] = $contact->contactid;
} else {
$userids[] = $contact->userid;
}
}
return helper::get_member_info($userid, $userids);
}
return [];
}
/**
* Returns the contacts count.
*

View File

@ -2226,6 +2226,66 @@ class core_message_external extends external_api {
);
}
/**
* The user contacts return parameters.
*
* @return external_function_parameters
*/
public static function get_user_contacts_parameters() {
return new external_function_parameters(
array(
'userid' => new external_value(PARAM_INT, 'The id of the user who we retrieving the contacts for'),
'limitfrom' => new external_value(PARAM_INT, 'Limit from', VALUE_DEFAULT, 0),
'limitnum' => new external_value(PARAM_INT, 'Limit number', VALUE_DEFAULT, 0)
)
);
}
/**
* Get user contacts.
*
* @param int $userid The id of the user who we are viewing conversations for
* @param int $limitfrom
* @param int $limitnum
* @return array
* @throws moodle_exception
*/
public static function get_user_contacts(int $userid, int $limitfrom = 0, int $limitnum = 0) {
global $CFG, $USER;
// Check if messaging is enabled.
if (empty($CFG->messaging)) {
throw new moodle_exception('disabled', 'message');
}
$systemcontext = context_system::instance();
$params = array(
'userid' => $userid,
'limitfrom' => $limitfrom,
'limitnum' => $limitnum
);
$params = self::validate_parameters(self::get_user_contacts_parameters(), $params);
self::validate_context($systemcontext);
if (($USER->id != $params['userid']) && !has_capability('moodle/site:readallmessages', $systemcontext)) {
throw new moodle_exception('You do not have permission to perform this action.');
}
return \core_message\api::get_user_contacts($params['userid'], $params['limitfrom'], $params['limitnum']);
}
/**
* The user contacts return structure.
*
* @return external_multiple_structure
*/
public static function get_user_contacts_returns() {
return new external_multiple_structure(
self::get_conversation_member_structure()
);
}
/**
* The get most recent message return parameters.
*
@ -2391,6 +2451,7 @@ class core_message_external extends external_api {
/**
* Get contacts parameters description.
*
* @deprecated since 3.6
* @return external_function_parameters
* @since Moodle 2.5
*/
@ -2401,6 +2462,7 @@ class core_message_external extends external_api {
/**
* Get contacts.
*
* @deprecated since 3.6
* @return external_description
* @since Moodle 2.5
*/
@ -2482,6 +2544,7 @@ class core_message_external extends external_api {
/**
* Get contacts return description.
*
* @deprecated since 3.6
* @return external_description
* @since Moodle 2.5
*/
@ -2528,6 +2591,15 @@ class core_message_external extends external_api {
);
}
/**
* Marking the method as deprecated.
*
* @return bool
*/
public static function get_contacts_is_deprecated() {
return true;
}
/**
* Search contacts parameters description.
*

View File

@ -2108,6 +2108,66 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertNull($contact3->unreadcount);
}
/**
* Tests retrieving user contacts.
*/
public function test_get_user_contacts() {
// Create some users.
$user1 = self::getDataGenerator()->create_user();
// Set as the user.
$this->setUser($user1);
$user2 = new stdClass();
$user2->firstname = 'User';
$user2->lastname = 'A';
$user2 = self::getDataGenerator()->create_user($user2);
$user3 = new stdClass();
$user3->firstname = 'User';
$user3->lastname = 'B';
$user3 = self::getDataGenerator()->create_user($user3);
$user4 = new stdClass();
$user4->firstname = 'User';
$user4->lastname = 'C';
$user4 = self::getDataGenerator()->create_user($user4);
$user5 = new stdClass();
$user5->firstname = 'User';
$user5->lastname = 'D';
$user5 = self::getDataGenerator()->create_user($user5);
// Add some users as contacts.
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Retrieve the contacts.
$contacts = \core_message\api::get_user_contacts($user1->id);
// Confirm the data is correct.
$this->assertEquals(3, count($contacts));
ksort($contacts);
$contact1 = array_shift($contacts);
$contact2 = array_shift($contacts);
$contact3 = array_shift($contacts);
$this->assertEquals($user2->id, $contact1->id);
$this->assertEquals(fullname($user2), $contact1->fullname);
$this->assertTrue($contact1->iscontact);
$this->assertEquals($user3->id, $contact2->id);
$this->assertEquals(fullname($user3), $contact2->fullname);
$this->assertTrue($contact2->iscontact);
$this->assertEquals($user4->id, $contact3->id);
$this->assertEquals(fullname($user4), $contact3->fullname);
$this->assertTrue($contact3->iscontact);
}
/**
* Tests retrieving messages.
*/

View File

@ -3191,6 +3191,193 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
core_message_external::data_for_messagearea_contacts($user->id);
}
/**
* Tests retrieving contacts.
*/
public function test_get_user_contacts() {
$this->resetAfterTest(true);
// Create some users.
$user1 = self::getDataGenerator()->create_user();
// Set as the user.
$this->setUser($user1);
$user2 = new stdClass();
$user2->firstname = 'User';
$user2->lastname = 'A';
$user2 = self::getDataGenerator()->create_user($user2);
$user3 = new stdClass();
$user3->firstname = 'User';
$user3->lastname = 'B';
$user3 = self::getDataGenerator()->create_user($user3);
$user4 = new stdClass();
$user4->firstname = 'User';
$user4->lastname = 'C';
$user4 = self::getDataGenerator()->create_user($user4);
$user5 = new stdClass();
$user5->firstname = 'User';
$user5->lastname = 'D';
$user5 = self::getDataGenerator()->create_user($user5);
// Add some users as contacts.
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Retrieve the contacts.
$result = core_message_external::get_user_contacts($user1->id);
// We need to execute the return values cleaning process to simulate the web service server.
$result = external_api::clean_returnvalue(core_message_external::get_user_contacts_returns(),
$result);
// Confirm the data is correct.
$contacts = $result;
usort($contacts, ['static', 'sort_contacts_id']);
$this->assertCount(3, $contacts);
$contact1 = array_shift($contacts);
$contact2 = array_shift($contacts);
$contact3 = array_shift($contacts);
$this->assertEquals($user2->id, $contact1['id']);
$this->assertEquals(fullname($user2), $contact1['fullname']);
$this->assertTrue($contact1['iscontact']);
$this->assertEquals($user3->id, $contact2['id']);
$this->assertEquals(fullname($user3), $contact2['fullname']);
$this->assertTrue($contact2['iscontact']);
$this->assertEquals($user4->id, $contact3['id']);
$this->assertEquals(fullname($user4), $contact3['fullname']);
$this->assertTrue($contact3['iscontact']);
}
/**
* Tests retrieving contacts as another user.
*/
public function test_get_user_contacts_as_other_user() {
$this->resetAfterTest(true);
$this->setAdminUser();
// Create some users.
$user1 = self::getDataGenerator()->create_user();
$user2 = new stdClass();
$user2->firstname = 'User';
$user2->lastname = 'A';
$user2 = self::getDataGenerator()->create_user($user2);
$user3 = new stdClass();
$user3->firstname = 'User';
$user3->lastname = 'B';
$user3 = self::getDataGenerator()->create_user($user3);
$user4 = new stdClass();
$user4->firstname = 'User';
$user4->lastname = 'C';
$user4 = self::getDataGenerator()->create_user($user4);
$user5 = new stdClass();
$user5->firstname = 'User';
$user5->lastname = 'D';
$user5 = self::getDataGenerator()->create_user($user5);
// Add some users as contacts.
\core_message\api::add_contact($user1->id, $user2->id);
\core_message\api::add_contact($user1->id, $user3->id);
\core_message\api::add_contact($user1->id, $user4->id);
// Retrieve the contacts.
$result = core_message_external::get_user_contacts($user1->id);
// We need to execute the return values cleaning process to simulate the web service server.
$result = external_api::clean_returnvalue(core_message_external::get_user_contacts_returns(),
$result);
// Confirm the data is correct.
$contacts = $result;
usort($contacts, ['static', 'sort_contacts_id']);
$this->assertCount(3, $contacts);
$contact1 = array_shift($contacts);
$contact2 = array_shift($contacts);
$contact3 = array_shift($contacts);
$this->assertEquals($user2->id, $contact1['id']);
$this->assertEquals(fullname($user2), $contact1['fullname']);
$this->assertTrue($contact1['iscontact']);
$this->assertEquals($user3->id, $contact2['id']);
$this->assertEquals(fullname($user3), $contact2['fullname']);
$this->assertTrue($contact2['iscontact']);
$this->assertEquals($user4->id, $contact3['id']);
$this->assertEquals(fullname($user4), $contact3['fullname']);
$this->assertTrue($contact3['iscontact']);
}
/**
* Tests retrieving contacts as another user without the proper capabilities.
*/
public function test_get_user_contacts_as_other_user_without_cap() {
$this->resetAfterTest(true);
// Create some users.
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
// The person retrieving the contacts for another user.
$this->setUser($user1);
// Perform the WS call and ensure an exception is thrown.
$this->expectException('moodle_exception');
core_message_external::get_user_contacts($user2->id);
}
/**
* Tests retrieving contacts with messaging disabled.
*/
public function test_get_user_contacts_messaging_disabled() {
global $CFG;
$this->resetAfterTest(true);
// Create some skeleton data just so we can call the WS.
$user = self::getDataGenerator()->create_user();
// The person retrieving the contacts.
$this->setUser($user);
// Disable messaging.
$CFG->messaging = 0;
// Perform the WS call and ensure we are shown that it is disabled.
$this->expectException('moodle_exception');
core_message_external::get_user_contacts($user->id);
}
/**
* Test getting contacts when there are no results.
*/
public function test_get_user_contacts_no_results() {
$this->resetAfterTest();
$user1 = self::getDataGenerator()->create_user();
$this->setUser($user1);
$requests = core_message_external::get_user_contacts($user1->id);
$requests = external_api::clean_returnvalue(core_message_external::get_user_contacts_returns(), $requests);
$this->assertEmpty($requests);
}
/**
* Tests retrieving messages.
*/
@ -4564,6 +4751,17 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
return $a['userid'] > $b['userid'];
}
/**
* Comparison function for sorting contacts.
*
* @param array $a
* @param array $b
* @return bool
*/
protected static function sort_contacts_id($a, $b) {
return $a['id'] > $b['id'];
}
/**
* Test verifying that conversations can be marked as favourite conversations.
*/

View File

@ -49,6 +49,7 @@ information provided here is intended especially for developers.
- core_message_external::data_for_messagearea_messages().
- core_message_external::data_for_messagearea_get_most_recent_message().
- core_message_external::data_for_messagearea_get_profile().
- core_message_external::get_contacts().
* The following function has been added for getting the privacy messaging preference:
- get_user_privacy_messaging_preference()

View File

@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
$version = 2018112000.01; // YYYYMMDD = weekly release date of this DEV branch.
$version = 2018112000.02; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.