refactor: Use certificates api method instead of the model, and rename whitelist to allowlist. Also move method to certificates app to prevent circular import. (#27532)
MICROBA-1021
This commit is contained in:
@@ -35,13 +35,16 @@ from common.djangoapps.student.models import (
|
||||
username_exists_or_retired
|
||||
)
|
||||
from common.djangoapps.util.password_policy_validators import normalize_password
|
||||
from lms.djangoapps.certificates.api import get_certificate_url, has_html_certificates_enabled
|
||||
from lms.djangoapps.certificates.api import (
|
||||
certificates_viewable_for_course,
|
||||
get_certificate_url,
|
||||
has_html_certificates_enabled
|
||||
)
|
||||
from lms.djangoapps.certificates.models import CertificateStatuses, certificate_status_for_student
|
||||
from lms.djangoapps.grades.api import CourseGradeFactory
|
||||
from lms.djangoapps.verify_student.models import VerificationDeadline
|
||||
from lms.djangoapps.verify_student.services import IDVerificationService
|
||||
from lms.djangoapps.verify_student.utils import is_verification_expiring_soon, verification_for_datetime
|
||||
from openedx.core.djangoapps.certificates.api import certificates_viewable_for_course
|
||||
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
||||
from openedx.core.djangoapps.theming.helpers import get_themes
|
||||
from openedx.core.djangoapps.user_authn.utils import is_safe_login_or_logout_redirect
|
||||
@@ -396,7 +399,7 @@ def create_or_set_user_attribute_created_on_site(user, site):
|
||||
Create or Set UserAttribute indicating the site the user account was created on.
|
||||
User maybe created on 'courses.edx.org', or a white-label site. Due to the very high
|
||||
traffic on this table we now ignore the default site (eg. 'courses.edx.org') and
|
||||
code which comsumes this attribute should assume a 'created_on_site' which doesn't exist
|
||||
code which consumes this attribute should assume a 'created_on_site' which doesn't exist
|
||||
belongs to the default site.
|
||||
"""
|
||||
if site and site.id != settings.SITE_ID:
|
||||
@@ -696,7 +699,7 @@ def get_resume_urls_for_enrollments(user, enrollments):
|
||||
enrollments (list): a list of user enrollments
|
||||
|
||||
Returns:
|
||||
resume_course_urls (OrderedDict): an OrderdDict of urls
|
||||
resume_course_urls (OrderedDict): an OrderedDict of urls
|
||||
key: CourseKey
|
||||
value: url to the last completed block
|
||||
if the value is '', then the user has not completed any blocks in the course run
|
||||
|
||||
@@ -9,6 +9,8 @@ certificates models or any other certificates modules.
|
||||
|
||||
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from pytz import UTC
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
@@ -44,7 +46,6 @@ from lms.djangoapps.certificates.utils import (
|
||||
get_certificate_url as _get_certificate_url,
|
||||
has_html_certificates_enabled as _has_html_certificates_enabled
|
||||
)
|
||||
from openedx.core.djangoapps.certificates.api import certificates_viewable_for_course
|
||||
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
||||
|
||||
log = logging.getLogger("edx.certificate")
|
||||
@@ -583,6 +584,30 @@ def get_certificate_footer_context():
|
||||
return data
|
||||
|
||||
|
||||
def certificates_viewable_for_course(course):
|
||||
"""
|
||||
Returns True if certificates are viewable for any student enrolled in the course, False otherwise.
|
||||
"""
|
||||
if course.self_paced:
|
||||
return True
|
||||
if (
|
||||
course.certificates_display_behavior in ('early_with_info', 'early_no_info')
|
||||
or course.certificates_show_before_end
|
||||
):
|
||||
return True
|
||||
if (
|
||||
course.certificate_available_date
|
||||
and course.certificate_available_date <= datetime.now(UTC)
|
||||
):
|
||||
return True
|
||||
if (
|
||||
course.certificate_available_date is None
|
||||
and course.has_ended()
|
||||
):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def get_allowlisted_users(course_key):
|
||||
"""
|
||||
Return the users who are on the allowlist for this course run
|
||||
|
||||
@@ -15,10 +15,13 @@ from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from lms.djangoapps.certificates.api import get_certificate_for_user, get_certificates_for_user
|
||||
from lms.djangoapps.certificates.api import (
|
||||
certificates_viewable_for_course,
|
||||
get_certificate_for_user,
|
||||
get_certificates_for_user
|
||||
)
|
||||
from lms.djangoapps.certificates.apis.v0.permissions import IsOwnerOrPublicCertificates
|
||||
from openedx.core.djangoapps.catalog.utils import get_course_run_details
|
||||
from openedx.core.djangoapps.certificates.api import certificates_viewable_for_course
|
||||
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
||||
from openedx.core.djangoapps.user_api.accounts.api import visible_fields
|
||||
from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser
|
||||
|
||||
@@ -28,6 +28,7 @@ from common.djangoapps.util.views import handle_500
|
||||
from lms.djangoapps.badges.events.course_complete import get_completion_badge
|
||||
from lms.djangoapps.badges.utils import badges_enabled
|
||||
from lms.djangoapps.certificates.api import (
|
||||
certificates_viewable_for_course,
|
||||
get_active_web_certificate,
|
||||
get_certificate_footer_context,
|
||||
get_certificate_header_context,
|
||||
@@ -43,7 +44,7 @@ from lms.djangoapps.certificates.models import (
|
||||
from lms.djangoapps.certificates.permissions import PREVIEW_CERTIFICATES
|
||||
from lms.djangoapps.certificates.utils import emit_certificate_event, get_certificate_url
|
||||
from openedx.core.djangoapps.catalog.utils import get_course_run_details
|
||||
from openedx.core.djangoapps.certificates.api import certificates_viewable_for_course, display_date_for_certificate
|
||||
from openedx.core.djangoapps.certificates.api import display_date_for_certificate
|
||||
from openedx.core.djangoapps.lang_pref.api import get_closest_released_language
|
||||
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
||||
from openedx.core.lib.courses import course_image_url
|
||||
|
||||
@@ -7,7 +7,8 @@ import logging
|
||||
from datetime import datetime
|
||||
from pytz import UTC
|
||||
|
||||
from lms.djangoapps.certificates.models import CertificateStatuses, CertificateWhitelist
|
||||
from lms.djangoapps.certificates import api as certs_api
|
||||
from lms.djangoapps.certificates.models import CertificateStatuses
|
||||
from openedx.core.djangoapps.certificates.config import waffle
|
||||
from common.djangoapps.student.models import CourseEnrollment
|
||||
|
||||
@@ -26,30 +27,6 @@ def _enabled_and_instructor_paced(course):
|
||||
return False
|
||||
|
||||
|
||||
def certificates_viewable_for_course(course):
|
||||
"""
|
||||
Returns True if certificates are viewable for any student enrolled in the course, False otherwise.
|
||||
"""
|
||||
if course.self_paced:
|
||||
return True
|
||||
if (
|
||||
course.certificates_display_behavior in ('early_with_info', 'early_no_info')
|
||||
or course.certificates_show_before_end
|
||||
):
|
||||
return True
|
||||
if (
|
||||
course.certificate_available_date
|
||||
and course.certificate_available_date <= datetime.now(UTC)
|
||||
):
|
||||
return True
|
||||
if (
|
||||
course.certificate_available_date is None
|
||||
and course.has_ended()
|
||||
):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def is_certificate_valid(certificate):
|
||||
"""
|
||||
Returns True if the student has a valid, verified certificate for this course, False otherwise.
|
||||
@@ -57,17 +34,20 @@ def is_certificate_valid(certificate):
|
||||
return CourseEnrollment.is_enrolled_as_verified(certificate.user, certificate.course_id) and certificate.is_valid()
|
||||
|
||||
|
||||
def can_show_certificate_message(course, student, course_grade, certificates_enabled_for_course): # lint-amnesty, pylint: disable=missing-function-docstring
|
||||
is_whitelisted = CertificateWhitelist.objects.filter(user=student, course_id=course.id, whitelist=True).exists()
|
||||
def can_show_certificate_message(course, student, course_grade, certificates_enabled_for_course):
|
||||
"""
|
||||
Returns True if a course certificate message can be shown
|
||||
"""
|
||||
is_allowlisted = certs_api.is_on_allowlist(student, course.id)
|
||||
auto_cert_gen_enabled = auto_certificate_generation_enabled()
|
||||
has_active_enrollment = CourseEnrollment.is_enrolled(student, course.id)
|
||||
certificates_are_viewable = certificates_viewable_for_course(course)
|
||||
certificates_are_viewable = certs_api.certificates_viewable_for_course(course)
|
||||
|
||||
return (
|
||||
(auto_cert_gen_enabled or certificates_enabled_for_course) and
|
||||
has_active_enrollment and
|
||||
certificates_are_viewable and
|
||||
(course_grade.passed or is_whitelisted)
|
||||
(course_grade.passed or is_allowlisted)
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@ from django.template.loader import render_to_string
|
||||
from web_fragments.fragment import Fragment
|
||||
|
||||
from lms.djangoapps.certificates import api as certificate_api
|
||||
from openedx.core.djangoapps.certificates.api import certificates_viewable_for_course
|
||||
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
||||
from openedx.core.djangoapps.plugin_api.views import EdxFragmentView
|
||||
|
||||
@@ -45,7 +44,7 @@ class LearnerAchievementsFragmentView(EdxFragmentView):
|
||||
try:
|
||||
course_overview = CourseOverview.get_from_id(course_key)
|
||||
course_certificate['course'] = course_overview
|
||||
if certificates_viewable_for_course(course_overview):
|
||||
if certificate_api.certificates_viewable_for_course(course_overview):
|
||||
# add certificate into passing certificate list only if it's a PDF certificate
|
||||
# or there is an active certificate configuration.
|
||||
if course_certificate['is_pdf_certificate'] or course_overview.has_any_active_web_certificate:
|
||||
|
||||
Reference in New Issue
Block a user