From 195d4b5d620f82620fde7ebd709b7cf167968257 Mon Sep 17 00:00:00 2001
From: Justus Dieckmann <justusdieckmann@wwu.de>
Date: Wed, 25 Sep 2019 20:04:16 +0200
Subject: [PATCH] Delays: Code cleanup, return cached data when
 mform->get_data() would return null, only delete delays for selected
 workflow/globally

---
 classes/form/form_delays_filter.php     | 36 +++++++++++++++-
 classes/table/delayed_courses_table.php | 57 +++++++++++++------------
 db/caches.php                           |  5 +--
 delayedcourses.php                      |  2 +-
 4 files changed, 67 insertions(+), 33 deletions(-)

diff --git a/classes/form/form_delays_filter.php b/classes/form/form_delays_filter.php
index 662cb5a..529d04c 100644
--- a/classes/form/form_delays_filter.php
+++ b/classes/form/form_delays_filter.php
@@ -23,6 +23,7 @@
  */
 namespace tool_lifecycle\form;
 
+use cache;
 use tool_lifecycle\action;
 use tool_lifecycle\entity\step_subplugin;
 use tool_lifecycle\entity\workflow;
@@ -43,6 +44,11 @@ require_once($CFG->libdir . '/formslib.php');
  */
 class form_delays_filter extends \moodleform {
 
+    /**
+     * @var $cache cache the cache to get stored data from;
+     */
+    private $cache;
+
     /**
      * Constructor
      *
@@ -82,8 +88,12 @@ class form_delays_filter extends \moodleform {
         $this->add_action_buttons(true, get_string('apply', 'tool_lifecycle'));
     }
 
+    /**
+     * This method is called after definition(), data submission and set_data().
+     * All form setup that is dependent on form values should go in here.
+     */
     public function definition_after_data() {
-        $cache = \cache::make('tool_lifecycle', 'mformdata');
+        $cache = $this->get_cache();
         if ($this->is_submitted() && $this->is_validated()) {
             if ($this->is_cancelled()) {
                 $cache->delete('delays_filter');
@@ -95,4 +105,28 @@ class form_delays_filter extends \moodleform {
         }
     }
 
+    /**
+     * Override get data to return cached data when nothing was submitted.
+     * @return object
+     */
+    public function get_data() {
+        $data = parent::get_data();
+        if ($data) {
+            return $data;
+        } else {
+            return $this->get_cache()->get('delays_filter');
+        }
+    }
+
+    /**
+     * @return cache the cache to get the cached mform data.
+     */
+    private function get_cache() {
+        if (!$this->cache) {
+            $this->cache = cache::make('tool_lifecycle', 'mformdata');
+        }
+        return $this->cache;
+    }
+
+
 }
diff --git a/classes/table/delayed_courses_table.php b/classes/table/delayed_courses_table.php
index d655883..cf467b4 100644
--- a/classes/table/delayed_courses_table.php
+++ b/classes/table/delayed_courses_table.php
@@ -36,15 +36,16 @@ require_once($CFG->libdir . '/tablelib.php');
  */
 class delayed_courses_table extends \table_sql {
 
-    /** @var $filterdata object|null data from mform */
-    private $filterdata;
+    /** @var $workflow null|int|string workflow to filter for. Might be workflowid or "global" to filter for global delays. */
+    private $workflow;
 
     /**
      * Constructor for delayed_courses_table.
+     *
+     * @param $filterdata object|null filterdata from moodle form.
      */
     public function __construct($filterdata) {
         parent::__construct('tool_lifecycle-delayed-courses');
-        $this->filterdata = $filterdata;
 
         $fields = 'c.id as courseid, c.fullname as coursefullname, cat.name as category, ';
 
@@ -54,16 +55,16 @@ class delayed_courses_table extends \table_sql {
         if ($filterdata && $filterdata->workflow) {
             if ($filterdata->workflow == 'global') {
                 $selectseperatedelays = false;
+                $this->workflow = 'global';
             } else if (is_number($filterdata->workflow)) {
                 $selectglobaldelays = false;
                 $workflowfilterid = $filterdata->workflow;
+                $this->workflow = $filterdata->workflow;
             } else {
-                throw new \coding_exception('action has to be "global" or a int value');
+                throw new \coding_exception('workflow has to be "global" or a int value');
             }
         }
 
-
-
         if ($selectseperatedelays) {
             $fields .= 'dw.workflowid, w.title as workflow, dw.delayeduntil AS workflowdelay, maxtable.wfcount AS workflowcount, ';
         } else {
@@ -102,8 +103,13 @@ class delayed_courses_table extends \table_sql {
                     'JOIN {tool_lifecycle_workflow} w ON dw.workflowid = w.id ';
 
             if ($selectglobaldelays) {
-                $from .= 'FULL JOIN {tool_lifecycle_delayed} d ON dw.courseid = d.courseid ' .
+                $from .= 'FULL JOIN (' .
+                        'SELECT * FROM {tool_lifecycle_delayed} d ' .
+                        'WHERE d.delayeduntil > :time2 ' .
+                        ') d ON dw.courseid = d.courseid ' .
                         'JOIN {course} c ON c.id = COALESCE(dw.courseid, d.courseid) ';
+
+                $params['time2'] = time();
             } else {
                 $from .= 'JOIN {course} c ON c.id = dw.courseid ';
             }
@@ -129,11 +135,9 @@ class delayed_courses_table extends \table_sql {
      *
      * @param $row
      * @return string
-     * @throws \coding_exception
-     * @throws \dml_exception
      */
     public function col_workflow($row) {
-        if($row->globaldelay >= time()) {
+        if ($row->globaldelay >= time()) {
             if ($row->workflowcount == 1) {
                 $text = get_string('delayed_globally_and_seperately_for_one', 'tool_lifecycle');
             } else if ($row->workflowcount > 1) {
@@ -146,7 +150,7 @@ class delayed_courses_table extends \table_sql {
         } else {
             if ($row->workflowcount <= 0) {
                 $text = '';
-            } else if($row->workflowcount == 1) {
+            } else if ($row->workflowcount == 1) {
                 $dateformat = get_string('strftimedatetimeshort', 'core_langconfig');
                 $date = userdate($row->workflowdelay, $dateformat);
                 $text = get_string('delayed_for_workflow_until', 'tool_lifecycle',
@@ -166,25 +170,20 @@ class delayed_courses_table extends \table_sql {
      *
      * @param $row
      * @return string
-     * @throws \coding_exception
-     * @throws \dml_exception
      */
     private function get_mouseover($row) {
         global $DB;
         $text = '';
         $dateformat = get_string('strftimedatetimeshort', 'core_langconfig');
-        if($row->globaldelay >= time()) {
+        if ($row->globaldelay >= time()) {
             $date = userdate($row->globaldelay, $dateformat);
             $text .= get_string('globally_until_date', 'tool_lifecycle', $date) . '&#13;';
         }
-        if($row->workflowcount == 1) {
+        if ($row->workflowcount == 1) {
             $date = userdate($row->workflowdelay, $dateformat);
             $text .= get_string('name_until_date', 'tool_lifecycle',
                     array('name' => $row->workflow, 'date' => $date)) . '&#13;';
         } else if ($row->workflowcount > 1) {
-
-            // TODO Make sure dw.workflowid is distinct.
-
             $sql = 'SELECT dw.id, dw.delayeduntil, w.title
                     FROM {tool_lifecycle_delayed_workf} dw
                     JOIN {tool_lifecycle_workflow} w ON dw.workflowid = w.id
@@ -204,19 +203,21 @@ class delayed_courses_table extends \table_sql {
      * Render tools column.
      * @param object $row Row data.
      * @return string pluginname of the subplugin
-     * @throws \coding_exception
-     * @throws \invalid_parameter_exception
      */
     public function col_tools($row) {
         global $PAGE, $OUTPUT;
-        // TODO Add view specific workflow parameter.
-
-        $button = new \single_button(
-                new \moodle_url($PAGE->url, array(
-                        'action' => 'delete',
-                        'cid' => $row->courseid,
-                        'sesskey' => sesskey()
-                )),
+
+        $params = array(
+                'action' => 'delete',
+                'cid' => $row->courseid,
+                'sesskey' => sesskey()
+        );
+
+        if ($this->workflow) {
+            $params['workflow'] = $this->workflow;
+        }
+
+        $button = new \single_button(new \moodle_url($PAGE->url, $params),
                 get_string('delete_delay', 'tool_lifecycle'));
         return $OUTPUT->render($button);
     }
diff --git a/db/caches.php b/db/caches.php
index 209ad71..e68e32e 100644
--- a/db/caches.php
+++ b/db/caches.php
@@ -15,10 +15,9 @@
 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
- * Cache Definition for Admin Approve Step
+ * Cache Definition for tool_lifecycle
  *
- * @package tool_lifecycle_step
- * @subpackage adminapprove
+ * @package tool_lifecycle
  * @copyright  2019 Justus Dieckmann WWU
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
diff --git a/delayedcourses.php b/delayedcourses.php
index c648443..e78a820 100644
--- a/delayedcourses.php
+++ b/delayedcourses.php
@@ -42,7 +42,7 @@ if ($action) {
         $cid = required_param('cid', PARAM_INT);
         $workflow = optional_param('workflow', null, PARAM_ALPHANUM);
         if ($workflow) {
-            if (is_int($workflow)) {
+            if (is_number($workflow)) {
                 $DB->delete_records('tool_lifecycle_delayed_workf', array('courseid' => $cid, 'workflowid' => $workflow));
             } else if ($workflow == 'global') {
                 $DB->delete_records('tool_lifecycle_delayed', array('courseid' => $cid));
-- 
GitLab