mirror of
https://github.com/moodle/moodle.git
synced 2025-04-22 17:02:03 +02:00
Merge branch 'MDL-64018_master' of git://github.com/markn86/moodle
This commit is contained in:
commit
c746921e6e
@ -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(
|
||||
|
@ -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}});
|
2
message/amd/build/message_repository.min.js
vendored
2
message/amd/build/message_repository.min.js
vendored
File diff suppressed because one or more lines are too long
@ -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) {
|
||||
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user