• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

uw-it-aca / canvas-sis-provisioner / 4147136751

pending completion
4147136751

Pull #754

github

GitHub
Merge f4e8d5f13 into 58b7dd6e7
Pull Request #754: Develop

128 of 128 new or added lines in 6 files covered. (100.0%)

4322 of 7781 relevant lines covered (55.55%)

0.56 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/sis_provisioner/management/commands/backfill_courses.py
1
# Copyright 2023 UW-IT, University of Washington
2
# SPDX-License-Identifier: Apache-2.0
3

4

5
from django.core.management.base import BaseCommand, CommandError
×
6
from django.core.files.storage import default_storage
×
7
from django.db.utils import IntegrityError
×
8
from django.utils.timezone import utc
×
9
from sis_provisioner.dao.canvas import update_course_sis_id
×
10
from sis_provisioner.dao.course import adhoc_course_sis_id
×
11
from sis_provisioner.models.course import Course
×
12
from uw_canvas.terms import Terms
×
13
from dateutil.parser import parse
×
14
from dateutil.parser._parser import ParserError
×
15
from logging import getLogger
×
16
import codecs
×
17
import csv
×
18

19
logger = getLogger(__name__)
×
20

21

22
class Command(BaseCommand):
×
23
    help = "Insert courses from file."
×
24

25
    def add_arguments(self, parser):
×
26
        parser.add_argument(
×
27
            'course_file', help='Course file path')
28

29
    def get_all_terms(self):
×
30
        terms = {}
×
31
        for term in Terms().get_all_terms():
×
32
            terms[str(term.term_id)] = term.sis_term_id or 'default'
×
33
        return terms
×
34

35
    def handle(self, *args, **options):
×
36
        course_file = options.get('course_file')
×
37
        terms = self.get_all_terms()
×
38

39
        with default_storage.open(course_file, mode='r') as csvfile:
×
40
            reader = csv.reader(codecs.iterdecode(csvfile, 'utf-8'))
×
41
            next(reader)
×
42

43
            for row in reader:
×
44
                canvas_id = row[1]
×
45
                term_id = row[4].lstrip('1').lstrip('0')
×
46
                sis_source_id = row[12]
×
47
                try:
×
48
                    created_at = parse(row[8]).replace(tzinfo=utc)
×
49
                except ParserError as ex:
×
50
                    pass
×
51

52
                try:
×
53
                    course = Course.objects.find_course(
×
54
                        canvas_id, sis_source_id)
55
                    if course.expiration_date is None:
×
56
                        # Backfill sis course with new attrs
57
                        course.course_id = sis_source_id
×
58
                        course.canvas_course_id = canvas_id
×
59
                        course.created_date = created_at
×
60
                        course.expiration_date = \
×
61
                            course.default_expiration_date()
62
                        course.save()
×
63

64
                except Course.DoesNotExist:
×
65
                    course = Course(
×
66
                        course_id=sis_source_id,
67
                        canvas_course_id=canvas_id,
68
                        course_type=Course.ADHOC_TYPE,
69
                        term_id=terms.get(term_id),
70
                        created_date=created_at,
71
                        priority=Course.PRIORITY_NONE)
72
                    course.expiration_date = course.default_expiration_date()
×
73
                    course.save()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc