Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 2.5
    • Fix Version/s: 2.6
    • Component/s: Assignment, Web Services
    • Labels:
    • Story Points:
      8
    • Rank:
      46718
    • Sprint:
      FRONTEND Sprint 3

      Description

      After a small bit of refactoring - most of the process_XXX functions in mod/assign/locallib.php would be suitable for calling from a webservice.

      List of simple functions:

      Function Description Parameters Returns
      mod_assign_revert_submissions_to_draft Revert a list of submissions to draft for a single assignment int assignmentid, array userids array of external warnings
      mod_assign_lock_submissions Lock a list of assignment submissions for a single assignment int assignmentid, array userids List of user ids array of external warnings
      mod_assign_unlock_submissions Unlock a list of assignment submissions for a single assignment int assignmentid, array userids List of user ids array of external warnings
      mod_assign_submit_for_grading Submit the current users submission for marking int assignmentid array of external warnings
      mod_assign_save_user_extensions Grant extension due dates to a list of students for a single assignment int assignmentid, array userids, array duedates array of external warnings
      mod_assign_reveal_identities Reveal the identities for users in a blind marking assignment int assignmentid array of external warnings

      More complicated functions:

      Function Description Parameters Returns
      mod_assign_save_submission Save a submission to the assignment as the current user int assignmentid, plugindata array of fields used by plugins to save the submission. The valid list of fields is dependent on the installed plugins array of external warnings
      mod_assign_save_grade Save a grade to the assignment as the current user int assignmentid, int userid, float grade, bool applytoall, plugindata array of fields used by plugins to save the feedback. The valid list of fields is dependent on the installed plugins array of external warnings

      Other contenders - download_all_submissions (link to download a zip - TBD)

        Issue Links

          Activity

          Show
          Jérôme Mouneyrac added a comment - I added a comment about file upload in: https://tracker.moodle.org/browse/MDL-22236?focusedCommentId=195351&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-195351
          Hide
          Damyon Wiese added a comment -

          removed prepare functions based on the implementation of file upload for webservices.

          Show
          Damyon Wiese added a comment - removed prepare functions based on the implementation of file upload for webservices.
          Hide
          Dan Poltawski added a comment -

          Hi Damyon,

          This code looks good to me. The only critical comment would be that i'd prefer for the git history to have more in depth comments and be a tiny bit cleaner (i.e. not adding commented out webservice definitions). But thats being v.picky

          [Y] Syntax
          [-] Output
          [Y] Whitespace
          [-] Language
          [Y] Databases
          [Y] Testing
          [Y] Security
          [-] Documentation
          [N] Git
          [Y] Sanity check

          Also worth saying that I found it noticeably easier to review this code because you stuck to the line length limits. I found it noticeable that I didn't have to readjust my terminal

          Show
          Dan Poltawski added a comment - Hi Damyon, This code looks good to me. The only critical comment would be that i'd prefer for the git history to have more in depth comments and be a tiny bit cleaner (i.e. not adding commented out webservice definitions). But thats being v.picky [Y] Syntax [-] Output [Y] Whitespace [-] Language [Y] Databases [Y] Testing [Y] Security [-] Documentation [N] Git [Y] Sanity check Also worth saying that I found it noticeably easier to review this code because you stuck to the line length limits. I found it noticeable that I didn't have to readjust my terminal
          Hide
          Damyon Wiese added a comment -

          Thanks Dan,

          This needs a rebase and retest against marking workflow and attempt history changes which is about half a days work before it could be submitted for integration.

          Show
          Damyon Wiese added a comment - Thanks Dan, This needs a rebase and retest against marking workflow and attempt history changes which is about half a days work before it could be submitted for integration.
          Hide
          Frédéric Massart added a comment -

          That would be awesome if this issue could be worked on and integrated, this would really help unit testing some part of the API. Problem I am facing during the event_trigger migration.

          Show
          Frédéric Massart added a comment - That would be awesome if this issue could be worked on and integrated, this would really help unit testing some part of the API. Problem I am facing during the event_trigger migration.
          Hide
          Damyon Wiese added a comment -

          Rebased and added support for marking workflow and attempts.

          This could do with another peer review because the rebase was quite tricky (yay for diff3).

          Show
          Damyon Wiese added a comment - Rebased and added support for marking workflow and attempts. This could do with another peer review because the rebase was quite tricky (yay for diff3).
          Hide
          Damyon Wiese added a comment -

          (Just adding points for work done in this sprint).

          Show
          Damyon Wiese added a comment - (Just adding points for work done in this sprint).
          Hide
          Dan Poltawski added a comment -

          Hi Damyon,

          There are unit test failures relating to private files (sounds like something in integration this week without the fix?)

          But also:

          HP Fatal error:  Call to undefined function add_attempt() in /Users/danp/moodles/pm/moodle/mod/assign/locallib.php on line 6282
          PHP Stack trace:
          PHP   1. {main}() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/composer/bin/phpunit:0
          PHP   2. PHPUnit_TextUI_Command::main() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/composer/bin/phpunit:63
          PHP   3. PHPUnit_TextUI_Command->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:129
          PHP   4. PHPUnit_TextUI_TestRunner->doRun() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:176
          PHP   5. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:349
          PHP   6. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705
          PHP   7. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705
          PHP   8. PHPUnit_Framework_TestSuite->runTest() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:745
          PHP   9. PHPUnit_Framework_TestCase->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:775
          PHP  10. PHPUnit_Framework_TestResult->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:776
          PHP  11. advanced_testcase->runBare() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php:648
          PHP  12. PHPUnit_Framework_TestCase->runBare() /Users/danp/moodles/pm/moodle/lib/phpunit/classes/advanced_testcase.php:76
          PHP  13. PHPUnit_Framework_TestCase->runTest() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:831
          PHP  14. ReflectionMethod->invokeArgs() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976
          PHP  15. mod_assign_locallib_testcase->test_attempt_reopen_method_manual() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976
          PHP  16. testable_assign->testable_process_add_attempt() /Users/danp/moodles/pm/moodle/mod/assign/tests/locallib_test.php:799
          PHP  17. assign->process_add_attempt() /Users/danp/moodles/pm/moodle/mod/assign/tests/base_test.php:255
          
          Fatal error: Call to undefined function add_attempt() in /Users/danp/moodles/pm/moodle/mod/assign/locallib.php on line 6282
          
          Call Stack:
              0.0003     228992   1. {main}() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/composer/bin/phpunit:0
              0.0036     539544   2. PHPUnit_TextUI_Command::main() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/composer/bin/phpunit:63
              0.0036     539776   3. PHPUnit_TextUI_Command->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:129
              7.0861  175599264   4. PHPUnit_TextUI_TestRunner->doRun() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:176
              7.0899  175754368   5. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:349
            665.8395  259664112   6. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705
            690.9565  263501568   7. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705
            747.1550  273645512   8. PHPUnit_Framework_TestSuite->runTest() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:745
            747.1550  273645512   9. PHPUnit_Framework_TestCase->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:775
            747.1552  273645512  10. PHPUnit_Framework_TestResult->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:776
            747.1553  273646456  11. advanced_testcase->runBare() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php:648
            747.1561  273666928  12. PHPUnit_Framework_TestCase->runBare() /Users/danp/moodles/pm/moodle/lib/phpunit/classes/advanced_testcase.php:76
            748.1408  274597744  13. PHPUnit_Framework_TestCase->runTest() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:831
            748.1408  274598560  14. ReflectionMethod->invokeArgs() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976
            748.1408  274598592  15. mod_assign_locallib_testcase->test_attempt_reopen_method_manual() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976
            749.1663  275161968  16. testable_assign->testable_process_add_attempt() /Users/danp/moodles/pm/moodle/mod/assign/tests/locallib_test.php:799
            749.1663  275162000  17. assign->process_add_attempt() /Users/danp/moodles/pm/moodle/mod/assign/tests/base_test.php:255
          
          Show
          Dan Poltawski added a comment - Hi Damyon, There are unit test failures relating to private files (sounds like something in integration this week without the fix?) But also: HP Fatal error: Call to undefined function add_attempt() in /Users/danp/moodles/pm/moodle/mod/assign/locallib.php on line 6282 PHP Stack trace: PHP 1. {main}() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/composer/bin/phpunit:0 PHP 2. PHPUnit_TextUI_Command::main() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/composer/bin/phpunit:63 PHP 3. PHPUnit_TextUI_Command->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:129 PHP 4. PHPUnit_TextUI_TestRunner->doRun() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:176 PHP 5. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:349 PHP 6. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705 PHP 7. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705 PHP 8. PHPUnit_Framework_TestSuite->runTest() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:745 PHP 9. PHPUnit_Framework_TestCase->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:775 PHP 10. PHPUnit_Framework_TestResult->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:776 PHP 11. advanced_testcase->runBare() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php:648 PHP 12. PHPUnit_Framework_TestCase->runBare() /Users/danp/moodles/pm/moodle/lib/phpunit/classes/advanced_testcase.php:76 PHP 13. PHPUnit_Framework_TestCase->runTest() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:831 PHP 14. ReflectionMethod->invokeArgs() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976 PHP 15. mod_assign_locallib_testcase->test_attempt_reopen_method_manual() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976 PHP 16. testable_assign->testable_process_add_attempt() /Users/danp/moodles/pm/moodle/mod/assign/tests/locallib_test.php:799 PHP 17. assign->process_add_attempt() /Users/danp/moodles/pm/moodle/mod/assign/tests/base_test.php:255 Fatal error: Call to undefined function add_attempt() in /Users/danp/moodles/pm/moodle/mod/assign/locallib.php on line 6282 Call Stack: 0.0003 228992 1. {main}() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/composer/bin/phpunit:0 0.0036 539544 2. PHPUnit_TextUI_Command::main() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/composer/bin/phpunit:63 0.0036 539776 3. PHPUnit_TextUI_Command->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:129 7.0861 175599264 4. PHPUnit_TextUI_TestRunner->doRun() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/Command.php:176 7.0899 175754368 5. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:349 665.8395 259664112 6. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705 690.9565 263501568 7. PHPUnit_Framework_TestSuite->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:705 747.1550 273645512 8. PHPUnit_Framework_TestSuite->runTest() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:745 747.1550 273645512 9. PHPUnit_Framework_TestCase->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestSuite.php:775 747.1552 273645512 10. PHPUnit_Framework_TestResult->run() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:776 747.1553 273646456 11. advanced_testcase->runBare() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestResult.php:648 747.1561 273666928 12. PHPUnit_Framework_TestCase->runBare() /Users/danp/moodles/pm/moodle/lib/phpunit/classes/advanced_testcase.php:76 748.1408 274597744 13. PHPUnit_Framework_TestCase->runTest() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:831 748.1408 274598560 14. ReflectionMethod->invokeArgs() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976 748.1408 274598592 15. mod_assign_locallib_testcase->test_attempt_reopen_method_manual() /Users/danp/moodles/pm/moodle/vendor/phpunit/phpunit/PHPUnit/Framework/TestCase.php:976 749.1663 275161968 16. testable_assign->testable_process_add_attempt() /Users/danp/moodles/pm/moodle/mod/assign/tests/locallib_test.php:799 749.1663 275162000 17. assign->process_add_attempt() /Users/danp/moodles/pm/moodle/mod/assign/tests/base_test.php:255
          Hide
          Damyon Wiese added a comment -

          Yay unit tests!

          Show
          Damyon Wiese added a comment - Yay unit tests!
          Hide
          Damyon Wiese added a comment -

          The unit tests are fixed - pushing for integration.

          Show
          Damyon Wiese added a comment - The unit tests are fixed - pushing for integration.
          Hide
          Marina Glancy added a comment -

          Damyon, sorry, have to fail the review, comments say "@since Moodle 2.5"

          Also, do you think there should be some upgrade note for subplugins that they can now implement the webservice functions?

          Show
          Marina Glancy added a comment - Damyon, sorry, have to fail the review, comments say "@since Moodle 2.5" Also, do you think there should be some upgrade note for subplugins that they can now implement the webservice functions?
          Hide
          Marina Glancy added a comment -

          Damyon, before I spotted this 2.5 I ran behat tests with --tags @mod_assign

          (::) failed steps (::)
          
          01. "Submission changes not allowed" text was not found in the page
              In step `Then I should see "Submission changes not allowed"'. # behat_general::assert_page_contains_text()
              From scenario `Preventing changes and allowing them again'.   # /home/marina/repositories/behat_master/moodle/mod/assign/tests/behat/prevent_submission_changes.feature:8
              Of feature `Prevent or allow assignment submission changes'.  # /home/marina/repositories/behat_master/moodle/mod/assign/tests/behat/prevent_submission_changes.feature
          
          Show
          Marina Glancy added a comment - Damyon, before I spotted this 2.5 I ran behat tests with --tags @mod_assign (::) failed steps (::) 01. "Submission changes not allowed" text was not found in the page In step `Then I should see "Submission changes not allowed" '. # behat_general::assert_page_contains_text() From scenario `Preventing changes and allowing them again'. # /home/marina/repositories/behat_master/moodle/mod/assign/tests/behat/prevent_submission_changes.feature:8 Of feature `Prevent or allow assignment submission changes'. # /home/marina/repositories/behat_master/moodle/mod/assign/tests/behat/prevent_submission_changes.feature
          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
          Damyon Wiese added a comment -

          All since 2.5 comment have been updated. More notes added to upgrade.txt about plugins webservice changes. Behat Fixed (behat found a real typo - yay).

          Rebased.
          Repushed.
          Resending for integration.

          Thanks!

          Show
          Damyon Wiese added a comment - All since 2.5 comment have been updated. More notes added to upgrade.txt about plugins webservice changes. Behat Fixed (behat found a real typo - yay). Rebased. Repushed. Resending for integration. Thanks!
          Hide
          Eloy Lafuente (stronk7) added a comment - - edited

          Uhm… I just was verifying the externallib code… and I think that there is something not being properly handled….

          For example, take the get_grades() method. For all the assignments ($cms) passed, it validates the context and the required capability. And, if there is any problem with them… it just creates a warning (because the exceptions thrown by any of them are being caught).

          Then, the process continues normally and the grades are fetched and returned (together with the warnings).

          IMO that's completely wrong, implying that ANY USER is able to return all grades, no matter the permissions nor the settings.

          Note I've not verified other functions, just the 1st one. But the key here is that some errors must be handled as errors, not as warnings.

          Also, I've seen that there are a bunch of phpdocs missing, i think this would be a good moment to complete them: http://ci.stronk7.com/view/prehecker/job/Precheck%20remote%20branch/536/artifact/work/smurf.html

          So I'm reopening this, ciao

          Reference: http://docs.moodle.org/dev/Errors_handling_in_web_services

          Show
          Eloy Lafuente (stronk7) added a comment - - edited Uhm… I just was verifying the externallib code… and I think that there is something not being properly handled…. For example, take the get_grades() method. For all the assignments ($cms) passed, it validates the context and the required capability. And, if there is any problem with them… it just creates a warning (because the exceptions thrown by any of them are being caught). Then, the process continues normally and the grades are fetched and returned (together with the warnings). IMO that's completely wrong, implying that ANY USER is able to return all grades, no matter the permissions nor the settings. Note I've not verified other functions, just the 1st one. But the key here is that some errors must be handled as errors, not as warnings. Also, I've seen that there are a bunch of phpdocs missing, i think this would be a good moment to complete them: http://ci.stronk7.com/view/prehecker/job/Precheck%20remote%20branch/536/artifact/work/smurf.html So I'm reopening this, ciao Reference: http://docs.moodle.org/dev/Errors_handling_in_web_services
          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
          Damyon Wiese added a comment -

          Thanks Eloy - I can fix the codechecker warnings, but I'll have to create a new issue to fix the get_grades things you mentioned (that is not part of this patch - it is an existing webservice that goes back to 2.4).

          I'll create a new bug for it now....MDL-41423

          Show
          Damyon Wiese added a comment - Thanks Eloy - I can fix the codechecker warnings, but I'll have to create a new issue to fix the get_grades things you mentioned (that is not part of this patch - it is an existing webservice that goes back to 2.4). I'll create a new bug for it now....MDL-41423
          Hide
          Damyon Wiese added a comment -

          Resubmitting this for integration. It is rebased and has 1 additional commit to fix all codechecker warnings and another one to fix all moodlecheck warnings in the entire module (outside of tests).

          The issue with the webservice noted by Eloy last week was not a bug (see the linked issue for more details - there is a unit test there that confirms it).

          Also note for integrator:
          Please be kind

          Show
          Damyon Wiese added a comment - Resubmitting this for integration. It is rebased and has 1 additional commit to fix all codechecker warnings and another one to fix all moodlecheck warnings in the entire module (outside of tests). The issue with the webservice noted by Eloy last week was not a bug (see the linked issue for more details - there is a unit test there that confirms it). Also note for integrator: Please be kind
          Hide
          Damyon Wiese added a comment -

          Pushed a fix for a missing variable spotted by Sam (thanks!).

          The fix is covered by a modified unit test.

          Show
          Damyon Wiese added a comment - Pushed a fix for a missing variable spotted by Sam (thanks!). The fix is covered by a modified unit test.
          Hide
          Sam Hemelryk added a comment -

          Thanks Damyon this has been integrated now

          Show
          Sam Hemelryk added a comment - Thanks Damyon this has been integrated now
          Hide
          Damyon Wiese added a comment -

          Hurray!

          Show
          Damyon Wiese added a comment - Hurray!
          Hide
          Andrew Davis added a comment -

          Assignment seems fine. Passing.

          Show
          Andrew Davis added a comment - Assignment seems fine. Passing.
          Hide
          Sam Hemelryk added a comment -

          Yarrr me 'arties, good job done. Yer code 'as landed and the weeklies ave been released with your contributions in tow.
          The brethren thank ya for yer 'ard work and if there'd been treasure to ave ya would ave got yer cut.

          Thanks for the effort everyone, another successful weekly release has been rolled.
          Please keep in mind code freeze is just around the corner now, get your new features and improvements in ASAP.

          Many thanks
          Sam

          Show
          Sam Hemelryk added a comment - Yarrr me 'arties, good job done. Yer code 'as landed and the weeklies ave been released with your contributions in tow. The brethren thank ya for yer 'ard work and if there'd been treasure to ave ya would ave got yer cut. Thanks for the effort everyone, another successful weekly release has been rolled. Please keep in mind code freeze is just around the corner now, get your new features and improvements in ASAP. Many thanks Sam

            People

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

              Dates

              • Created:
                Updated:
                Resolved:

                Agile