Skip to content

Commit

Permalink
various locking improvements and fixes, cron locktime support stilll …
Browse files Browse the repository at this point in the history
…missing
  • Loading branch information
skodak committed Aug 9, 2007
1 parent 1a5bcab commit fb0e357
Show file tree
Hide file tree
Showing 11 changed files with 294 additions and 188 deletions.
4 changes: 2 additions & 2 deletions grade/edit/tree/action.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
if ($type == 'grade' and empty($object->id)) {
$object->insert();
}
$object->set_locked(1);
$object->set_locked(1, true, true);
}
break;

Expand All @@ -74,7 +74,7 @@
if ($type == 'grade' and empty($object->id)) {
$object->insert();
}
$object->set_locked(0);
$object->set_locked(0, true, true);
}
break;
}
Expand Down
62 changes: 42 additions & 20 deletions grade/edit/tree/grade.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@
$grade->hiddenuntil = 0;
}

if ($grade_item->is_locked()) {
$grade->locked = 1;
}

$mform->set_data($grade);

} else {
Expand All @@ -109,14 +113,22 @@
$old_grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true); //might not exist yet

// fix no grade for scales
if ($grade_item->gradetype == GRADE_TYPE_SCALE and $data->finalgrade < 1) {
if (!isset($data->finalgrade)) {
$data->finalgrade = $old_grade_grade->finalgrade;

} else if ($grade_item->gradetype == GRADE_TYPE_SCALE and $data->finalgrade < 1) {
$data->finalgrade = NULL;
}

if (!isset($data->feedback)) {
$data->feedback = $old_grade_grade->feedback;
$data->feedbackformat = $old_grade_grade->feedbackformat;
}
// update final grade or feedback
$grade_item->update_final_grade($data->userid, $data->finalgrade, NULL, 'editgrade', $data->feedback, $data->feedbackformat);

$grade_grade = grade_grade::fetch(array('userid'=>$data->userid, 'itemid'=>$grade_item->id));
$grade_grade->grade_item =& $grade_item; // no db fetching

if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:hide', $context)) {
if (empty($data->hidden)) {
Expand All @@ -130,33 +142,43 @@
}
}

