diff --git a/lms/djangoapps/commerce/api/v1/models.py b/lms/djangoapps/commerce/api/v1/models.py index f6d547203a..21a24b4ab4 100644 --- a/lms/djangoapps/commerce/api/v1/models.py +++ b/lms/djangoapps/commerce/api/v1/models.py @@ -1,7 +1,10 @@ """ API v1 models. """ +from __future__ import absolute_import + import logging from itertools import groupby +import six from django.db import transaction from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey @@ -22,7 +25,7 @@ class Course(object): _deleted_modes = None def __init__(self, id, modes, **kwargs): # pylint: disable=redefined-builtin - self.id = CourseKey.from_string(unicode(id)) # pylint: disable=invalid-name + self.id = CourseKey.from_string(six.text_type(id)) # pylint: disable=invalid-name self.modes = list(modes) self.verification_deadline = UNDEFINED if 'verification_deadline' in kwargs: @@ -32,7 +35,7 @@ class Course(object): @property def name(self): """ Return course name. """ - course_id = CourseKey.from_string(unicode(self.id)) + course_id = CourseKey.from_string(six.text_type(self.id)) try: return CourseOverview.get_from_id(course_id).display_name @@ -112,7 +115,7 @@ class Course(object): def get(cls, course_id): """ Retrieve a single course. """ try: - course_id = CourseKey.from_string(unicode(course_id)) + course_id = CourseKey.from_string(six.text_type(course_id)) except InvalidKeyError: log.debug(u'[%s] is not a valid course key.', course_id) raise ValueError diff --git a/lms/djangoapps/commerce/api/v1/permissions.py b/lms/djangoapps/commerce/api/v1/permissions.py index a31323b841..1b5b41792d 100644 --- a/lms/djangoapps/commerce/api/v1/permissions.py +++ b/lms/djangoapps/commerce/api/v1/permissions.py @@ -1,5 +1,7 @@ """ Custom API permissions. """ +from __future__ import absolute_import + from django.contrib.auth.models import User from rest_framework.permissions import BasePermission, DjangoModelPermissions diff --git a/lms/djangoapps/commerce/api/v1/serializers.py b/lms/djangoapps/commerce/api/v1/serializers.py index 687fa610ec..6c66dfecf3 100644 --- a/lms/djangoapps/commerce/api/v1/serializers.py +++ b/lms/djangoapps/commerce/api/v1/serializers.py @@ -1,7 +1,10 @@ """ API v1 serializers. """ +from __future__ import absolute_import + from datetime import datetime import pytz +import six from django.utils.translation import ugettext as _ from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey @@ -10,7 +13,7 @@ from rest_framework import serializers from course_modes.models import CourseMode from xmodule.modulestore.django import modulestore -from .models import Course, UNDEFINED +from .models import UNDEFINED, Course class CourseModeSerializer(serializers.ModelSerializer): @@ -40,7 +43,7 @@ def validate_course_id(course_id): Check that course id is valid and exists in modulestore. """ try: - course_key = CourseKey.from_string(unicode(course_id)) + course_key = CourseKey.from_string(six.text_type(course_id)) except InvalidKeyError: raise serializers.ValidationError( _(u"{course_id} is not a valid course key.").format( diff --git a/lms/djangoapps/commerce/api/v1/tests/test_models.py b/lms/djangoapps/commerce/api/v1/tests/test_models.py index 0c48775893..8773b4800f 100644 --- a/lms/djangoapps/commerce/api/v1/tests/test_models.py +++ b/lms/djangoapps/commerce/api/v1/tests/test_models.py @@ -1,4 +1,6 @@ """ Tests for models. """ +from __future__ import absolute_import + import ddt from django.test import TestCase diff --git a/lms/djangoapps/commerce/api/v1/tests/test_serializers.py b/lms/djangoapps/commerce/api/v1/tests/test_serializers.py index c17b069122..a02f6ae168 100644 --- a/lms/djangoapps/commerce/api/v1/tests/test_serializers.py +++ b/lms/djangoapps/commerce/api/v1/tests/test_serializers.py @@ -1,4 +1,6 @@ """ Commerce API v1 serializer tests. """ +from __future__ import absolute_import + from django.test import TestCase from ..serializers import serializers, validate_course_id diff --git a/lms/djangoapps/commerce/api/v1/tests/test_views.py b/lms/djangoapps/commerce/api/v1/tests/test_views.py index be0c17ec8c..a23cc7506c 100644 --- a/lms/djangoapps/commerce/api/v1/tests/test_views.py +++ b/lms/djangoapps/commerce/api/v1/tests/test_views.py @@ -1,15 +1,18 @@ """ Commerce API v1 view tests. """ +from __future__ import absolute_import + import itertools import json from datetime import datetime, timedelta import ddt import pytz +import six from django.conf import settings from django.contrib.auth.models import Permission -from django.urls import reverse, reverse_lazy from django.test import TestCase from django.test.utils import override_settings +from django.urls import reverse, reverse_lazy from rest_framework.utils.encoders import JSONEncoder from course_modes.models import CourseMode @@ -72,8 +75,8 @@ class CourseApiViewTestMixin(object): verification_deadline = verification_deadline or VerificationDeadline.deadline_for_course(course.id) return { - u'id': unicode(course.id), - u'name': unicode(course.display_name), + u'id': six.text_type(course.id), + u'name': six.text_type(course.display_name), u'verification_deadline': cls._serialize_datetime(verification_deadline), u'modes': [cls._serialize_course_mode(mode) for mode in modes] } @@ -112,7 +115,7 @@ class CourseRetrieveUpdateViewTests(CourseApiViewTestMixin, ModuleStoreTestCase) def setUp(self): super(CourseRetrieveUpdateViewTests, self).setUp() - self.path = reverse('commerce_api:v1:courses:retrieve_update', args=[unicode(self.course.id)]) + self.path = reverse('commerce_api:v1:courses:retrieve_update', args=[six.text_type(self.course.id)]) self.user = UserFactory.create() self.client.login(username=self.user.username, password=PASSWORD) @@ -286,7 +289,7 @@ class CourseRetrieveUpdateViewTests(CourseApiViewTestMixin, ModuleStoreTestCase) def test_update_overwrite(self): """ Verify that data submitted via PUT overwrites/deletes modes that are not included in the body of the request. """ - course_id = unicode(self.course.id) + course_id = six.text_type(self.course.id) expected_course_mode = CourseMode( mode_slug=u'credit', min_price=500, @@ -323,7 +326,7 @@ class CourseRetrieveUpdateViewTests(CourseApiViewTestMixin, ModuleStoreTestCase) expiration_datetime=expiration_datetime ) ) - course_id = unicode(self.course.id) + course_id = six.text_type(self.course.id) payload = {u'id': course_id, u'modes': [mode]} path = reverse('commerce_api:v1:courses:retrieve_update', args=[course_id]) @@ -351,7 +354,7 @@ class CourseRetrieveUpdateViewTests(CourseApiViewTestMixin, ModuleStoreTestCase) ) ] expected = self._serialize_course(course, expected_modes) - path = reverse('commerce_api:v1:courses:retrieve_update', args=[unicode(course.id)]) + path = reverse('commerce_api:v1:courses:retrieve_update', args=[six.text_type(course.id)]) response = self.client.put(path, json.dumps(expected), content_type=JSON_CONTENT_TYPE, **request_kwargs) self.assertEqual(response.status_code, 201) @@ -397,13 +400,13 @@ class CourseRetrieveUpdateViewTests(CourseApiViewTestMixin, ModuleStoreTestCase) course_key = 'non/existing/key' course_dict = { - u'id': unicode(course_key), - u'name': unicode('Non Existing Course'), + u'id': six.text_type(course_key), + u'name': six.text_type('Non Existing Course'), u'verification_deadline': None, u'modes': [self._serialize_course_mode(mode) for mode in expected_modes] } - path = reverse('commerce_api:v1:courses:retrieve_update', args=[unicode(course_key)]) + path = reverse('commerce_api:v1:courses:retrieve_update', args=[six.text_type(course_key)]) response = self.client.put(path, json.dumps(course_dict), content_type=JSON_CONTENT_TYPE) self.assertEqual(response.status_code, 400) diff --git a/lms/djangoapps/commerce/api/v1/urls.py b/lms/djangoapps/commerce/api/v1/urls.py index c9de3059c3..98c24e1689 100644 --- a/lms/djangoapps/commerce/api/v1/urls.py +++ b/lms/djangoapps/commerce/api/v1/urls.py @@ -1,3 +1,8 @@ +""" +Commerce URLs +""" +from __future__ import absolute_import + from django.conf import settings from django.conf.urls import include, url diff --git a/lms/djangoapps/commerce/api/v1/views.py b/lms/djangoapps/commerce/api/v1/views.py index 384cbaeb2a..8b9bb7fae9 100644 --- a/lms/djangoapps/commerce/api/v1/views.py +++ b/lms/djangoapps/commerce/api/v1/views.py @@ -1,3 +1,8 @@ +""" +Commerce views +""" +from __future__ import absolute_import + import logging from django.contrib.auth.models import User