diff --git a/CHANGELOG.md b/CHANGELOG.md
index b653134..17c3e42 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -36,6 +36,7 @@
 - Fixed an issue where creating an external tool did not properly send parameters to Canvas. (Thanks, [@altgilbers](https://github.com/altgilbers))
 - Fixed an issue where getting Quiz Submissions would only return up to the first 10 results (Thanks,[@Mike-Nahmias](https://github.com/Mike-Nahmias))
 - Fixed an issue where unhandled 4XX and 5XX HTTP errors would cause a JSONDecodeError
+- Removed a limitation where the parameter `grouped` being passed to `get_multiple_submissions` would be ignored. These methods now return a `GroupedSubmission` object containing multiple `Submission` objects, instead of ignoring. (Thanks, [@bennettscience](https://github.com/bennettscience))
 
 ## [0.12.0] - 2019-04-03
 
diff --git a/canvasapi/course.py b/canvasapi/course.py
index d87df1a..ec1996f 100644
--- a/canvasapi/course.py
+++ b/canvasapi/course.py
@@ -18,9 +18,11 @@ from canvasapi.paginated_list import PaginatedList
 from canvasapi.progress import Progress
 from canvasapi.quiz import QuizExtension
 from canvasapi.tab import Tab
-from canvasapi.submission import Submission
+from canvasapi.submission import GroupedSubmission, Submission
 from canvasapi.upload import Uploader
-from canvasapi.util import combine_kwargs, is_multivalued, file_or_path, obj_or_id
+from canvasapi.util import (
+    combine_kwargs, is_multivalued, file_or_path, obj_or_id, normalize_bool
+)
 from canvasapi.rubric import Rubric
 
 
@@ -1410,17 +1412,21 @@ class Course(CanvasObject):
         :rtype: :class:`canvasapi.paginated_list.PaginatedList` of
             :class:`canvasapi.submission.Submission`
         """
-        if 'grouped' in kwargs:
-            warnings.warn('The `grouped` parameter must be empty. Removing kwarg `grouped`.')
-            del kwargs['grouped']
+
+        is_grouped = kwargs.get("grouped", False)
+
+        if normalize_bool(is_grouped, "grouped"):
+            cls = GroupedSubmission
+        else:
+            cls = Submission
 
         return PaginatedList(
-            Submission,
+            cls,
             self._requester,
             'GET',
             'courses/{}/students/submissions'.format(self.id),
             {'course_id': self.id},
-            _kwargs=combine_kwargs(**kwargs)
+            _kwargs=combine_kwargs(**kwargs),
         )
 
     def get_submission(self, assignment, user, **kwargs):
diff --git a/canvasapi/section.py b/canvasapi/section.py
index d76be75..5486937 100644
--- a/canvasapi/section.py
+++ b/canvasapi/section.py
@@ -6,8 +6,8 @@ from six import python_2_unicode_compatible
 from canvasapi.canvas_object import CanvasObject
 from canvasapi.paginated_list import PaginatedList
 from canvasapi.progress import Progress
-from canvasapi.submission import Submission
-from canvasapi.util import combine_kwargs, obj_or_id
+from canvasapi.submission import GroupedSubmission, Submission
+from canvasapi.util import combine_kwargs, obj_or_id, normalize_bool
 
 warnings.simplefilter('always', DeprecationWarning)
 
@@ -242,17 +242,20 @@ class Section(CanvasObject):
         :rtype: :class:`canvasapi.paginated_list.PaginatedList` of
             :class:`canvasapi.submission.Submission`
         """
-        if 'grouped' in kwargs:
-            warnings.warn('The `grouped` parameter must be empty. Removing kwarg `grouped`.')
-            del kwargs['grouped']
+        is_grouped = kwargs.get("grouped", False)
+
+        if normalize_bool(is_grouped, "grouped"):
+            cls = GroupedSubmission
+        else:
+            cls = Submission
 
         return PaginatedList(
-            Submission,
+            cls,
             self._requester,
             'GET',
             'sections/{}/students/submissions'.format(self.id),
             {'section_id': self.id},
-            _kwargs=combine_kwargs(**kwargs)
+            _kwargs=combine_kwargs(**kwargs),
         )
 
     def get_submission(self, assignment, user, **kwargs):
diff --git a/canvasapi/submission.py b/canvasapi/submission.py
index b1816f3..d36be90 100644
--- a/canvasapi/submission.py
+++ b/canvasapi/submission.py
@@ -188,3 +188,23 @@ class Submission(CanvasObject):
                 }
             )
         return response
+
+
+@python_2_unicode_compatible
+class GroupedSubmission(CanvasObject):
+    def __str__(self):
+        return "{} submission(s) for User #{}".format(
+            len(self.submissions), self.user_id
+        )
+
+    def __init__(self, requester, attributes):
+        try:
+            self.submissions = [
+                Submission(requester, submission)
+                for submission in attributes['submissions']
+            ]
+            del attributes['submissions']
+        except KeyError:
+            self.submissions = list()
+
+        super(GroupedSubmission, self).__init__(requester, attributes)
diff --git a/canvasapi/util.py b/canvasapi/util.py
index 351f2fb..4b71275 100644
--- a/canvasapi/util.py
+++ b/canvasapi/util.py
@@ -128,7 +128,9 @@ def obj_or_id(parameter, param_name, object_types):
                     break
 
         obj_type_list = ",".join([obj_type.__name__ for obj_type in object_types])
-        message = 'Parameter {} must be of type {} or int.'.format(param_name, obj_type_list)
+        message = 'Parameter {} must be of type {} or int.'.format(
+            param_name, obj_type_list
+        )
         raise TypeError(message)
 
 
@@ -168,3 +170,29 @@ def file_or_path(file):
         is_path = True
 
     return file, is_path
+
+
+def normalize_bool(val, param_name):
+    """
+    Normalize boolean-like strings to their corresponding boolean values.
+
+    :param val: Value to normalize. Acceptable values:
+        True, "True", "true", False, "False", "false"
+    :type val: str or bool
+    :param param_name: Name of the parameter being checked
+    :type param_name: str
+
+    :rtype: bool
+    """
+    if isinstance(val, bool):
+        return val
+    elif val in ("True", "true"):
+        return True
+    elif val in ("False", "false"):
+        return False
+    else:
+        raise ValueError(
+            'Parameter `{}` must be True, "True", "true", False, "False", or "false".'.format(
+                param_name
+            )
+        )

Grouped Responses
The `list_multiple_submissions` methods on `Course` and `Section` objects takes in an optional parameter `grouped` (See [Canvas Docs](https://canvas.instructure.com/doc/api/submissions.html#method.submissions_api.for_students)). If `grouped` is true (note: see #61 for details on boolean weirdness for this particular method), the format Canvas returns is different than what PaginatedList normally expects.

To get around this, we prevent the `grouped` parameter from being passed at all. Ideally, we should see if it's possible to parse this other format and leverage it's benefit of being grouped by user.

Similar issues may exist in other endpoints. It's possible that support for different formats is related to #56.
diff --git a/tests/fixtures/course.json b/tests/fixtures/course.json
index 1b9b787..8b0df0d 100644
--- a/tests/fixtures/course.json
+++ b/tests/fixtures/course.json
@@ -1431,6 +1431,37 @@
 		],
 		"status_code": 200
 	},
+	"list_multiple_submissions_grouped": {
+		"method": "GET",
+		"endpoint": "courses/1/students/submissions",
+		"data": [
+			{
+				"user_id": 1,
+				"submissions": [
+					{
+						"id": 1,
+						"assignments_id": 1,
+						"user_id": 1,
+						"html_url": "https://example.com/courses/1/assignments/1/submissions/1",
+						"submission_type": "online_upload"
+					}
+				]
+			},
+			{
+				"user_id": 2,
+				"submissions": [
+					{
+						"id": 2,
+						"assignments_id": 1,
+						"user_id": 2,
+						"html_url": "https://example.com/courses/1/assignments/1/submissions/2",
+						"submission_type": "online_upload"
+					}
+				]
+			}
+		],
+		"status_code": 200
+	},
 	"list_gradeable_students": {
 		"method": "GET",
 		"endpoint": "courses/1/assignments/1/gradeable_students",
diff --git a/tests/fixtures/section.json b/tests/fixtures/section.json
index 5c7df15..a4eb936 100644
--- a/tests/fixtures/section.json
+++ b/tests/fixtures/section.json
@@ -148,6 +148,37 @@
 		],
 		"status_code": 200
 	},
+	"list_multiple_submissions_grouped": {
+		"method": "GET",
+		"endpoint": "sections/1/students/submissions",
+		"data": [
+			{
+				"user_id": 1,
+				"submissions": [
+					{
+						"id": 1,
+						"assignments_id": 1,
+						"user_id": 1,
+						"html_url": "https://example.com/sections/1/assignments/1/submissions/1",
+						"submission_type": "online_upload"
+					}
+				]
+			},
+			{
+				"user_id": 2,
+				"submissions": [
+					{
+						"id": 2,
+						"assignments_id": 1,
+						"user_id": 2,
+						"html_url": "https://example.com/sections/1/assignments/1/submissions/2",
+						"submission_type": "online_upload"
+					}
+				]
+			}
+		],
+		"status_code": 200
+	},
 	"get_submission": {
 		"method": "GET",
 		"endpoint": "sections/1/assignments/1/submissions/1",
diff --git a/tests/test_course.py b/tests/test_course.py
index 70fb8df..6263c3a 100644
--- a/tests/test_course.py
+++ b/tests/test_course.py
@@ -32,7 +32,7 @@ from canvasapi.progress import Progress
 from canvasapi.quiz import Quiz, QuizExtension
 from canvasapi.rubric import Rubric
 from canvasapi.section import Section
-from canvasapi.submission import Submission
+from canvasapi.submission import GroupedSubmission, Submission
 from canvasapi.tab import Tab
 from canvasapi.user import User
 from canvasapi.user import UserDisplay
@@ -917,24 +917,29 @@ class TestCourse(unittest.TestCase):
         self.assertEqual(len(submission_list), 2)
         self.assertIsInstance(submission_list[0], Submission)
 
-    def test_get_multiple_submissions_grouped_param(self, m):
+    def test_get_multiple_submissions_grouped_true(self, m):
+        register_uris({'course': ['list_multiple_submissions_grouped']}, m)
+
+        submissions = self.course.get_multiple_submissions(grouped=True)
+        submission_list = [submission for submission in submissions]
+
+        self.assertEqual(len(submission_list), 2)
+        self.assertIsInstance(submission_list[0], GroupedSubmission)
+
+    def test_get_multiple_submissions_grouped_false(self, m):
         register_uris({'course': ['list_multiple_submissions']}, m)
 
-        with warnings.catch_warnings(record=True) as warning_list:
-            warnings.simplefilter('always')
-            submissions = self.course.get_multiple_submissions(grouped=True)
-            submission_list = [submission for submission in submissions]
+        submissions = self.course.get_multiple_submissions(grouped=False)
+        submission_list = [submission for submission in submissions]
 
-            # Ensure using the `grouped` param raises a warning
-            self.assertEqual(len(warning_list), 1)
-            self.assertEqual(warning_list[-1].category, UserWarning)
-            self.assertEqual(
-                text_type(warning_list[-1].message),
-                'The `grouped` parameter must be empty. Removing kwarg `grouped`.'
-            )
+        self.assertEqual(len(submission_list), 2)
+        self.assertIsInstance(submission_list[0], Submission)
 
-            self.assertEqual(len(submission_list), 2)
-            self.assertIsInstance(submission_list[0], Submission)
+    def test_get_multiple_submissions_grouped_invalid(self, m):
+        with self.assertRaises(ValueError) as cm:
+            self.course.get_multiple_submissions(grouped='blargh')
+
+        self.assertIn("Parameter `grouped` must", cm.exception.args[0])
 
     # get_submission()
     def test_get_submission(self, m):
diff --git a/tests/test_section.py b/tests/test_section.py
index ca01c1c..e7dfdfa 100644
--- a/tests/test_section.py
+++ b/tests/test_section.py
@@ -3,7 +3,6 @@ import unittest
 import warnings
 
 import requests_mock
-from six import text_type
 
 from canvasapi import Canvas
 from canvasapi.assignment import AssignmentOverride
@@ -11,7 +10,7 @@ from canvasapi.enrollment import Enrollment
 from canvasapi.exceptions import RequiredFieldMissing
 from canvasapi.progress import Progress
 from canvasapi.section import Section
-from canvasapi.submission import Submission
+from canvasapi.submission import GroupedSubmission, Submission
 from tests import settings
 from tests.util import register_uris
 
@@ -184,24 +183,29 @@ class TestSection(unittest.TestCase):
         self.assertEqual(len(submission_list), 2)
         self.assertIsInstance(submission_list[0], Submission)
 
-    def test_get_multiple_submissions_grouped_param(self, m):
+    def test_get_multiple_submissions_grouped_true(self, m):
+        register_uris({'section': ['list_multiple_submissions_grouped']}, m)
+
+        submissions = self.section.get_multiple_submissions(grouped=True)
+        submission_list = [submission for submission in submissions]
+
+        self.assertEqual(len(submission_list), 2)
+        self.assertIsInstance(submission_list[0], GroupedSubmission)
+
+    def test_get_multiple_submissions_grouped_false(self, m):
         register_uris({'section': ['list_multiple_submissions']}, m)
 
-        with warnings.catch_warnings(record=True) as warning_list:
-            warnings.simplefilter('always')
-            submissions = self.section.get_multiple_submissions(grouped=True)
-            submission_list = [submission for submission in submissions]
+        submissions = self.section.get_multiple_submissions(grouped=False)
+        submission_list = [submission for submission in submissions]
 
-            # Ensure using the `grouped` param raises a warning
-            self.assertEqual(len(warning_list), 1)
-            self.assertEqual(warning_list[-1].category, UserWarning)
-            self.assertEqual(
-                text_type(warning_list[-1].message),
-                'The `grouped` parameter must be empty. Removing kwarg `grouped`.'
-            )
+        self.assertEqual(len(submission_list), 2)
+        self.assertIsInstance(submission_list[0], Submission)
 
-            self.assertEqual(len(submission_list), 2)
-            self.assertIsInstance(submission_list[0], Submission)
+    def test_get_multiple_submissions_grouped_invalid(self, m):
+        with self.assertRaises(ValueError) as cm:
+            self.section.get_multiple_submissions(grouped='blargh')
+
+        self.assertIn("Parameter `grouped` must", cm.exception.args[0])
 
     # get_submission()
     def test_get_submission(self, m):
diff --git a/tests/test_submission.py b/tests/test_submission.py
index ae00970..f3928b1 100644
--- a/tests/test_submission.py
+++ b/tests/test_submission.py
@@ -7,23 +7,25 @@ import requests_mock
 
 from canvasapi import Canvas
 from canvasapi.peer_review import PeerReview
-from canvasapi.submission import Submission
+from canvasapi.submission import GroupedSubmission, Submission
 from tests import settings
 from tests.util import cleanup_file, register_uris
 
 
 @requests_mock.Mocker()
 class TestSubmission(unittest.TestCase):
-
     def setUp(self):
         self.canvas = Canvas(settings.BASE_URL, settings.API_KEY)
 
         with requests_mock.Mocker() as m:
-            register_uris({
-                'course': ['get_by_id', 'get_assignment_by_id'],
-                'section': ['get_by_id'],
-                'submission': ['get_by_id_course', 'get_by_id_section']
-            }, m)
+            register_uris(
+                {
+                    'course': ['get_by_id', 'get_assignment_by_id'],
+                    'section': ['get_by_id'],
+                    'submission': ['get_by_id_course', 'get_by_id_section'],
+                },
+                m,
+            )
 
             with warnings.catch_warnings(record=True) as warning_list:
                 self.course = self.canvas.get_course(1)
@@ -43,9 +45,7 @@ class TestSubmission(unittest.TestCase):
 
     # create_submission_peer_review()
     def test_create_submission_peer_review(self, m):
-        register_uris({'submission': [
-            'create_submission_peer_review',
-        ]}, m)
+        register_uris({'submission': ['create_submission_peer_review']}, m)
 
         created_peer_review = self.submission_course.create_submission_peer_review(1)
 
@@ -54,9 +54,7 @@ class TestSubmission(unittest.TestCase):
 
     # delete_submission_peer_review()
     def test_delete_submission_peer_review(self, m):
-        register_uris({'submission': [
-            'delete_submission_peer_review',
-        ]}, m)
+        register_uris({'submission': ['delete_submission_peer_review']}, m)
 
         deleted_peer_review = self.submission_course.delete_submission_peer_review(1)
 
@@ -65,9 +63,7 @@ class TestSubmission(unittest.TestCase):
 
     # edit()
     def test_edit(self, m):
-        register_uris({
-            'submission': ['edit']
-        }, m)
+        register_uris({'submission': ['edit']}, m)
 
         self.assertFalse(hasattr(self.submission_course, 'excused'))
 
@@ -79,23 +75,21 @@ class TestSubmission(unittest.TestCase):
 
     # get_submission_peer_reviews()
     def test_get_submission_peer_reviews(self, m):
-        register_uris({'submission': [
-            'list_submission_peer_reviews',
-        ]}, m)
+        register_uris({'submission': ['list_submission_peer_reviews']}, m)
 
         submission_peer_reviews = self.submission_course.get_submission_peer_reviews()
-        submission_peer_review_list = [peer_review for peer_review in submission_peer_reviews]
+        submission_peer_review_list = [
+            peer_review for peer_review in submission_peer_reviews
+        ]
 
         self.assertEqual(len(submission_peer_review_list), 2)
         self.assertIsInstance(submission_peer_review_list[0], PeerReview)
 
     # upload_comment()
     def test_upload_comment(self, m):
-        register_uris({'submission': [
-            'upload_comment',
-            'upload_comment_final',
-            'edit',
-        ]}, m)
+        register_uris(
+            {'submission': ['upload_comment', 'upload_comment_final', 'edit']}, m
+        )
 
         filename = 'testfile_submission_{}'.format(uuid.uuid4().hex)
 
@@ -110,11 +104,9 @@ class TestSubmission(unittest.TestCase):
             cleanup_file(filename)
 
     def test_upload_comment_section(self, m):
-        register_uris({'submission': [
-            'upload_comment',
-            'upload_comment_final',
-            'edit',
-        ]}, m)
+        register_uris(
+            {'submission': ['upload_comment', 'upload_comment_final', 'edit']}, m
+        )
 
         filename = 'testfile_submission_{}'.format(uuid.uuid4().hex)
 
@@ -127,3 +119,41 @@ class TestSubmission(unittest.TestCase):
             self.assertIn('url', response[1])
         finally:
             cleanup_file(filename)
+
+
+class TestGroupedSubmission(unittest.TestCase):
+    def setUp(self):
+        self.canvas = Canvas(settings.BASE_URL, settings.API_KEY)
+
+        self.grouped_submission = GroupedSubmission(
+            self.canvas._Canvas__requester,
+            {
+                'user_id': 1,
+                'submissions': [
+                    {
+                        'id': 1,
+                        'assignment_id': 1,
+                        'user_id': 1,
+                        "html_url": "https://example.com/courses/1/assignments/1/submissions/1",
+                        "submission_type": "online_upload",
+                    }
+                ],
+            },
+        )
+
+    # __init__()
+    def test__init__no_submission_key(self):
+        grouped_submission = GroupedSubmission(
+            self.canvas._Canvas__requester, {'user_id': 1}
+        )
+
+        self.assertIsInstance(grouped_submission, GroupedSubmission)
+        self.assertTrue(hasattr(grouped_submission, 'submissions'))
+        self.assertIsInstance(grouped_submission.submissions, list)
+        self.assertEqual(len(grouped_submission.submissions), 0)
+
+    # __str__()
+    def test__str__(self):
+        string = str(self.grouped_submission)
+        self.assertIsInstance(string, str)
+        self.assertEqual(string, '1 submission(s) for User #1')
diff --git a/tests/test_util.py b/tests/test_util.py
index d52eb8e..2c7ffda 100644
--- a/tests/test_util.py
+++ b/tests/test_util.py
@@ -8,7 +8,12 @@ from canvasapi import Canvas
 from canvasapi.course import CourseNickname
 from canvasapi.user import User
 from canvasapi.util import (
-    combine_kwargs, get_institution_url, is_multivalued, obj_or_id, file_or_path
+    combine_kwargs,
+    get_institution_url,
+    is_multivalued,
+    obj_or_id,
+    file_or_path,
+    normalize_bool,
 )
 from itertools import chain
 from six import integer_types, iterkeys, itervalues, iteritems, text_type
@@ -19,7 +24,6 @@ from tests.util import cleanup_file, register_uris
 
 @requests_mock.Mocker()
 class TestUtil(unittest.TestCase):
-
     def setUp(self):
         self.canvas = Canvas(settings.BASE_URL, settings.API_KEY)
 
@@ -79,6 +83,7 @@ class TestUtil(unittest.TestCase):
     def test_is_multivalued_generator_call(self, m):
         def yielder():
             yield 'item'
+
         self.assertTrue(is_multivalued(yielder()))
 
     def test_is_multivalued_chain(self, m):
@@ -536,3 +541,22 @@ class TestUtil(unittest.TestCase):
 
         with self.assertRaises(IOError):
             handler, is_path = file_or_path(filename)
+
+    # normalize_bool()
+    def test_normalize_bool_boolean(self, m):
+        self.assertTrue(normalize_bool(True, "value"))
+        self.assertFalse(normalize_bool(False, "value"))
+
+    def test_normalize_bool_str_lower(self, m):
+        self.assertTrue(normalize_bool("true", "value"))
+        self.assertFalse(normalize_bool("false", "value"))
+
+    def test_normalize_bool_str_upper(self, m):
+        self.assertTrue(normalize_bool("True", "value"))
+        self.assertFalse(normalize_bool("False", "value"))
+
+    def test_normalize_bool_str_invalid(self, m):
+        with self.assertRaises(ValueError) as cm:
+            normalize_bool("invalid", "value")
+
+        self.assertIn("Parameter `value` must", cm.exception.args[0])

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov flake8 requests_mock
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/ucfopen/canvasapi.git@75869c101b32ff971196ec8b8fe8a77b903a6714#egg=canvasapi
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==7.8.0
exceptiongroup==1.2.2
flake8==7.2.0
idna==3.10
iniconfig==2.1.0
mccabe==0.7.0
packaging==24.2
pluggy==1.5.0
pycodestyle==2.13.0
pyflakes==3.3.1
pytest==8.3.5
pytest-cov==6.0.0
pytz==2025.2
requests==2.32.3
requests-mock==1.12.1
six==1.17.0
tomli==2.2.1
urllib3==2.3.0

name: canvasapi
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==7.8.0
      - exceptiongroup==1.2.2
      - flake8==7.2.0
      - idna==3.10
      - iniconfig==2.1.0
      - mccabe==0.7.0
      - packaging==24.2
      - pluggy==1.5.0
      - pycodestyle==2.13.0
      - pyflakes==3.3.1
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - pytz==2025.2
      - requests==2.32.3
      - requests-mock==1.12.1
      - six==1.17.0
      - tomli==2.2.1
      - urllib3==2.3.0
prefix: /opt/conda/envs/canvasapi

tests/test_course.py::TestCourse::test__str__ tests/test_course.py::TestCourse::test_add_grading_standards tests/test_course.py::TestCourse::test_add_grading_standards_empty_list tests/test_course.py::TestCourse::test_add_grading_standards_missing_name_key tests/test_course.py::TestCourse::test_add_grading_standards_missing_value_key tests/test_course.py::TestCourse::test_add_grading_standards_non_dict_list tests/test_course.py::TestCourse::test_conclude tests/test_course.py::TestCourse::test_create_assignment tests/test_course.py::TestCourse::test_create_assignment_fail tests/test_course.py::TestCourse::test_create_assignment_group tests/test_course.py::TestCourse::test_create_assignment_overrides tests/test_course.py::TestCourse::test_create_content_migration tests/test_course.py::TestCourse::test_create_content_migration_bad_migration_type tests/test_course.py::TestCourse::test_create_content_migration_migrator tests/test_course.py::TestCourse::test_create_course_section tests/test_course.py::TestCourse::test_create_discussion_topic tests/test_course.py::TestCourse::test_create_epub_export tests/test_course.py::TestCourse::test_create_external_feed tests/test_course.py::TestCourse::test_create_external_tool tests/test_course.py::TestCourse::test_create_folder tests/test_course.py::TestCourse::test_create_group_category tests/test_course.py::TestCourse::test_create_module tests/test_course.py::TestCourse::test_create_module_fail tests/test_course.py::TestCourse::test_create_page tests/test_course.py::TestCourse::test_create_page_fail tests/test_course.py::TestCourse::test_create_quiz tests/test_course.py::TestCourse::test_create_quiz_fail tests/test_course.py::TestCourse::test_delete tests/test_course.py::TestCourse::test_delete_external_feed tests/test_course.py::TestCourse::test_edit_front_page tests/test_course.py::TestCourse::test_enroll_user tests/test_course.py::TestCourse::test_export_content tests/test_course.py::TestCourse::test_get_assignment tests/test_course.py::TestCourse::test_get_assignment_group tests/test_course.py::TestCourse::test_get_assignment_groups tests/test_course.py::TestCourse::test_get_assignment_overrides tests/test_course.py::TestCourse::test_get_assignments tests/test_course.py::TestCourse::test_get_blueprint tests/test_course.py::TestCourse::test_get_blueprint_default tests/test_course.py::TestCourse::test_get_content_migration tests/test_course.py::TestCourse::test_get_content_migrations tests/test_course.py::TestCourse::test_get_course_level_assignment_data tests/test_course.py::TestCourse::test_get_course_level_participation_data tests/test_course.py::TestCourse::test_get_course_level_student_summary_data tests/test_course.py::TestCourse::test_get_discussion_topic tests/test_course.py::TestCourse::test_get_discussion_topics tests/test_course.py::TestCourse::test_get_enrollments tests/test_course.py::TestCourse::test_get_epub_export tests/test_course.py::TestCourse::test_get_external_feeds tests/test_course.py::TestCourse::test_get_external_tool tests/test_course.py::TestCourse::test_get_external_tools tests/test_course.py::TestCourse::test_get_file tests/test_course.py::TestCourse::test_get_files tests/test_course.py::TestCourse::test_get_folder tests/test_course.py::TestCourse::test_get_folders tests/test_course.py::TestCourse::test_get_full_discussion_topic tests/test_course.py::TestCourse::test_get_grading_period tests/test_course.py::TestCourse::test_get_grading_periods tests/test_course.py::TestCourse::test_get_grading_standards tests/test_course.py::TestCourse::test_get_group_categories tests/test_course.py::TestCourse::test_get_groups tests/test_course.py::TestCourse::test_get_migration_systems tests/test_course.py::TestCourse::test_get_module tests/test_course.py::TestCourse::test_get_modules tests/test_course.py::TestCourse::test_get_multiple_submissions tests/test_course.py::TestCourse::test_get_multiple_submissions_grouped_false tests/test_course.py::TestCourse::test_get_multiple_submissions_grouped_invalid tests/test_course.py::TestCourse::test_get_multiple_submissions_grouped_true tests/test_course.py::TestCourse::test_get_outcome_group tests/test_course.py::TestCourse::test_get_outcome_groups_in_context tests/test_course.py::TestCourse::test_get_outcome_import_status tests/test_course.py::TestCourse::test_get_outcome_import_status_latest tests/test_course.py::TestCourse::test_get_outcome_links_in_context tests/test_course.py::TestCourse::test_get_outcome_result_rollups tests/test_course.py::TestCourse::test_get_outcome_results tests/test_course.py::TestCourse::test_get_page tests/test_course.py::TestCourse::test_get_pages tests/test_course.py::TestCourse::test_get_quiz tests/test_course.py::TestCourse::test_get_quiz_fail tests/test_course.py::TestCourse::test_get_quizzes tests/test_course.py::TestCourse::test_get_recent_students tests/test_course.py::TestCourse::test_get_root_outcome_group tests/test_course.py::TestCourse::test_get_rubric tests/test_course.py::TestCourse::test_get_rubrics tests/test_course.py::TestCourse::test_get_section tests/test_course.py::TestCourse::test_get_sections tests/test_course.py::TestCourse::test_get_settings tests/test_course.py::TestCourse::test_get_single_grading_standard tests/test_course.py::TestCourse::test_get_tabs tests/test_course.py::TestCourse::test_get_user tests/test_course.py::TestCourse::test_get_user_id_type tests/test_course.py::TestCourse::test_get_user_in_a_course_level_assignment_data tests/test_course.py::TestCourse::test_get_user_in_a_course_level_messaging_data tests/test_course.py::TestCourse::test_get_user_in_a_course_level_participation_data tests/test_course.py::TestCourse::test_get_users tests/test_course.py::TestCourse::test_import_outcome_binary tests/test_course.py::TestCourse::test_import_outcome_filepath tests/test_course.py::TestCourse::test_import_outcome_id tests/test_course.py::TestCourse::test_import_outcome_ioerror tests/test_course.py::TestCourse::test_list_blueprint_subscriptions tests/test_course.py::TestCourse::test_list_content_exports tests/test_course.py::TestCourse::test_preview_html tests/test_course.py::TestCourse::test_reorder_pinned_topics tests/test_course.py::TestCourse::test_reorder_pinned_topics_comma_separated_string tests/test_course.py::TestCourse::test_reorder_pinned_topics_invalid_input tests/test_course.py::TestCourse::test_reorder_pinned_topics_tuple tests/test_course.py::TestCourse::test_reset tests/test_course.py::TestCourse::test_set_extensions_empty_list tests/test_course.py::TestCourse::test_set_extensions_missing_key tests/test_course.py::TestCourse::test_set_extensions_non_dicts tests/test_course.py::TestCourse::test_set_extensions_not_list tests/test_course.py::TestCourse::test_set_quiz_extensions tests/test_course.py::TestCourse::test_show_content_export tests/test_course.py::TestCourse::test_show_front_page tests/test_course.py::TestCourse::test_submissions_bulk_update tests/test_course.py::TestCourse::test_update tests/test_course.py::TestCourse::test_update_assignment_overrides tests/test_course.py::TestCourse::test_update_settings tests/test_course.py::TestCourse::test_upload tests/test_course.py::TestCourseNickname::test__str__ tests/test_course.py::TestCourseNickname::test_remove tests/test_section.py::TestSection::test__str__ tests/test_section.py::TestSection::test_cross_list_section tests/test_section.py::TestSection::test_decross_list_section tests/test_section.py::TestSection::test_delete tests/test_section.py::TestSection::test_edit tests/test_section.py::TestSection::test_get_assignment_override tests/test_section.py::TestSection::test_get_enrollments tests/test_section.py::TestSection::test_get_multiple_submissions tests/test_section.py::TestSection::test_get_multiple_submissions_grouped_false tests/test_section.py::TestSection::test_get_multiple_submissions_grouped_invalid tests/test_section.py::TestSection::test_get_multiple_submissions_grouped_true tests/test_section.py::TestSection::test_submissions_bulk_update tests/test_submission.py::TestGroupedSubmission::test__init__no_submission_key tests/test_submission.py::TestGroupedSubmission::test__str__ tests/test_util.py::TestUtil::test_combine_kwargs_dict_list_dict tests/test_util.py::TestUtil::test_combine_kwargs_empty tests/test_util.py::TestUtil::test_combine_kwargs_multiple_dicts tests/test_util.py::TestUtil::test_combine_kwargs_multiple_mixed tests/test_util.py::TestUtil::test_combine_kwargs_multiple_nested_dicts tests/test_util.py::TestUtil::test_combine_kwargs_nested_dict tests/test_util.py::TestUtil::test_combine_kwargs_single tests/test_util.py::TestUtil::test_combine_kwargs_single_dict tests/test_util.py::TestUtil::test_combine_kwargs_single_generator_empty tests/test_util.py::TestUtil::test_combine_kwargs_single_generator_multiple_items tests/test_util.py::TestUtil::test_combine_kwargs_single_generator_single_item tests/test_util.py::TestUtil::test_combine_kwargs_single_list_empty tests/test_util.py::TestUtil::test_combine_kwargs_single_list_multiple_items tests/test_util.py::TestUtil::test_combine_kwargs_single_list_single_item tests/test_util.py::TestUtil::test_combine_kwargs_super_nested_dict tests/test_util.py::TestUtil::test_combine_kwargs_the_gauntlet tests/test_util.py::TestUtil::test_file_or_path_file tests/test_util.py::TestUtil::test_file_or_path_invalid_path tests/test_util.py::TestUtil::test_file_or_path_valid_path tests/test_util.py::TestUtil::test_get_institution_url tests/test_util.py::TestUtil::test_is_multivalued_bool tests/test_util.py::TestUtil::test_is_multivalued_bytes tests/test_util.py::TestUtil::test_is_multivalued_chain tests/test_util.py::TestUtil::test_is_multivalued_dict tests/test_util.py::TestUtil::test_is_multivalued_dict_items tests/test_util.py::TestUtil::test_is_multivalued_dict_iter tests/test_util.py::TestUtil::test_is_multivalued_dict_keys tests/test_util.py::TestUtil::test_is_multivalued_dict_values tests/test_util.py::TestUtil::test_is_multivalued_generator_call tests/test_util.py::TestUtil::test_is_multivalued_generator_expr tests/test_util.py::TestUtil::test_is_multivalued_integer_types tests/test_util.py::TestUtil::test_is_multivalued_list tests/test_util.py::TestUtil::test_is_multivalued_list_iter tests/test_util.py::TestUtil::test_is_multivalued_set tests/test_util.py::TestUtil::test_is_multivalued_set_iter tests/test_util.py::TestUtil::test_is_multivalued_str tests/test_util.py::TestUtil::test_is_multivalued_tuple tests/test_util.py::TestUtil::test_is_multivalued_tuple_iter tests/test_util.py::TestUtil::test_is_multivalued_unicode tests/test_util.py::TestUtil::test_is_multivalued_zip tests/test_util.py::TestUtil::test_normalize_bool_boolean tests/test_util.py::TestUtil::test_normalize_bool_str_invalid tests/test_util.py::TestUtil::test_normalize_bool_str_lower tests/test_util.py::TestUtil::test_normalize_bool_str_upper tests/test_util.py::TestUtil::test_obj_or_id_int tests/test_util.py::TestUtil::test_obj_or_id_multiple_objs tests/test_util.py::TestUtil::test_obj_or_id_nonuser_self tests/test_util.py::TestUtil::test_obj_or_id_obj tests/test_util.py::TestUtil::test_obj_or_id_obj_no_id tests/test_util.py::TestUtil::test_obj_or_id_str_invalid tests/test_util.py::TestUtil::test_obj_or_id_str_valid tests/test_util.py::TestUtil::test_obj_or_id_user_self
tests/test_course.py::TestCourse::test_get_submission tests/test_course.py::TestCourse::test_list_assignment_groups tests/test_course.py::TestCourse::test_list_external_feeds tests/test_course.py::TestCourse::test_list_files tests/test_course.py::TestCourse::test_list_folders tests/test_course.py::TestCourse::test_list_gradeable_students tests/test_course.py::TestCourse::test_list_group_categories tests/test_course.py::TestCourse::test_list_groups tests/test_course.py::TestCourse::test_list_multiple_submissions tests/test_course.py::TestCourse::test_list_rubrics tests/test_course.py::TestCourse::test_list_sections tests/test_course.py::TestCourse::test_list_submissions tests/test_course.py::TestCourse::test_list_tabs tests/test_course.py::TestCourse::test_mark_submission_as_read tests/test_course.py::TestCourse::test_mark_submission_as_unread tests/test_course.py::TestCourse::test_submit_assignment tests/test_course.py::TestCourse::test_submit_assignment_fail tests/test_course.py::TestCourse::test_update_submission tests/test_course.py::TestCourse::test_update_tab tests/test_section.py::TestSection::test_get_submission tests/test_section.py::TestSection::test_list_multiple_submissions tests/test_section.py::TestSection::test_list_submissions tests/test_section.py::TestSection::test_mark_submission_as_read tests/test_section.py::TestSection::test_mark_submission_as_unread tests/test_section.py::TestSection::test_subit_assignment_fail tests/test_section.py::TestSection::test_submit_assignment tests/test_section.py::TestSection::test_update_submission tests/test_submission.py::TestSubmission::test__str__ tests/test_submission.py::TestSubmission::test_create_submission_peer_review tests/test_submission.py::TestSubmission::test_delete_submission_peer_review tests/test_submission.py::TestSubmission::test_edit tests/test_submission.py::TestSubmission::test_get_submission_peer_reviews tests/test_submission.py::TestSubmission::test_upload_comment tests/test_submission.py::TestSubmission::test_upload_comment_section
canvasapi/util.py canvasapi/submission.py CHANGELOG.md canvasapi/course.py canvasapi/section.py
canvasapi/util.py canvasapi/submission.py CHANGELOG.md canvasapi/course.py canvasapi/section.py