Commit f68edf9f by Michael Terry Committed by Michael Terry

Drop publisher_entitlements waffle flag

The feature has fully landed. We just want it always on now.

LEARNER-4152
parent 84f26e86
...@@ -14,7 +14,6 @@ from course_discovery.apps.core.utils import serialize_datetime ...@@ -14,7 +14,6 @@ from course_discovery.apps.core.utils import serialize_datetime
from course_discovery.apps.course_metadata.models import CourseEntitlement as DiscoveryCourseEntitlement from course_discovery.apps.course_metadata.models import CourseEntitlement as DiscoveryCourseEntitlement
from course_discovery.apps.course_metadata.models import Seat as DiscoverySeat from course_discovery.apps.course_metadata.models import Seat as DiscoverySeat
from course_discovery.apps.course_metadata.models import CourseRun, SeatType, Video from course_discovery.apps.course_metadata.models import CourseRun, SeatType, Video
from course_discovery.apps.course_metadata.tests import toggle_switch
from course_discovery.apps.course_metadata.tests.factories import OrganizationFactory, PersonFactory from course_discovery.apps.course_metadata.tests.factories import OrganizationFactory, PersonFactory
from course_discovery.apps.ietf_language_tags.models import LanguageTag from course_discovery.apps.ietf_language_tags.models import LanguageTag
from course_discovery.apps.publisher.api.utils import (serialize_entitlement_for_ecommerce_api, from course_discovery.apps.publisher.api.utils import (serialize_entitlement_for_ecommerce_api,
...@@ -82,8 +81,6 @@ class CourseRunViewSetTests(APITestCase): ...@@ -82,8 +81,6 @@ class CourseRunViewSetTests(APITestCase):
@responses.activate @responses.activate
@mock.patch.object(Partner, 'access_token', return_value='JWT fake') @mock.patch.object(Partner, 'access_token', return_value='JWT fake')
def test_publish(self, mock_access_token): # pylint: disable=unused-argument,too-many-statements def test_publish(self, mock_access_token): # pylint: disable=unused-argument,too-many-statements
toggle_switch('publisher_entitlements', True)
publisher_course_run = self._create_course_run_for_publication() publisher_course_run = self._create_course_run_for_publication()
currency = Currency.objects.get(code='USD') currency = Currency.objects.get(code='USD')
......
import logging import logging
from collections import OrderedDict from collections import OrderedDict
import waffle
from edx_rest_api_client.client import EdxRestApiClient from edx_rest_api_client.client import EdxRestApiClient
from edx_rest_framework_extensions.authentication import JwtAuthentication from edx_rest_framework_extensions.authentication import JwtAuthentication
from rest_framework import permissions, serializers, status, viewsets from rest_framework import permissions, serializers, status, viewsets
...@@ -95,9 +94,8 @@ class CourseRunViewSet(viewsets.GenericViewSet): ...@@ -95,9 +94,8 @@ class CourseRunViewSet(viewsets.GenericViewSet):
# NOTE: We only order here to aid testing. The E-Commerce API does NOT care about ordering. # NOTE: We only order here to aid testing. The E-Commerce API does NOT care about ordering.
products = [serialize_seat_for_ecommerce_api(seat) for seat in products = [serialize_seat_for_ecommerce_api(seat) for seat in
course_run.seats.exclude(type=Seat.CREDIT).order_by('created')] course_run.seats.exclude(type=Seat.CREDIT).order_by('created')]
if waffle.switch_is_active('publisher_entitlements'): products.extend([serialize_entitlement_for_ecommerce_api(entitlement) for entitlement in
products.extend([serialize_entitlement_for_ecommerce_api(entitlement) for entitlement in course_run.course.entitlements.order_by('created')])
course_run.course.entitlements.order_by('created')])
data['products'] = products data['products'] = products
try: try:
...@@ -160,17 +158,16 @@ class CourseRunViewSet(viewsets.GenericViewSet): ...@@ -160,17 +158,16 @@ class CourseRunViewSet(viewsets.GenericViewSet):
discovery_course_run.transcript_languages.add(*course_run.transcript_languages.all()) discovery_course_run.transcript_languages.add(*course_run.transcript_languages.all())
discovery_course_run.staff.add(*course_run.staff.all()) discovery_course_run.staff.add(*course_run.staff.all())
if waffle.switch_is_active('publisher_entitlements'): for entitlement in publisher_course.entitlements.all():
for entitlement in publisher_course.entitlements.all(): DiscoveryCourseEntitlement.objects.update_or_create(
DiscoveryCourseEntitlement.objects.update_or_create( course=discovery_course,
course=discovery_course, mode=SeatType.objects.get(slug=entitlement.mode),
mode=SeatType.objects.get(slug=entitlement.mode), defaults={
defaults={ 'partner': partner,
'partner': partner, 'price': entitlement.price,
'price': entitlement.price, 'currency': entitlement.currency,
'currency': entitlement.currency, }
} )
)
for seat in course_run.seats.exclude(type=Seat.CREDIT).order_by('created'): for seat in course_run.seats.exclude(type=Seat.CREDIT).order_by('created'):
DiscoverySeat.objects.update_or_create( DiscoverySeat.objects.update_or_create(
......
...@@ -16,5 +16,4 @@ PARTNER_SUPPORT_GROUP_NAME = 'Partner Support Members' ...@@ -16,5 +16,4 @@ PARTNER_SUPPORT_GROUP_NAME = 'Partner Support Members'
PARTNER_COORDINATOR_GROUP_NAME = 'Partner Coordinators' PARTNER_COORDINATOR_GROUP_NAME = 'Partner Coordinators'
# Waffle flags # Waffle flags
PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH = 'publisher_entitlements'
PUBLISHER_CREATE_AUDIT_SEATS_FOR_VERIFIED_COURSE_RUNS = 'publisher_create_audit_seats_for_verified_course_runs' PUBLISHER_CREATE_AUDIT_SEATS_FOR_VERIFIED_COURSE_RUNS = 'publisher_create_audit_seats_for_verified_course_runs'
...@@ -35,7 +35,7 @@ from course_discovery.apps.publisher.choices import ( ...@@ -35,7 +35,7 @@ from course_discovery.apps.publisher.choices import (
) )
from course_discovery.apps.publisher.constants import ( from course_discovery.apps.publisher.constants import (
ADMIN_GROUP_NAME, INTERNAL_USER_GROUP_NAME, PROJECT_COORDINATOR_GROUP_NAME, ADMIN_GROUP_NAME, INTERNAL_USER_GROUP_NAME, PROJECT_COORDINATOR_GROUP_NAME,
PUBLISHER_CREATE_AUDIT_SEATS_FOR_VERIFIED_COURSE_RUNS, PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH, REVIEWER_GROUP_NAME PUBLISHER_CREATE_AUDIT_SEATS_FOR_VERIFIED_COURSE_RUNS, REVIEWER_GROUP_NAME
) )
from course_discovery.apps.publisher.models import ( from course_discovery.apps.publisher.models import (
Course, CourseEntitlement, CourseRun, CourseRunState, CourseState, OrganizationExtension, Seat Course, CourseEntitlement, CourseRun, CourseRunState, CourseState, OrganizationExtension, Seat
...@@ -302,8 +302,6 @@ class CreateCourseViewTests(SiteMixin, TestCase): ...@@ -302,8 +302,6 @@ class CreateCourseViewTests(SiteMixin, TestCase):
""" """
Verify that we create an entitlement for appropriate types (happy path) Verify that we create an entitlement for appropriate types (happy path)
""" """
toggle_switch(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH, True)
data = {'mode': mode, 'price': 50} data = {'mode': mode, 'price': 50}
course = self._create_course_with_post(data) course = self._create_course_with_post(data)
...@@ -316,21 +314,10 @@ class CreateCourseViewTests(SiteMixin, TestCase): ...@@ -316,21 +314,10 @@ class CreateCourseViewTests(SiteMixin, TestCase):
self.assertEqual(mode, entitlement.mode) self.assertEqual(mode, entitlement.mode)
self.assertEqual(50, entitlement.price) self.assertEqual(50, entitlement.price)
def test_no_entitlement_created_without_switch(self):
"""
Verify that when we create a verified seat without the entitlement waffle switch enabled, we set version right
"""
toggle_switch(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH, False)
data = {'mode': CourseEntitlement.VERIFIED, 'price': 50}
course = self._create_course_with_post(data)
self.assertEqual(0, CourseEntitlement.objects.all().count())
self.assertEqual(Course.SEAT_VERSION, course.version)
def test_seat_version(self): def test_seat_version(self):
""" """
Verify that when we create a seat product without an entitlement, we set version correctly Verify that when we create a seat product without an entitlement, we set version correctly
""" """
toggle_switch(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH, True)
course = self._create_course_with_post() course = self._create_course_with_post()
self.assertEqual(0, CourseEntitlement.objects.all().count()) self.assertEqual(0, CourseEntitlement.objects.all().count())
self.assertEqual(Course.SEAT_VERSION, course.version) self.assertEqual(Course.SEAT_VERSION, course.version)
...@@ -340,7 +327,6 @@ class CreateCourseViewTests(SiteMixin, TestCase): ...@@ -340,7 +327,6 @@ class CreateCourseViewTests(SiteMixin, TestCase):
""" """
Verify that we check price validity when making an entitlement Verify that we check price validity when making an entitlement
""" """
toggle_switch(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH, True)
data = {'title': 'Test2', 'number': 'testX234', 'mode': CourseEntitlement.VERIFIED} data = {'title': 'Test2', 'number': 'testX234', 'mode': CourseEntitlement.VERIFIED}
if price is not None: if price is not None:
data['price'] = price data['price'] = price
...@@ -2996,7 +2982,6 @@ class CourseEditViewTests(SiteMixin, TestCase): ...@@ -2996,7 +2982,6 @@ class CourseEditViewTests(SiteMixin, TestCase):
Verify that a SEAT_VERSION Course that has course runs associated with it can be updated without changing Verify that a SEAT_VERSION Course that has course runs associated with it can be updated without changing
the version, and can change the version as long as the Course Run Seat prices and types match the Course the version, and can change the version as long as the Course Run Seat prices and types match the Course
""" """
toggle_switch(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH, True)
self.user.groups.add(Group.objects.get(name=INTERNAL_USER_GROUP_NAME)) self.user.groups.add(Group.objects.get(name=INTERNAL_USER_GROUP_NAME))
self.course.version = Course.SEAT_VERSION self.course.version = Course.SEAT_VERSION
self.course.save() self.course.save()
...@@ -3070,7 +3055,6 @@ class CourseEditViewTests(SiteMixin, TestCase): ...@@ -3070,7 +3055,6 @@ class CourseEditViewTests(SiteMixin, TestCase):
""" """
Verify that an ENTITLEMENT_VERSION Course cannot be reverted to a SEAT_RUN Course, but a Course can be updated Verify that an ENTITLEMENT_VERSION Course cannot be reverted to a SEAT_RUN Course, but a Course can be updated
""" """
toggle_switch(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH, True)
self.user.groups.add(Group.objects.get(name=INTERNAL_USER_GROUP_NAME)) self.user.groups.add(Group.objects.get(name=INTERNAL_USER_GROUP_NAME))
self.course.version = Course.SEAT_VERSION self.course.version = Course.SEAT_VERSION
self.course.save() self.course.save()
......
...@@ -27,7 +27,6 @@ from course_discovery.apps.course_metadata.models import Person ...@@ -27,7 +27,6 @@ from course_discovery.apps.course_metadata.models import Person
from course_discovery.apps.ietf_language_tags.models import LanguageTag from course_discovery.apps.ietf_language_tags.models import LanguageTag
from course_discovery.apps.publisher import emails, mixins, serializers from course_discovery.apps.publisher import emails, mixins, serializers
from course_discovery.apps.publisher.choices import CourseRunStateChoices, CourseStateChoices, PublisherUserRole from course_discovery.apps.publisher.choices import CourseRunStateChoices, CourseStateChoices, PublisherUserRole
from course_discovery.apps.publisher.constants import PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH
from course_discovery.apps.publisher.dataloader.create_courses import process_course from course_discovery.apps.publisher.dataloader.create_courses import process_course
from course_discovery.apps.publisher.emails import send_email_for_published_course_run_editing from course_discovery.apps.publisher.emails import send_email_for_published_course_run_editing
from course_discovery.apps.publisher.forms import ( from course_discovery.apps.publisher.forms import (
...@@ -256,14 +255,12 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -256,14 +255,12 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
return success_url return success_url
def get_context_data(self): def get_context_data(self):
data = { return {
'course_form': self.course_form(user=self.request.user), 'course_form': self.course_form(user=self.request.user),
'entitlement_form': self.entitlement_form(),
'publisher_hide_features_for_pilot': waffle.switch_is_active('publisher_hide_features_for_pilot'), 'publisher_hide_features_for_pilot': waffle.switch_is_active('publisher_hide_features_for_pilot'),
'publisher_add_instructor_feature': waffle.switch_is_active('publisher_add_instructor_feature'), 'publisher_add_instructor_feature': waffle.switch_is_active('publisher_add_instructor_feature'),
} }
if waffle.switch_is_active(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH):
data['entitlement_form'] = self.entitlement_form()
return data
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
return render(request, self.template_name, self.get_context_data()) return render(request, self.template_name, self.get_context_data())
...@@ -272,8 +269,6 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -272,8 +269,6 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
ctx = self.get_context_data() ctx = self.get_context_data()
add_new_run = request.POST.get('add_new_run') add_new_run = request.POST.get('add_new_run')
support_entitlements = waffle.switch_is_active(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH)
# pass selected organization to CourseForm to populate related # pass selected organization to CourseForm to populate related
# choices into institution admin field # choices into institution admin field
user = self.request.user user = self.request.user
...@@ -287,7 +282,7 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -287,7 +282,7 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
try: try:
with transaction.atomic(): with transaction.atomic():
course = course_form.save(commit=False) course = course_form.save(commit=False)
if entitlement_form['mode'].value() and support_entitlements: if entitlement_form['mode'].value():
course.version = Course.ENTITLEMENT_VERSION course.version = Course.ENTITLEMENT_VERSION
else: else:
course.version = Course.SEAT_VERSION course.version = Course.SEAT_VERSION
...@@ -297,7 +292,7 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -297,7 +292,7 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
course_form.save_m2m() course_form.save_m2m()
# Now create entitlement if we need to # Now create entitlement if we need to
if course.version == Course.ENTITLEMENT_VERSION: if course.uses_entitlements:
entitlement_form.save(course=course) entitlement_form.save(course=course)
organization_extension = get_object_or_404( organization_extension = get_object_or_404(
...@@ -350,10 +345,9 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -350,10 +345,9 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
ctx.update( ctx.update(
{ {
'course_form': course_form, 'course_form': course_form,
'entitlement_form': entitlement_form,
} }
) )
if support_entitlements:
ctx['entitlement_form'] = entitlement_form
return render(request, self.template_name, ctx, status=400) return render(request, self.template_name, ctx, status=400)
...@@ -388,11 +382,10 @@ class CourseEditView(mixins.PublisherPermissionMixin, UpdateView): ...@@ -388,11 +382,10 @@ class CourseEditView(mixins.PublisherPermissionMixin, UpdateView):
} }
) )
if waffle.switch_is_active(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH): if self.object.uses_entitlements:
if self.object.version == Course.ENTITLEMENT_VERSION: context['entitlement_form'] = self.entitlement_form(instance=self.object.entitlements.first())
context['entitlement_form'] = self.entitlement_form(instance=self.object.entitlements.first()) else:
else: context['entitlement_form'] = self.entitlement_form({'mode': ''})
context['entitlement_form'] = self.entitlement_form({'mode': ''})
return context return context
...@@ -560,13 +553,9 @@ class CourseEditView(mixins.PublisherPermissionMixin, UpdateView): ...@@ -560,13 +553,9 @@ class CourseEditView(mixins.PublisherPermissionMixin, UpdateView):
) )
return self.render_to_response(self.get_context_data(form=course_form)) return self.render_to_response(self.get_context_data(form=course_form))
# If the switch is active handle the different Course versions, otherwise just save the form like normal error_response = self._handle_entitlement_update(user, request, course_form)
if waffle.switch_is_active(PUBLISHER_ENTITLEMENTS_WAFFLE_SWITCH): if error_response:
error_response = self._handle_entitlement_update(user, request, course_form) return error_response
if error_response:
return error_response
else:
self._update_course(course_form, user, Course.SEAT_VERSION)
organization = course_form.cleaned_data['organization'] organization = course_form.cleaned_data['organization']
if self.object.organizations.first() != organization: if self.object.organizations.first() != organization:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment