MDL-23271 - missing completion on submit for feedback

This commit is contained in:
Andreas Grabs 2010-10-22 23:19:23 +00:00
parent db04866591
commit 8a41eb4fa8
8 changed files with 134 additions and 9 deletions

View File

@ -51,7 +51,8 @@ class backup_feedback_activity_structure_step extends backup_activity_structure_
'publish_stats',
'timeopen',
'timeclose',
'timemodified'));
'timemodified',
'completionsubmit'));
$completeds = new backup_nested_element('completeds');

View File

@ -237,6 +237,12 @@
$tracking->completed = $new_completed_id;
$DB->insert_record('feedback_tracking', $tracking);
unset($SESSION->feedback->is_started);
// Update completion state
$completion = new completion_info($course);
if ($completion->is_enabled($cm) && $feedback->completionsubmit) {
$completion->update_state($cm, COMPLETION_COMPLETE);
}
}else {
$savereturn = 'failed';
@ -320,10 +326,6 @@
}
}
// Mark activity viewed for completion-tracking
$completion=new completion_info($course);
$completion->set_module_viewed($cm);
if($feedback->site_after_submit) {
echo $OUTPUT->continue_button(feedback_encode_target_url($feedback->site_after_submit));
}else {
@ -500,5 +502,9 @@
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Mark activity viewed for completion-tracking
$completion=new completion_info($course);
$completion->set_module_viewed($cm);
echo $OUTPUT->footer();

View File

@ -21,7 +21,8 @@
<FIELD NAME="publish_stats" TYPE="int" LENGTH="1" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="page_after_submitformat" NEXT="timeopen"/>
<FIELD NAME="timeopen" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="publish_stats" NEXT="timeclose"/>
<FIELD NAME="timeclose" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="timeopen" NEXT="timemodified"/>
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="timeclose"/>
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="timeclose" NEXT="completionsubmit"/>
<FIELD NAME="completionsubmit" TYPE="int" LENGTH="1" NOTNULL="true" UNSIGNED="false" DEFAULT="0" SEQUENCE="false" COMMENT="If this field is set to 1, then the activity will be automatically marked as 'complete' once the user submits their choice." PREVIOUS="timemodified"/>
</FIELDS>
<KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id" COMMENT="Primary key for feedback"/>

View File

@ -289,6 +289,21 @@ function xmldb_feedback_upgrade($oldversion) {
upgrade_mod_savepoint(true, 2010051601, 'feedback');
}
if ($oldversion < 2010102300) {
// Define field completionsubmit to be added to feedback
$table = new xmldb_table('feedback');
$field = new xmldb_field('completionsubmit', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'timemodified');
// Conditionally launch add field completionsubmit
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// feedback savepoint reached
upgrade_mod_savepoint(true, 2010102300, 'feedback');
}
return true;
}

View File

@ -48,6 +48,7 @@ $string['captchanotset'] = 'Captcha hasn\'t been set.';
$string['completed'] = 'completed';
$string['completed_feedbacks'] = 'Submitted answers';
$string['complete_the_form'] = 'Answer the questions...';
$string['completionsubmit'] = 'View as completed if the feedback is submitted';
$string['configallowfullanonymous'] = 'If this option is set yes so the feedback can be completed without any preceding logon. It only affects feedbacks on the homepage.';
$string['confirmdeleteentry'] = 'Are you sure you want to delete this entry?';
$string['confirmdeleteitem'] = 'Are you sure you want to delete this element?';

View File

@ -28,6 +28,8 @@
require_once($CFG->libdir.'/eventslib.php');
/** Include calendar/lib.php */
require_once($CFG->dirroot.'/calendar/lib.php');
/** Include completionlib.php */
require_once($CFG->libdir . '/completionlib.php');
define('FEEDBACK_ANONYMOUS_YES', 1);
@ -58,6 +60,7 @@ function feedback_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 false;
case FEATURE_GRADE_OUTCOMES: return false;
case FEATURE_BACKUP_MOODLE2: return true;
@ -419,6 +422,31 @@ function feedback_print_recent_mod_activity($activity, $courseid, $detail, $modn
return;
}
/**
* Obtains the automatic completion state for this feedback based on the condition
* in feedback 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 feedback_get_completion_state($course, $cm, $userid, $type) {
global $CFG, $DB;
// Get feedback details
$feedback = $DB->get_record('feedback', array('id'=>$cm->instance), '*', MUST_EXIST);
// If completion option is enabled, evaluate it and return true/false
if($feedback->completionsubmit) {
return $DB->record_exists('feedback_tracking', array('userid'=>$userid, 'feedback'=>$feedback->id));
} else {
// Completion option is not enabled so just return $type
return $type;
}
}
/**
* Print a detailed representation of what a user has done with
@ -1037,6 +1065,7 @@ function feedback_items_from_template($feedback, $templateid, $deleteold = false
//files in the template_item are in the context of the current course
//files in the feedback_item are in the feedback_context of the feedback
$c_context = get_context_instance(CONTEXT_COURSE, $feedback->course);
$course = $DB->get_record('course', array('id'=>$feedback->course));
$cm = get_coursemodule_from_instance('feedback', $feedback->id);
$f_context = get_context_instance(CONTEXT_MODULE, $cm->id);
@ -1050,7 +1079,17 @@ function feedback_items_from_template($feedback, $templateid, $deleteold = false
}
//delete tracking-data
$DB->delete_records('feedback_tracking', array('feedback'=>$feedback->id));
$DB->delete_records('feedback_completed', array('feedback'=>$feedback->id));
if($completeds = $DB->get_records('feedback_completed', array('feedback'=>$feedback->id))) {
$completion = new completion_info($course);
foreach($completeds as $completed) {
// Update completion state
if ($completion->is_enabled($cm) && $feedback->completionsubmit) {
$completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid);
}
$DB->delete_records('feedback_completed', array('id'=>$completed->id));
}
}
$DB->delete_records('feedback_completedtmp', array('feedback'=>$feedback->id));
}
$positionoffset = 0;
@ -1331,14 +1370,38 @@ function feedback_delete_item($itemid, $renumber = true){
function feedback_delete_all_items($feedbackid){
global $DB;
if(!$feedback = $DB->get_record('feedback', array('id'=>$feedbackid))) {
return false;
}
if (!$cm = get_coursemodule_from_instance('feedback', $feedback->id)) {
return false;
}
if(!$course = $DB->get_record('course', array('id'=>$feedback->course))) {
return false;
}
if(!$items = $DB->get_records('feedback_item', array('feedback'=>$feedbackid))) {
return;
}
foreach($items as $item) {
feedback_delete_item($item->id, false);
}
// $DB->delete_records('feedback_completed', array('feedback'=>$feedbackid));
if($completeds = $DB->get_records('feedback_completed', array('feedback'=>$feedback->id))) {
$completion = new completion_info($course);
foreach($completeds as $completed) {
// Update completion state
if ($completion->is_enabled($cm) && $feedback->completionsubmit) {
$completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid);
}
$DB->delete_records('feedback_completed', array('id'=>$completed->id));
}
}
$DB->delete_records('feedback_completedtmp', array('feedback'=>$feedbackid));
$DB->delete_records('feedback_completed', array('feedback'=>$feedbackid));
}
/**
@ -2275,6 +2338,19 @@ function feedback_delete_completed($completedid) {
if (!$completed = $DB->get_record('feedback_completed', array('id'=>$completedid))) {
return false;
}
if (!$feedback = $DB->get_record('feedback', array('id'=>$completed->feedback))) {
return false;
}
if (!$course = $DB->get_record('course', array('id'=>$feedback->course))) {
return false;
}
if (!$cm = get_coursemodule_from_instance('feedback', $feedback->id)) {
return false;
}
//first we delete all related values
$DB->delete_records('feedback_value', array('completed'=>$completed->id));
@ -2283,6 +2359,11 @@ function feedback_delete_completed($completedid) {
$DB->delete_records('feedback_tracking', array('completed'=>$completed->id));
}
// Update completion state
$completion = new completion_info($course);
if ($completion->is_enabled($cm) && $feedback->completionsubmit) {
$completion->update_state($cm, COMPLETION_INCOMPLETE, $completed->userid);
}
//last we delete the completed-record
return $DB->delete_records('feedback_completed', array('id'=>$completed->id));
}

View File

@ -119,7 +119,17 @@ class mod_feedback_mod_form extends moodleform_mod {
if ($data) {
$data->page_after_submitformat = $data->page_after_submit['format'];
$data->page_after_submit = $data->page_after_submit['text'];
// Turn off completion settings if the checkboxes aren't ticked
$autocompletion = !empty($data->completion) && $data->completion==COMPLETION_TRACKING_AUTOMATIC;
if(empty($data->completion) || !$autocompletion) {
$data->completionsubmit=0;
}
if(empty($data->completionsubmit)) {
$data->completionsubmit=0;
}
}
return $data;
}
@ -128,4 +138,14 @@ class mod_feedback_mod_form extends moodleform_mod {
return $errors;
}
function add_completion_rules() {
$mform =& $this->_form;
$mform->addElement('checkbox', 'completionsubmit', '', get_string('completionsubmit', 'feedback'));
return array('completionsubmit');
}
function completion_rule_enabled($data) {
return !empty($data['completionsubmit']);
}
}

View File

@ -9,7 +9,7 @@
*/
$module->version = 2010080300; // The current module version (Date: YYYYMMDDXX)
$module->version = 2010102300; // The current module version (Date: YYYYMMDDXX)
$module->requires = 2010080300; // Requires this Moodle version
$feedback_version_intern = 1; //this version is used for restore older backups
$module->cron = 0; // Period for cron to check this module (secs)