diff --git a/Dockerfile b/Dockerfile index 3cf2a74..fe950da 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,12 @@ # syntax=docker/dockerfile:experimental -FROM 482956169056.dkr.ecr.us-east-1.amazonaws.com/uw/python-postgres-build:v0.3 as build +FROM 482956169056.dkr.ecr.us-east-1.amazonaws.com/uw/python-postgres-build:v0.5 as build COPY canvas_manage_course/requirements/*.txt /code/ RUN --mount=type=ssh,id=build_ssh_key ./python_venv/bin/pip3 install wheel gunicorn && ./python_venv/bin/pip3 install -r aws.txt COPY . /code/ RUN chmod a+x /code/docker-entrypoint.sh -FROM 482956169056.dkr.ecr.us-east-1.amazonaws.com/uw/python-postgres-base:v0.3 +FROM 482956169056.dkr.ecr.us-east-1.amazonaws.com/uw/python-postgres-base:v0.5 COPY --from=build /code /code/ ENV PYTHONUNBUFFERED 1 WORKDIR /code diff --git a/canvas_manage_course/requirements/base.txt b/canvas_manage_course/requirements/base.txt index e9bd6af..ea0d68f 100644 --- a/canvas_manage_course/requirements/base.txt +++ b/canvas_manage_course/requirements/base.txt @@ -1,5 +1,5 @@ -boto3==1.9.210 -Django==2.2.23 +boto3==1.21.35 +Django==2.2.27 cx-Oracle==7.2.2 django-allow-cidr==0.3.1 django-cached-authentication-middleware==0.2.2 @@ -7,8 +7,8 @@ django-redis-cache==2.0.0 hiredis==1.0.0 kitchen==1.2.4 redis==3.3.8 -psycopg2==2.7.3.2 -requests==2.22.0 +psycopg2==2.8.6 +requests==2.27.1 django-storages==1.7.1 django_rq==2.1.0 django-watchman==1.2.0 @@ -16,10 +16,10 @@ splunk_handler==2.2.0 python-json-logger==0.1.11 -git+ssh://git@github.com/penzance/canvas_python_sdk.git@v1.0#egg=canvas-python-sdk==1.0 -git+ssh://git@github.com/Harvard-University-iCommons/django-auth-lti.git@v2.0.1#egg=django-auth-lti==2.0.1 +git+ssh://git@github.com/penzance/canvas_python_sdk.git@v1.2.0#egg=canvas-python-sdk==1.2.0 +git+ssh://git@github.com/Harvard-University-iCommons/django-auth-lti.git@v2.0.4#egg=django-auth-lti==2.0.4 -git+ssh://git@github.com/Harvard-University-iCommons/django-icommons-common.git@v2.3#egg=django-icommons-common==2.3 +git+ssh://git@github.com/Harvard-University-iCommons/django-icommons-common.git@v2.5#egg=django-icommons-common==2.5 git+ssh://git@github.com/Harvard-University-iCommons/django-icommons-ui.git@v2.0#egg=django-icommons-ui==2.0 git+ssh://git@github.com/Harvard-University-iCommons/django-canvas-lti-school-permissions@v1.0#egg=django-canvas-lti-school-permissions==1.0 -git+ssh://git@github.com/Harvard-University-iCommons/django-ssm-parameter-store.git@v0.3#egg=django-ssm-parameter-store==0.3 +git+ssh://git@github.com/Harvard-University-iCommons/django-ssm-parameter-store.git@v0.6#egg=django-ssm-parameter-store==0.6 diff --git a/canvas_manage_course/settings/base.py b/canvas_manage_course/settings/base.py index 39c1cc2..1da9610 100644 --- a/canvas_manage_course/settings/base.py +++ b/canvas_manage_course/settings/base.py @@ -256,6 +256,16 @@ 'filters': ['require_debug_true'], }, }, + # This is the default logger for any apps or libraries that use the logger + # package, but are not represented in the `loggers` dict below. A level + # must be set and handlers defined. Setting this logger is equivalent to + # setting and empty string logger in the loggers dict below, but the separation + # here is a bit more explicit. See link for more details: + # https://docs.python.org/3.7/library/logging.config.html#dictionary-schema-details + 'root': { + 'level': logging.INFO, + 'handlers': ['default', 'console'], + }, 'loggers': { 'gunicorn': { 'handlers': ['gunicorn', 'console'], @@ -367,4 +377,3 @@ 'watchman.checks.databases', 'watchman.checks.caches', ) - diff --git a/manage_people/views.py b/manage_people/views.py index 47804b1..520cd15 100644 --- a/manage_people/views.py +++ b/manage_people/views.py @@ -434,6 +434,7 @@ def get_enrollments_added_through_tool(sis_course_id): (Q(source__isnull=True) | ~(Q(source__icontains='feed') | Q(source='xreg_map')))) for model in COURSE_MEMBER_CLASSES: + ids = None try: ids = list(model.objects.filter(query).values_list('user_id', 'role_id')) @@ -443,16 +444,21 @@ def get_enrollments_added_through_tool(sis_course_id): else: logger.debug('eligible %s members = %s', model._meta.db_table, ids) - eligible_ids.update(ids) + if ids: + eligible_ids.update(ids) logger.debug('full set of eligible user/role ids: %s', eligible_ids) # get a mapping of canvas role_id to UserRole ids canvas_role_to_user_role = get_canvas_to_user_role_id_map() + logger.debug(f'canvas_role_to_user_role: {canvas_role_to_user_role}') + # get the updated (or cached) Canvas role list so we can show the right # Canvas role labels for the enrollments canvas_roles_by_role_id = get_roles_for_account_id('self') + logger.debug(f'canvas_roles_by_role_id: {canvas_roles_by_role_id}') + # Further filter users to remove users who may not yet be be in canvas. # For the moment we are treating COURSEMANAGER as the single source of truth # for who should be enrolled in a course, but we also need to get Canvas @@ -462,6 +468,7 @@ def get_enrollments_added_through_tool(sis_course_id): filtered_enrollments = [] for enrollment in canvas_enrollments: + logger.debug(f'looking at canvas enrollment {enrollment}') if enrollment.get('user'): # If sis_user_id exists, use it; if not, use login_id; if neither # exist then log it and do not include @@ -469,10 +476,11 @@ def get_enrollments_added_through_tool(sis_course_id): enrollment['user'].get('login_id')) user_role_id = canvas_role_to_user_role[enrollment['role_id']] if user_id and (user_id, user_role_id) in eligible_ids: + logger.debug(f'looking up enrollment {user_id} role_id {enrollment.get("role_id")} in canvas_roles_by_role_id') enrollment.update({ 'user_role_id': user_role_id, 'canvas_role_label': canvas_roles_by_role_id.get( - enrollment['role_id'])['label']}) + enrollment['role_id'], {}).get('label', f'Unknown role {enrollment["role_id"]}')}) filtered_enrollments.append(enrollment) logger.debug('MP filter out registrar fed: Allowing (%s, %s)', user_id, user_role_id)