if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:override', $context)) {
// ignore overridden flag when changing final grade
if ($old_grade_grade->finalgrade == $grade_grade->finalgrade) {
if ($grade_grade->set_overridden($data->overridden) and empty($data->overridden)) {
$grade_item->force_regrading(); // force regrading only when clearing the flag
}
if (isset($data->locked) and !$grade_item->is_locked()) {
if (($old_grade_grade->locked or $old_grade_grade->locktime)
and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:unlock', $context))) {
//ignore data

} else if ((!$old_grade_grade->locked and !$old_grade_grade->locktime)
and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:lock', $context))) {
//ignore data

} else {
$grade_grade->set_locktime($data->locktime); //set_lock may reset locktime
$grade_grade->set_locked($data->locked, false, true);
}
}

if (has_capability('moodle/grade:manage', $context)) {
if ($grade_grade->set_excluded($data->excluded)) {
$grade_item->force_regrading();
if (isset($data->excluded) and has_capability('moodle/grade:manage', $context)) {
$grade_grade->set_excluded($data->excluded);
}

if (isset($data->overridden) and has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:override', $context)) {
// ignore overridden flag when changing final grade
if ($old_grade_grade->finalgrade == $grade_grade->finalgrade) {
$grade_grade->set_overridden($data->overridden);
}
}

if (($old_grade_grade->locked or $old_grade_grade->locktime)
and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:unlock', $context))) {
//ignore data
// detect cases when we need to do full regrading
if ($old_grade_grade->excluded != $grade_grade->excluded) {
$parent = $grade_item->get_parent_category();
$parent->force_regrading();

} else if ((!$old_grade_grade->locked and !$old_grade_grade->locktime)
and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:lock', $context))) {
//ignore data
} else if ($old_grade_grade->overridden != $grade_grade->overridden and empty($grade_grade->overridden)) { // only when unoverriding
$grade_item->force_regrading();

} else {
$grade_grade->set_locked($data->locked);
$grade_grade->set_locktime($data->locktime);
}
} else if ($old_grade_grade->locktime != $grade_grade->locktime) {
$grade_item->force_regrading();
}

redirect($returnurl);
}
Expand Down
37 changes: 25 additions & 12 deletions grade/edit/tree/grade_form.php
Original file line number Diff line number Diff line change
Expand Up @@ -135,20 +135,33 @@ function definition_after_data() {
}

$old_grade_grade = new grade_grade(array('itemid'=>$grade_item->id, 'userid'=>$userid));
if (empty($old_grade_grade->id)) {
$old_grade_grade->locked = $grade_item->locked;
$old_grade_grade->locktime = $grade_item->locktime;
}

if (($old_grade_grade->locked or $old_grade_grade->locktime)
and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:unlock', $context))) {
$mform->hardFreeze('locked');
$mform->hardFreeze('locktime');
if ($old_grade_grade->is_locked()) {
if ($grade_item->is_locked()) {
$mform->hardFreeze('locked');
$mform->hardFreeze('locktime');
}

$mform->hardFreeze('overridden');
$mform->hardFreeze('finalgrade');
$mform->hardFreeze('feedback');

} else {
if (empty($old_grade_grade->id)) {
$old_grade_grade->locked = $grade_item->locked;
$old_grade_grade->locktime = $grade_item->locktime;
}

} else if ((!$old_grade_grade->locked and !$old_grade_grade->locktime)
and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:lock', $context))) {
$mform->hardFreeze('locked');
$mform->hardFreeze('locktime');
if (($old_grade_grade->locked or $old_grade_grade->locktime)
and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:unlock', $context))) {
$mform->hardFreeze('locked');
$mform->hardFreeze('locktime');

} else if ((!$old_grade_grade->locked and !$old_grade_grade->locktime)
and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:lock', $context))) {
$mform->hardFreeze('locked');
$mform->hardFreeze('locktime');
}
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions grade/edit/tree/item.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
$item->hiddenuntil = 0;
}

$item->locked = !empty($item->locked);

// Get Item preferences
$item->pref_gradedisplaytype = grade_report::get_pref('gradedisplaytype', $id);
$item->pref_decimalpoints = grade_report::get_pref('decimalpoints', $id);
Expand All @@ -58,6 +60,11 @@
unset($data->hidden);
unset($data->hiddenuntil);

$locked = empty($data->locked) ? 0: $data->locked;
$locktime = empty($data->locktime) ? 0: $data->locktime;
unset($data->locked);
unset($data->locktime);

$grade_item = new grade_item(array('id'=>$id, 'courseid'=>$courseid));
grade_item::set_properties($grade_item, $data);

Expand All @@ -78,6 +85,9 @@
$grade_item->set_hidden(1);
}

$grade_item->set_locktime($locktime); // locktime first - it might be removed when unlocking
$grade_item->set_locked($locked, false, true);

// Handle user preferences
if (isset($data->pref_gradedisplaytype)) {
if (!grade_report::set_pref('gradedisplaytype', $data->pref_gradedisplaytype, $grade_item->id)) {
Expand Down
10 changes: 10 additions & 0 deletions grade/edit/tree/outcomeitem.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
$item->hiddenuntil = 0;
}

$item->locked = !empty($item->locked);

$item->calculation = grade_item::denormalize_formula($item->calculation, $course->id);

if ($item->itemtype == 'mod') {
Expand All @@ -63,6 +65,11 @@
unset($data->hidden);
unset($data->hiddenuntil);

$locked = empty($data->locked) ? 0: $data->locked;
$locktime = empty($data->locktime) ? 0: $data->locktime;
unset($data->locked);
unset($data->locktime);

$grade_item = new grade_item(array('id'=>$id, 'courseid'=>$courseid));
grade_item::set_properties($grade_item, $data);

Expand Down Expand Up @@ -130,6 +137,9 @@
$grade_item->set_hidden(1);
}

$grade_item->set_locktime($locktime); // locktime first - it might be removed when unlocking
$grade_item->set_locked($locked, false, true);

redirect($returnurl);
}

Expand Down
4 changes: 2 additions & 2 deletions grade/lib.php
Original file line number Diff line number Diff line change
Expand Up @@ -864,9 +864,9 @@ function get_locking_icon($element, $gpr) {
$icon = 'unlock';
$tooltip = '';

if ($element['object']->locktime > 1) { // Change the icon and add a tooltip showing the date
if ($element['type'] != 'category' and $element['object']->get_locktime() > 1) { // Change the icon and add a tooltip showing the date
$icon = 'locktime';
$tooltip = userdate($element['object']->locktime);
$tooltip = userdate($element['object']->get_locktime());
}

if (!has_capability('moodle/grade:manage', $this->context) and !has_capability('moodle/grade:unlock', $this->context)) {
Expand Down
2 changes: 1 addition & 1 deletion lang/en_utf8/grades.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@
$string['linkedactivityhelp'] = 'An optional activity this outcome item is linked to.';
$string['lock'] = 'Lock';
$string['locked'] = 'Locked';
$string['locktime'] = 'Locked until';
$string['locktime'] = 'Lock after';
$string['lowest'] = 'Lowest';
$string['lowgradeletter'] = 'Low';
$string['mapfrom'] = 'Map from';
Expand Down
30 changes: 17 additions & 13 deletions lib/grade/grade_category.php
Original file line number Diff line number Diff line change
Expand Up @@ -1009,29 +1009,33 @@ function is_locked() {
* Sets the grade_item's locked variable and updates the grade_item.
* Method named after grade_item::set_locked().
* @param int $locked 0, 1 or a timestamp int(10) after which date the item will be locked.
* @param boolean $cascade lock/unlock child objects too
* @param boolean $refresh refresh grades when unlocking
* @return boolean success if category locked (not all children mayb be locked though)
*/
function set_locked($lockedstate, $refresh=true) {
function set_locked($lockedstate, $cascade=false, $refresh=true) {
$this->load_grade_item();

$result = $this->grade_item->set_locked($lockedstate, true);
if ($children = grade_item::fetch_all(array('categoryid'=>$this->id))) {
foreach($children as $child) {
$child->set_locked($lockedstate, false);
if (empty($lockedstate) and $refresh) {
//refresh when unlocking
$child->refresh_grades();
$result = $this->grade_item->set_locked($lockedstate, $cascade, true);

if ($cascade) {
//process all children - items and categories
if ($children = grade_item::fetch_all(array('categoryid'=>$this->id))) {
foreach($children as $child) {
$child->set_locked($lockedstate, true, false);
if (empty($lockedstate) and $refresh) {
//refresh when unlocking
$child->refresh_grades();
}
}
}
}
if ($children = grade_category::fetch_all(array('parent'=>$this->id))) {
foreach($children as $child) {
$child->set_locked($lockedstate, true);
if ($children = grade_category::fetch_all(array('parent'=>$this->id))) {
foreach($children as $child) {
$child->set_locked($lockedstate, true, true);
}
}
}


return $result;
}

Expand Down
Loading

0 comments on commit fb0e357

Please sign in to comment.