From 3a1ea0c945eee5983576cfb1ef3389c5c39022e8 Mon Sep 17 00:00:00 2001
From: Matthew Hilton <matthewhilton@catalyst-au.net>
Date: Tue, 13 Feb 2024 12:59:05 +1000
Subject: [PATCH] MDL-80300 mod_quiz: Updated override edit form validation

---
 mod/quiz/classes/form/edit_override_form.php | 52 ++++++++------------
 1 file changed, 21 insertions(+), 31 deletions(-)

diff --git a/mod/quiz/classes/form/edit_override_form.php b/mod/quiz/classes/form/edit_override_form.php
index c227e5e0f40..d15d71cc54c 100644
--- a/mod/quiz/classes/form/edit_override_form.php
+++ b/mod/quiz/classes/form/edit_override_form.php
@@ -56,6 +56,9 @@ class edit_override_form extends moodleform {
     /** @var int userid, if provided. */
     protected $userid;
 
+    /** @var int overrideid, if provided. */
+    protected $overrideid;
+
     /**
      * Constructor.
      *
@@ -76,6 +79,7 @@ class edit_override_form extends moodleform {
         $this->groupmode = $groupmode;
         $this->groupid = empty($override->groupid) ? 0 : $override->groupid;
         $this->userid = empty($override->userid) ? 0 : $override->userid;
+        $this->overrideid = $override->id ?? 0;
 
         parent::__construct($submiturl);
     }
@@ -261,44 +265,30 @@ class edit_override_form extends moodleform {
         return $username;
     }
 
+    /**
+     * Validate the data from the form.
+     *
+     * @param  array $data form data
+     * @param  array $files form files
+     * @return array An array of error messages, where the key is is the mform element name and the value is the error.
+     */
     public function validation($data, $files): array {
         $errors = parent::validation($data, $files);
+        $data['id'] = $this->overrideid;
+        $data['quiz'] = $this->quiz->id;
 
-        $mform =& $this->_form;
-        $quiz = $this->quiz;
+        $manager = new \mod_quiz\local\override_manager($this->quiz, $this->context);
+        $errors = array_merge($errors, $manager->validate_data($data));
 
-        if ($mform->elementExists('userid')) {
-            if (empty($data['userid'])) {
-                $errors['userid'] = get_string('required');
+        // Any 'general' errors we merge with the group/user selector element.
+        if (!empty($errors['general'])) {
+            if ($this->groupmode) {
+                $errors['groupid'] = $errors['groupid'] ?? "" . $errors['general'];
+            } else {
+                $errors['userid'] = $errors['userid'] ?? "" . $errors['general'];
             }
         }
 
-        if ($mform->elementExists('groupid')) {
-            if (empty($data['groupid'])) {
-                $errors['groupid'] = get_string('required');
-            }
-        }
-
-        // Ensure that the dates make sense.
-        if (!empty($data['timeopen']) && !empty($data['timeclose'])) {
-            if ($data['timeclose'] < $data['timeopen'] ) {
-                $errors['timeclose'] = get_string('closebeforeopen', 'quiz');
-            }
-        }
-
-        // Ensure that at least one quiz setting was changed.
-        $changed = false;
-        $keys = ['timeopen', 'timeclose', 'timelimit', 'attempts', 'password'];
-        foreach ($keys as $key) {
-            if ($data[$key] != $quiz->{$key}) {
-                $changed = true;
-                break;
-            }
-        }
-        if (!$changed) {
-            $errors['timeopen'] = get_string('nooverridedata', 'quiz');
-        }
-
         return $errors;
     }
 }