Commit 0627d608 by zubair-arbi Committed by Zubair Afzal

ENT-529

Populate course run effort values from Drupal API
parent 025c7b57
......@@ -2,6 +2,7 @@ import abc
import concurrent.futures
import datetime
import logging
import re
from urllib.parse import parse_qs, urlencode, urlparse
from uuid import UUID
......@@ -418,6 +419,7 @@ class CourseMarketingSiteDataLoader(AbstractMarketingSiteDataLoader):
end = data.get('field_course_end_date')
end = datetime.datetime.fromtimestamp(int(end), tz=pytz.UTC) if end else None
weeks_to_complete = data.get('field_course_required_weeks')
min_effort, max_effort = self.get_min_max_effort_per_week(data)
defaults = {
'key': key,
......@@ -435,6 +437,8 @@ class CourseMarketingSiteDataLoader(AbstractMarketingSiteDataLoader):
'video': course.video,
'course': course,
'short_description_override': self.clean_html(data['field_course_sub_title_short']) or None,
'min_effort': min_effort,
'max_effort': max_effort,
}
if weeks_to_complete:
......@@ -495,6 +499,26 @@ class CourseMarketingSiteDataLoader(AbstractMarketingSiteDataLoader):
hidden = data.get('field_couse_is_hidden', False)
return hidden is True
def get_min_max_effort_per_week(self, data):
"""
Parse effort value from drupal course data which have specific format.
"""
effort_per_week = data.get('field_course_effort', '')
min_effort = None
max_effort = None
# Ignore effort values in minutes
if not effort_per_week or 'minutes' in effort_per_week:
return min_effort, max_effort
effort_values = [int(keyword) for keyword in re.split(r'\s|-|–|,|\+|~', effort_per_week) if keyword.isdigit()]
if len(effort_values) == 1:
min_effort = effort_values[0]
if len(effort_values) == 2:
min_effort = effort_values[0]
max_effort = effort_values[1]
return min_effort, max_effort
def _get_objects_by_uuid(self, object_type, raw_objects_data):
uuids = [_object.get('uuid') for _object in raw_objects_data]
return object_type.objects.filter(uuid__in=uuids)
......
......@@ -335,6 +335,41 @@ class CourseMarketingSiteDataLoaderTests(AbstractMarketingSiteDataLoaderTestMixi
data = {'field_couse_is_hidden': hidden}
self.assertEqual(self.loader.get_hidden(data), expected)
@ddt.data(
(None, None, None),
('Browse at your own pace.', None, None),
('1.5 - 3.5 hours/week', None, None),
('8 hours/week', 8, None),
('2.5-5 hours.', 5, None),
('5+ hours per week', 5, None),
('3 horas por semana', 3, None),
('1 - 1.5 hours per week', 1, None),
('6 hours of video/300 multiple choice questions', 6, None),
('6 to 9 hours/week', 6, 9),
('4-6 hours per week', 4, 6),
('About 5-12 hrs/week.', 5, 12),
('4 - 8 hours/week | 小时/周', 4, 8),
('6 horas/semana, 6 hours/week', 6, 6),
('Estimated effort: 4–5 hours per week.', 4, 5),
('4-6 hours per week depending on the background of the student.', 4, 6),
('每周 2-3 小时 | 2-3 hours per week', None, None),
('Part 1: 3 hours; Part 2: 4 hours; Part 3: 2 hours', None, None),
('From 10 - 60 minutes, or as much time as you want.', None, None),
('3-4 hours per unit (recommended pace: 1 unit per week)', None, None),
('5-8 hours/week; 2-3 hours for lectures; 3-5 hours for homework/self-study', None, None),
)
@ddt.unpack
def test_get_min_max_effort_per_week(self, course_effort_string, expected_min_effort, expected_max_effort):
"""
Verify that the method `get_min_max_effort_per_week` correctly parses
most of the the effort values which have specific format and maps them
to min effort and max effort values.
"""
data = {'field_course_effort': course_effort_string}
min_effort, max_effort = self.loader.get_min_max_effort_per_week(data)
self.assertEqual(min_effort, expected_min_effort)
self.assertEqual(max_effort, expected_max_effort)
def test_get_hidden_missing(self):
"""Verify that the get_hidden method can cope with a missing field."""
self.assertEqual(self.loader.get_hidden({}), False)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment