coveralls: 
[![Coverage Status](https://coveralls.io/builds/29059259/badge)](https://coveralls.io/builds/29059259)

Coverage remained the same at 100.0% when pulling **fcbcc14c603bf18e37b18b61222d8914a86a0153 on Mike-Nahmias:issue/294-print-change-record-class** into **309210681e28c58256ce5999a513b8a70f8aba31 on ucfopen:develop**.

diff --git a/canvasapi/blueprint.py b/canvasapi/blueprint.py
index ad40862..f8e7fae 100644
--- a/canvasapi/blueprint.py
+++ b/canvasapi/blueprint.py
@@ -236,8 +236,8 @@ class BlueprintMigration(CanvasObject):
 
 @python_2_unicode_compatible
 class ChangeRecord(CanvasObject):
-    def __str__(self):  # pragma: no cover
-        return "{} {}".format(self.id, self.template_id)
+    def __str__(self):
+        return "{} {}".format(self.asset_id, self.asset_name)
 
 
 @python_2_unicode_compatible

Cannot print ChangeRecord class
# Describe the bug

Instances of the ChangeRecord class cannot be printed because the `__str__` method references attributes that don't exist on that object.

# To Reproduce

Steps to reproduce the behavior:

1. Get a blueprint course
2. Get a blueprint template
3. Iterate through unsynced changes and try to print them
4. You will get this error: AttributeError: 'ChangeRecord' object has no attribute 'id'

# Environment information (please complete the following information)

- Python version: 3.7.3
- CanvasAPI version: 0.14.0

# Additional context

Here is the definition of the ChangeRecord class:
```
@python_2_unicode_compatible
class ChangeRecord(CanvasObject):
    def __str__(self):  # pragma: no cover
        return "{} {}".format(self.id, self.template_id)
```

Here is Canvas's documented object:
https://canvas.instructure.com/doc/api/blueprint_courses.html#ChangeRecord
diff --git a/tests/test_blueprint.py b/tests/test_blueprint.py
index fd4b60a..6b3c3b7 100644
--- a/tests/test_blueprint.py
+++ b/tests/test_blueprint.py
@@ -196,3 +196,25 @@ class TestBlueprintMigration(unittest.TestCase):
         import_details = self.b_import.get_import_details()
         self.assertIsInstance(import_details, PaginatedList)
         self.assertIsInstance(import_details[0], ChangeRecord)
+
+
+@requests_mock.Mocker()
+class TestChangeRecord(unittest.TestCase):
+    def setUp(self):
+        self.canvas = Canvas(settings.BASE_URL, settings.API_KEY)
+
+        with requests_mock.Mocker() as m:
+            requires = {
+                "course": ["get_blueprint", "get_by_id"],
+                "blueprint": ["get_unsynced_changes"],
+            }
+            register_uris(requires, m)
+
+            self.course = self.canvas.get_course(1)
+            self.blueprint = self.course.get_blueprint(1)
+            self.change_record = self.blueprint.get_unsynced_changes()[0]
+
+    # __str__()
+    def test__str__(self, m):
+        string = str(self.change_record)
+        self.assertIsInstance(string, str)

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest requests-mock
apt-get update apt-get install -y gcc
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
-e git+https://github.com/ucfopen/canvasapi.git@29a894149d60d6be732e578eb5da8560bd6f67e0#egg=canvasapi
certifi==2021.5.30
charset-normalizer==2.0.12
idna==3.10
importlib-metadata==4.8.3
iniconfig==1.1.1
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
pytz==2025.2
requests==2.27.1
requests-mock==1.12.1
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.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
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - 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=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - charset-normalizer==2.0.12
      - idna==3.10
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytz==2025.2
      - requests==2.27.1
      - requests-mock==1.12.1
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/canvasapi

tests/test_blueprint.py::TestChangeRecord::test__str__
tests/test_blueprint.py::TestBlueprint::test__str__ tests/test_blueprint.py::TestBlueprint::test_associated_course_migration tests/test_blueprint.py::TestBlueprint::test_change_blueprint_restrictions tests/test_blueprint.py::TestBlueprint::test_get_associated_courses tests/test_blueprint.py::TestBlueprint::test_get_unsynced_changes tests/test_blueprint.py::TestBlueprint::test_list_blueprint_migrations tests/test_blueprint.py::TestBlueprint::test_show_blueprint_migration tests/test_blueprint.py::TestBlueprint::test_update_associated_courses tests/test_blueprint.py::TestBlueprintSubscription::test__str__ tests/test_blueprint.py::TestBlueprintSubscription::test_list_blueprint_imports tests/test_blueprint.py::TestBlueprintSubscription::test_show_blueprint_import tests/test_blueprint.py::TestBlueprintMigration::test__str__ tests/test_blueprint.py::TestBlueprintMigration::test_get_details tests/test_blueprint.py::TestBlueprintMigration::test_get_import_details
canvasapi/blueprint.py
canvasapi/blueprint.py