Skip to content

Commit 625f9fa

Browse files
committed
fix: Include start/end dates for external course run
exit
1 parent 7f12c12 commit 625f9fa

File tree

3 files changed

+49
-15
lines changed

3 files changed

+49
-15
lines changed

course_discovery/apps/api/tests/test_utils.py

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,16 +116,19 @@ def make_studio_data(self, run, add_pacing=True, add_schedule=True, team=None, a
116116
}
117117
if add_pacing:
118118
data['pacing_type'] = run.pacing_type
119-
if add_schedule:
120-
data['schedule'] = {
121-
'start': serialize_datetime(run.start),
122-
'end': serialize_datetime(run.end),
123-
}
124-
if add_enrollment_dates:
125-
data['schedule'] = {
126-
'enrollment_start': serialize_datetime(run.enrollment_start),
127-
'enrollment_end': serialize_datetime(run.enrollment_end),
128-
}
119+
120+
if add_schedule or add_enrollment_dates:
121+
data['schedule'] = {}
122+
if add_schedule:
123+
data['schedule'].update({
124+
'start': serialize_datetime(run.start),
125+
'end': serialize_datetime(run.end),
126+
})
127+
if add_enrollment_dates:
128+
data['schedule'].update({
129+
'enrollment_start': serialize_datetime(run.enrollment_start),
130+
'enrollment_end': serialize_datetime(run.enrollment_end),
131+
})
129132
return data
130133

131134
def test_create_rerun(self):
@@ -217,6 +220,32 @@ def test_generate_data_for_studio_api__external_course_missing_enrollment_dates(
217220
f'Enrollment information added to data {output_data} for course run {run.key}'
218221
)
219222

223+
def test_generate_data_for_studio_api__non_external_course_no_start_end_on_update(self):
224+
"""Test that start/end are NOT included when updating a non-external course."""
225+
run = CourseRunFactory() # Default: non-external
226+
expected_data = self.make_studio_data(run, add_pacing=False, add_schedule=False, add_enrollment_dates=True)
227+
with mock.patch('course_discovery.apps.api.utils.logger') as mock_logger:
228+
output_data = StudioAPI.generate_data_for_studio_api(run, creating=False)
229+
self.assertEqual(output_data, expected_data)
230+
mock_logger.info.assert_called_with(
231+
f'Enrollment information added to data {output_data} for course run {run.key}'
232+
)
233+
234+
def test_generate_data_for_studio_api__external_course_start_end_on_update(self):
235+
"""Test that start/end are included for external course on update."""
236+
exec_ed_type = CourseTypeFactory(slug=CourseType.EXECUTIVE_EDUCATION_2U)
237+
run = CourseRunFactory(course=CourseFactory(type=exec_ed_type))
238+
239+
expected_data = self.make_studio_data(run, add_pacing=False, add_schedule=True, add_enrollment_dates=True)
240+
241+
with mock.patch('course_discovery.apps.api.utils.logger') as mock_logger:
242+
output_data = StudioAPI.generate_data_for_studio_api(run, creating=False)
243+
self.assertEqual(output_data, expected_data)
244+
245+
mock_logger.info.assert_called_with(
246+
f'Enrollment information added to data {output_data} for course run {run.key}'
247+
)
248+
220249
def test_calculate_course_run_key_run_value_with_multiple_runs_per_trimester(self):
221250
start = datetime.datetime(2017, 2, 1)
222251

course_discovery/apps/api/utils.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,11 @@ def calculate_course_run_key_run_value(cls, course_num, start):
253253
def generate_data_for_studio_api(cls, course_run, creating, user=None):
254254
editors = [editor.user for editor in course_run.course.editors.all()]
255255
key = CourseKey.from_string(course_run.key)
256-
256+
is_external = course_run.course.is_external_course
257257
# start, end, and pacing are not sent on updates - Studio is where users edit them
258-
start = course_run.start if creating else None
259-
end = course_run.end if creating else None
258+
#Include start and end only if creating or if it's an external course during update
259+
start = course_run.start if creating or is_external else None
260+
end = course_run.end if creating or is_external else None
260261
pacing = course_run.pacing_type if creating else None
261262
enrollment_start = course_run.enrollment_start
262263
enrollment_end = course_run.enrollment_end
@@ -300,10 +301,12 @@ def generate_data_for_studio_api(cls, course_run, creating, user=None):
300301
# But when the course run is created, in Studio or Discovery, the enrollment dates are not taken as input.
301302
# It is better to keep the flow consistent across places.
302303
# Allow sending enrollment start and end dates as part of Update only.
303-
data['schedule'] = {
304+
# An empty dictionary is created. This prevents overwriting or throwing a KeyError when updating enrollment-related schedule fields.
305+
data.setdefault('schedule', {})
306+
data['schedule'].update({
304307
'enrollment_start': serialize_datetime(course_run.enrollment_start),
305308
'enrollment_end': serialize_datetime(course_run.enrollment_end),
306-
}
309+
})
307310
logger.info(f"Enrollment information added to data {data} for course run {course_run.key}")
308311

309312
return data

course_discovery/apps/course_metadata/data_loaders/csv_loader.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,8 @@ def update_course_run_api_request_data(self, course_run_data, course_run, course
481481
'prices': self.get_pricing_representation(course_run_data['verified_price'], course_type),
482482
'staff': staff_uuids,
483483
'draft': is_draft,
484+
'start': self.get_formatted_datetime_string(f"{course_run_data['start_date']} {course_run_data['start_time']}"),
485+
'end': self.get_formatted_datetime_string(f"{course_run_data['end_date']} {course_run_data['end_time']}"),
484486

485487
'weeks_to_complete': course_run_data['length'],
486488
'min_effort': course_run_data['minimum_effort'],

0 commit comments

Comments
 (0)