예제 #1
0
 def test_update_external_tool_in_account(self, mock_update):
     canvas = ExternalTools()
     canvas.update_external_tool_in_account(
         "11111", "222222", self.json_data)
     mock_update.assert_called_with(
         '/api/v1/accounts/11111/external_tools/222222',
         body=self.json_data)
예제 #2
0
    def test_get_sessionless_launch_from_course_sis_id(self):
        canvas = ExternalTools()

        launch = canvas.get_sessionless_launch_url_from_course_sis_id(
            '54321', '2015-autumn-UWBW-301-A')

        self.assertEquals(launch['id'], 54321, "Has correct tool id")
예제 #3
0
 def test_update_external_tool_in_course(self, mock_update):
     canvas = ExternalTools()
     canvas.update_external_tool_in_course(
         "123456", "222222", self.json_data)
     mock_update.assert_called_with(
         '/api/v1/courses/123456/external_tools/222222',
         body=self.json_data)
예제 #4
0
    def test_get_sessionless_launch_from_account_sis_id(self):
        canvas = ExternalTools()

        launch = canvas.get_sessionless_launch_url_from_account(
            '54321', '12345')

        self.assertEquals(launch['id'], 54321, "Has correct tool id")
예제 #5
0
    def test_get_external_tools_in_account(self):
        canvas = ExternalTools()

        tools = canvas.get_external_tools_in_account('12345')

        self.assertEquals(len(tools), 12, "Correct tools length")
        self.assertEquals(tools[10]['name'], "Tool", "Name is Correct")
    def handle(self, *args, **options):
        self._canvas = Canvas()
        self._tools = ExternalTools()
        self._accounts = Accounts()
        self._courses = Courses()
        self._options = options

        csv.register_dialect("unix_newline", lineterminator="\n")
        self._writer = csv.writer(sys.stdout, dialect="unix_newline")

        self._headers = [
            'tool_name', 'tool_id', 'tool_type', 'account_name', 'account_id'
        ]

        if self._options['courses']:
            self._headers.append('course_name')
            self._headers.append('course_id')
            self._headers.append('term')

        if options['sessionless']:
            self._headers.append('sessionless url')

        if re.match(r'^\d+$', options['account_id']):
            account = self._accounts.get_account(options['account_id'])
        else:
            account = self._accounts.get_account_by_sis_id(
                options['account_id'])

        try:
            self.report_external_tools(account)

        except DataFailureException as err:
            if err.status == 404:
                print('Unknown Sub-Account \"%s\"' % (options['account_id']),
                      file=sys.stderr)
예제 #7
0
    def test_get_external_tools_in_course_by_sis_id(self):
        canvas = ExternalTools()

        tools = canvas.get_external_tools_in_course_by_sis_id(
            '2015-autumn-UWBW-301-A')

        self.assertEquals(len(tools), 2, "Correct tools length")
        self.assertEquals(
            tools[1]['name'], 'Course Tool', "Has correct tool name")
예제 #8
0
def delete_external_tool(account_id, external_tool_id):
    return ExternalTools().delete_external_tool_in_account(
        account_id, external_tool_id)
예제 #9
0
def update_external_tool(account_id, external_tool_id, config):
    return ExternalTools().update_external_tool_in_account(
        account_id, external_tool_id, config)
예제 #10
0
def create_external_tool(account_id, config):
    if 'id' in config:
        del config['id']
    return ExternalTools().create_external_tool_in_account(account_id, config)
예제 #11
0
def get_external_tools(account_id):
    return ExternalTools(per_page=100).get_external_tools_in_account(
        account_id)
예제 #12
0
 def test_delete_external_tool_in_account(self, mock_delete):
     canvas = ExternalTools()
     canvas.delete_external_tool_in_account("11111", "222222")
     mock_delete.assert_called_with(
         '/api/v1/accounts/11111/external_tools/222222')
예제 #13
0
 def test_delete_external_tool_in_course(self, mock_delete):
     canvas = ExternalTools()
     canvas.delete_external_tool_in_course("123456", "222222")
     mock_delete.assert_called_with(
         '/api/v1/courses/123456/external_tools/222222')
class Command(BaseCommand):
    help = "Report externals tools in account"

    def add_arguments(self, parser):
        parser.add_argument(
            '-a',
            '--account',
            action='store',
            dest='account_id',
            default=default_account,
            help=('show external tools in account by id or '
                  'sis_id (default: {})').format(default_account))
        parser.add_argument('-r',
                            '--recurse',
                            action='store_true',
                            dest='recurse',
                            default=False,
                            help='recurse through subaccounts')
        parser.add_argument('-c',
                            '--courses',
                            action='store_true',
                            dest='courses',
                            default=False,
                            help='include account courses in report')
        parser.add_argument('-t',
                            '--term',
                            action='store',
                            dest='term',
                            default='',
                            help='include only courses in given term')
        parser.add_argument(
            '-s',
            '--sessionless-url',
            action='store_true',
            dest='sessionless',
            default=False,
            help='show sessionless url with each external tool')

    def handle(self, *args, **options):
        self._canvas = Canvas()
        self._tools = ExternalTools()
        self._accounts = Accounts()
        self._courses = Courses()
        self._options = options

        csv.register_dialect("unix_newline", lineterminator="\n")
        self._writer = csv.writer(sys.stdout, dialect="unix_newline")

        self._headers = [
            'tool_name', 'tool_id', 'tool_type', 'account_name', 'account_id'
        ]

        if self._options['courses']:
            self._headers.append('course_name')
            self._headers.append('course_id')
            self._headers.append('term')

        if options['sessionless']:
            self._headers.append('sessionless url')

        if re.match(r'^\d+$', options['account_id']):
            account = self._accounts.get_account(options['account_id'])
        else:
            account = self._accounts.get_account_by_sis_id(
                options['account_id'])

        try:
            self.report_external_tools(account)

        except DataFailureException as err:
            if err.status == 404:
                print('Unknown Sub-Account \"%s\"' % (options['account_id']),
                      file=sys.stderr)

    def report_external_tools(self, account):
        tools = self._tools.get_external_tools_in_account(account.account_id)
        self._print_tools(tools, account)

        if self._options['courses']:
            params = {
                "by_subaccounts": [account.account_id],
                "include": ["term"]
            }

            if self._options['term']:
                params['enrollment_term_id'] = self._canvas.get_term_by_sis_id(
                    self._options['term']).term_id

            courses = self._courses.get_published_courses_in_account(
                account.account_id, params=params)
            for course in courses:
                tools = self._tools.get_external_tools_in_course(
                    course.course_id)
                self._print_tools(tools, account, course)

        if self._options['recurse']:
            subaccounts = self._accounts.get_sub_accounts(account.account_id)
            for account in subaccounts:
                self.report_external_tools(account)

    def _print_tools(self, tools, account, course=None):
        if len(tools):
            if self._headers:
                self._writer.writerow(self._headers)
                self._headers = None

            for tool in tools:
                tool_types = []
                for tt in ['account', 'course', 'user']:
                    if tool.get("{}_navigation".format(tt)):
                        tool_types.append(tt)

                tool_type = ' & '.join(tool_types)
                line = [
                    tool['name'], tool['id'], tool_type, account.name,
                    account.account_id
                ]

                if self._options['courses']:
                    if course:
                        line.extend([
                            course.name, course.course_id,
                            course.term.name if course.term else ''
                        ])
                    else:
                        line.extend(['', '', ''])

                if self._options['sessionless']:
                    try:
                        tools = self._tools
                        url = tools.get_sessionless_launch_url_from_account(
                            tool['id'], account.account_id)
                        line.append(url['url'])
                    except DataFailureException as ex:
                        line.append('')

                self._writer.writerow(line)