From 79ed4d8475c79e8eefce33d114d4e27c6932efce Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Thu, 16 Aug 2012 11:34:33 +0800 Subject: [PATCH] MDL-31341: Add custom completion rule to assignment: 'submit' --- .../backup/moodle2/backup_assign_stepslib.php | 3 ++- mod/assign/db/install.xml | 3 ++- mod/assign/db/upgrade.php | 14 ++++++++++ mod/assign/lang/en/assign.php | 1 + mod/assign/lib.php | 27 +++++++++++++++++++ mod/assign/locallib.php | 22 ++++++++++++++- mod/assign/mod_form.php | 10 +++++++ mod/assign/version.php | 2 +- 8 files changed, 78 insertions(+), 4 deletions(-) diff --git a/mod/assign/backup/moodle2/backup_assign_stepslib.php b/mod/assign/backup/moodle2/backup_assign_stepslib.php index fa972085109..06a8fdc4d9b 100644 --- a/mod/assign/backup/moodle2/backup_assign_stepslib.php +++ b/mod/assign/backup/moodle2/backup_assign_stepslib.php @@ -55,7 +55,8 @@ class backup_assign_activity_structure_step extends backup_activity_structure_st 'duedate', 'allowsubmissionsfromdate', 'grade', - 'timemodified')); + 'timemodified', + 'completionsubmit')); $submissions = new backup_nested_element('submissions'); diff --git a/mod/assign/db/install.xml b/mod/assign/db/install.xml index c075dbd9bb5..213a62b6655 100644 --- a/mod/assign/db/install.xml +++ b/mod/assign/db/install.xml @@ -21,7 +21,8 @@ - + + diff --git a/mod/assign/db/upgrade.php b/mod/assign/db/upgrade.php index e12e781d81f..d3c6c4eb802 100644 --- a/mod/assign/db/upgrade.php +++ b/mod/assign/db/upgrade.php @@ -64,6 +64,20 @@ function xmldb_assign_upgrade($oldversion) { // Assign savepoint reached. upgrade_mod_savepoint(true, 2012071800, 'assign'); } + if ($oldversion < 2012081600) { + + // Define field sendlatenotifications to be added to assign + $table = new xmldb_table('assign'); + $field = new xmldb_field('completionsubmit', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, '0', 'timemodified'); + + // Conditionally launch add field sendlatenotifications + if (!$dbman->field_exists($table, $field)) { + $dbman->add_field($table, $field); + } + + // Assign savepoint reached. + upgrade_mod_savepoint(true, 2012081600, 'assign'); + } return true; } diff --git a/mod/assign/lang/en/assign.php b/mod/assign/lang/en/assign.php index 9ab4132b561..3b8a6f9417a 100644 --- a/mod/assign/lang/en/assign.php +++ b/mod/assign/lang/en/assign.php @@ -66,6 +66,7 @@ $string['batchoperationlock'] = 'lock submissions'; $string['batchoperationunlock'] = 'unlock submissions'; $string['batchoperationreverttodraft'] = 'revert submissions to draft'; $string['comment'] = 'Comment'; +$string['completionsubmit'] = 'Student must submit to this activity to complete it'; $string['conversionexception'] = 'Could not convert assignment. Exception was: {$a}.'; $string['configshowrecentsubmissions'] = 'Everyone can see notifications of submissions in recent activity reports.'; $string['confirmsubmission'] = 'Are you sure you want to submit your work for grading? You will not be able to make any more changes'; diff --git a/mod/assign/lib.php b/mod/assign/lib.php index f423fa3d733..c39c24f98e0 100644 --- a/mod/assign/lib.php +++ b/mod/assign/lib.php @@ -83,6 +83,7 @@ function assign_supports($feature) { case FEATURE_GROUPMEMBERSONLY: return true; case FEATURE_MOD_INTRO: return true; case FEATURE_COMPLETION_TRACKS_VIEWS: return true; + case FEATURE_COMPLETION_HAS_RULES: return true; case FEATURE_GRADE_HAS_GRADE: return true; case FEATURE_GRADE_OUTCOMES: return true; case FEATURE_BACKUP_MOODLE2: return true; @@ -936,3 +937,29 @@ function assign_user_outline($course, $user, $coursemodule, $assignment) { return $result; } + +/** + * Obtains the automatic completion state for this module based on any conditions + * in assign settings. + * + * @param object $course Course + * @param object $cm Course-module + * @param int $userid User ID + * @param bool $type Type of comparison (or/and; can be used as return value if no conditions) + * @return bool True if completed, false if not, $type if conditions not set. + */ +function assign_get_completion_state($course,$cm,$userid,$type) { + global $CFG,$DB; + require_once($CFG->dirroot . '/mod/assign/locallib.php'); + + $assign = new assign(null, $cm, $course); + + // If completion option is enabled, evaluate it and return true/false + if($assign->get_instance()->completionsubmit) { + $submission = $DB->get_record('assign_submission', array('assignment'=>$assign->get_instance()->id, 'userid'=>$userid), '*', IGNORE_MISSING); + return $submission && $submission->status == ASSIGN_SUBMISSION_STATUS_SUBMITTED; + } else { + // Completion option is not enabled so just return $type + return $type; + } +} diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 94d18719593..60a3f9251c1 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -417,6 +417,7 @@ class assign { $update->duedate = $formdata->duedate; $update->allowsubmissionsfromdate = $formdata->allowsubmissionsfromdate; $update->grade = $formdata->grade; + $update->completionsubmit = $formdata->completionsubmit; $returnid = $DB->insert_record('assign', $update); $this->instance = $DB->get_record('assign', array('id'=>$returnid), '*', MUST_EXIST); // cache the course record @@ -636,6 +637,7 @@ class assign { $update->duedate = $formdata->duedate; $update->allowsubmissionsfromdate = $formdata->allowsubmissionsfromdate; $update->grade = $formdata->grade; + $update->completionsubmit = $formdata->completionsubmit; $result = $DB->update_record('assign', $update); $this->instance = $DB->get_record('assign', array('id'=>$update->id), '*', MUST_EXIST); @@ -2561,6 +2563,11 @@ class assign { $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; $this->update_submission($submission); + $completion = new completion_info($this->get_course()); + if ($completion->is_enabled($this->get_course_module()) && $this->get_instance()->completionsubmit) { + $completion->update_state($this->get_course_module(), COMPLETION_COMPLETE, $USER->id); + } + if (isset($data->submissionstatement)) { $this->add_to_log('submission statement accepted', get_string('submissionstatementacceptedlog', 'mod_assign', fullname($USER))); } @@ -2838,6 +2845,15 @@ class assign { } $this->add_to_log('submit', $this->format_submission_for_log($submission)); + $complete = COMPLETION_INCOMPLETE; + if ($submission->status == ASSIGN_SUBMISSION_STATUS_SUBMITTED) { + $complete = COMPLETION_COMPLETE; + } + $completion = new completion_info($this->get_course()); + if ($completion->is_enabled($this->get_course_module()) && $this->get_instance()->completionsubmit) { + $completion->update_state($this->get_course_module(), $complete, $USER->id); + } + if (!$this->get_instance()->submissiondrafts) { $this->notify_student_submission_receipt($submission); $this->notify_graders($submission); @@ -3140,7 +3156,7 @@ class assign { * @return void */ private function process_revert_to_draft($userid = 0) { - global $USER, $DB; + global $DB; // Need grade permission require_capability('mod/assign:grade', $this->context); @@ -3163,6 +3179,10 @@ class assign { $user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST); + $completion = new completion_info($this->get_course()); + if ($completion->is_enabled($this->get_course_module()) && $this->get_instance()->completionsubmit) { + $completion->update_state($this->get_course_module(), COMPLETION_INCOMPLETE, $userid); + } $this->add_to_log('revert submission to draft', get_string('reverttodraftforstudent', 'assign', array('id'=>$user->id, 'fullname'=>fullname($user)))); } diff --git a/mod/assign/mod_form.php b/mod/assign/mod_form.php index 89d0159631c..14650757413 100644 --- a/mod/assign/mod_form.php +++ b/mod/assign/mod_form.php @@ -161,5 +161,15 @@ class mod_assign_mod_form extends moodleform_mod { $assignment->plugin_data_preprocessing($defaultvalues); } + function add_completion_rules() { + $mform =& $this->_form; + + $mform->addElement('checkbox', 'completionsubmit', '', get_string('completionsubmit', 'assign')); + return array('completionsubmit'); + } + + function completion_rule_enabled($data) { + return !empty($data['completionsubmit']); + } } diff --git a/mod/assign/version.php b/mod/assign/version.php index 99ef6478807..b9a29a3d16c 100644 --- a/mod/assign/version.php +++ b/mod/assign/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); $module->component = 'mod_assign'; // Full name of the plugin (used for diagnostics) -$module->version = 2012071800; // The current module version (Date: YYYYMMDDXX) +$module->version = 2012081600; // The current module version (Date: YYYYMMDDXX) $module->requires = 2012061700; // Requires this Moodle version $module->cron = 60;