Moodle
  1. Moodle
  2. MDL-32523

Copy (Duplicate) question(s) in the Question Bank

    Details

    • Type: New Feature New Feature
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 2.2.2, 2.7
    • Fix Version/s: 2.7
    • Component/s: Questions
    • Labels:
    • Testing Instructions:
      Hide
      1. Go to Administration -> Question bank -> Questions in a course. (If needed create a couple of questions.)
      2. In the table in question bank click on “Duplicate” icon for a question
      3. This take you to the question editing page and you will see that the information on the question editing form is taken from the given question you decided to duplicate
      4. The string ‘ (copy)’ is concatenated to the end of the question name, modify form as you require and click on ‘Save changes’
      5. The new question appear in the list of questions in the question bank
      6. Repeat steps 2-5 for these cases:
        • Simple qtype like multichoice.
        • Simple qtype, but with images embedded in lots of the text fields.
        • A multianswer (Cloze) question.
        • A calculated question.

      This can be equally be done from the question bank displayed on quiz editing page.

      Show
      Go to Administration -> Question bank -> Questions in a course. (If needed create a couple of questions.) In the table in question bank click on “Duplicate” icon for a question This take you to the question editing page and you will see that the information on the question editing form is taken from the given question you decided to duplicate The string ‘ (copy)’ is concatenated to the end of the question name, modify form as you require and click on ‘Save changes’ The new question appear in the list of questions in the question bank Repeat steps 2-5 for these cases: Simple qtype like multichoice. Simple qtype, but with images embedded in lots of the text fields. A multianswer (Cloze) question. A calculated question. This can be equally be done from the question bank displayed on quiz editing page.
    • Affected Branches:
      MOODLE_22_STABLE, MOODLE_27_STABLE
    • Fixed Branches:
      MOODLE_27_STABLE
    • Pull from Repository:
    • Pull Master Branch:
    • Rank:
      39416

      Description

      Add a "Copy" button to the buttom of the question list (Inside the Question Bank) that enable the question creator to duplicate a question inside the same category or a different one. (next to the "Move" button)

      Question's data should be duplicated and not "linked" to, to enable teachers to change the copied question(s) without changing the original question inside the Quiz that was using the original questions.

        Issue Links

          Activity

          Hide
          Pierre Pichet added a comment -

          Say in other words you want to have the same result as the "save as a new question" button in the edit form where nothing except possibly the category has been changed.

          As usual calculated will need special handling

          Show
          Pierre Pichet added a comment - Say in other words you want to have the same result as the "save as a new question" button in the edit form where nothing except possibly the category has been changed. As usual calculated will need special handling
          Hide
          Nadav Kavalerchik added a comment -

          @Pierre
          Yes

          Show
          Nadav Kavalerchik added a comment - @Pierre Yes
          Hide
          Tim Hunt added a comment -

          Acutally, I was already considering this. I think it would be a much less confusing user-interface is we separated copy question and move question behaviour from the edit question behaviour. It would also simplify the code, which means fewer bugs.

          I mean, how many times have you clicked on the 'Edit' icon for an question intending to make some changes, and then click 'Make copy', but then clicked 'Save changes' by mistake, and broken the original question.

          Show
          Tim Hunt added a comment - Acutally, I was already considering this. I think it would be a much less confusing user-interface is we separated copy question and move question behaviour from the edit question behaviour. It would also simplify the code, which means fewer bugs. I mean, how many times have you clicked on the 'Edit' icon for an question intending to make some changes, and then click 'Make copy', but then clicked 'Save changes' by mistake, and broken the original question.
          Hide
          Nadav Kavalerchik added a comment -

          @Tim
          +1 (or Like) to your previous comment

          btw, I was going through the code and found out the question_save function
          and I think it is very easy to implement. and if you are busy... i will have it done next week or so.
          Unless, of course... you already on it

          Show
          Nadav Kavalerchik added a comment - @Tim +1 (or Like) to your previous comment btw, I was going through the code and found out the question_save function and I think it is very easy to implement. and if you are busy... i will have it done next week or so. Unless, of course... you already on it
          Hide
          Tim Hunt added a comment -

          No. I am not on it. I am on MDL-3030. Until that is done, I cannot promise to peer review anything.

          As Pierre says, make sure to test calculated questions. Also, you will need to read http://docs.moodle.org/dev/Question_data_structures

          Show
          Tim Hunt added a comment - No. I am not on it. I am on MDL-3030 . Until that is done, I cannot promise to peer review anything. As Pierre says, make sure to test calculated questions. Also, you will need to read http://docs.moodle.org/dev/Question_data_structures
          Hide
          Nadav Kavalerchik added a comment -

          @Tim, ok I will patch it and add a link to it when I am done.

          Show
          Nadav Kavalerchik added a comment - @Tim, ok I will patch it and add a link to it when I am done.
          Hide
          Nadav Kavalerchik added a comment -

          I have made some progress, BUT I am stuck. and love to get some help...

          I have added the following code to moodle/question/editlib.php (around/after line 403)
          Which adds a listbox of "my courses" at the end of the Question Bank dialog, to which i am about to copy a question

          question_category_select_menu($addcontexts, false, 0, "$category->id,$category->contextid");
          // new code start here
          echo "<hr/>";   
          $mycourses = get_my_courses($USER->id);
          foreach($mycourses as $mycourse) {
            $mycourseslist[$mycourse->id] = $mycourse->fullname;
          }
          echo choose_from_menu($mycourseslist,'selectedcourse');
          echo '<input type="submit" name="copy" value="'.get_string('copyto', 'quiz')."\" />\n";
          // new code end here
          }
          

          And added a new Action:"copy" to handle to copy/duplicate request,
          around line 442 (inside question_showbank_action() function):

              if (optional_param('copy', false, PARAM_BOOL) and confirm_sesskey()) {
              $courseid = required_param('courseid', PARAM_SEQUENCE);
              $sql = "SELECT qc.id as tocategoryid, qc.contextid as contextid
          FROM `mdl_context` c
          JOIN `mdl_question_categories` qc ON c.id = qc.contextid
          WHERE `instanceid` = $courseid ";
          
          $questioncategory = get_record_sql($sql);
                if (! $tocategory = get_record('question_categories', 'id', $questioncategory->tocategoryid, 'contextid', $questioncategory->contextid)) {
                    error('Could not find category record');
                }
                $tocontext = get_context_instance_by_id($questioncategory->contextid);
          
          
                $rawdata = (array) data_submitted();
                $questionids = array();
                foreach ($rawdata as $key => $value) {    // Parse input for question ids
                    if (preg_match('!^q([0-9]+)$!', $key, $matches)) {
                        $key = $matches[1];
                        $questionids[] = $key;
                    }
                }
                if ($questionids){
                  $questionidlist = join($questionids, ',');
                  $sql = "SELECT q.*, c.contextid FROM {$CFG->prefix}question q, {$CFG->prefix}question_categories c WHERE q.id IN ($questionidlist) AND c.id = q.category";
                  if (!$questions = get_records_sql($sql)){
                      print_error('questiondoesnotexist', 'question', $pageurl->out());
                  }
                  foreach($questions as $question) {
                    $question->id = NULL;
                    echo $question->name = 'copy_'.$question->name; echo "<br/>";
                    $newquestion = $QTYPES[$question->qtype]->save_question($question, $question);                    
                  }
                }
                die;
              }
          

          What I am trying to do is, to copy the selected question(s) to the first question category of the selected course.
          I am calling $QTYPES[$question->qtype]->save_question() for each question. BUT! it seems that the save_question_options() for each question type does not get invoked and the question is "half" duplicated.
          I see it on the question bank list, but, with no content.
          While examining the question/type/questiontype.php - save_question() function I saw that it is suppose to be invoked from within the function.
          Should I invoke it explicitly? (For each question type and 3rd-party question type too)
          And am I on the right track with this implementation? (Should it be done in a different way?)

          Show
          Nadav Kavalerchik added a comment - I have made some progress, BUT I am stuck. and love to get some help... I have added the following code to moodle/question/editlib.php (around/after line 403) Which adds a listbox of "my courses" at the end of the Question Bank dialog, to which i am about to copy a question question_category_select_menu($addcontexts, false , 0, "$category->id,$category->contextid" ); // new code start here echo "<hr/>" ; $mycourses = get_my_courses($USER->id); foreach($mycourses as $mycourse) { $mycourseslist[$mycourse->id] = $mycourse->fullname; } echo choose_from_menu($mycourseslist,'selectedcourse'); echo '<input type= "submit" name= "copy" value= "'.get_string('copyto', 'quiz')." \ " />\n" ; // new code end here } And added a new Action:"copy" to handle to copy/duplicate request, around line 442 (inside question_showbank_action() function): if (optional_param('copy', false , PARAM_BOOL) and confirm_sesskey()) { $courseid = required_param('courseid', PARAM_SEQUENCE); $sql = "SELECT qc.id as tocategoryid, qc.contextid as contextid FROM `mdl_context` c JOIN `mdl_question_categories` qc ON c.id = qc.contextid WHERE `instanceid` = $courseid "; $questioncategory = get_record_sql($sql); if (! $tocategory = get_record('question_categories', 'id', $questioncategory->tocategoryid, 'contextid', $questioncategory->contextid)) { error('Could not find category record'); } $tocontext = get_context_instance_by_id($questioncategory->contextid); $rawdata = (array) data_submitted(); $questionids = array(); foreach ($rawdata as $key => $value) { // Parse input for question ids if (preg_match('!^q([0-9]+)$!', $key, $matches)) { $key = $matches[1]; $questionids[] = $key; } } if ($questionids){ $questionidlist = join($questionids, ','); $sql = "SELECT q.*, c.contextid FROM {$CFG->prefix}question q, {$CFG->prefix}question_categories c WHERE q.id IN ($questionidlist) AND c.id = q.category" ; if (!$questions = get_records_sql($sql)){ print_error('questiondoesnotexist', 'question', $pageurl->out()); } foreach($questions as $question) { $question->id = NULL; echo $question->name = 'copy_'.$question->name; echo "<br/>" ; $newquestion = $QTYPES[$question->qtype]->save_question($question, $question); } } die; } What I am trying to do is, to copy the selected question(s) to the first question category of the selected course. I am calling $QTYPES [$question->qtype] ->save_question() for each question. BUT! it seems that the save_question_options() for each question type does not get invoked and the question is "half" duplicated. I see it on the question bank list, but, with no content. While examining the question/type/questiontype.php - save_question() function I saw that it is suppose to be invoked from within the function. Should I invoke it explicitly? (For each question type and 3rd-party question type too) And am I on the right track with this implementation? (Should it be done in a different way?)
          Hide
          Tim Hunt added a comment -

          Try reading http://docs.moodle.org/dev/Question_data_structures if you have never read it before.

          You need to make sure you pass the right data to save_question, which is non-trivial, because get_question_options does not return the data structure that save_question expects.

          Show
          Tim Hunt added a comment - Try reading http://docs.moodle.org/dev/Question_data_structures if you have never read it before. You need to make sure you pass the right data to save_question, which is non-trivial, because get_question_options does not return the data structure that save_question expects.
          Hide
          Nadav Kavalerchik added a comment -

          Tim, Thanks you very much!

          I wish I came across the document before, though i read a few "neighboring" documents and read through several question types too.

          Again, thank you!

          Show
          Nadav Kavalerchik added a comment - Tim, Thanks you very much! I wish I came across the document before, though i read a few "neighboring" documents and read through several question types too. Again, thank you!
          Hide
          chester folming added a comment -

          Our teachers would love this "save as a new question" button.
          Is this coming?

          Show
          chester folming added a comment - Our teachers would love this "save as a new question" button. Is this coming?
          Hide
          Tim Hunt added a comment -

          This issue was assigned to me automatically, however I will not be able to work on this issue in the immediate future. In order to create a truer sense of the state of this issue and to allow other developers to have chance to become involved, I am removing myself as the assignee of this issue.

          For more information, see http://docs.moodle.org/dev/Changes_to_issue_assignment

          Show
          Tim Hunt added a comment - This issue was assigned to me automatically, however I will not be able to work on this issue in the immediate future. In order to create a truer sense of the state of this issue and to allow other developers to have chance to become involved, I am removing myself as the assignee of this issue. For more information, see http://docs.moodle.org/dev/Changes_to_issue_assignment
          Hide
          Mahmoud Kassaei added a comment -

          I have done the fix

          Here is the diff:

          https://github.com/mkassaei/moodle/compare/mdl_32523?expand=1

          BTW, I deleted the "Make a copy" from the form and its occurrence in the code apart from

          } else if (!empty($form->makecopy)) {
          in question/type/calculated/questiontype.php and

          if (empty($question->makecopy) && $question->itemid[$i]) {
          and
          if (!empty($question->makecopy) && !empty($question->convert)) {
          in question/type/calculatedsimple/questiontype.php

          I believe that 'makecopy' need to be replaced by 'duplicate', since we have a hidden element 'duplicate' in question/type/edit_question_form.php. Alternatively, we could replace 'duplicate' in new changes with 'makecopy' and therefore we might get away with not changing the above calculated qtypes.

          Show
          Mahmoud Kassaei added a comment - I have done the fix Here is the diff: https://github.com/mkassaei/moodle/compare/mdl_32523?expand=1 BTW, I deleted the "Make a copy" from the form and its occurrence in the code apart from } else if (!empty($form->makecopy)) { in question/type/calculated/questiontype.php and if (empty($question->makecopy) && $question->itemid [$i] ) { and if (!empty($question->makecopy) && !empty($question->convert)) { in question/type/calculatedsimple/questiontype.php I believe that 'makecopy' need to be replaced by 'duplicate', since we have a hidden element 'duplicate' in question/type/edit_question_form.php. Alternatively, we could replace 'duplicate' in new changes with 'makecopy' and therefore we might get away with not changing the above calculated qtypes.
          Hide
          Tim Hunt added a comment -

          I have not yet tested this yet, I have just looked at the code, but it is looking very good. A pleasingly small patch.

          Some minor points:

          1. I think that, to duplicate a question, you need moodle/question:add on the context of the currently selected category, and question_has_capability_on($question, 'view') on the question being copied. I think this affects

          • question_bank_duplicate_action_column
          • question/question.php
          • validation() in question/type/edit_question_form.php.

          2. I am not sure why you need protected $duplicatequestionurl;

          3. I wonder if we can use the name makecopy instead of duplicate? If we are lucky that might make things like caclulated and STACK just work. If we are unlucky, it will cause problems.

          4. I don't think you should remove the // Copies should not be hidden comment.

          5. Please can you edit this issue, and write some testing instructions. We will need those before this can be integrated.

          6. Also, if it were me, I would probably add more to the commit comment explaining what this change is.

          Show
          Tim Hunt added a comment - I have not yet tested this yet, I have just looked at the code, but it is looking very good. A pleasingly small patch. Some minor points: 1. I think that, to duplicate a question, you need moodle/question:add on the context of the currently selected category, and question_has_capability_on($question, 'view') on the question being copied. I think this affects question_bank_duplicate_action_column question/question.php validation() in question/type/edit_question_form.php. 2. I am not sure why you need protected $duplicatequestionurl; 3. I wonder if we can use the name makecopy instead of duplicate? If we are lucky that might make things like caclulated and STACK just work. If we are unlucky, it will cause problems. 4. I don't think you should remove the // Copies should not be hidden comment. 5. Please can you edit this issue, and write some testing instructions. We will need those before this can be integrated. 6. Also, if it were me, I would probably add more to the commit comment explaining what this change is.
          Hide
          Mahmoud Kassaei added a comment -

          Thanks Tim,
          I have replaced 'duplicate' with 'makecopy' accordingly and added other minor changes.
          I also tested with calculated qtype and it worked.

          Show
          Mahmoud Kassaei added a comment - Thanks Tim, I have replaced 'duplicate' with 'makecopy' accordingly and added other minor changes. I also tested with calculated qtype and it worked.
          Hide
          Tim Hunt added a comment -

          That is getting better, but two more things:

          1. I just noticed ' (copy)' was hard-coded. It needs to be a langauge string, and you should not concatenate strings, because that does not work for languages taht need a different word order. So, you need a string like

          $string['questionnamecopy'] = '{$a} (copy)';
          

          2. I think you should not use 'makecopy' in question_bank_makecopy_action_column or makecopyaction. I think in those two you could just use the word 'copy'.

          3. You need to rebase -i to reduce this to a single commit.

          Show
          Tim Hunt added a comment - That is getting better, but two more things: 1. I just noticed ' (copy)' was hard-coded. It needs to be a langauge string, and you should not concatenate strings, because that does not work for languages taht need a different word order. So, you need a string like $string['questionnamecopy'] = '{$a} (copy)'; 2. I think you should not use 'makecopy' in question_bank_makecopy_action_column or makecopyaction. I think in those two you could just use the word 'copy'. 3. You need to rebase -i to reduce this to a single commit.
          Hide
          Mahmoud Kassaei added a comment -

          I have amended the code to accommodate the above changes including checking for capabilities that the user can add a question in the same category as the existing question and to view and edit the details of the question being copied.

          Show
          Mahmoud Kassaei added a comment - I have amended the code to accommodate the above changes including checking for capabilities that the user can add a question in the same category as the existing question and to view and edit the details of the question being copied.
          Hide
          Tim Hunt added a comment -

          Oops! Typo. The new lang string has ' {copy)'. They should both be round brackets.

          Show
          Tim Hunt added a comment - Oops! Typo. The new lang string has ' {copy)'. They should both be round brackets.
          Hide
          Tim Hunt added a comment -

          Also, I just tested with qtype_multianswer, and that does not work for some reason.

          Show
          Tim Hunt added a comment - Also, I just tested with qtype_multianswer, and that does not work for some reason.
          Hide
          Tim Hunt added a comment -

          I also tested a STACK question, which is a particularly complicated qtype, and that worked fine . So, we just need to fix multianswer, and the type, and we are done.

          Show
          Tim Hunt added a comment - I also tested a STACK question, which is a particularly complicated qtype, and that worked fine . So, we just need to fix multianswer, and the type, and we are done.
          Hide
          Mahmoud Kassaei added a comment -

          I have created two multianswer questions taking the two examples form
          http://docs.moodle.org/26/en/question/type/multianswer
          It was able to duplicate both of them.

          Show
          Mahmoud Kassaei added a comment - I have created two multianswer questions taking the two examples form http://docs.moodle.org/26/en/question/type/multianswer It was able to duplicate both of them.
          Hide
          Mahmoud Kassaei added a comment -

          I have changed the typo '{cop)' to '(cop)' and pushed it github

          Show
          Mahmoud Kassaei added a comment - I have changed the typo '{cop)' to '(cop)' and pushed it github
          Hide
          Tim Hunt added a comment -

          I don't know what happened before, but when I test again, multianswer questions are fine.

          So, this is now ready for integration. We just need to wait for 2.6 to be released, then we can rebase this.

          Show
          Tim Hunt added a comment - I don't know what happened before, but when I test again, multianswer questions are fine. So, this is now ready for integration. We just need to wait for 2.6 to be released, then we can rebase this.
          Hide
          Mahmoud Kassaei added a comment -

          Rebased on latest version of master (Moodle 2.7 dev)
          See https://github.com/mkassaei/moodle/compare/master...MDL-32523

          Show
          Mahmoud Kassaei added a comment - Rebased on latest version of master (Moodle 2.7 dev) See https://github.com/mkassaei/moodle/compare/master...MDL-32523
          Hide
          Dan Poltawski added a comment -

          The main moodle.git repository has just been updated with latest weekly modifications. You may wish to rebase your PULL branches to simplify history and avoid any possible merge conflicts. This would also make integrator's life easier next week.

          TIA and ciao

          Show
          Dan Poltawski added a comment - The main moodle.git repository has just been updated with latest weekly modifications. You may wish to rebase your PULL branches to simplify history and avoid any possible merge conflicts. This would also make integrator's life easier next week. TIA and ciao
          Hide
          Mahmoud Kassaei added a comment -

          I have rebased this on latest main Moodle git repository

          Show
          Mahmoud Kassaei added a comment - I have rebased this on latest main Moodle git repository
          Hide
          Marina Glancy added a comment -

          Hi Mahmoud, this is a very nice change!
          Please correct the following:
          1. class definition must have phpdocs block with class description, copyright and package
          2. there are trailing whitespaces in question/type/edit_question_form.php line 247
          and the most important
          3. this issue needs behat test, all other buttons have tests in question/tests/behat/*.feature
          I can help you with behat test if you need it

          Show
          Marina Glancy added a comment - Hi Mahmoud, this is a very nice change! Please correct the following: 1. class definition must have phpdocs block with class description, copyright and package 2. there are trailing whitespaces in question/type/edit_question_form.php line 247 and the most important 3. this issue needs behat test, all other buttons have tests in question/tests/behat/*.feature I can help you with behat test if you need it
          Hide
          Marina Glancy added a comment -

          linking to the css issue I found: MDL-43284

          Show
          Marina Glancy added a comment - linking to the css issue I found: MDL-43284
          Hide
          CiBoT added a comment -

          Moving this reopened issue out from current integration. Please, re-submit it for integration once ready.

          Show
          CiBoT added a comment - Moving this reopened issue out from current integration. Please, re-submit it for integration once ready.
          Hide
          Mahmoud Kassaei added a comment -

          Thanks Marina, I have done the suggested changes and wrote a behat test (I have not checked them in becasue I need to run behat before doing so). However, I has some issue with installing behat for windows.

          I get the follwoing message:

          Connection Error [ERR_CONNECTION]: Unable to connect to getcomposer.org

          Request to https://getcomposer.org/installer failed with errors:
          Failed to open stream: No connection could be made because the target machine actively refused it.

          I can see the php code when I go to https://getcomposer.org/installer

          Show
          Mahmoud Kassaei added a comment - Thanks Marina, I have done the suggested changes and wrote a behat test (I have not checked them in becasue I need to run behat before doing so). However, I has some issue with installing behat for windows. I get the follwoing message: — Connection Error [ERR_CONNECTION] : Unable to connect to getcomposer.org Request to https://getcomposer.org/installer failed with errors: Failed to open stream: No connection could be made because the target machine actively refused it. – I can see the php code when I go to https://getcomposer.org/installer
          Hide
          Marina Glancy added a comment -

          Hi Mahmoud,
          please try the following (from http://docs.moodle.org/dev/Acceptance_testing#Installation)

          If you don't have curl installed or you have problems running curl http://getcomposer.org/installer | php:
          
              Download http://getcomposer.org/installer
              Store it in /your/moodle/dirroot/composerinstaller.php for example
              Run it from /your/moodle/dirroot with php composerinstaller.php, you can delete this file after running the next step (php composer.phar update --dev) 
          
          Show
          Marina Glancy added a comment - Hi Mahmoud, please try the following (from http://docs.moodle.org/dev/Acceptance_testing#Installation ) If you don't have curl installed or you have problems running curl http: //getcomposer.org/installer | php: Download http: //getcomposer.org/installer Store it in /your/moodle/dirroot/composerinstaller.php for example Run it from /your/moodle/dirroot with php composerinstaller.php, you can delete this file after running the next step (php composer.phar update --dev)
          Hide
          Mahmoud Kassaei added a comment -

          I have written a behat test-file for this, However, I have not tested it because I had some issues with my local server and behat installation after updating my master branch.

          In terms of the order of integration, this should be integrated before

          https://tracker.moodle.org/browse/MDL-33839
          and
          https://tracker.moodle.org/browse/MDL-33653

          I have just rebased this on latest version of Moodle master

          Show
          Mahmoud Kassaei added a comment - I have written a behat test-file for this, However, I have not tested it because I had some issues with my local server and behat installation after updating my master branch. In terms of the order of integration, this should be integrated before https://tracker.moodle.org/browse/MDL-33839 and https://tracker.moodle.org/browse/MDL-33653 I have just rebased this on latest version of Moodle master
          Hide
          CiBoT added a comment -

          Results for MDL-32523

          • Remote repository: git://github.com/mkassaei/moodle.git
          Show
          CiBoT added a comment - Results for MDL-32523 Remote repository: git://github.com/mkassaei/moodle.git Remote branch MDL-32523 to be integrated into upstream master Executed job http://integration.moodle.org/job/Precheck%20remote%20branch/523 Details: http://integration.moodle.org/job/Precheck%20remote%20branch/523/artifact/work/smurf.html
          Hide
          CiBoT added a comment -

          Results for MDL-32523

          • Remote repository: git://github.com/mkassaei/moodle.git
          Show
          CiBoT added a comment - Results for MDL-32523 Remote repository: git://github.com/mkassaei/moodle.git Remote branch MDL-32523 to be integrated into upstream master Executed job http://integration.moodle.org/job/Precheck%20remote%20branch/538 Details: http://integration.moodle.org/job/Precheck%20remote%20branch/538/artifact/work/smurf.html
          Hide
          Tim Hunt added a comment -

          Mahmoud, I just pushed three small commits on top of your work: https://github.com/timhunt/moodle/compare/master...MDL-32523 Are you happy with those changes?

          Show
          Tim Hunt added a comment - Mahmoud, I just pushed three small commits on top of your work: https://github.com/timhunt/moodle/compare/master...MDL-32523 Are you happy with those changes?
          Hide
          Tim Hunt added a comment -

          Mahmoud checked out my new commits, and was happy. I squashed two into the main commit, and left the third one separate. I hope that makes sense.

          Submitting for integration.

          Show
          Tim Hunt added a comment - Mahmoud checked out my new commits, and was happy. I squashed two into the main commit, and left the third one separate. I hope that makes sense. Submitting for integration.
          Hide
          Damyon Wiese added a comment -

          Thanks Tim and Mahmoud Kassaei,

          Looks good to me, + passes all tests.

          Integrated to master only.

          Show
          Damyon Wiese added a comment - Thanks Tim and Mahmoud Kassaei, Looks good to me, + passes all tests. Integrated to master only.
          Hide
          Marina Glancy added a comment -

          works good, thanks

          Show
          Marina Glancy added a comment - works good, thanks
          Hide
          Eloy Lafuente (stronk7) added a comment -

          I won't be saying "Thanks!" this week. I'm tired of it.

          For the good (and the bad), your code is now part of Moodle, the best LMS in the world. Hope you are contributing for that to continue being a fact (and not the opposite), sincerely.

          Just closing this as fixed, ciao

          PS: Just a bit of black/cruel humor, sorry, LOL!

          Show
          Eloy Lafuente (stronk7) added a comment - I won't be saying "Thanks!" this week. I'm tired of it. For the good (and the bad), your code is now part of Moodle, the best LMS in the world. Hope you are contributing for that to continue being a fact (and not the opposite), sincerely. Just closing this as fixed, ciao PS: Just a bit of black/cruel humor, sorry, LOL!

            People

            • Votes:
              7 Vote for this issue
              Watchers:
              9 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: