Skip to content

Commit 7311f67

Browse files
authored
Merge pull request #3153 from uw-it-aca/qa
Fix/muwm 5362 (#3152)
2 parents 0ac8c45 + 8e9a940 commit 7311f67

File tree

6 files changed

+81
-32
lines changed

6 files changed

+81
-32
lines changed

docker/prod-values.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
autoscaling:
22
enabled: true
33
minReplicas: 4
4-
maxReplicas: 120
4+
maxReplicas: 150
55
targetAverageUtilization: 100
66
resources:
77
limits:

myuw/dao/canvas.py

+46-27
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
from uw_canvas.sections import Sections
1010
from uw_canvas.courses import Courses
1111
from uw_canvas.models import CanvasCourse, CanvasSection
12-
from uw_sws.exceptions import InvalidCanvasIndependentStudyCourse
12+
from uw_sws.exceptions import (
13+
InvalidCanvasIndependentStudyCourse, InvalidCanvasSection)
1314
from myuw.dao import log_err
1415
from myuw.dao.pws import get_regid_of_current_user
1516
from myuw.dao.term import get_comparison_datetime
1617

1718
logger = logging.getLogger(__name__)
19+
canvas_enrollments = Enrollments()
1820

1921

2022
def canvas_prefetch():
@@ -26,9 +28,11 @@ def _method(request):
2628
def get_canvas_active_enrollments(request):
2729
if not hasattr(request, "canvas_act_enrollments"):
2830
request.canvas_act_enrollments = (
29-
Enrollments().get_enrollments_for_regid(
31+
canvas_enrollments.get_enrollments_for_regid(
3032
get_regid_of_current_user(request),
3133
{'type': ['StudentEnrollment'], 'state': ['active']}))
34+
logger.debug({'canvas_act_enrollments':
35+
request.canvas_act_enrollments[0].json_data()})
3236
return request.canvas_act_enrollments
3337

3438

@@ -37,34 +41,50 @@ def set_section_canvas_course_urls(canvas_active_enrollments, schedule,
3741
"""
3842
Set canvas_course_url in schedule.sections
3943
"""
40-
now = get_comparison_datetime(request)
41-
section_labels = set()
44+
canvas_sis_ids = {}
45+
# MUWM-5362 {canvas_section_sis_id: primary_section_label}
4246
for section in schedule.sections:
43-
section_labels.add(section.section_label())
47+
section_label = section.section_label()
4448

45-
canvas_links = {} # sis_course_id: canvas course_url
46-
for enrollment in canvas_active_enrollments:
47-
(sws_label, inst_regid) = sws_section_label(enrollment.sis_course_id)
48-
if sws_label is not None and sws_label in section_labels:
49-
sis_course_id = enrollment.sis_course_id
50-
if sis_course_id not in canvas_links:
51-
canvas_links[sis_course_id] = enrollment.course_url
52-
53-
for section in schedule.sections:
5449
try:
55-
section.canvas_course_url = canvas_links.get(
56-
section.canvas_course_sis_id())
50+
cid = section.canvas_course_sis_id()
51+
if cid not in canvas_sis_ids:
52+
canvas_sis_ids[cid] = section.primary_section_label()
5753
except InvalidCanvasIndependentStudyCourse as ex:
5854
# REQ3132940 known SWS issue:
5955
# prior quarter's registration data has
6056
# no independent study instructor.
6157
# If independent_study_instructor being None occurs
6258
# in current or future quarter, likely is a data error.
63-
if not section.term.is_past(now):
64-
log_err(logger,
65-
"{} {}".format(section.section_label(), ex),
66-
traceback, request)
67-
pass
59+
log_err(
60+
logger, f"canvas_course_sis_id of {section_label} {ex}",
61+
traceback, request)
62+
continue
63+
try:
64+
cid = section.canvas_section_sis_id()
65+
canvas_sis_ids[cid] = section.primary_section_label()
66+
except Exception as ex:
67+
log_err(
68+
logger, f"canvas_section_sis_id of {section_label} {ex}",
69+
traceback, request)
70+
logger.debug({'canvas_sis_ids': canvas_sis_ids})
71+
72+
canvas_links = {} # primary_section_label: canvas course_url
73+
for enrollment in canvas_active_enrollments:
74+
psection_label = None
75+
# MUWM-5362 check both course and section
76+
if enrollment.sis_section_id in canvas_sis_ids:
77+
psection_label = canvas_sis_ids[enrollment.sis_section_id]
78+
else:
79+
if enrollment.sis_course_id in canvas_sis_ids:
80+
psection_label = canvas_sis_ids[enrollment.sis_course_id]
81+
if psection_label and psection_label not in canvas_links:
82+
canvas_links[psection_label] = enrollment.course_url
83+
logger.debug({'canvas_links': canvas_links})
84+
85+
for section in schedule.sections:
86+
section.canvas_course_url = canvas_links.get(
87+
section.primary_section_label())
6888

6989

7090
def get_canvas_course_from_section(sws_section):
@@ -91,12 +111,11 @@ def get_canvas_course_url(sws_section, person):
91111
def sws_section_label(sis_id):
92112
canvas_section = CanvasSection(sis_section_id=sis_id)
93113
sws_label = canvas_section.sws_section_id()
94-
if sws_label is None:
95-
canvas_course = CanvasCourse(sis_course_id=sis_id)
96-
sws_label = canvas_course.sws_course_id()
97-
return (sws_label, canvas_course.sws_instructor_regid())
98-
else:
114+
if sws_label is not None:
99115
return (sws_label, canvas_section.sws_instructor_regid())
116+
canvas_course = CanvasCourse(sis_course_id=sis_id)
117+
sws_label = canvas_course.sws_course_id()
118+
return (sws_label, canvas_course.sws_instructor_regid())
100119

101120

102121
def get_viewable_course_sections(canvas_course_id, canvas_user_id):
@@ -108,7 +127,7 @@ def get_viewable_course_sections(canvas_course_id, canvas_user_id):
108127
limit_privileges_to_course_section = False
109128
limit_sections = {}
110129

111-
enrollments = Enrollments().get_enrollments_for_course(
130+
enrollments = canvas_enrollments.get_enrollments_for_course(
112131
canvas_course_id, params={'user_id': canvas_user_id})
113132

114133
for enrollment in enrollments:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<h1>Canvas Student Active Enrollments</h1>
2+
<form method="post" action="{{form_action}}">
3+
{% csrf_token %}
4+
<p>
5+
<label for="uwregid">UW NetID or RegID:</label>
6+
<input id="uwregid" name="uwregid" size="32" type="text">
7+
</p>
8+
<p>
9+
<input value="Submit" type="submit">
10+
</p>
11+
</form>

myuw/templates/supporttools/custom_sidebar_links.html

+7
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@ <h3>Web Services</h3>
4747
</li>
4848
{% endif %}
4949

50+
{% url 'myuw_rest_search' 'canvas' 'active_enrollments.html' as canvas_url %}
51+
{% if canvas_url %}
52+
<li>
53+
<a href="{{ canvas_url }}">Canvas Student</a>
54+
</li>
55+
{% endif %}
56+
5057
{% url 'myuw_rest_search' 'hfs' 'accounts.html' as hfs_url %}
5158
{% if hfs_url %}
5259
<li>

myuw/test/dao/test_canvas.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
from django.test import TestCase
5+
from restclients_core.exceptions import DataFailureException
56
from myuw.dao.canvas import (
67
get_canvas_active_enrollments, set_section_canvas_course_urls,
78
get_canvas_course_from_section,
@@ -29,9 +30,9 @@ def test_get_canvas_active_enrollments(self):
2930

3031
set_section_canvas_course_urls(canvas_active_enrollments,
3132
schedule, req)
32-
section1 = schedule.sections[0]
33+
section1 = schedule.sections[2]
3334
self.assertEqual(section1.section_label(),
34-
"2013,spring,PHYS,121/A")
35+
"2013,spring,PHYS,121/AQ")
3536
self.assertEqual(section1.canvas_course_url,
3637
'https://test.edu/courses/249652')
3738

@@ -60,15 +61,21 @@ def test_get_canvas_active_enrollments(self):
6061
self.assertEqual(section.section_label(), "2013,spring,TRAIN,101/A")
6162
self.assertIsNotNone(section.canvas_course_url)
6263

64+
req = get_request_with_user("jbothell")
65+
schedule = get_schedule_by_term(req, get_current_quarter(req))
66+
self.assertRaises(
67+
DataFailureException, get_canvas_active_enrollments, req)
68+
69+
def test_InvalidCanvasIndependentStudyCourse_case(self):
6370
req = get_request_with_user("jeos",
6471
get_request_with_date("2013-10-01"))
6572
schedule = get_schedule_by_term(req, get_current_quarter(req))
6673
canvas_active_enrollments = get_canvas_active_enrollments(req)
6774
self.assertIsNotNone(req.canvas_act_enrollments)
6875
set_section_canvas_course_urls(canvas_active_enrollments,
6976
schedule, req)
70-
with self.assertRaises(AttributeError):
71-
a = schedule.sections[0].canvas_course_url
77+
# InvalidCanvasIndependentStudyCourse
78+
self.assertIsNone(schedule.sections[0].canvas_course_url)
7279

7380
def test_get_canvas_course_url(self):
7481
person = Person()

myuw/views/rest_search.py

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ def get_proxy_url(self, request, service, url):
3333
"uw/json_utf8_202007.ubs",
3434
get_input_value(request.POST, "quarter"),
3535
get_input_value(request.POST, "sln1"))
36+
elif service == "canvas":
37+
regid = get_regid(get_input_value(request.POST, "uwregid"))
38+
url = (
39+
f"api/v1/users/sis_user_id:{regid}/enrollments?" +
40+
f"state[]=active&type[]=StudentEnrollment")
3641
elif service == "grad":
3742
params = self.format_params(request)
3843
params['id'] = get_student_system_key(params['id'])

0 commit comments

Comments
 (0)