MDL-56871 core_message: fix inconsistent online status between panels

This commit is contained in:
Mark Nelson
2016-11-23 16:32:46 +08:00
parent 0fbe41f4cd
commit cb8057531f
12 changed files with 86 additions and 48 deletions
+1 -1
View File
@@ -361,7 +361,7 @@ class api {
$data->city = '';
$data->country = '';
$data->email = '';
$data->isonline = false;
$data->isonline = null;
// Get the user picture data - messaging has always shown these to the user.
$userpicture = new \user_picture($user);
$userpicture->size = 1; // Size f1.
+24 -2
View File
@@ -178,8 +178,10 @@ class helper {
$data->messageid = $contact->messageid;
}
}
// Check if the user is online.
$data->isonline = self::is_online($userfields->lastaccess);
$data->isonline = null;
if (self::show_online_status($userfields)) {
$data->isonline = self::is_online($userfields->lastaccess);
}
$data->isblocked = isset($contact->blocked) ? (bool) $contact->blocked : false;
$data->isread = isset($contact->isread) ? (bool) $contact->isread : false;
$data->unreadcount = isset($contact->unreadcount) ? $contact->unreadcount : null;
@@ -187,6 +189,26 @@ class helper {
return $data;
}
/**
* Helper function for checking if we should show the user's online status.
*
* @param \stdClass $user
* @return boolean
*/
public static function show_online_status($user) {
global $CFG;
require_once($CFG->dirroot . '/user/lib.php');
if ($lastaccess = user_get_user_details($user, null, array('lastaccess'))) {
if (isset($lastaccess['lastaccess'])) {
return true;
}
}
return false;
}
/**
* Helper function for checking the time meets the 'online' condition.
*
@@ -140,6 +140,7 @@ class contact implements templatable, renderable {
} else {
$contact->lastmessage = null;
}
$contact->showonlinestatus = is_null($this->isonline) ? false : true;
$contact->isonline = $this->isonline;
$contact->isblocked = $this->isblocked;
$contact->isread = $this->isread;
+15 -10
View File
@@ -67,11 +67,13 @@ class messages implements templatable, renderable {
* @param array $messages
*/
public function __construct($currentuserid, $otheruserid, $messages) {
$ufields = get_all_user_name_fields(true) . ', lastaccess';
$ufields = 'id, ' . get_all_user_name_fields(true) . ', lastaccess';
$this->currentuserid = $currentuserid;
$this->otheruserid = $otheruserid;
$this->otheruser = \core_user::get_user($otheruserid, $ufields);
if ($otheruserid) {
$this->otheruserid = $otheruserid;
$this->otheruser = \core_user::get_user($otheruserid, $ufields, MUST_EXIST);
}
$this->messages = $messages;
}
@@ -81,14 +83,17 @@ class messages implements templatable, renderable {
$data = new \stdClass();
$data->iscurrentuser = $USER->id == $this->currentuserid;
$data->currentuserid = $this->currentuserid;
$data->otheruserid = $this->otheruserid;
$data->otheruserfullname = fullname($this->otheruser);
if (empty($this->otheruser)) {
$data->isonline = false;
} else {
$data->isonline = \core_message\helper::is_online($this->otheruser->lastaccess);
if ($this->otheruserid) {
$data->otheruserid = $this->otheruserid;
$data->otheruserfullname = fullname($this->otheruser);
}
$data->isonline = null;
if ($this->otheruserid) {
if (\core_message\helper::show_online_status($this->otheruser)) {
$data->isonline = \core_message\helper::is_online($this->otheruser->lastaccess);
}
}
$data->showonlinestatus = is_null($data->isonline) ? false : true;
$data->messages = array();
foreach ($this->messages as $message) {
@@ -110,6 +110,7 @@ class profile implements templatable, renderable {
$data = new \stdClass();
$data->userid = $this->userid;
$data->fullname = $this->fullname;
$data->showonlinestatus = is_null($this->isonline) ? false : true;
$data->isonline = $this->isonline;
$data->email = $this->email;
if (!empty($this->country)) {
+3
View File
@@ -489,6 +489,7 @@ class core_message_external extends external_api {
'sentfromcurrentuser' => new external_value(PARAM_BOOL, 'Was the last message sent from the current user?'),
'lastmessage' => new external_value(PARAM_NOTAGS, 'The user\'s last message'),
'messageid' => new external_value(PARAM_INT, 'The unique search message id', VALUE_DEFAULT, null),
'showonlinestatus' => new external_value(PARAM_BOOL, 'Show the user\'s online status?'),
'isonline' => new external_value(PARAM_BOOL, 'The user\'s online status'),
'isread' => new external_value(PARAM_BOOL, 'If the user has read the message'),
'isblocked' => new external_value(PARAM_BOOL, 'If the user has been blocked'),
@@ -993,6 +994,7 @@ class core_message_external extends external_api {
'currentuserid' => new external_value(PARAM_INT, 'The current user\'s id'),
'otheruserid' => new external_value(PARAM_INT, 'The other user\'s id'),
'otheruserfullname' => new external_value(PARAM_NOTAGS, 'The other user\'s fullname'),
'showonlinestatus' => new external_value(PARAM_BOOL, 'Show the user\'s online status?'),
'isonline' => new external_value(PARAM_BOOL, 'The user\'s online status'),
'messages' => new external_multiple_structure(
self::get_messagearea_message_structure()
@@ -1132,6 +1134,7 @@ class core_message_external extends external_api {
'fullname' => new external_value(PARAM_NOTAGS, 'The user\'s name'),
'profileimageurl' => new external_value(PARAM_URL, 'User picture URL'),
'profileimageurlsmall' => new external_value(PARAM_URL, 'Small user picture URL'),
'showonlinestatus' => new external_value(PARAM_BOOL, 'Show the user\'s online status?'),
'isonline' => new external_value(PARAM_BOOL, 'The user\'s online status'),
'isblocked' => new external_value(PARAM_BOOL, 'Is the user blocked?'),
'iscontact' => new external_value(PARAM_BOOL, 'Is the user a contact?')
@@ -23,9 +23,11 @@
<div class="information">
<div class="name">
{{fullname}}
<span {{^isonline}}class="hidden"{{/isonline}} data-region="contact-icon-online">
{{#pix}} t/go, core, {{#str}} online, message {{/str}} {{/pix}}
</span>
{{#showonlinestatus}}
<span {{^isonline}}class="hidden"{{/isonline}} data-region="contact-icon-online">
{{#pix}} t/go, core, {{#str}} online, message {{/str}} {{/pix}}
</span>
{{/showonlinestatus}}
<span {{^isblocked}}class="hidden"{{/isblocked}} data-region="contact-icon-blocked">
{{#pix}} t/block, core, {{#str}} contactblocked, message {{/str}} {{/pix}}
</span>
@@ -62,10 +62,12 @@
</span>
{{/isblocked}}
</div>
<div class="status {{#isonline}}online{{/isonline}}">
<span class="offline-text">{{#str}} offline, message {{/str}}</span>
<span class="online-text">{{#str}} online, message {{/str}}</span>
</div>
{{#showonlinestatus}}
<div class="status {{#isonline}}online{{/isonline}}">
<span class="offline-text">{{#str}} offline, message {{/str}}</span>
<span class="online-text">{{#str}} online, message {{/str}}</span>
</div>
{{/showonlinestatus}}
</div>
<div class="delete-instructions">
{{#str}} selectmessagestodelete, message {{/str}}
@@ -24,10 +24,12 @@
<img class="profile-picture" src="{{profileimageurl}}" alt="" />
<div class="name-container">
<div class="name">{{fullname}}</div>
<div class="status {{#isonline}}online{{/isonline}}">
<div class="online-text">{{#str}} online, message {{/str}}</div>
<div class="offline-text">{{#str}} offline, message {{/str}}</div>
</div>
{{#showonlinestatus}}
<div class="status {{#isonline}}online{{/isonline}}">
<div class="online-text">{{#str}} online, message {{/str}}</div>
<div class="offline-text">{{#str}} offline, message {{/str}}</div>
</div>
{{/showonlinestatus}}
</div>
<ul class="information">
{{#email}}<li><div class="name">{{#str}} email {{/str}}</div><div class="value">{{.}}</div></li>{{/email}}
+10 -10
View File
@@ -164,7 +164,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertFalse($user->ismessaging);
$this->assertNull($user->lastmessage);
$this->assertNull($user->messageid);
$this->assertTrue($user->isonline);
$this->assertNull($user->isonline);
$this->assertFalse($user->isread);
$this->assertTrue($user->isblocked);
$this->assertNull($user->unreadcount);
@@ -303,7 +303,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue($message1->ismessaging);
$this->assertEquals('Word.', $message1->lastmessage);
$this->assertNotEmpty($message1->messageid);
$this->assertFalse($message1->isonline);
$this->assertNull($message1->isonline);
$this->assertFalse($message1->isread);
$this->assertFalse($message1->isblocked);
$this->assertNull($message1->unreadcount);
@@ -314,7 +314,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue($message2->ismessaging);
$this->assertEquals('Yo!', $message2->lastmessage);
$this->assertNotEmpty($message2->messageid);
$this->assertFalse($message2->isonline);
$this->assertNull($message2->isonline);
$this->assertTrue($message2->isread);
$this->assertFalse($message2->isblocked);
$this->assertNull($message2->unreadcount);
@@ -364,7 +364,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue($message1->ismessaging);
$this->assertEquals('Dope.', $message1->lastmessage);
$this->assertNull($message1->messageid);
$this->assertFalse($message1->isonline);
$this->assertNull($message1->isonline);
$this->assertTrue($message1->isread);
$this->assertFalse($message1->isblocked);
$this->assertEquals(0, $message1->unreadcount);
@@ -374,7 +374,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue($message2->ismessaging);
$this->assertEquals('Cool.', $message2->lastmessage);
$this->assertNull($message2->messageid);
$this->assertFalse($message2->isonline);
$this->assertNull($message2->isonline);
$this->assertFalse($message2->isread);
$this->assertFalse($message2->isblocked);
$this->assertEquals(2, $message2->unreadcount);
@@ -384,7 +384,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertTrue($message3->ismessaging);
$this->assertEquals('Word.', $message3->lastmessage);
$this->assertNull($message3->messageid);
$this->assertFalse($message3->isonline);
$this->assertNull($message3->isonline);
$this->assertFalse($message3->isread);
$this->assertFalse($message3->isblocked);
$this->assertEquals(2, $message3->unreadcount);
@@ -440,7 +440,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertFalse($contact1->ismessaging);
$this->assertNull($contact1->lastmessage);
$this->assertNull($contact1->messageid);
$this->assertFalse($contact1->isonline);
$this->assertNull($contact1->isonline);
$this->assertFalse($contact1->isread);
$this->assertFalse($contact1->isblocked);
$this->assertNull($contact1->unreadcount);
@@ -450,7 +450,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertFalse($contact2->ismessaging);
$this->assertNull($contact2->lastmessage);
$this->assertNull($contact2->messageid);
$this->assertFalse($contact2->isonline);
$this->assertNull($contact2->isonline);
$this->assertFalse($contact2->isread);
$this->assertFalse($contact2->isblocked);
$this->assertNull($contact2->unreadcount);
@@ -460,7 +460,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertFalse($contact3->ismessaging);
$this->assertNull($contact3->lastmessage);
$this->assertNull($contact3->messageid);
$this->assertFalse($contact3->isonline);
$this->assertNull($contact3->isonline);
$this->assertFalse($contact3->isread);
$this->assertFalse($contact3->isblocked);
$this->assertNull($contact3->unreadcount);
@@ -566,7 +566,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertEmpty($profile->country);
$this->assertEmpty($profile->city);
$this->assertEquals(fullname($user2), $profile->fullname);
$this->assertFalse($profile->isonline);
$this->assertNull($profile->isonline);
$this->assertFalse($profile->isblocked);
$this->assertFalse($profile->iscontact);
}
+11 -11
View File
@@ -1030,7 +1030,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertFalse($user['sentfromcurrentuser']);
$this->assertNull($user['lastmessage']);
$this->assertNull($user['messageid']);
$this->assertTrue($user['isonline']);
$this->assertNull($user['isonline']);
$this->assertFalse($user['isread']);
$this->assertTrue($user['isblocked']);
$this->assertNull($user['unreadcount']);
@@ -1402,7 +1402,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertFalse($message1['sentfromcurrentuser']);
$this->assertEquals('Word.', $message1['lastmessage']);
$this->assertNotEmpty($message1['messageid']);
$this->assertFalse($message1['isonline']);
$this->assertNull($message1['isonline']);
$this->assertFalse($message1['isread']);
$this->assertFalse($message1['isblocked']);
$this->assertNull($message1['unreadcount']);
@@ -1413,7 +1413,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertTrue($message2['sentfromcurrentuser']);
$this->assertEquals('Yo!', $message2['lastmessage']);
$this->assertNotEmpty($message2['messageid']);
$this->assertFalse($message2['isonline']);
$this->assertNull($message2['isonline']);
$this->assertTrue($message2['isread']);
$this->assertFalse($message2['isblocked']);
$this->assertNull($message2['unreadcount']);
@@ -1567,7 +1567,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertTrue($message1['sentfromcurrentuser']);
$this->assertEquals('Dope.', $message1['lastmessage']);
$this->assertNull($message1['messageid']);
$this->assertFalse($message1['isonline']);
$this->assertNull($message1['isonline']);
$this->assertTrue($message1['isread']);
$this->assertFalse($message1['isblocked']);
$this->assertEquals(0, $message1['unreadcount']);
@@ -1577,7 +1577,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertFalse($message2['sentfromcurrentuser']);
$this->assertEquals('Cool.', $message2['lastmessage']);
$this->assertNull($message2['messageid']);
$this->assertFalse($message2['isonline']);
$this->assertNull($message2['isonline']);
$this->assertFalse($message2['isread']);
$this->assertFalse($message2['isblocked']);
$this->assertEquals(2, $message2['unreadcount']);
@@ -1587,7 +1587,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertFalse($message3['sentfromcurrentuser']);
$this->assertEquals('Word.', $message3['lastmessage']);
$this->assertNull($message3['messageid']);
$this->assertFalse($message3['isonline']);
$this->assertNull($message3['isonline']);
$this->assertFalse($message3['isread']);
$this->assertFalse($message3['isblocked']);
$this->assertEquals(2, $message3['unreadcount']);
@@ -1767,7 +1767,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertFalse($contact1['sentfromcurrentuser']);
$this->assertNull($contact1['lastmessage']);
$this->assertNull($contact1['messageid']);
$this->assertFalse($contact1['isonline']);
$this->assertNull($contact1['isonline']);
$this->assertFalse($contact1['isread']);
$this->assertFalse($contact1['isblocked']);
$this->assertNull($contact1['unreadcount']);
@@ -1777,7 +1777,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertFalse($contact2['sentfromcurrentuser']);
$this->assertNull($contact2['lastmessage']);
$this->assertNull($contact2['messageid']);
$this->assertFalse($contact2['isonline']);
$this->assertNull($contact2['isonline']);
$this->assertFalse($contact2['isread']);
$this->assertFalse($contact2['isblocked']);
$this->assertNull($contact2['unreadcount']);
@@ -1787,7 +1787,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertFalse($contact3['sentfromcurrentuser']);
$this->assertNull($contact3['lastmessage']);
$this->assertNull($contact3['messageid']);
$this->assertFalse($contact3['isonline']);
$this->assertNull($contact3['isonline']);
$this->assertFalse($contact3['isread']);
$this->assertFalse($contact3['isblocked']);
$this->assertNull($contact3['unreadcount']);
@@ -1947,7 +1947,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertEquals($user1->id, $result['currentuserid']);
$this->assertEquals($user2->id, $result['otheruserid']);
$this->assertEquals(fullname($user2), $result['otheruserfullname']);
$this->assertFalse($result['isonline']);
$this->assertNull($result['isonline']);
// Confirm the message data is correct.
$messages = $result['messages'];
@@ -2258,7 +2258,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->assertEmpty($result['country']);
$this->assertEmpty($result['city']);
$this->assertEquals(fullname($user2), $result['fullname']);
$this->assertFalse($result['isonline']);
$this->assertNull($result['isonline']);
$this->assertFalse($result['isblocked']);
$this->assertFalse($result['iscontact']);
}
+3 -3
View File
@@ -384,18 +384,18 @@ function user_get_user_details($user, $course = null, array $userfields = array(
$hiddenfields = array();
// Address, phone1 and phone2 not appears in hidden fields list but require viewhiddenfields capability
// according to user/profile.php.
if ($user->address && in_array('address', $userfields)) {
if (!empty($user->address) && in_array('address', $userfields)) {
$userdetails['address'] = $user->address;
}
} else {
$hiddenfields = array_flip(explode(',', $CFG->hiddenuserfields));
}
if ($user->phone1 && in_array('phone1', $userfields) &&
if (!empty($user->phone1) && in_array('phone1', $userfields) &&
(in_array('phone1', $showuseridentityfields) or $canviewhiddenuserfields)) {
$userdetails['phone1'] = $user->phone1;
}
if ($user->phone2 && in_array('phone2', $userfields) &&
if (!empty($user->phone2) && in_array('phone2', $userfields) &&
(in_array('phone2', $showuseridentityfields) or $canviewhiddenuserfields)) {
$userdetails['phone2'] = $user->phone2;
}