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 (Obsolete):
      8
    • 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)

        Gliffy Diagrams

          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