Skip to content

Commit 876b7be

Browse files
test: test cases added for validation
1 parent fbe00dd commit 876b7be

File tree

6 files changed

+55
-45
lines changed

6 files changed

+55
-45
lines changed

cms/forms.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class CoursewareForm(WagtailAdminPageForm):
3939
Admin form for the Courseware Pages.
4040
4141
This form introduces price and course_run fields to manage product pricing in CMS.
42+
And update course dropdown based on the page type.
4243
"""
4344

4445
course_run = forms.ChoiceField(
@@ -59,12 +60,7 @@ def __init__(self, data=None, files=None, parent_page=None, *args, **kwargs):
5960

6061
instance = kwargs.get("instance")
6162
if instance and instance.is_internal_or_external_course_page:
62-
course_qs = Course.objects.all()
63-
if instance.is_course_page:
64-
course_qs = Course.objects.filter(is_external=False)
65-
elif instance.is_external_course_page:
66-
course_qs = Course.objects.filter(is_external=True)
67-
63+
course_qs = Course.objects.filter(is_external=instance.is_external_course_page)
6864
self.fields["course"].queryset = course_qs
6965

7066
if instance and instance.id:

courses/admin.py

-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from django.forms import TextInput
1010

1111
from mitxpro.admin import AuditableModelAdmin, TimestampedModelAdmin
12-
from courses.forms import CourseForm
1312
from mitxpro.utils import get_field_names, now_in_utc
1413

1514
from .models import (
@@ -62,8 +61,6 @@ class CourseAdmin(admin.ModelAdmin):
6261
models.CharField: {"widget": TextInput(attrs={"size": "80"})}
6362
}
6463

65-
form = CourseForm
66-
6764
@admin.display(
6865
description="Program",
6966
ordering="program__readable_id",

courses/forms.py

-35
This file was deleted.

courses/models.py

+31
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,37 @@ def available_runs(self, user):
614614
class Meta: # noqa: DJ012
615615
ordering = ("program", "title")
616616

617+
def clean(self):
618+
"""
619+
Ensures that is_external field is not changed if course is associated with CoursePage or ExternalCoursePage
620+
"""
621+
622+
if not self.pk:
623+
return
624+
625+
original = Course.objects.get(pk=self.pk)
626+
if original.is_external == self.is_external:
627+
return
628+
629+
if getattr(self, "coursepage", None):
630+
raise ValidationError(
631+
{
632+
"is_external": (
633+
"Course is associated with CoursePage, cannot change is_external value"
634+
)
635+
}
636+
)
637+
elif getattr(self, "externalcoursepage", None):
638+
raise ValidationError(
639+
{
640+
"is_external": (
641+
"Course is associated with ExternalCoursePage, cannot change is_external value"
642+
)
643+
}
644+
)
645+
646+
return super().clean()
647+
617648
def save(self, *args, **kwargs): # noqa: DJ012
618649
"""Overridden save method"""
619650
# If adding a Course to a Program without position specified, set it as the highest position + 1.

courses/models_test.py

+21
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from cms.factories import (
1212
CertificatePageFactory,
1313
CoursePageFactory,
14+
ExternalCoursePageFactory,
1415
FacultyMembersPageFactory,
1516
ProgramPageFactory,
1617
)
@@ -841,3 +842,23 @@ def test_course_language_prevent_delete():
841842
course_page = CoursePageFactory.create()
842843
with pytest.raises(ProtectedError):
843844
course_page.language.delete()
845+
846+
@pytest.mark.parametrize(("is_external", "page_factory"), [(True, ExternalCoursePageFactory), (False, CoursePageFactory)])
847+
def test_is_external_field_update_after_course_is_attached_with_course_page(is_external, page_factory):
848+
"""
849+
Tests that is_external field is not updated after a course is attached with a course page.
850+
"""
851+
course = CourseFactory.create(is_external=is_external, page=None)
852+
page_factory.create(course=course)
853+
course.is_external = not is_external
854+
with pytest.raises(ValidationError):
855+
course.save()
856+
857+
@pytest.mark.parametrize(("is_external"), [True, False])
858+
def test_is_external_field_update_before_course_is_attached_with_course_page(is_external):
859+
"""
860+
Tests that is_external field is updated bnefore a course is attached with a course page.
861+
"""
862+
course = CourseFactory.create(is_external=is_external, page=None)
863+
course.is_external = not is_external
864+
course.save()

ecommerce/conftest.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def basket_and_coupons():
3333
"""
3434
Sample basket and coupon
3535
"""
36-
basket_item = BasketItemFactory()
36+
basket_item = BasketItemFactory(product__content_object__course__page=None)
3737

3838
# Some prices for the basket item product
3939
ProductVersionFactory(product=basket_item.product, price=Decimal("15.00"))

0 commit comments

Comments
 (0)