/** * deletes a completed given by completedid. * all related data such values or tracking data also will be deleted * * @global object * @param int $completedid * @return boolean */ function feedback_delete_completed($completedid) { global $DB, $CFG; require_once $CFG->libdir . '/completionlib.php'; 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)); //now we delete all tracking data $params = array('completed' => $completed->id, 'feedback' => $completed->feedback); if ($tracking = $DB->get_record('feedback_tracking', $params)) { $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)); // Trigger event for the delete action we performed. $event = \mod_feedback\event\response_deleted::create(array('relateduserid' => $completed->userid, 'objectid' => $completedid, 'courseid' => $course->id, 'context' => context_module::instance($cm->id), 'anonymous' => $completed->anonymous_response == FEEDBACK_ANONYMOUS_YES, 'other' => array('cmid' => $cm->id, 'instanceid' => $feedback->id, 'anonymous' => $completed->anonymous_response))); $event->add_record_snapshot('feedback_completed', $completed); $event->add_record_snapshot('course', $course); $event->add_record_snapshot('feedback', $feedback); $event->trigger(); return $return; }
/** * Tests for event validations related to feedback response deletion. */ public function test_response_deleted_event_exceptions() { $this->resetAfterTest(); $context = context_module::instance($this->eventcm->id); // Test not setting instanceid. try { \mod_feedback\event\response_deleted::create(array( 'context' => $context, 'objectid' => $this->eventfeedbackcompleted->id, 'other' => array('cmid' => $this->eventcm->id, 'anonymous' => 2) )); $this->assertEventContextNotUsed($event); $this->fail("Event validation should not allow \\mod_feedback\\event\\response_deleted to be triggered without other['instanceid']"); } catch (coding_exception $e) { $this->assertContains("Field other['instanceid'] cannot be empty", $e->getMessage()); } // Test not setting cmid. try { \mod_feedback\event\response_deleted::create(array( 'context' => $context, 'objectid' => $this->eventfeedbackcompleted->id, 'other' => array('instanceid' => $this->eventfeedback->id, 'anonymous' => 2) )); $this->fail("Event validation should not allow \\mod_feedback\\event\\response_deleted to be triggered without other['cmid']"); } catch (coding_exception $e) { $this->assertContains("Field other['cmid'] cannot be empty", $e->getMessage()); } // Test not setting anonymous. try { \mod_feedback\event\response_submitted::create(array( 'context' => $context, 'objectid' => $this->eventfeedbackcompleted->id, 'other' => array('cmid' => $this->eventcm->id, 'instanceid' => $this->eventfeedback->id) )); $this->fail("Event validation should not allow \\mod_feedback\\event\\response_deleted to be triggered without other['anonymous']"); } catch (coding_exception $e) { $this->assertContains("Field other['anonymous'] cannot be empty", $e->getMessage()); } }
/** * deletes a completed given by completedid. * all related data such values or tracking data also will be deleted * * @param int|stdClass $completed * @param stdClass $feedback * @param stdClass|cm_info $cm * @param stdClass $course * @return boolean */ function feedback_delete_completed($completed, $feedback = null, $cm = null, $course = null) { global $DB, $CFG; require_once $CFG->libdir . '/completionlib.php'; if (!isset($completed->id)) { if (!($completed = $DB->get_record('feedback_completed', array('id' => $completed)))) { return false; } } if (!$feedback && !($feedback = $DB->get_record('feedback', array('id' => $completed->feedback)))) { return false; } if (!$course && !($course = $DB->get_record('course', array('id' => $feedback->course)))) { return false; } if (!$cm && !($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)); // 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)); // Trigger event for the delete action we performed. $event = \mod_feedback\event\response_deleted::create_from_record($completed, $cm, $feedback); $event->trigger(); return $return; }