From 2e7bd6c2864600865655ecc7446b2c1d76047937 Mon Sep 17 00:00:00 2001 From: David Mudrak Date: Tue, 17 Aug 2010 13:31:53 +0000 Subject: [PATCH] MDL-23709 Added more checks to prevent multiply submissions per user --- mod/workshop/exsubmission.php | 21 ++++++++++++++++----- mod/workshop/lang/en/workshop.php | 1 + mod/workshop/styles.css | 7 +++++-- mod/workshop/submission.php | 21 ++++++++++++++++----- mod/workshop/submission_form.php | 23 +++++++++++++++++++++++ 5 files changed, 61 insertions(+), 12 deletions(-) diff --git a/mod/workshop/exsubmission.php b/mod/workshop/exsubmission.php index 79381b865c7..a972eab6e48 100644 --- a/mod/workshop/exsubmission.php +++ b/mod/workshop/exsubmission.php @@ -53,6 +53,7 @@ if ($id) { // example is specified $example = new stdclass(); $example->id = null; $example->authorid = $USER->id; + $example->example = 1; } $canmanage = has_capability('mod/workshop:manageexamples', $workshop->context); @@ -113,8 +114,14 @@ if ($edit and $canmanage) { redirect($workshop->view_url()); } elseif ($canmanage and $formdata = $mform->get_data()) { + if ($formdata->example == 1) { + // this was used just for validation, it must be set to one when dealing with example submissions + unset($formdata->example); + } else { + throw new coding_exception('Invalid submission form data value: example'); + } $timenow = time(); - if (empty($formdata->id)) { + if (is_null($example->id)) { $formdata->workshopid = $workshop->id; $formdata->example = 1; $formdata->authorid = $USER->id; @@ -126,15 +133,19 @@ if ($edit and $canmanage) { $formdata->content = ''; // updated later $formdata->contentformat = FORMAT_HTML; // updated later $formdata->contenttrust = 0; // updated later - if (empty($formdata->id)) { - $formdata->id = $DB->insert_record('workshop_submissions', $formdata); + if (is_null($example->id)) { + $example->id = $formdata->id = $DB->insert_record('workshop_submissions', $formdata); // todo add to log + } else { + if (empty($formdata->id) or empty($example->id) or ($formdata->id != $example->id)) { + throw new moodle_exception('err_examplesubmissionid', 'workshop'); + } } // save and relink embedded images and save attachments $formdata = file_postupdate_standard_editor($formdata, 'content', $contentopts, $workshop->context, - 'mod_workshop', 'submission_content', $formdata->id); + 'mod_workshop', 'submission_content', $example->id); $formdata = file_postupdate_standard_filemanager($formdata, 'attachment', $attachmentopts, $workshop->context, - 'mod_workshop', 'submission_attachment', $formdata->id); + 'mod_workshop', 'submission_attachment', $example->id); if (empty($formdata->attachment)) { // explicit cast to zero integer $formdata->attachment = 0; diff --git a/mod/workshop/lang/en/workshop.php b/mod/workshop/lang/en/workshop.php index 8e1cabefba5..b1ab813400d 100644 --- a/mod/workshop/lang/en/workshop.php +++ b/mod/workshop/lang/en/workshop.php @@ -87,6 +87,7 @@ $string['editassessmentformstrategy'] = 'Edit assessment form ({$a})'; $string['editingassessmentform'] = 'Editing assessment form'; $string['editingsubmission'] = 'Editing submission'; $string['editsubmission'] = 'Edit submission'; +$string['err_multiplesubmissions'] = 'While editing this form, another version of the submission has been saved. Multiple submissions per user are not allowed.'; $string['err_removegrademappings'] = 'Unable to remove the unused grade mappings'; $string['evaluategradeswait'] = 'Please wait until the assessments are evaluated and the grades are calculated'; $string['evaluation'] = 'Grading evaluation'; diff --git a/mod/workshop/styles.css b/mod/workshop/styles.css index d9caa1b5842..e264d086c22 100644 --- a/mod/workshop/styles.css +++ b/mod/workshop/styles.css @@ -298,11 +298,14 @@ /** * Assessment */ -.path-mod-workshop .assessment-summary.graded, -.path-mod-workshop .example-summary.graded { +.path-mod-workshop .assessment-summary.graded { background-color: #e7f1c3; } +.path-mod-workshop .example-summary.notgraded { + background-color: #ffd3d9; +} + .path-mod-workshop .assessmentform .description { margin: 0px 1em; } diff --git a/mod/workshop/submission.php b/mod/workshop/submission.php index d3c4ad67987..517f1a15e45 100644 --- a/mod/workshop/submission.php +++ b/mod/workshop/submission.php @@ -51,6 +51,7 @@ if ($id) { // submission is specified $submission = new stdclass(); $submission->id = null; $submission->authorid = $USER->id; + $submission->example = 0; $submission->grade = null; $submission->gradeover = null; $submission->published = null; @@ -122,8 +123,14 @@ if ($edit) { redirect($workshop->view_url()); } elseif ($cansubmit and $formdata = $mform->get_data()) { + if ($formdata->example == 0) { + // this was used just for validation, it must be set to zero when dealing with normal submissions + unset($formdata->example); + } else { + throw new coding_exception('Invalid submission form data value: example'); + } $timenow = time(); - if (empty($formdata->id)) { + if (is_null($submission->id)) { $formdata->workshopid = $workshop->id; $formdata->example = 0; $formdata->authorid = $USER->id; @@ -142,15 +149,19 @@ if ($edit) { if ($workshop->phase == workshop::PHASE_ASSESSMENT) { $formdata->late = $formdata->late | 0x2; } - if (empty($formdata->id)) { - $formdata->id = $DB->insert_record('workshop_submissions', $formdata); + if (is_null($submission->id)) { + $submission->id = $formdata->id = $DB->insert_record('workshop_submissions', $formdata); // todo add to log + } else { + if (empty($formdata->id) or empty($submission->id) or ($formdata->id != $submission->id)) { + throw new moodle_exception('err_submissionid', 'workshop'); + } } // save and relink embedded images and save attachments $formdata = file_postupdate_standard_editor($formdata, 'content', $contentopts, $workshop->context, - 'mod_workshop', 'submission_content', $formdata->id); + 'mod_workshop', 'submission_content', $submission->id); $formdata = file_postupdate_standard_filemanager($formdata, 'attachment', $attachmentopts, $workshop->context, - 'mod_workshop', 'submission_attachment', $formdata->id); + 'mod_workshop', 'submission_attachment', $submission->id); if (empty($formdata->attachment)) { // explicit cast to zero integer $formdata->attachment = 0; diff --git a/mod/workshop/submission_form.php b/mod/workshop/submission_form.php index 27703f6bcaf..367d484631c 100644 --- a/mod/workshop/submission_form.php +++ b/mod/workshop/submission_form.php @@ -53,8 +53,16 @@ class workshop_submission_form extends moodleform { } $mform->addElement('hidden', 'id', $current->id); + $mform->setType('id', PARAM_INT); + $mform->addElement('hidden', 'cmid', $workshop->cm->id); + $mform->setType('cmid', PARAM_INT); + $mform->addElement('hidden', 'edit', 1); + $mform->setType('edit', PARAM_INT); + + $mform->addElement('hidden', 'example', 0); + $mform->setType('hidden', PARAM_INT); $this->add_action_buttons(); @@ -65,6 +73,21 @@ class workshop_submission_form extends moodleform { global $CFG, $USER, $DB; $errors = parent::validation($data, $files); + + if (empty($data['id']) and empty($data['example'])) { + // make sure there is no submission saved meanwhile from another browser window + $sql = "SELECT COUNT (s.id) + FROM {workshop_submissions} s + JOIN {workshop} w ON (s.workshopid = w.id) + JOIN {course_modules} cm ON (w.id = cm.instance) + JOIN {modules} m ON (m.name = 'workshop' AND m.id = cm.module) + WHERE cm.id = ? AND s.authorid = ? AND s.example = 0"; + + if ($DB->count_records_sql($sql, array($data['cmid'], $USER->id))) { + $errors['title'] = get_string('err_multiplesubmissions', 'mod_workshop'); + } + } + return $errors; } }