Commit 5f024f8e by Clinton Blackburn

Exposed upgraded deadline on course run form

LEARNER-2621
parent 066d6216
import datetime
import html import html
from dal import autocomplete from dal import autocomplete
...@@ -396,14 +397,16 @@ class SeatForm(BaseForm): ...@@ -396,14 +397,16 @@ class SeatForm(BaseForm):
] ]
type = forms.ChoiceField(choices=TYPE_CHOICES, required=False, label=_('Enrollment Track')) type = forms.ChoiceField(choices=TYPE_CHOICES, required=False, label=_('Enrollment Track'))
price = forms.DecimalField(max_digits=6, decimal_places=2, required=False, initial=0.00)
credit_price = forms.DecimalField(max_digits=6, decimal_places=2, required=False, initial=0.00) credit_price = forms.DecimalField(max_digits=6, decimal_places=2, required=False, initial=0.00)
class Meta: class Meta:
fields = ('price', 'type', 'credit_price') fields = ('price', 'type', 'credit_price', 'course_run', 'upgrade_deadline',)
model = Seat model = Seat
widgets = {
'course_run': forms.HiddenInput(),
}
def save(self, commit=True, course_run=None, changed_by=None): # pylint: disable=arguments-differ def save(self, commit=True):
# When seat is save make sure its prices and others fields updated accordingly. # When seat is save make sure its prices and others fields updated accordingly.
seat = super(SeatForm, self).save(commit=False) seat = super(SeatForm, self).save(commit=False)
if seat.type in [Seat.HONOR, Seat.AUDIT]: if seat.type in [Seat.HONOR, Seat.AUDIT]:
...@@ -416,21 +419,16 @@ class SeatForm(BaseForm): ...@@ -416,21 +419,16 @@ class SeatForm(BaseForm):
seat.upgrade_deadline = None seat.upgrade_deadline = None
self.reset_credit_to_default(seat) self.reset_credit_to_default(seat)
if course_run:
seat.course_run = course_run
if changed_by:
seat.changed_by = changed_by
if commit: if commit:
seat.save() seat.save()
return seat return seat
def clean(self): def clean(self):
price = self.cleaned_data.get('price') cleaned_data = super().clean()
credit_price = self.cleaned_data.get('credit_price') price = cleaned_data.get('price')
seat_type = self.cleaned_data.get('type') credit_price = cleaned_data.get('credit_price')
seat_type = cleaned_data.get('type')
if seat_type and seat_type != Seat.AUDIT and not price: if seat_type and seat_type != Seat.AUDIT and not price:
self.add_error('price', _('Please specify a price.')) self.add_error('price', _('Please specify a price.'))
...@@ -438,7 +436,13 @@ class SeatForm(BaseForm): ...@@ -438,7 +436,13 @@ class SeatForm(BaseForm):
if seat_type == Seat.CREDIT and not credit_price: if seat_type == Seat.CREDIT and not credit_price:
self.add_error('credit_price', _('Please specify a price for credit.')) self.add_error('credit_price', _('Please specify a price for credit.'))
return self.cleaned_data if not cleaned_data.get('upgrade_deadline'):
course_run = cleaned_data.get('course_run')
if course_run:
cleaned_data['upgrade_deadline'] = course_run.end - datetime.timedelta(days=10)
return cleaned_data
def reset_credit_to_default(self, seat): def reset_credit_to_default(self, seat):
seat.credit_provider = '' seat.credit_provider = ''
......
...@@ -8,8 +8,9 @@ from course_discovery.apps.core.models import User ...@@ -8,8 +8,9 @@ from course_discovery.apps.core.models import User
from course_discovery.apps.core.tests.factories import UserFactory from course_discovery.apps.core.tests.factories import UserFactory
from course_discovery.apps.course_metadata.models import Person from course_discovery.apps.course_metadata.models import Person
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.publisher.forms import CourseForm, CourseRunForm, PublisherUserCreationForm from course_discovery.apps.publisher.forms import CourseForm, CourseRunForm, PublisherUserCreationForm, SeatForm
from course_discovery.apps.publisher.tests.factories import CourseFactory, OrganizationExtensionFactory from course_discovery.apps.publisher.models import Seat
from course_discovery.apps.publisher.tests.factories import CourseFactory, OrganizationExtensionFactory, SeatFactory
class UserModelChoiceFieldTests(TestCase): class UserModelChoiceFieldTests(TestCase):
...@@ -278,3 +279,18 @@ class PublisherCustomCourseFormTests(TestCase): ...@@ -278,3 +279,18 @@ class PublisherCustomCourseFormTests(TestCase):
course_form.save() course_form.save()
course.refresh_from_db() course.refresh_from_db()
assert course.title == 'áçã' assert course.title == 'áçã'
class SeatFormTests(TestCase):
def test_upgrade_deadline(self):
seat = SeatFactory()
data = {
'price': 100,
'type': Seat.VERIFIED,
'course_run': seat.course_run.pk,
'upgrade_deadline': None,
}
form = SeatForm(instance=seat, data=data)
assert form.is_valid()
assert form.cleaned_data['upgrade_deadline'] == seat.course_run.end - timedelta(days=10)
...@@ -730,7 +730,7 @@ class CourseRunEditView(mixins.LoginRequiredMixin, mixins.PublisherPermissionMix ...@@ -730,7 +730,7 @@ class CourseRunEditView(mixins.LoginRequiredMixin, mixins.PublisherPermissionMix
run_form = self.run_form( run_form = self.run_form(
request.POST, instance=course_run, is_project_coordinator=context.get('is_project_coordinator') request.POST, instance=course_run, is_project_coordinator=context.get('is_project_coordinator')
) )
seat_form = self.seat_form(request.POST, instance=course_run.seats.first()) seat_form = self.seat_form(request.POST, instance=course_run.seats.first(), initial={'changed_by': user,})
if run_form.is_valid() and seat_form.is_valid(): if run_form.is_valid() and seat_form.is_valid():
try: try:
with transaction.atomic(): with transaction.atomic():
...@@ -741,7 +741,7 @@ class CourseRunEditView(mixins.LoginRequiredMixin, mixins.PublisherPermissionMix ...@@ -741,7 +741,7 @@ class CourseRunEditView(mixins.LoginRequiredMixin, mixins.PublisherPermissionMix
# If price-type comes with request then save the seat object. # If price-type comes with request then save the seat object.
if request.POST.get('type'): if request.POST.get('type'):
seat_form.save(changed_by=user, course_run=course_run) seat_form.save()
# in case of any updating move the course-run state to draft except draft and published state. # in case of any updating move the course-run state to draft except draft and published state.
immutable_states = [CourseRunStateChoices.Draft, CourseRunStateChoices.Published] immutable_states = [CourseRunStateChoices.Draft, CourseRunStateChoices.Published]
......
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