From 2a11d3123ce54d707a7f18d1b275c715c80b1934 Mon Sep 17 00:00:00 2001 From: Rebecca Callis <84805023+becdavid@users.noreply.github.com> Date: Tue, 23 Jul 2024 15:47:10 -0400 Subject: [PATCH 01/11] feat(organizations): pull in org institutions into course settings --- cms/djangoapps/contentstore/views/course.py | 7 ++++++- cms/templates/settings.html | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index 5b5347158ee4..09ac62705ada 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -30,7 +30,7 @@ from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.locator import BlockUsageLocator -from organizations.api import add_organization_course, ensure_organization +from organizations.api import add_organization_course, ensure_organization, get_course_organization, get_organization_institutions from organizations.exceptions import InvalidOrganizationException from rest_framework.exceptions import ValidationError @@ -1184,6 +1184,11 @@ def settings_handler(request, course_key_string): # lint-amnesty, pylint: disab 'upgrade_deadline': upgrade_deadline, 'mfe_proctored_exam_settings_url': get_proctored_exam_settings_url(course_module.id), } + + course_org = get_course_organization(course_key) + institutions = get_organization_institutions(course_org) + settings_context.update({'possible_organization_institutions': list(institutions)}) + if is_prerequisite_courses_enabled(): courses, in_process_course_actions = get_courses_accessible_to_user(request) # exclude current course from the list of available courses diff --git a/cms/templates/settings.html b/cms/templates/settings.html index ca148fca5894..952ec3e0b43a 100644 --- a/cms/templates/settings.html +++ b/cms/templates/settings.html @@ -395,6 +395,17 @@

${_('Course Details')}

${_("Identify the course revision number here. This is used to assist with identifying what changes have been made for a course. Placeholder indicates a date format (YYYY.MM), however, we don't have to explicity tie this to a date for the number identification.")} +
  • + + + ${_("Institution that is hosting this course run")} + +
  • % endif From 6cd4affbf8cb727616adea3e4e4f0c18a74d1a50 Mon Sep 17 00:00:00 2001 From: Rebecca David Date: Wed, 4 Dec 2024 15:03:21 -0500 Subject: [PATCH 02/11] feat(organizations): prompt save when changing institution in settings --- .../js/models/settings/course_details.js | 1 + .../js/spec/views/settings/main_spec.js | 14 +++++++++++ cms/static/js/views/settings/main.js | 4 ++++ .../migrations/0027_auto_20240909_1523.py | 23 +++++++++++++++++++ .../content/course_overviews/models.py | 10 ++++---- .../core/djangoapps/models/course_details.py | 2 ++ 6 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 openedx/core/djangoapps/content/course_overviews/migrations/0027_auto_20240909_1523.py diff --git a/cms/static/js/models/settings/course_details.js b/cms/static/js/models/settings/course_details.js index 49531192787b..9b637ba92134 100644 --- a/cms/static/js/models/settings/course_details.js +++ b/cms/static/js/models/settings/course_details.js @@ -37,6 +37,7 @@ define(['backbone', 'underscore', 'gettext', 'js/models/validation_helpers', 'js learning_info: [], instructor_info: {}, self_paced: null, + course_institution: '', revision_number: '' }, diff --git a/cms/static/js/spec/views/settings/main_spec.js b/cms/static/js/spec/views/settings/main_spec.js index aa0360672cec..bb47d9eca732 100644 --- a/cms/static/js/spec/views/settings/main_spec.js +++ b/cms/static/js/spec/views/settings/main_spec.js @@ -51,6 +51,7 @@ define([ instructors: [{name: '', title: '', organization: '', image: '', bio: ''}] }, self_paced: false, + course_institution: '', revision_number: '' }, @@ -199,6 +200,19 @@ define([ ); }); + it('should save institution as part of course details', function() { + var requests = AjaxHelpers.requests(this); + var expectedJson = $.extend(true, {}, modelData, { + course_institution: '' + }); + $('#course-institution').val('').trigger('change'); + expect(this.model.get('course_institution')).toEqual(''); + this.view.saveView(); + AjaxHelpers.expectJsonRequest( + requests, 'POST', urlRoot, expectedJson + ); + }); + it('should not error if about_page_editable is False', function() { var requests = AjaxHelpers.requests(this); // if about_page_editable is false, there is no section.course_details diff --git a/cms/static/js/views/settings/main.js b/cms/static/js/views/settings/main.js index 9e795b2de71d..1acc8a9114c5 100644 --- a/cms/static/js/views/settings/main.js +++ b/cms/static/js/views/settings/main.js @@ -134,6 +134,8 @@ define(['js/views/validation', 'codemirror', 'underscore', 'jquery', 'jquery.ui' pre_requisite_courses = pre_requisite_courses.length > 0 ? pre_requisite_courses : ''; this.$el.find('#' + this.fieldToSelectorMap.pre_requisite_courses).val(pre_requisite_courses); + this.$el.find('#' + this.fieldToSelectorMap.course_institution).val(this.model.get('course_institution')); + if (this.model.get('entrance_exam_enabled') == 'true') { this.$('#' + this.fieldToSelectorMap.entrance_exam_enabled).attr('checked', this.model.get('entrance_exam_enabled')); this.$('.div-grade-requirements').show(); @@ -185,6 +187,7 @@ define(['js/views/validation', 'codemirror', 'underscore', 'jquery', 'jquery.ui' banner_image_asset_path: 'banner-image-url', video_thumbnail_image_asset_path: 'video-thumbnail-image-url', pre_requisite_courses: 'pre-requisite-course', + course_institution: 'course-institution', entrance_exam_enabled: 'entrance-exam-enabled', entrance_exam_minimum_score_pct: 'entrance-exam-minimum-score-pct', course_settings_learning_fields: 'course-settings-learning-fields', @@ -318,6 +321,7 @@ define(['js/views/validation', 'codemirror', 'underscore', 'jquery', 'jquery.ui' case 'course-version': case 'course-revision-number': case 'course-title': + case 'course-institution': case 'course-subtitle': case 'course-duration': case 'course-description': diff --git a/openedx/core/djangoapps/content/course_overviews/migrations/0027_auto_20240909_1523.py b/openedx/core/djangoapps/content/course_overviews/migrations/0027_auto_20240909_1523.py new file mode 100644 index 000000000000..9058b4deae71 --- /dev/null +++ b/openedx/core/djangoapps/content/course_overviews/migrations/0027_auto_20240909_1523.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.13 on 2024-09-09 15:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('course_overviews', '0026_auto_20230525_1917'), + ] + + operations = [ + migrations.AddField( + model_name='courseoverview', + name='course_institution', + field=models.TextField(null=True), + ), + migrations.AddField( + model_name='historicalcourseoverview', + name='course_institution', + field=models.TextField(null=True), + ), + ] diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py index 6a8d6b7276c3..ee8649c0bf7a 100644 --- a/openedx/core/djangoapps/content/course_overviews/models.py +++ b/openedx/core/djangoapps/content/course_overviews/models.py @@ -70,10 +70,11 @@ class Meta: # Course identification id = CourseKeyField(db_index=True, primary_key=True, max_length=255) _location = UsageKeyField(max_length=255) - org = models.TextField(max_length=255, default='outdated_entry') - display_name = models.TextField(null=True) - display_number_with_default = models.TextField() - display_org_with_default = models.TextField() + org = TextField(max_length=255, default='outdated_entry') + display_name = TextField(null=True) + display_number_with_default = TextField() + display_org_with_default = TextField() + course_institution = TextField(null=True) start = models.DateTimeField(null=True) end = models.DateTimeField(null=True) @@ -206,6 +207,7 @@ def _create_or_update(cls, course): # lint-amnesty, pylint: disable=too-many-st course_overview.display_name = display_name course_overview.display_number_with_default = course.display_number_with_default course_overview.display_org_with_default = course.display_org_with_default + course_overview.course_institution = CourseDetails.fetch_about_attribute(course.id, 'course_institution') course_overview.start = start course_overview.end = end diff --git a/openedx/core/djangoapps/models/course_details.py b/openedx/core/djangoapps/models/course_details.py index d02cb21201be..e79ea38205a1 100644 --- a/openedx/core/djangoapps/models/course_details.py +++ b/openedx/core/djangoapps/models/course_details.py @@ -31,6 +31,7 @@ 'entrance_exam_id', 'entrance_exam_minimum_score_pct', 'about_sidebar_html', + 'course_institution', 'revision_number', ] @@ -71,6 +72,7 @@ def __init__(self, org, course_id, run): self.video_thumbnail_image_name = "" self.video_thumbnail_image_asset_path = "" self.pre_requisite_courses = [] # pre-requisite courses + self.course_institution = "" # course institution self.entrance_exam_enabled = "" # is entrance exam enabled self.entrance_exam_id = "" # the content location for the entrance exam self.entrance_exam_minimum_score_pct = settings.FEATURES.get( From 10690ee965019f1f61986ae42bfd002fc8a97a2b Mon Sep 17 00:00:00 2001 From: Rebecca Callis <84805023+becdavid@users.noreply.github.com> Date: Wed, 14 Aug 2024 15:02:37 -0400 Subject: [PATCH 03/11] feat: Include survey links on dashboard when enrolled in CA course --- lms/static/sass/multicourse/_dashboard.scss | 69 +++++++++++++++ lms/templates/dashboard.html | 3 + .../dashboard/_dashboard_program_surveys.html | 86 +++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 lms/templates/dashboard/_dashboard_program_surveys.html diff --git a/lms/static/sass/multicourse/_dashboard.scss b/lms/static/sass/multicourse/_dashboard.scss index db099914f9d0..36b34acadbf5 100644 --- a/lms/static/sass/multicourse/_dashboard.scss +++ b/lms/static/sass/multicourse/_dashboard.scss @@ -561,6 +561,75 @@ } } + .program-survey { + box-shadow: 3px 3px 10px -3px grey; + + border: 1px solid theme-color("secondary"); + border-radius: 3px; + padding: 30px; + margin-bottom: 30px; + + .program-survey-header { + @extend %t-title4; + + @include padding-right($baseline/2); + } + + .program-details { + color: $gray; + margin-bottom: lh(); + line-height: 1.3em; + } + + .survey-details-wrapper { + margin-top: 30px; + column-count: 2; + column-width: auto; + + .survey-wrapper { + + margin-right: 50px; + + hr { + @extend .faded-hr-divider-medium; + } + + .survey-title { + @extend %t-title5; + + font-weight: 600; + @include padding-right($baseline/2); + } + + .survey-instructions { + font: -apple-system-short-subheadline !important; + color: $gray-d1; + font-weight: 600; + + @extend %t-title7; + + display: inline-block; + } + + .survey-details { + @extend %t-title7; + + color: $gray-d1; + margin-bottom: lh(); + line-height: 1.3em; + } + + .provide-feedback-btn { + font: -apple-system-short-subheadline !important; + + @extend %btn-primary-blue; + + margin-top: $baseline; + } + } + } + } + // Responsive behavior @include media-breakpoint-down(md) { padding: $baseline; diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index 59c5a77e58e5..a09845b0163a 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -148,6 +148,9 @@
    + <%include file='dashboard/_dashboard_program_surveys.html' + args='user=user, course_enrollments=course_enrollments'/> +
    % if display_dashboard_courses: <%include file="learner_dashboard/_dashboard_navigation_courses.html"/> diff --git a/lms/templates/dashboard/_dashboard_program_surveys.html b/lms/templates/dashboard/_dashboard_program_surveys.html new file mode 100644 index 000000000000..cfd1dc2bfc84 --- /dev/null +++ b/lms/templates/dashboard/_dashboard_program_surveys.html @@ -0,0 +1,86 @@ +<%page expression_filter="h"/> +<%page args='user, course_enrollments'/> +<%! +from openedx.core.djangoapps.content.course_overviews.models import CourseOverview +from organizations.models import OrganizationInstitution +from common.djangoapps.student.models import AnonymousUserId +%> + +<%namespace name='static' file='../static_content.html'/> + +<% show_program_survey = False +course_institution = ''%> +% for enrollment in course_enrollments: +<% course_overview = CourseOverview.get_from_id(enrollment.course_id) %> +% if course_overview.org == "CUCWD": +<% show_program_survey = True %> + % if course_overview.course_institution: + <% course_institution = course_overview.course_institution %> + % endif +% endif +% endfor + + + +% if show_program_survey: +<% course_institution = OrganizationInstitution.get_by_shortname(short_name=course_overview.course_institution) +%> + % if user.is_anonymous: + <% anonymous_user_id = user.id %> + % else: + <% + anonymous_user_id = AnonymousUserId.objects.filter(user=user).order_by('-id') + anonymous_user_id = anonymous_user_id[0].anonymous_user_id + %> + % endif +<% platform_anonymous_user_id_string = "platform_anonymous_user_id=" + anonymous_user_id +username_string = "platform_username=" + user.username +user_email_string = "platform_email=" + user.email +org_institution_name_string = "org_institution_name=" + course_institution.name +org_institution_shortname_string = "org_institution_short_name=" + course_institution.short_name +org_institution_city_string = "org_institution_city=" + course_institution.city +org_institution_state_string = "org_institution_state=" + course_institution.state +org_institution_zipcode_string = "org_institution_zipcode=" + course_institution.zipcode +%> + +
    +

    + Aviation Mechanic General +

    +
    +

    This program of courses equips learners for entry into the FAA mechanic pathway. Upon completion, they gain foundational knowledge in mathematics, aircraft drawings, weight and balance, aircraft materials, processes and tools, physics, electricity, inspection, ground operations, and FAA regulations governing maintenance technician certification and work.

    +
    + +
    +
    +

    Pre-Program Survey

    +
    +

    Answer this survey prior to taking any course content

    +

    This will help us understand your career awareness and interest, gauge where you are with FAA General maintenance knowledge and skill confidence, career plans, and demographic information.

    + + Provide Feedback +
    + +
    +

    Post-Program Survey

    +
    +

    Answer this survey after you have completed most of this program's courses

    +

    This will help us understand your completion of FAA General maintenance program, career awareness and interest, kwowledge and skill confidence, and demographic information.

    + + Provide Feedback +
    +
    +
    + +% endif \ No newline at end of file From 105209f5736ba3e6c588e0229e211cae2cc73dc4 Mon Sep 17 00:00:00 2001 From: Rebecca David Date: Wed, 21 Aug 2024 08:10:59 -0400 Subject: [PATCH 04/11] fix: update survey links for production --- .../dashboard/_dashboard_program_surveys.html | 123 ++++++++---------- 1 file changed, 56 insertions(+), 67 deletions(-) diff --git a/lms/templates/dashboard/_dashboard_program_surveys.html b/lms/templates/dashboard/_dashboard_program_surveys.html index cfd1dc2bfc84..3afe1e922ce1 100644 --- a/lms/templates/dashboard/_dashboard_program_surveys.html +++ b/lms/templates/dashboard/_dashboard_program_surveys.html @@ -8,79 +8,68 @@ <%namespace name='static' file='../static_content.html'/> -<% show_program_survey = False -course_institution = ''%> -% for enrollment in course_enrollments: -<% course_overview = CourseOverview.get_from_id(enrollment.course_id) %> -% if course_overview.org == "CUCWD": -<% show_program_survey = True %> - % if course_overview.course_institution: - <% course_institution = course_overview.course_institution %> - % endif -% endif -% endfor + +<% +show_program_survey = False +course_institution = '' - +for enrollment in course_enrollments: + course_overview = CourseOverview.get_from_id(enrollment.course_id) + if course_overview.org == "CA": + show_program_survey = True -% if show_program_survey: -<% course_institution = OrganizationInstitution.get_by_shortname(short_name=course_overview.course_institution) -%> - % if user.is_anonymous: - <% anonymous_user_id = user.id %> - % else: - <% - anonymous_user_id = AnonymousUserId.objects.filter(user=user).order_by('-id') - anonymous_user_id = anonymous_user_id[0].anonymous_user_id - %> - % endif -<% platform_anonymous_user_id_string = "platform_anonymous_user_id=" + anonymous_user_id -username_string = "platform_username=" + user.username -user_email_string = "platform_email=" + user.email -org_institution_name_string = "org_institution_name=" + course_institution.name -org_institution_shortname_string = "org_institution_short_name=" + course_institution.short_name -org_institution_city_string = "org_institution_city=" + course_institution.city -org_institution_state_string = "org_institution_state=" + course_institution.state -org_institution_zipcode_string = "org_institution_zipcode=" + course_institution.zipcode + if course_overview.course_institution: + course_institution = course_overview.course_institution + break %> -
    -

    - Aviation Mechanic General -

    -
    -

    This program of courses equips learners for entry into the FAA mechanic pathway. Upon completion, they gain foundational knowledge in mathematics, aircraft drawings, weight and balance, aircraft materials, processes and tools, physics, electricity, inspection, ground operations, and FAA regulations governing maintenance technician certification and work.

    -
    + +% if show_program_survey: + <% + course_institution = OrganizationInstitution.get_by_shortname(short_name=course_overview.course_institution) -
    -
    -

    Pre-Program Survey

    -
    -

    Answer this survey prior to taking any course content

    -

    This will help us understand your career awareness and interest, gauge where you are with FAA General maintenance knowledge and skill confidence, career plans, and demographic information.

    - - Provide Feedback + if user.is_anonymous: + anonymous_user_id = user.id + else: + anonymous_user_id = AnonymousUserId.objects.filter(user=user, course_id=None).order_by('-id') + anonymous_user_id = anonymous_user_id[0].anonymous_user_id + + platform_anonymous_user_id_string = "platform_anonymous_user_id=" + (anonymous_user_id or "") + username_string = "platform_username=" + (user.username or "") + user_email_string = "platform_email=" + (user.email or "") + org_institution_name_string = "org_institution_name=" + (course_institution.name or "") + org_institution_shortname_string = "org_institution_short_name=" + (course_institution.short_name or "") + org_institution_city_string = "org_institution_city=" + (course_institution.city or "") + org_institution_state_string = "org_institution_state=" + (course_institution.state or "") + org_institution_zipcode_string = "org_institution_zipcode=" + (course_institution.zipcode or "") + %> + +
    +

    + Aviation Mechanic General +

    +
    +

    This program of courses equips learners for entry into the FAA mechanic pathway. Upon completion, they gain foundational knowledge in mathematics, aircraft drawings, weight and balance, aircraft materials, processes and tools, physics, electricity, inspection, ground operations, and FAA regulations governing maintenance technician certification and work.

    -
    -

    Post-Program Survey

    -
    -

    Answer this survey after you have completed most of this program's courses

    -

    This will help us understand your completion of FAA General maintenance program, career awareness and interest, kwowledge and skill confidence, and demographic information.

    - - Provide Feedback +
    +
    +

    Pre-Program Survey

    +
    +

    Answer this survey prior to taking any course content

    +

    This will help us understand your career awareness and interest, gauge where you are with FAA General maintenance knowledge and skill confidence, career plans, and demographic information.

    + + Provide Feedback +
    + +
    +

    Post-Program Survey

    +
    +

    Answer this survey after you have completed most of this program's courses

    +

    This will help us understand your completion of FAA General maintenance program, career awareness and interest, kwowledge and skill confidence, and demographic information.

    + + Provide Feedback +
    -
    - -% endif \ No newline at end of file +% endif From c1acfabe1d577404c1e9ea6eede6bd4a3badf6db Mon Sep 17 00:00:00 2001 From: Zachary Trabookis Date: Mon, 9 Sep 2024 22:47:07 -0400 Subject: [PATCH 05/11] feat: Add in `platform: fullname`, `demographic: zipcode, country`. --- .../dashboard/_dashboard_program_surveys.html | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lms/templates/dashboard/_dashboard_program_surveys.html b/lms/templates/dashboard/_dashboard_program_surveys.html index 3afe1e922ce1..2997f7038293 100644 --- a/lms/templates/dashboard/_dashboard_program_surveys.html +++ b/lms/templates/dashboard/_dashboard_program_surveys.html @@ -4,6 +4,7 @@ from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from organizations.models import OrganizationInstitution from common.djangoapps.student.models import AnonymousUserId +from custom_reg_form.models import ExtraInfo %> <%namespace name='static' file='../static_content.html'/> @@ -36,12 +37,19 @@ platform_anonymous_user_id_string = "platform_anonymous_user_id=" + (anonymous_user_id or "") username_string = "platform_username=" + (user.username or "") + platform_fullname = "platform_fullname=" + (user.profile.name or "") user_email_string = "platform_email=" + (user.email or "") org_institution_name_string = "org_institution_name=" + (course_institution.name or "") org_institution_shortname_string = "org_institution_short_name=" + (course_institution.short_name or "") org_institution_city_string = "org_institution_city=" + (course_institution.city or "") org_institution_state_string = "org_institution_state=" + (course_institution.state or "") org_institution_zipcode_string = "org_institution_zipcode=" + (course_institution.zipcode or "") + try: + demographic_zipcode = "demographic_zipcode=" + (ExtraInfo.objects.get(user_id=user.id).zipcode or "") + except: + demographic_zipcode = "demographic_zipcode=" + demographic_country = "demographic_country=" + (str(user.profile.country) or "") + program_name = "program_name=" + "Aviation Mechanic General" %>
    @@ -58,7 +66,7 @@

    Pre-Program Survey


    Answer this survey prior to taking any course content

    This will help us understand your career awareness and interest, gauge where you are with FAA General maintenance knowledge and skill confidence, career plans, and demographic information.

    - + Provide Feedback
    @@ -67,7 +75,7 @@

    Post-Program Survey


    Answer this survey after you have completed most of this program's courses

    This will help us understand your completion of FAA General maintenance program, career awareness and interest, kwowledge and skill confidence, and demographic information.

    - + Provide Feedback
    From 8d6f9c21e2e4c2739cda93a346be1f31b61f5ad6 Mon Sep 17 00:00:00 2001 From: Zachary Trabookis Date: Wed, 11 Sep 2024 12:59:48 -0400 Subject: [PATCH 06/11] feat: Prevent page from crashing when `OrganizationInstitution` is not assigned to a course. --- .../dashboard/_dashboard_program_surveys.html | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lms/templates/dashboard/_dashboard_program_surveys.html b/lms/templates/dashboard/_dashboard_program_surveys.html index 2997f7038293..ee3c8026cace 100644 --- a/lms/templates/dashboard/_dashboard_program_surveys.html +++ b/lms/templates/dashboard/_dashboard_program_surveys.html @@ -39,15 +39,24 @@ username_string = "platform_username=" + (user.username or "") platform_fullname = "platform_fullname=" + (user.profile.name or "") user_email_string = "platform_email=" + (user.email or "") - org_institution_name_string = "org_institution_name=" + (course_institution.name or "") - org_institution_shortname_string = "org_institution_short_name=" + (course_institution.short_name or "") - org_institution_city_string = "org_institution_city=" + (course_institution.city or "") - org_institution_state_string = "org_institution_state=" + (course_institution.state or "") - org_institution_zipcode_string = "org_institution_zipcode=" + (course_institution.zipcode or "") + + org_institution_name_string = "org_institution_name=" + org_institution_shortname_string = "org_institution_short_name=" + org_institution_city_string = "org_institution_city=" + org_institution_state_string = "org_institution_state=" + org_institution_zipcode_string = "org_institution_zipcode=" + if course_institution is not None: + org_institution_name_string += (course_institution.name or "") + org_institution_shortname_string += (course_institution.short_name or "") + org_institution_city_string += (course_institution.city or "") + org_institution_state_string += (course_institution.state or "") + org_institution_zipcode_string += (course_institution.zipcode or "") + try: demographic_zipcode = "demographic_zipcode=" + (ExtraInfo.objects.get(user_id=user.id).zipcode or "") except: demographic_zipcode = "demographic_zipcode=" + demographic_country = "demographic_country=" + (str(user.profile.country) or "") program_name = "program_name=" + "Aviation Mechanic General" %> @@ -66,7 +75,7 @@

    Pre-Program Survey


    Answer this survey prior to taking any course content

    This will help us understand your career awareness and interest, gauge where you are with FAA General maintenance knowledge and skill confidence, career plans, and demographic information.

    - + Provide Feedback
    @@ -75,7 +84,7 @@

    Post-Program Survey


    Answer this survey after you have completed most of this program's courses

    This will help us understand your completion of FAA General maintenance program, career awareness and interest, kwowledge and skill confidence, and demographic information.

    - + Provide Feedback
    From 4a197af1f26b0431c1eb00991ac1a6557eda8c5a Mon Sep 17 00:00:00 2001 From: Zachary Trabookis Date: Mon, 16 Sep 2024 11:10:44 -0400 Subject: [PATCH 07/11] feat: Provide better UX for the learner for these pre/post-program surveys. I spoke with Austin Sanderson about this verbiage and we came up with these changes. --- .../dashboard/_dashboard_program_surveys.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lms/templates/dashboard/_dashboard_program_surveys.html b/lms/templates/dashboard/_dashboard_program_surveys.html index ee3c8026cace..1f06c0ae64fd 100644 --- a/lms/templates/dashboard/_dashboard_program_surveys.html +++ b/lms/templates/dashboard/_dashboard_program_surveys.html @@ -63,7 +63,7 @@

    - Aviation Mechanic General + Aviation Mechanic General Surveys

    This program of courses equips learners for entry into the FAA mechanic pathway. Upon completion, they gain foundational knowledge in mathematics, aircraft drawings, weight and balance, aircraft materials, processes and tools, physics, electricity, inspection, ground operations, and FAA regulations governing maintenance technician certification and work.

    @@ -71,19 +71,19 @@

    -

    Pre-Program Survey

    +

    Pre-Program


    -

    Answer this survey prior to taking any course content

    +

    New Learner: Take this survey upon program entry.

    This will help us understand your career awareness and interest, gauge where you are with FAA General maintenance knowledge and skill confidence, career plans, and demographic information.

    - Provide Feedback + Provide Input
    -

    Post-Program Survey

    +

    Post-Program


    -

    Answer this survey after you have completed most of this program's courses

    -

    This will help us understand your completion of FAA General maintenance program, career awareness and interest, kwowledge and skill confidence, and demographic information.

    +

    Continuing Learner: Take this survey upon program exit.

    +

    This will help us understand your completion of FAA General maintenance program, career awareness and interest, knowledge and skill confidence, and demographic information.

    Provide Feedback
    From 674e3d903565beb231e3f8709ad9cf550c2de4c2 Mon Sep 17 00:00:00 2001 From: Rebecca David Date: Thu, 5 Dec 2024 13:18:13 -0500 Subject: [PATCH 08/11] fix: pylint errors --- .../core/djangoapps/content/course_overviews/models.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py index ee8649c0bf7a..2e2047802a87 100644 --- a/openedx/core/djangoapps/content/course_overviews/models.py +++ b/openedx/core/djangoapps/content/course_overviews/models.py @@ -70,11 +70,11 @@ class Meta: # Course identification id = CourseKeyField(db_index=True, primary_key=True, max_length=255) _location = UsageKeyField(max_length=255) - org = TextField(max_length=255, default='outdated_entry') - display_name = TextField(null=True) - display_number_with_default = TextField() - display_org_with_default = TextField() - course_institution = TextField(null=True) + org = models.TextField(max_length=255, default='outdated_entry') + display_name = models.TextField(null=True) + display_number_with_default = models.TextField() + display_org_with_default = models.TextField() + course_institution = models.TextField(null=True) start = models.DateTimeField(null=True) end = models.DateTimeField(null=True) From 3fb532df20fc4a947169cf4082ca2b41559d8ce5 Mon Sep 17 00:00:00 2001 From: Rebecca David Date: Tue, 10 Dec 2024 09:12:22 -0500 Subject: [PATCH 09/11] fix: update edx-organization requirments --- requirements/edx/base.txt | 4 ++-- requirements/edx/development.txt | 2 +- requirements/edx/private.in | 4 ++-- requirements/edx/private.txt | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 9d8b5949e605..c8c362831128 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -1145,9 +1145,9 @@ zipp==3.8.0 # setuptools # EducateWorkforce specific packages. This was manually added because `make upgrade` was causing a lot of packages to update. This limits the Python package changes for the release. --e git+https://github.com/CUCWD/bigcommerce-api-python.git@bigcommerce-0.22.2-maple.1#egg=bigcommerce==0.22.2 +-e git+https://github.com/CUCWD/bigcommerce-api-python.git@bigcommerce-0.22.2-nutmeg#egg=bigcommerce==0.22.2 # via -r ./requirements/edx/private.txt --e git+https://github.com/CUCWD/edx-organizations.git@6.10.0-cucwd-maple.1#egg=edx-organizations==6.10.0-cucwd-maple.1 +-e git+https://github.com/CUCWD/edx-organizations.git@6.11.1.2-cucwd-nutmeg#egg=edx-organizations==6.11.1 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0-maple.1 # via -r ./requirements/edx/private.txt diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index 18b9da44ce9a..df119bc4eb97 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1652,7 +1652,7 @@ zipp==3.8.0 # EducateWorkforce specific packages. This was manually added because `make upgrade` was causing a lot of packages to update. This limits the Python package changes for the release. -e git+https://github.com/CUCWD/bigcommerce-api-python.git@bigcommerce-0.22.2-nutmeg#egg=bigcommerce==0.22.2 # via -r ./requirements/edx/private.txt - -e git+https://github.com/CUCWD/edx-organizations.git@6.11.1-cucwd-nutmeg#egg=edx-organizations==6.11.1 + -e git+https://github.com/CUCWD/edx-organizations.git@6.11.1.2-cucwd-nutmeg#egg=edx-organizations==6.11.1 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0-maple.1 # via -r ./requirements/edx/private.txt diff --git a/requirements/edx/private.in b/requirements/edx/private.in index e350f0ce4616..b65d2a64fec3 100644 --- a/requirements/edx/private.in +++ b/requirements/edx/private.in @@ -1,12 +1,12 @@ # BigCommerce --e git+https://github.com/CUCWD/bigcommerce-api-python.git@bigcommerce-0.22.2-maple.3#egg=bigcommerce==0.22.2 +-e git+https://github.com/CUCWD/bigcommerce-api-python.git@bigcommerce-0.22.2-nutmeg#egg=bigcommerce==0.22.2 -e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.3#egg=social-auth-backend-bigcommerce==0.1.0 # Analytics -e git+https://github.com/CUCWD/figures@0.4.dev17-maple.3#egg=Figures==0.4.dev17 # Organizations (reworked for Figures) --e git+https://github.com/CUCWD/edx-organizations.git@6.10.0-maple.3-cucwd#egg=edx-organizations==6.10.0 +-e git+https://github.com/CUCWD/edx-organizations.git@6.11.1.2-cucwd-nutmeg#egg=edx-organizations==6.11.1 # XBlocks -e git+https://github.com/CUCWD/xblock-qualtrics-survey.git@release/v.2.1.0-maple.3-cucwd#egg=xblock_qualtrics_survey==2.1.0 diff --git a/requirements/edx/private.txt b/requirements/edx/private.txt index e887ffd182d6..54c2cd06048d 100644 --- a/requirements/edx/private.txt +++ b/requirements/edx/private.txt @@ -8,13 +8,13 @@ --extra-index-url https://pypi.python.org/simple --trusted-host edx.devstack.devpi --e git+https://github.com/CUCWD/bigcommerce-api-python.git@bigcommerce-0.22.2-maple.3#egg=bigcommerce==0.22.2 +-e git+https://github.com/CUCWD/bigcommerce-api-python.git@bigcommerce-0.22.2-nutmeg#egg=bigcommerce==0.22.2 # via -r ./requirements/edx/private.in -e git+https://github.com/CUCWD/custom-form-app.git@0.1-maple.3-cucwd#egg=custom-form-app==0.1 # via -r ./requirements/edx/private.in -e git+https://github.com/CUCWD/figures@0.4.dev17-maple.3#egg=Figures==0.4.dev17 # via -r ./requirements/edx/private.in --e git+https://github.com/CUCWD/edx-organizations.git@6.10.0-maple.3-cucwd#egg=edx-organizations==6.10.0 +-e git+https://github.com/CUCWD/edx-organizations.git@6.11.1.2-cucwd-nutmeg#egg=edx-organizations==6.11.1 # via -r ./requirements/edx/private.in -e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.3#egg=social-auth-backend-bigcommerce==0.1.0 # via -r ./requirements/edx/private.in From 8ff1b8555753d1cc8caa71f4bee9a823fcf9c1ff Mon Sep 17 00:00:00 2001 From: Rebecca David Date: Tue, 10 Dec 2024 13:37:49 -0500 Subject: [PATCH 10/11] fix: quality tests and migration errors --- cms/djangoapps/contentstore/views/course.py | 16 ++++++++++++---- .../migrations/0028_merge_20241210_1837.py | 14 ++++++++++++++ .../tests/test_course_overviews.py | 2 +- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- 5 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 openedx/core/djangoapps/content/course_overviews/migrations/0028_merge_20241210_1837.py diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index 09ac62705ada..e3ac79832461 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -30,7 +30,12 @@ from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.locator import BlockUsageLocator -from organizations.api import add_organization_course, ensure_organization, get_course_organization, get_organization_institutions +from organizations.api import ( + add_organization_course, + ensure_organization, + get_course_organization, + get_organization_institutions +) from organizations.exceptions import InvalidOrganizationException from rest_framework.exceptions import ValidationError @@ -1184,10 +1189,13 @@ def settings_handler(request, course_key_string): # lint-amnesty, pylint: disab 'upgrade_deadline': upgrade_deadline, 'mfe_proctored_exam_settings_url': get_proctored_exam_settings_url(course_module.id), } - + course_org = get_course_organization(course_key) - institutions = get_organization_institutions(course_org) - settings_context.update({'possible_organization_institutions': list(institutions)}) + if (course_org): + institutions = get_organization_institutions(course_org) + settings_context.update({'possible_organization_institutions': list(institutions)}) + else: + settings_context.update({'possible_organization_institutions': []}) if is_prerequisite_courses_enabled(): courses, in_process_course_actions = get_courses_accessible_to_user(request) diff --git a/openedx/core/djangoapps/content/course_overviews/migrations/0028_merge_20241210_1837.py b/openedx/core/djangoapps/content/course_overviews/migrations/0028_merge_20241210_1837.py new file mode 100644 index 000000000000..ef6e63016cc5 --- /dev/null +++ b/openedx/core/djangoapps/content/course_overviews/migrations/0028_merge_20241210_1837.py @@ -0,0 +1,14 @@ +# Generated by Django 3.2.16 on 2024-12-10 18:37 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('course_overviews', '0027_auto_20240909_1523'), + ('course_overviews', '0027_merge_20240123_1603'), + ] + + operations = [ + ] diff --git a/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py b/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py index e06064f8f142..5e2a7442c2ab 100644 --- a/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py +++ b/openedx/core/djangoapps/content/course_overviews/tests/test_course_overviews.py @@ -380,7 +380,7 @@ def test_malformed_grading_policy(self): course_overview = CourseOverview._create_or_update(course) # pylint: disable=protected-access assert course_overview.lowest_passing_grade is None - @ddt.data((ModuleStoreEnum.Type.mongo, 5, 5), (ModuleStoreEnum.Type.split, 2, 2)) + @ddt.data((ModuleStoreEnum.Type.mongo, 6, 6), (ModuleStoreEnum.Type.split, 2, 2)) @ddt.unpack def test_versioning(self, modulestore_type, min_mongo_calls, max_mongo_calls): """ diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index c8c362831128..1340882baa2e 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -1149,7 +1149,7 @@ zipp==3.8.0 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/edx-organizations.git@6.11.1.2-cucwd-nutmeg#egg=edx-organizations==6.11.1 # via -r ./requirements/edx/private.txt --e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0-maple.1 +-e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0 # via -r ./requirements/edx/private.txt # -e git+https://github.com/CUCWD/edx-ora2.git@4.1.2-nutmeg-cucwd#egg=ora2==4.1.2 -e git+https://github.com/CUCWD/custom-form-app.git@0.1-maple.3-cucwd#egg=custom-form-app==0.1 diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index df119bc4eb97..effede1f42bb 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1654,7 +1654,7 @@ zipp==3.8.0 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/edx-organizations.git@6.11.1.2-cucwd-nutmeg#egg=edx-organizations==6.11.1 # via -r ./requirements/edx/private.txt - -e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0-maple.1 + -e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/edx-ora2.git@4.1.2-nutmeg-cucwd#egg=ora2==4.1.2 # via -r ./requirements/edx/private.txt From 92e16d6f96ee6b60df5ebfa6e91ff0019a4cbd39 Mon Sep 17 00:00:00 2001 From: Rebecca David Date: Mon, 16 Dec 2024 15:05:02 -0500 Subject: [PATCH 11/11] fix: pylint errors --- cms/djangoapps/contentstore/views/course.py | 4 ++-- requirements/edx/base.txt | 2 +- requirements/edx/development.txt | 2 +- requirements/edx/testing.txt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index e3ac79832461..792e3ce8999b 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -1189,9 +1189,9 @@ def settings_handler(request, course_key_string): # lint-amnesty, pylint: disab 'upgrade_deadline': upgrade_deadline, 'mfe_proctored_exam_settings_url': get_proctored_exam_settings_url(course_module.id), } - + course_org = get_course_organization(course_key) - if (course_org): + if course_org: institutions = get_organization_institutions(course_org) settings_context.update({'possible_organization_institutions': list(institutions)}) else: diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt index 1340882baa2e..f5918405c7d4 100644 --- a/requirements/edx/base.txt +++ b/requirements/edx/base.txt @@ -1149,7 +1149,7 @@ zipp==3.8.0 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/edx-organizations.git@6.11.1.2-cucwd-nutmeg#egg=edx-organizations==6.11.1 # via -r ./requirements/edx/private.txt --e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0 +-e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.3#egg=social-auth-backend-bigcommerce==0.1.0 # via -r ./requirements/edx/private.txt # -e git+https://github.com/CUCWD/edx-ora2.git@4.1.2-nutmeg-cucwd#egg=ora2==4.1.2 -e git+https://github.com/CUCWD/custom-form-app.git@0.1-maple.3-cucwd#egg=custom-form-app==0.1 diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt index effede1f42bb..7b3a7fdf79fb 100644 --- a/requirements/edx/development.txt +++ b/requirements/edx/development.txt @@ -1654,7 +1654,7 @@ zipp==3.8.0 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/edx-organizations.git@6.11.1.2-cucwd-nutmeg#egg=edx-organizations==6.11.1 # via -r ./requirements/edx/private.txt - -e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0 + -e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.3#egg=social-auth-backend-bigcommerce==0.1.0 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/edx-ora2.git@4.1.2-nutmeg-cucwd#egg=ora2==4.1.2 # via -r ./requirements/edx/private.txt diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt index 4bcc39103887..b36bc5da5b26 100644 --- a/requirements/edx/testing.txt +++ b/requirements/edx/testing.txt @@ -1523,5 +1523,5 @@ zipp==3.8.0 # via -r ./requirements/edx/private.txt -e git+https://github.com/CUCWD/bigcommerce-api-python.git@bigcommerce-0.22.2-maple.1#egg=bigcommerce==0.22.2 # via -r ./requirements/edx/private.in --e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.1#egg=social-auth-backend-bigcommerce==0.1.0-maple.1 +-e git+https://github.com/CUCWD/social-auth-backend-bigcommerce.git@0.1.0-maple.3#egg=social-auth-backend-bigcommerce==0.1.0 # via -r ./requirements/edx/private.in \ No newline at end of file