Commit 07aa3374 by Waheed Ahmed

Fixed autocomplete queryset for LanguageTag.

ECOM-6885
parent f5f9a83e
...@@ -8,6 +8,7 @@ from django.utils.translation import ugettext_lazy as _ ...@@ -8,6 +8,7 @@ from django.utils.translation import ugettext_lazy as _
from course_discovery.apps.course_metadata.choices import CourseRunPacing from course_discovery.apps.course_metadata.choices import CourseRunPacing
from course_discovery.apps.course_metadata.models import Person, Organization, Subject from course_discovery.apps.course_metadata.models import Person, Organization, Subject
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.mixins import LanguageModelSelect2Multiple
from course_discovery.apps.publisher.models import ( from course_discovery.apps.publisher.models import (
Course, CourseRun, Seat, User, OrganizationExtension, OrganizationUserRole, CourseUserRole Course, CourseRun, Seat, User, OrganizationExtension, OrganizationUserRole, CourseUserRole
) )
...@@ -174,7 +175,7 @@ class CustomCourseRunForm(CourseRunForm): ...@@ -174,7 +175,7 @@ class CustomCourseRunForm(CourseRunForm):
transcript_languages = forms.ModelMultipleChoiceField( transcript_languages = forms.ModelMultipleChoiceField(
queryset=LanguageTag.objects.all(), queryset=LanguageTag.objects.all(),
widget=autocomplete.ModelSelect2Multiple( widget=LanguageModelSelect2Multiple(
url='language_tags:language-tag-autocomplete', url='language_tags:language-tag-autocomplete',
attrs={ attrs={
'data-minimum-input-length': 2 'data-minimum-input-length': 2
...@@ -202,7 +203,8 @@ class CustomCourseRunForm(CourseRunForm): ...@@ -202,7 +203,8 @@ class CustomCourseRunForm(CourseRunForm):
fields = ( fields = (
'length', 'transcript_languages', 'language', 'min_effort', 'max_effort', 'length', 'transcript_languages', 'language', 'min_effort', 'max_effort',
'contacted_partner_manager', 'target_content', 'pacing_type', 'video_language', 'contacted_partner_manager', 'target_content', 'pacing_type', 'video_language',
'staff', 'start', 'end', 'is_xseries', 'xseries_name', 'is_micromasters', 'micromasters_name', 'staff', 'start', 'end', 'is_xseries', 'xseries_name', 'is_micromasters',
'micromasters_name', 'lms_course_id',
) )
def save(self, commit=True, course=None, changed_by=None): # pylint: disable=arguments-differ def save(self, commit=True, course=None, changed_by=None): # pylint: disable=arguments-differ
......
from functools import wraps from functools import wraps
from dal import autocomplete
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.http import HttpResponseForbidden, HttpResponseRedirect from django.http import HttpResponseForbidden, HttpResponseRedirect
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
...@@ -56,6 +58,7 @@ class FormValidMixin(object): ...@@ -56,6 +58,7 @@ class FormValidMixin(object):
publisher_object = form.save(commit=False) publisher_object = form.save(commit=False)
publisher_object.changed_by = user publisher_object.changed_by = user
publisher_object.save() publisher_object.save()
form.save_m2m()
if self.change_state: if self.change_state:
publisher_object.change_state(user=user) publisher_object.change_state(user=user)
...@@ -108,3 +111,18 @@ class PublisherUserRequiredMixin(object): ...@@ -108,3 +111,18 @@ class PublisherUserRequiredMixin(object):
@method_decorator(publisher_user_required) @method_decorator(publisher_user_required)
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
return super(PublisherUserRequiredMixin, self).dispatch(request, *args, **kwargs) return super(PublisherUserRequiredMixin, self).dispatch(request, *args, **kwargs)
class LanguageModelSelect2Multiple(autocomplete.ModelSelect2Multiple):
"""
QuerySet support for LanguageTag choices.
django.autocomplete queryset expects id field to filter choices but LanguageTag
does not have id field in it. It has code as primary key instead of id.
"""
def filter_choices_to_render(self, selected_choices):
# pylint: disable=no-member
self.choices.queryset = self.choices.queryset.filter(
code__in=[c for c in selected_choices if c]
)
...@@ -22,6 +22,7 @@ from course_discovery.apps.core.tests.factories import UserFactory, USER_PASSWOR ...@@ -22,6 +22,7 @@ from course_discovery.apps.core.tests.factories import UserFactory, USER_PASSWOR
from course_discovery.apps.core.tests.helpers import make_image_file from course_discovery.apps.core.tests.helpers import make_image_file
from course_discovery.apps.course_metadata.tests import toggle_switch from course_discovery.apps.course_metadata.tests import toggle_switch
from course_discovery.apps.course_metadata.tests.factories import OrganizationFactory from course_discovery.apps.course_metadata.tests.factories import OrganizationFactory
from course_discovery.apps.ietf_language_tags.models import LanguageTag
from course_discovery.apps.publisher.choices import PublisherUserRole from course_discovery.apps.publisher.choices import PublisherUserRole
from course_discovery.apps.publisher.constants import ( from course_discovery.apps.publisher.constants import (
INTERNAL_USER_GROUP_NAME, ADMIN_GROUP_NAME, PARTNER_COORDINATOR_GROUP_NAME, REVIEWER_GROUP_NAME INTERNAL_USER_GROUP_NAME, ADMIN_GROUP_NAME, PARTNER_COORDINATOR_GROUP_NAME, REVIEWER_GROUP_NAME
...@@ -1723,3 +1724,16 @@ class CourseRunEditViewTests(TestCase): ...@@ -1723,3 +1724,16 @@ class CourseRunEditViewTests(TestCase):
self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME)) self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME))
response = self.client.get(self.edit_page_url) response = self.client.get(self.edit_page_url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_edit_page_with_language_tags(self):
"""
Verify that publisher user can access course run edit page.
"""
self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME))
language_tag = LanguageTag(code='te-st', name='Test Language')
language_tag.save()
self.course_run.transcript_languages.add(language_tag)
self.course_run.save()
response = self.client.get(self.edit_page_url)
self.assertEqual(response.status_code, 200)
...@@ -20,8 +20,7 @@ from course_discovery.apps.core.models import User ...@@ -20,8 +20,7 @@ from course_discovery.apps.core.models import User
from course_discovery.apps.publisher.choices import PublisherUserRole from course_discovery.apps.publisher.choices import PublisherUserRole
from course_discovery.apps.publisher.emails import send_email_for_course_creation from course_discovery.apps.publisher.emails import send_email_for_course_creation
from course_discovery.apps.publisher.forms import ( from course_discovery.apps.publisher.forms import (
CourseForm, CourseRunForm, SeatForm, CustomCourseForm, CustomCourseRunForm, CourseForm, SeatForm, CustomCourseForm, CustomCourseRunForm, CustomSeatForm, UpdateCourseForm
CustomSeatForm, UpdateCourseForm
) )
from course_discovery.apps.publisher import mixins from course_discovery.apps.publisher import mixins
from course_discovery.apps.publisher.models import ( from course_discovery.apps.publisher.models import (
...@@ -393,7 +392,7 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView): ...@@ -393,7 +392,7 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView):
class CourseRunEditView(mixins.LoginRequiredMixin, mixins.PublisherPermissionMixin, mixins.FormValidMixin, UpdateView): class CourseRunEditView(mixins.LoginRequiredMixin, mixins.PublisherPermissionMixin, mixins.FormValidMixin, UpdateView):
""" Course Run Edit View.""" """ Course Run Edit View."""
model = CourseRun model = CourseRun
form_class = CourseRunForm form_class = CustomCourseRunForm
permission = OrganizationExtension.EDIT_COURSE_RUN permission = OrganizationExtension.EDIT_COURSE_RUN
template_name = 'publisher/course_run_form.html' template_name = 'publisher/course_run_form.html'
success_url = 'publisher:publisher_course_runs_edit' success_url = 'publisher:publisher_course_runs_edit'
......
...@@ -43,3 +43,7 @@ ...@@ -43,3 +43,7 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block extra_js %}
{{ form.media }}
{% endblock %}
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