Repository: ucfopen/canvasapi

Issue:
Issues with Reports coverage and functionality
Version: 0.10.0
Python version: 3.7

**1) Available Account Reports do not have IDs in Canvas**

In Canvas, the list of available reports do not have IDs. 

An available report has these fields: report, title, parameters
A report has these fields: id, report, file_url, attachment, status, created_at, started_at, ended_at, parameters, progress, current_line

In Account.py I see that there is a class for AccountReport. I wonder if there should be a class for AccountReport and another class called AvailableAccountReport or something similar? And then get_reports() would return a PaginatedList of type AvailableAccountReport.

I noticed this when doing the following:
```
reports = account.get_reports()

for report in reports:
    print(report)
```
The above code gave me this error:
```AttributeError: 'AccountReport' object has no attribute 'id'```
This is my workaround:
```
reports = account.get_reports()

for report in reports:
    print(report.attributes)
```

**2) Unless I missed it, the wrapper is missing most Report methods** 
I need functionality to start a report and get the status of a report. It looks like this isn't supported in the wrapper? 


Let me know what you think and I can create a fork with some fixes if you'd like.

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

Coverage remained the same at 100.0% when pulling **fe93aed6500150b8f1f1dfdc27b719fa16823054 on Mike-Nahmias:issue/206-print-account-report** into **309210681e28c58256ce5999a513b8a70f8aba31 on ucfopen:develop**.


Patch:
diff --git a/canvasapi/account.py b/canvasapi/account.py
index d03cea3..dca75ed 100644
--- a/canvasapi/account.py
+++ b/canvasapi/account.py
@@ -1925,7 +1925,11 @@ class AccountNotification(CanvasObject):
 @python_2_unicode_compatible
 class AccountReport(CanvasObject):
     def __str__(self):
-        return "{} ({})".format(self.report, self.id)
+        try:
+            return "{} ({})".format(self.report, self.id)
+        except AttributeError:
+            # Print params if not a report instance
+            return "{} ({})".format(self.report, self.parameters)
 
     def delete_report(self, **kwargs):
         """


Test patch:
diff --git a/tests/fixtures/account.json b/tests/fixtures/account.json
index af424bc..9dd6b81 100644
--- a/tests/fixtures/account.json
+++ b/tests/fixtures/account.json
@@ -578,10 +578,12 @@
 		"endpoint": "accounts/1/reports",
 		"data": [
 			{
-				"id": 1
+				"id": 1,
+				"report": "sis_export_csv"
 			},
 			{
-				"id": 2
+				"id": 2,
+				"report": "grade_export_csv"
 			}
 		],
 		"headers": {
diff --git a/tests/test_account.py b/tests/test_account.py
index e79d275..3cd8f35 100644
--- a/tests/test_account.py
+++ b/tests/test_account.py
@@ -286,6 +286,7 @@ class TestAccount(unittest.TestCase):
         self.assertIsInstance(report, AccountReport)
         self.assertTrue(hasattr(report, "title"))
         self.assertEqual(report.title, "Zero Activity")
+        self.assertIsInstance(str(report), str)
 
     # get_index_of_reports()
     def test_get_index_of_reports(self, m):
@@ -310,6 +311,7 @@ class TestAccount(unittest.TestCase):
         self.assertEqual(len(reports_list), 4)
         self.assertIsInstance(reports_list[0], AccountReport)
         self.assertTrue(hasattr(reports_list[0], "id"))
+        self.assertIsInstance(str(reports_list[0]), str)
 
     # get_subaccounts()
     def test_get_subaccounts(self, m):