Moodle
  1. Moodle
  2. MDL-17524

Deleting a calculated question delete datasetdefinitions shared by other question

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 1.6.8
    • Fix Version/s: 1.6.9, 1.7.7, 1.8.8, 1.9.4
    • Component/s: Questions
    • Labels:
      None
    • Affected Branches:
      MOODLE_16_STABLE
    • Fixed Branches:
      MOODLE_16_STABLE, MOODLE_17_STABLE, MOODLE_18_STABLE, MOODLE_19_STABLE
    • Rank:
      30201

      Description

      the delete function delete all datasetdefiniton used by this question without testing if they are shared by other questions.
      if ($datasets = get_records('question_datasets', 'question', $questionid)) {
      foreach ($datasets as $dataset)

      { delete_records('question_dataset_definitions', 'id', $dataset->datasetdefinition); delete_records('question_dataset_items', 'definition', $dataset->datasetdefinition); }

      }

      changing this in HEAD to
      if ($datasets = $DB->get_records('question_datasets', array('question' => $questionid))) {
      foreach ($datasets as $dataset) {
      if (!$DB->get_records_select( // no other questions sharing this datasetdefinition
      'question_datasets',
      "question != ?
      AND datasetdefinition = ?;", array($questionid, $dataset->datasetdefinition)))

      { $DB->delete_records('question_dataset_definitions', array('id' => $dataset->datasetdefinition)); $DB->delete_records('question_dataset_items', array('definition' => $dataset->datasetdefinition)); }

      }
      }
      solve the problem.
      will merge down to 1.6
      We can conclude that either shared datasetdefinition are not so often used or that such calculated questions are too precious to be deleted ...

        Activity

        Hide
        Pierre Pichet added a comment -

        for 1.9 and older version this becomes
        + if (! get_records_select(
        + 'question_datasets',
        + "question != $questionid
        + AND datasetdefinition = $dataset->datasetdefinition;"))

        { + delete_records('question_dataset_definitions', 'id', $dataset->datasetdefinition); + delete_records('question_dataset_items', 'definition', $dataset->datasetdefinition); + }
        Show
        Pierre Pichet added a comment - for 1.9 and older version this becomes + if (! get_records_select( + 'question_datasets', + "question != $questionid + AND datasetdefinition = $dataset->datasetdefinition;")) { + delete_records('question_dataset_definitions', 'id', $dataset->datasetdefinition); + delete_records('question_dataset_items', 'definition', $dataset->datasetdefinition); + }
        Hide
        Pierre Pichet added a comment -

        Just hope that I set fix versions correctly...

        Show
        Pierre Pichet added a comment - Just hope that I set fix versions correctly...
        Hide
        Tim Hunt added a comment -

        Looks good.

        Show
        Tim Hunt added a comment - Looks good.

          People

          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: