This is for the learning MFE outline endpoint. Also clean up some related permissions issues.
80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
"""Utility functions that have to do with the courseware."""
|
|
|
|
|
|
import datetime
|
|
|
|
from django.conf import settings
|
|
from lms.djangoapps.commerce.utils import EcommerceService
|
|
from pytz import utc
|
|
|
|
from course_modes.models import CourseMode
|
|
from xmodule.partitions.partitions import ENROLLMENT_TRACK_PARTITION_ID
|
|
from xmodule.partitions.partitions_service import PartitionService
|
|
|
|
|
|
def verified_upgrade_deadline_link(user, course=None, course_id=None):
|
|
"""
|
|
Format the correct verified upgrade link for the specified ``user``
|
|
in a course.
|
|
|
|
One of ``course`` or ``course_id`` must be supplied. If both are specified,
|
|
``course`` will take priority.
|
|
|
|
Arguments:
|
|
user (:class:`~django.contrib.auth.models.User`): The user to display
|
|
the link for.
|
|
course (:class:`.CourseOverview`): The course to render a link for.
|
|
course_id (:class:`.CourseKey`): The course_id of the course to render for.
|
|
|
|
Returns:
|
|
The formatted link that will allow the user to upgrade to verified
|
|
in this course.
|
|
"""
|
|
if course is not None:
|
|
course_id = course.id
|
|
return EcommerceService().upgrade_url(user, course_id)
|
|
|
|
|
|
def can_show_verified_upgrade(user, enrollment, course=None):
|
|
"""
|
|
Return whether this user can be shown upgrade message.
|
|
|
|
Arguments:
|
|
user (:class:`.AuthUser`): The user from the request.user property
|
|
enrollment (:class:`.CourseEnrollment`): The enrollment under consideration.
|
|
If None, then the enrollment is not considered to be upgradeable.
|
|
course (:class:`.ModulestoreCourse`): Optional passed in modulestore course.
|
|
If provided, it is expected to correspond to `enrollment.course.id`.
|
|
If not provided, the course will be loaded from the modulestore.
|
|
We use the course to retrieve user partitions when calculating whether
|
|
the upgrade link will be shown.
|
|
"""
|
|
if enrollment is None:
|
|
return False # this got accidentally flipped in 2017 (commit 8468357), but leaving alone to not switch again
|
|
partition_service = PartitionService(enrollment.course.id, course=course)
|
|
enrollment_track_partition = partition_service.get_user_partition(ENROLLMENT_TRACK_PARTITION_ID)
|
|
group = partition_service.get_group(user, enrollment_track_partition)
|
|
current_mode = None
|
|
if group:
|
|
try:
|
|
current_mode = [
|
|
mode.get('slug') for mode in settings.COURSE_ENROLLMENT_MODES.values() if mode['id'] == group.id
|
|
].pop()
|
|
except IndexError:
|
|
pass
|
|
upgradable_mode = not current_mode or current_mode in CourseMode.UPSELL_TO_VERIFIED_MODES
|
|
|
|
if not upgradable_mode:
|
|
return False
|
|
|
|
upgrade_deadline = enrollment.upgrade_deadline
|
|
|
|
if upgrade_deadline is None:
|
|
return False
|
|
|
|
if datetime.datetime.now(utc).date() > upgrade_deadline.date():
|
|
return False
|
|
|
|
# Show the summary if user enrollment is in which allow user to upsell
|
|
return enrollment.is_active and enrollment.mode in CourseMode.UPSELL_TO_VERIFIED_MODES
|