Skip to content

Commit

Permalink
OU blog: Participation - fixed 'can grade' logic #3606
Browse files Browse the repository at this point in the history
  • Loading branch information
sammarshallou committed May 9, 2012
1 parent 6be5f99 commit 6b2ee62
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 46 deletions.
43 changes: 38 additions & 5 deletions locallib.php
Original file line number Diff line number Diff line change
Expand Up @@ -2868,16 +2868,48 @@ function oublog_can_view_participation($course, $oublog, $cm, $groupid=0) {
}

/**
* Returns multiople users participation to view in participation.php
* Checks if current user is allowed to grade the given blog.
* @param object $course Moodle course object
* @param object $oublog Row from oublog table
* @param object $cm Course-module object
* @param int $groupid Optional group id
* @return bool True if you can grade the blog
*/
function oublog_can_grade($course, $oublog, $cm, $groupid=0) {
global $USER;

// Cannot grade if blog has grading turned off
if (!$oublog->grade) {
return false;
}

// Cannot grade if you do not have the capability
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
if (!has_capability('mod/oublog:grade', $context)) {
return false;
}

// Grading is a 'write' activity so you can only do it for your own
// group unless you have accessallgroups
$groupmode = groups_get_activity_groupmode($cm, $course);
$ok = $groupmode == NOGROUPS ||
has_capability('moodle/site:accessallgroups', $context) ||
($groupid && groups_is_member($groupid, $USER->id));
return $ok;
}

/**
* Returns information about the participation of users in this blog.
*
* @param object $oublog current oublog object
* @param object $context current context
* @param int $groupid optional group id term
* @param object $cm course-module object
* @param object $course current course object
* @param string $sort optional string to sort users by fields
* @return array user participation
*/
function oublog_get_participation($oublog, $context, $groupid=0,
function oublog_get_participation($oublog, $context, $groupid=0, $cm,
$course, $sort='u.firstname,u.lastname') {
global $DB;

Expand Down Expand Up @@ -2933,7 +2965,7 @@ function oublog_get_participation($oublog, $context, $groupid=0,
if (!empty($users)) {
// is grading enabled and available for the current user
$gradinginfo = null;
if ($oublog->grade != 0 && has_capability('mod/oublog:grade', $context)) {
if (oublog_can_grade($course, $oublog, $cm, $groupid)) {
$gradinginfo = grade_get_grades($course->id, 'mod',
'oublog', $oublog->id, array_keys($users));
}
Expand Down Expand Up @@ -2963,10 +2995,11 @@ function oublog_get_participation($oublog, $context, $groupid=0,
* @param object $context current context
* @param int $userid required userid term for participation being viewed
* @param int $groupid optional group id term
* @param object $cm course-module object
* @param object $course current course object
* @return array user participation
*/
function oublog_get_user_participation($oublog, $context, $userid, $groupid=0, $course) {
function oublog_get_user_participation($oublog, $context, $userid, $groupid=0, $cm, $course) {
global $DB;

$groupcheck = $groupid ? 'AND groupid = :groupid' : '';
Expand Down Expand Up @@ -3006,7 +3039,7 @@ function oublog_get_user_participation($oublog, $context, $userid, $groupid=0, $
$participation->user = $user;
$participation->posts = $DB->get_records_sql($postssql, $params);
$participation->comments = $DB->get_records_sql($commentssql, $params);
if ($oublog->grade != 0 && has_capability('mod/oublog:grade', $context)) {
if (oublog_can_grade($course, $oublog, $cm, $groupid)) {
$gradinginfo = grade_get_grades($course->id, 'mod',
'oublog', $oublog->id, array($userid));
$participation->gradeobj = $gradinginfo->items[0]->grades[$userid];
Expand Down
2 changes: 1 addition & 1 deletion participation.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@

// all enrolled users for table pagination
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
$participation = oublog_get_participation($oublog, $context, $groupid, $course);
$participation = oublog_get_participation($oublog, $context, $groupid, $cm, $course);

$PAGE->navbar->add(get_string('userparticipation', 'oublog'));
$PAGE->set_title(format_string($oublog->name));
Expand Down
8 changes: 5 additions & 3 deletions participation_table.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,17 @@ class oublog_participation_table extends flexible_table {
public $groupid;
public $groupname;
public $extraheaders;
private $hasgrades;

public function __construct($cm, $course, $oublog, $groupid = 0,
$groupname) {
$groupname, $hasgrades) {

$this->cm = $cm;
$this->course = $course;
$this->oublog = $oublog;
$this->groupid = $groupid;
$this->groupname = $groupname;
$this->hasgrades = $hasgrades;
parent::__construct('mod-oublog-participation');
}

Expand Down Expand Up @@ -89,7 +91,7 @@ public function setup($download = '') {
unset($headers[0]);
}

if ($this->oublog->grade != 0) {
if ($this->hasgrades) {
$columns[] = 'grade';
$headers[] = get_string('grades');
}
Expand All @@ -105,7 +107,7 @@ public function setup($download = '') {

$this->set_attribute('cellspacing', '0');
$this->set_attribute('id', 'participation');
$this->set_attribute('class', 'participation');
$this->set_attribute('class', 'generaltable');
$this->set_attribute('width', '100%');
$this->set_attribute('align', 'center');
$this->sortable(false);
Expand Down
50 changes: 26 additions & 24 deletions renderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,9 @@ public function render_participation_list($cm, $course, $oublog, $groupid,
$filename .= '-'.format_string($groupname, true);
}

$hasgrades = !empty($participation) && isset(reset($participation)->gradeobj);
$table = new oublog_participation_table($cm, $course, $oublog,
$groupid, $groupname);
$groupid, $groupname, $hasgrades);
$table->setup($download);
$table->is_downloading($download, $filename, get_string('participation', 'oublog'));

Expand Down Expand Up @@ -350,7 +351,7 @@ public function render_participation_list($cm, $course, $oublog, $groupid,
}

// grades
if ($oublog->grade != 0) {
if (isset($user->gradeobj)) {
if (!$table->is_downloading()) {
$attributes = array('userid' => $user->id);
if (empty($user->gradeobj->grade)) {
Expand Down Expand Up @@ -556,7 +557,7 @@ public function render_user_participation_list($cm, $course, $oublog, $participa
echo $output;

// Grade
if ($oublog->grade != 0) {
if (isset($participation->gradeobj)) {
$this->render_user_grade($course, $cm, $oublog, $participation, $groupid);
}
} else {
Expand Down Expand Up @@ -615,27 +616,28 @@ public function render_user_participation_list($cm, $course, $oublog, $participa
public function render_user_grade($course, $cm, $oublog, $user, $groupid) {
global $CFG, $USER;

if (isset($user->gradeobj->grade)) {
if ($user->gradeobj->grade != -1) {
$user->grade = abs($user->gradeobj->grade);
}
$grademenu = make_grades_menu($oublog->grade);
$grademenu[-1] = get_string('nograde');

$formparams = array();
$formparams['id'] = $cm->id;
$formparams['user'] = $user->user->id;
$formparams['group'] = $groupid;
$formparams['sesskey'] = $USER->sesskey;
$formaction = new moodle_url('/mod/oublog/savegrades.php', $formparams);
$mform = new MoodleQuickForm('savegrade', 'post', $formaction,
'', array('class' => 'savegrade'));
$mform->addElement('header', 'usergrade', get_string('usergrade', 'oublog'));
$mform->addElement('select', 'grade', get_string('grade'), $grademenu);
$mform->setDefault('grade', $user->gradeobj->grade);
$mform->addElement('submit', 'savechanges', get_string('savechanges'));

$mform->display();
if (is_null($user->gradeobj->grade)) {
$user->gradeobj->grade = -1;
}
if ($user->gradeobj->grade != -1) {
$user->grade = abs($user->gradeobj->grade);
}
$grademenu = make_grades_menu($oublog->grade);
$grademenu[-1] = get_string('nograde');

$formparams = array();
$formparams['id'] = $cm->id;
$formparams['user'] = $user->user->id;
$formparams['group'] = $groupid;
$formparams['sesskey'] = $USER->sesskey;
$formaction = new moodle_url('/mod/oublog/savegrades.php', $formparams);
$mform = new MoodleQuickForm('savegrade', 'post', $formaction,
'', array('class' => 'savegrade'));
$mform->addElement('header', 'usergrade', get_string('usergrade', 'oublog'));
$mform->addElement('select', 'grade', get_string('grade'), $grademenu);
$mform->setDefault('grade', $user->gradeobj->grade);
$mform->addElement('submit', 'savechanges', get_string('savechanges'));

$mform->display();
}
}
6 changes: 3 additions & 3 deletions savegrades.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,17 +53,17 @@
}

// grading capability check
if ($oublog->grade == 0 || !has_capability('mod/oublog:grade', $context)) {
if (!oublog_can_grade($course, $oublog, $cm, $groupid)) {
print_error('nopermissiontoshow');
}

$mode = '';
if (!empty($_POST['menu'])) {
$gradeinfo = $_POST['menu'];
$oldgrades = oublog_get_participation($oublog, $context, $groupid, $course);
$oldgrades = oublog_get_participation($oublog, $context, $groupid, $cm, $course);
} else if ($userid && !empty($_POST['grade'])) {
$gradeinfo[$userid] = $_POST['grade'];
$user = oublog_get_user_participation($oublog, $context, $userid, $groupid, $course);
$user = oublog_get_user_participation($oublog, $context, $userid, $groupid, $cm, $course);
$oldgrades = array($userid => $user);
}

Expand Down
18 changes: 9 additions & 9 deletions simpletest/test_participation.php
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public function test_participation() {
);

// check initial oublog_get_participation call
$participation = oublog_get_participation($oublog, $context, 0, $course);
$participation = oublog_get_participation($oublog, $context, 0, $cm, $course);
$this->assertEqual(count($participation), 2);
foreach ($participation as $participant) {
// so far no posts or comments
Expand Down Expand Up @@ -182,7 +182,7 @@ public function test_participation() {
$this->assertIsA($commentidc2, 'integer');

// Test again with posts and comments
$participation = oublog_get_participation($oublog, $context, 0, $course);
$participation = oublog_get_participation($oublog, $context, 0, $cm, $course);
$this->assertEqual(count($participation), 2);
foreach ($participation as $participant) {
if ($participant->id == $users['userb']->id) {
Expand All @@ -202,7 +202,7 @@ public function test_participation() {
$comment->timedeleted = time();
$this->testdb->update_record('oublog_comments', $comment);
$userparticipation = oublog_get_user_participation($oublog, $context,
$users['userc']->id, 0, $course);
$users['userc']->id, 0, $cm, $course);
$this->assertEqual(count($userparticipation->comments), 1);

// setup some groups
Expand All @@ -229,7 +229,7 @@ public function test_participation() {

// test single group participation
$groupparticipation = oublog_get_participation($oublog, $context,
$group1->id, $course);
$group1->id, $cm, $course);
$this->assertEqual(count($groupparticipation), 1);
$member = array_shift($groupparticipation);
$this->assertEqual($member->id, $users['userb']->id);
Expand All @@ -239,7 +239,7 @@ public function test_participation() {
$postb1->groupid = $group1->id;
$this->testdb->update_record('oublog_posts', $postb1);
$groupparticipation = oublog_get_participation($oublog, $context,
$group1->id, $course);
$group1->id, $cm, $course);
$userbparticipation = array_shift($groupparticipation);
$this->assertEqual($userbparticipation->id, $users['userb']->id);
$this->assertEqual(count($userbparticipation), 1);
Expand All @@ -249,7 +249,7 @@ public function test_participation() {
// since one User B blog post was changed to a group post there should only be one post
// and one comment for B remaining as standalone participation
$userparticipation = oublog_get_user_participation($oublog, $context,
$users['userb']->id, 0, $course);
$users['userb']->id, 0, $cm, $course);
$this->assertEqual($userparticipation->user->id, $users['userb']->id);
$this->assertEqual(count($userparticipation->posts), 1);
$this->assertEqual(count($userparticipation->comments), 1);
Expand All @@ -271,16 +271,16 @@ public function test_participation() {
$oublog->instance = $oublog->id;
oublog_update_instance($oublog);
$groupparticipation = oublog_get_participation($oublog, $context,
$group1->id, $course);
$group1->id, $cm, $course);
$userbgradeobj = $groupparticipation[$users['userb']->id]->gradeobj;
$this->assertEqual(count($groupparticipation), 1);
$this->assertNotNull($userbgradeobj);

// update grades and check results
$newgrades = array($users['userb']->id => 5, $users['userc']->id => 10);
$oldgrades = oublog_get_participation($oublog, $context, $group1->id, $course);
$oldgrades = oublog_get_participation($oublog, $context, $group1->id, $cm, $course);
oublog_update_grades($newgrades, $oldgrades, $cm, $oublog, $course);
$allgrades = oublog_get_participation($oublog, $context, 0, $course);
$allgrades = oublog_get_participation($oublog, $context, 0, $cm, $course);
$this->assertEqual($allgrades[$users['userb']->id]->gradeobj->grade, 5);

// userc should NOT have been updated as not in the group
Expand Down
4 changes: 4 additions & 0 deletions styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,10 @@ div.oublog-individualselector {
margin: 0 0 2em;
}

#page-mod-oublog-participation table#participation {
margin-top: 1em;
}

#oublogbuttons form,
#oublogbuttons div {
display: inline;
Expand Down
2 changes: 1 addition & 1 deletion userparticipation.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@

// all enrolled users for table pagination
$coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
$participation = oublog_get_user_participation($oublog, $context, $userid, $groupid, $course);
$participation = oublog_get_user_participation($oublog, $context, $userid, $groupid, $cm, $course);

// add extra navigation link for users who can see all participation
$canviewall = oublog_can_view_participation($course, $oublog, $cm, $groupid);
Expand Down

0 comments on commit 6b2ee62

Please sign in to comment.