Skip to content

Commit

Permalink
feat: add course run fields for Algolia indexing
Browse files Browse the repository at this point in the history
  • Loading branch information
brobro10000 committed Aug 19, 2024
1 parent 04c4efa commit dd95380
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 1 deletion.
34 changes: 33 additions & 1 deletion enterprise_catalog/apps/catalog/algolia_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
DISCOVERY_AVERAGE_COURSE_REVIEW_CACHE_KEY,
)
from enterprise_catalog.apps.catalog.constants import (
ALGOLIA_DEFAULT_TIMESTAMP,
COURSE,
EXEC_ED_2U_COURSE_TYPE,
EXEC_ED_2U_READABLE_COURSE_TYPE,
Expand Down Expand Up @@ -1100,6 +1101,9 @@ def _get_course_run(full_course_run):
'max_effort': full_course_run.get('max_effort'),
'weeks_to_complete': full_course_run.get('weeks_to_complete'),
'upgrade_deadline': _get_verified_upgrade_deadline(full_course_run),
'enroll_by': _get_course_run_enroll_by_date(full_course_run),
'is_available': _get_is_available_course_run(full_course_run),
'status': full_course_run.get('status'),
}
return course_run

Expand Down Expand Up @@ -1198,7 +1202,35 @@ def _get_verified_upgrade_deadline(full_course_run):
vud_datetime = datetime.datetime.strptime(seat.get('upgrade_deadline'), '%Y-%m-%dT%H:%M:%S.%fZ')
return time.mktime(vud_datetime.timetuple())
# defaults to year 3000, as algolia cannot filter on null values
return (datetime.datetime(3000, 1, 1)).timestamp()
return ALGOLIA_DEFAULT_TIMESTAMP


def _get_is_available_course_run(full_course_run):
is_marketable = full_course_run.get('is_marketable', False)
is_enrollable = full_course_run.get('is_enrollable', False)
availability = full_course_run.get('availability')
is_current_or_upcoming_availability = availability in {'Current', 'Upcoming'}
is_available = is_marketable and is_enrollable and is_current_or_upcoming_availability
if not is_available:
logger.info(
f'[_get_is_available_course_run] course run is not available '
f'key: {full_course_run.get('key')}, '
f'is_marketable: {is_marketable}, '
f'is_enrollable: {is_enrollable}, '
f'availability: {availability}'
)
return is_available

def _is_default_algolia_timestamp(timestamp):
return timestamp == ALGOLIA_DEFAULT_TIMESTAMP

def _get_course_run_enroll_by_date(full_course_run):
upgrade_deadline_timestamp = _get_verified_upgrade_deadline(full_course_run=full_course_run)
enrollment_end = full_course_run.get('enrollment_end', ALGOLIA_DEFAULT_TIMESTAMP)
if _is_default_algolia_timestamp(upgrade_deadline_timestamp) == _is_default_algolia_timestamp(enrollment_end):
return ALGOLIA_DEFAULT_TIMESTAMP




def get_course_first_paid_enrollable_seat_price(course):
Expand Down
4 changes: 4 additions & 0 deletions enterprise_catalog/apps/catalog/constants.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import datetime
import json

from enterprise_catalog.apps.catalog.waffle import (
DISABLE_MODEL_ADMIN_CHANGES_SWITCH,
)


# Algolia timestamp default
ALGOLIA_DEFAULT_TIMESTAMP = (datetime.datetime(3000, 1, 1)).timestamp()

# ContentMetadata content_type choices
COURSE = 'course'
COURSE_RUN = 'courserun'
Expand Down
13 changes: 13 additions & 0 deletions enterprise_catalog/apps/catalog/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
"""
import hashlib
import json
import time
from datetime import datetime
from logging import getLogger
from urllib.parse import urljoin

from dateutil import parser
from django.conf import settings
from django.db.models import Q
from edx_rbac.utils import feature_roles_from_jwt
Expand Down Expand Up @@ -138,3 +140,14 @@ def batch_by_pk(ModelClass, extra_filter=Q(), batch_size=10000):
for item in qs:
start_pk = item.pk
qs = ModelClass.objects.filter(pk__gt=start_pk).filter(extra_filter).order_by('pk')[:batch_size]

def to_timestamp(date_str_or_timestamp):
try:
if isinstance(date_str_or_timestamp, (int, float)):
return date_str_or_timestamp
parse_datetime = parser.parse(date_str_or_timestamp)
timestamp = time.mktime(parse_datetime.timetuple())
return timestamp
except (ValueError, TypeError) as error:
LOGGER.error(f"[to_timestamp][{error}] Could not parse date string: {date_str_or_timestamp}")
return None

0 comments on commit dd95380

Please sign in to comment.