diff --git a/lms/djangoapps/discussion/apps.py b/lms/djangoapps/discussion/apps.py index 2a0c2a2db6fabd1dec7911568c47216e461817ad..7aa94c6bda1c8ca0b36841dce07c13303397fb5e 100644 --- a/lms/djangoapps/discussion/apps.py +++ b/lms/djangoapps/discussion/apps.py @@ -4,10 +4,12 @@ Discussion Application Configuration Signal handlers are connected here. """ +from __future__ import absolute_import + from django.apps import AppConfig from openedx.core.constants import COURSE_ID_PATTERN -from openedx.core.djangoapps.plugins.constants import ProjectType, SettingsType, PluginURLs, PluginSettings +from openedx.core.djangoapps.plugins.constants import PluginSettings, PluginURLs, ProjectType, SettingsType class DiscussionConfig(AppConfig): diff --git a/lms/djangoapps/discussion/django_comment_client/middleware.py b/lms/djangoapps/discussion/django_comment_client/middleware.py index 5ab3cd29a8f227088aebe4885ce66cd72d828847..64f1c4061735213edde1a18ed6a4d304267114e8 100644 --- a/lms/djangoapps/discussion/django_comment_client/middleware.py +++ b/lms/djangoapps/discussion/django_comment_client/middleware.py @@ -1,4 +1,6 @@ # pylint: disable=missing-docstring +from __future__ import absolute_import + import json import logging diff --git a/lms/djangoapps/discussion/django_comment_client/permissions.py b/lms/djangoapps/discussion/django_comment_client/permissions.py index 7ec72ad1d614a61997ac4853b1f4f8a5a088aa65..3928ce606c9408d96a468bc01b27753290fc0abe 100644 --- a/lms/djangoapps/discussion/django_comment_client/permissions.py +++ b/lms/djangoapps/discussion/django_comment_client/permissions.py @@ -3,16 +3,20 @@ Module for checking permissions with the comment_client backend """ +from __future__ import absolute_import + import logging from types import NoneType +import six from edx_django_utils.cache import DEFAULT_REQUEST_CACHE from opaque_keys.edx.keys import CourseKey from lms.djangoapps.teams.models import CourseTeam from openedx.core.djangoapps.django_comment_common.comment_client import Thread from openedx.core.djangoapps.django_comment_common.models import ( - CourseDiscussionSettings, all_permissions_for_user_in_course, + CourseDiscussionSettings, + all_permissions_for_user_in_course ) from openedx.core.djangoapps.django_comment_common.utils import get_course_discussion_settings from openedx.core.lib.cache_utils import request_cached @@ -137,7 +141,7 @@ def _check_conditions_permissions(user, permissions, course_id, content, user_gr """ def test(user, per, operator="or"): - if isinstance(per, basestring): + if isinstance(per, six.string_types): if per in CONDITIONS: return _check_condition(user, per, content) if 'group_' in per: diff --git a/lms/djangoapps/discussion/django_comment_client/urls.py b/lms/djangoapps/discussion/django_comment_client/urls.py index f51def9cc0e4de62e626250d3fa1040edbc3af63..7aa21784172378d97157f5fce2e57ed7bbf30f20 100644 --- a/lms/djangoapps/discussion/django_comment_client/urls.py +++ b/lms/djangoapps/discussion/django_comment_client/urls.py @@ -1,6 +1,8 @@ """ Urls for the django_comment_client. """ +from __future__ import absolute_import + from django.conf.urls import include, url urlpatterns = [ diff --git a/lms/djangoapps/discussion/django_comment_client/utils.py b/lms/djangoapps/discussion/django_comment_client/utils.py index 265892b6bae458111a1b0da7a461a911b8485405..d1083d9f95a08b6bc8f0de178ff14b8f34ba2439 100644 --- a/lms/djangoapps/discussion/django_comment_client/utils.py +++ b/lms/djangoapps/discussion/django_comment_client/utils.py @@ -1,35 +1,41 @@ # pylint: skip-file +from __future__ import absolute_import + import json import logging from collections import defaultdict from datetime import datetime +import six from django.conf import settings from django.contrib.auth.models import User -from django.urls import reverse from django.db import connection from django.http import HttpResponse -from pytz import UTC +from django.urls import reverse from opaque_keys.edx.keys import CourseKey, UsageKey from opaque_keys.edx.locations import i4xEncoder +from pytz import UTC from six import text_type +from six.moves import map from courseware import courses from courseware.access import has_access from lms.djangoapps.discussion.django_comment_client.constants import TYPE_ENTRY, TYPE_SUBCATEGORY from lms.djangoapps.discussion.django_comment_client.permissions import ( - check_permissions_by_view, get_team, has_permission, + check_permissions_by_view, + get_team, + has_permission ) from lms.djangoapps.discussion.django_comment_client.settings import MAX_COMMENT_DEPTH +from openedx.core.djangoapps.course_groups.cohorts import get_cohort_id, get_cohort_names, is_course_cohorted from openedx.core.djangoapps.django_comment_common.models import ( - FORUM_ROLE_STUDENT, FORUM_ROLE_COMMUNITY_TA, + FORUM_ROLE_STUDENT, CourseDiscussionSettings, DiscussionsIdMapping, Role ) from openedx.core.djangoapps.django_comment_common.utils import get_course_discussion_settings -from openedx.core.djangoapps.course_groups.cohorts import get_cohort_id, get_cohort_names, is_course_cohorted from openedx.core.lib.cache_utils import request_cached from student.models import get_user_by_username_or_email from student.roles import GlobalStaff @@ -51,7 +57,7 @@ def strip_none(dic): """ Returns a dictionary stripped of any keys having values of None """ - return dict([(k, v) for k, v in dic.iteritems() if v is not None]) + return dict([(k, v) for k, v in six.iteritems(dic) if v is not None]) def strip_blank(dic): @@ -63,7 +69,7 @@ def strip_blank(dic): Determines if the provided value contains no information """ return isinstance(v, str) and len(v.strip()) == 0 - return dict([(k, v) for k, v in dic.iteritems() if not _is_blank(v)]) + return dict([(k, v) for k, v in six.iteritems(dic) if not _is_blank(v)]) # TODO should we be checking if d1 and d2 have the same keys with different values? @@ -236,7 +242,7 @@ def get_discussion_id_map_by_course_id(course_id, user): by discussion_id. """ xblocks = get_accessible_discussion_xblocks_by_course_id(course_id, user) - return dict(map(get_discussion_id_map_entry, xblocks)) + return dict(list(map(get_discussion_id_map_entry, xblocks))) @request_cached() @@ -501,7 +507,7 @@ class JsonError(HttpResponse): """ Object constructor, returns an error response containing the provided exception messages """ - if isinstance(error_messages, basestring): + if isinstance(error_messages, six.string_types): error_messages = [error_messages] content = json.dumps({'errors': error_messages}, indent=2, ensure_ascii=False) super(JsonError, self).__init__(content, diff --git a/lms/djangoapps/discussion/tasks.py b/lms/djangoapps/discussion/tasks.py index cdf056bdc40b8b1c417c32f92dc82bd70543d302..537d861b1c95e258bc14961501110c3547c43e8b 100644 --- a/lms/djangoapps/discussion/tasks.py +++ b/lms/djangoapps/discussion/tasks.py @@ -2,33 +2,35 @@ Defines asynchronous celery task for sending email notification (through edx-ace) pertaining to new discussion forum comments. """ +from __future__ import absolute_import + import logging -from urlparse import urljoin +import six from celery import task +from celery_utils.logged_task import LoggedTask from django.conf import settings from django.contrib.auth.models import User from django.contrib.sites.models import Site - -from celery_utils.logged_task import LoggedTask from edx_ace import ace -from edx_ace.utils import date from edx_ace.recipient import Recipient +from edx_ace.utils import date from eventtracking import tracker -from lms.djangoapps.discussion.django_comment_client.utils import ( - permalink, get_accessible_discussion_xblocks_by_course_id, -) from opaque_keys.edx.keys import CourseKey +from six.moves.urllib.parse import urljoin # pylint: disable=import-error -from openedx.core.djangoapps.ace_common.template_context import get_base_template_context +import openedx.core.djangoapps.django_comment_common.comment_client as cc +from lms.djangoapps.discussion.django_comment_client.utils import ( + get_accessible_discussion_xblocks_by_course_id, + permalink +) from openedx.core.djangoapps.ace_common.message import BaseMessageType +from openedx.core.djangoapps.ace_common.template_context import get_base_template_context from openedx.core.djangoapps.content.course_overviews.models import CourseOverview -import openedx.core.djangoapps.django_comment_common.comment_client as cc from openedx.core.djangoapps.django_comment_common.models import DiscussionsIdMapping from openedx.core.lib.celery.task_utils import emulate_http_request from track import segment - log = logging.getLogger(__name__) @@ -48,7 +50,7 @@ def update_discussions_map(context): course_key = CourseKey.from_string(context['course_id']) discussion_blocks = get_accessible_discussion_xblocks_by_course_id(course_key, include_all=True) discussions_id_map = { - discussion_block.discussion_id: unicode(discussion_block.location) + discussion_block.discussion_id: six.text_type(discussion_block.location) for discussion_block in discussion_blocks } DiscussionsIdMapping.update_mapping(course_key, discussions_id_map) @@ -85,10 +87,10 @@ def _track_notification_sent(message, context): 'app_label': 'discussion', 'name': 'responsenotification', # This is 'Campaign' in GA 'language': message.language, - 'uuid': unicode(message.uuid), - 'send_uuid': unicode(message.send_uuid), + 'uuid': six.text_type(message.uuid), + 'send_uuid': six.text_type(message.send_uuid), 'thread_id': context['thread_id'], - 'course_id': unicode(context['course_id']), + 'course_id': six.text_type(context['course_id']), 'thread_created_at': date.deserialize(context['thread_created_at']), 'nonInteraction': 1, } diff --git a/lms/djangoapps/discussion/urls.py b/lms/djangoapps/discussion/urls.py index d6bf5fe7498f3027ddab92fb1eaba5698b2dcb2b..82593824aa77e131eaca1005954200169ec9c931 100644 --- a/lms/djangoapps/discussion/urls.py +++ b/lms/djangoapps/discussion/urls.py @@ -1,6 +1,8 @@ """ Forum urls for the django_comment_client. """ +from __future__ import absolute_import + from django.conf.urls import url from discussion import views