refactor: Ran pyupgrade on openedx/core/djangoapps/django_comment_common (#26910)
This commit is contained in:
@@ -26,11 +26,11 @@ class Comment(models.Model):
|
||||
|
||||
metrics_tag_fields = ['course_id', 'endorsed', 'closed']
|
||||
|
||||
base_url = "{prefix}/comments".format(prefix=settings.PREFIX)
|
||||
base_url = f"{settings.PREFIX}/comments"
|
||||
type = 'comment'
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(Comment, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
|
||||
super().__init__(*args, **kwargs)
|
||||
self._cached_thread = None
|
||||
|
||||
@property
|
||||
@@ -58,7 +58,7 @@ class Comment(models.Model):
|
||||
if action in ['post']:
|
||||
return cls.url_for_comments(params)
|
||||
else:
|
||||
return super(Comment, cls).url(action, params)
|
||||
return super().url(action, params)
|
||||
|
||||
def flagAbuse(self, user, voteable):
|
||||
if voteable.type == 'thread':
|
||||
@@ -100,16 +100,16 @@ class Comment(models.Model):
|
||||
|
||||
|
||||
def _url_for_thread_comments(thread_id):
|
||||
return "{prefix}/threads/{thread_id}/comments".format(prefix=settings.PREFIX, thread_id=thread_id)
|
||||
return f"{settings.PREFIX}/threads/{thread_id}/comments"
|
||||
|
||||
|
||||
def _url_for_comment(comment_id):
|
||||
return "{prefix}/comments/{comment_id}".format(prefix=settings.PREFIX, comment_id=comment_id)
|
||||
return f"{settings.PREFIX}/comments/{comment_id}"
|
||||
|
||||
|
||||
def _url_for_flag_abuse_comment(comment_id):
|
||||
return "{prefix}/comments/{comment_id}/abuse_flag".format(prefix=settings.PREFIX, comment_id=comment_id)
|
||||
return f"{settings.PREFIX}/comments/{comment_id}/abuse_flag"
|
||||
|
||||
|
||||
def _url_for_unflag_abuse_comment(comment_id):
|
||||
return "{prefix}/comments/{comment_id}/abuse_unflag".format(prefix=settings.PREFIX, comment_id=comment_id)
|
||||
return f"{settings.PREFIX}/comments/{comment_id}/abuse_unflag"
|
||||
|
||||
@@ -9,7 +9,7 @@ class Commentable(models.Model):
|
||||
|
||||
accessible_fields = ['id', 'commentable_id']
|
||||
|
||||
base_url = "{prefix}/commentables".format(prefix=settings.PREFIX)
|
||||
base_url = f"{settings.PREFIX}/commentables"
|
||||
type = 'commentable'
|
||||
|
||||
def retrieve(self, *args, **kwargs):
|
||||
|
||||
@@ -8,7 +8,7 @@ from .utils import CommentClientRequestError, extract, perform_request
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class Model(object):
|
||||
class Model:
|
||||
|
||||
accessible_fields = ['id']
|
||||
updatable_fields = ['id']
|
||||
@@ -32,24 +32,24 @@ class Model(object):
|
||||
return self.attributes[name]
|
||||
except KeyError:
|
||||
if self.retrieved or self.id is None:
|
||||
raise AttributeError(u"Field {0} does not exist".format(name)) # lint-amnesty, pylint: disable=raise-missing-from
|
||||
raise AttributeError(f"Field {name} does not exist") # lint-amnesty, pylint: disable=raise-missing-from
|
||||
self.retrieve()
|
||||
return self.__getattr__(name)
|
||||
|
||||
def __setattr__(self, name, value):
|
||||
if name == 'attributes' or name not in self.accessible_fields + self.updatable_fields:
|
||||
super(Model, self).__setattr__(name, value) # lint-amnesty, pylint: disable=super-with-arguments
|
||||
super().__setattr__(name, value)
|
||||
else:
|
||||
self.attributes[name] = value
|
||||
|
||||
def __getitem__(self, key):
|
||||
if key not in self.accessible_fields:
|
||||
raise KeyError(u"Field {0} does not exist".format(key))
|
||||
raise KeyError(f"Field {key} does not exist")
|
||||
return self.attributes.get(key)
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
if key not in self.accessible_fields + self.updatable_fields:
|
||||
raise KeyError(u"Field {0} does not exist".format(key))
|
||||
raise KeyError(f"Field {key} does not exist")
|
||||
self.attributes.__setitem__(key, value)
|
||||
|
||||
def items(self, *args, **kwargs):
|
||||
@@ -89,11 +89,11 @@ class Model(object):
|
||||
record the class name of the model.
|
||||
"""
|
||||
tags = [
|
||||
u'{}.{}:{}'.format(self.__class__.__name__, attr, self[attr])
|
||||
'{}.{}:{}'.format(self.__class__.__name__, attr, self[attr])
|
||||
for attr in self.metric_tag_fields
|
||||
if attr in self.attributes
|
||||
]
|
||||
tags.append(u'model_class:{}'.format(self.__class__.__name__))
|
||||
tags.append(f'model_class:{self.__class__.__name__}')
|
||||
return tags
|
||||
|
||||
@classmethod
|
||||
@@ -106,7 +106,7 @@ class Model(object):
|
||||
self.__setattr__(k, v)
|
||||
else:
|
||||
log.warning(
|
||||
u"Unexpected field {field_name} in model {model_name}".format(
|
||||
"Unexpected field {field_name} in model {model_name}".format(
|
||||
field_name=k,
|
||||
model_name=self.__class__.__name__
|
||||
)
|
||||
@@ -180,12 +180,12 @@ class Model(object):
|
||||
raise CommentClientRequestError("Must provide base_url when using default url function")
|
||||
if action not in cls.DEFAULT_ACTIONS: # lint-amnesty, pylint: disable=no-else-raise
|
||||
raise ValueError(
|
||||
u"Invalid action {0}. The supported action must be in {1}".format(action, str(cls.DEFAULT_ACTIONS))
|
||||
"Invalid action {}. The supported action must be in {}".format(action, str(cls.DEFAULT_ACTIONS))
|
||||
)
|
||||
elif action in cls.DEFAULT_ACTIONS_WITH_ID:
|
||||
try:
|
||||
return cls.url_with_id(params)
|
||||
except KeyError:
|
||||
raise CommentClientRequestError(u"Cannot perform action {0} without id".format(action)) # lint-amnesty, pylint: disable=raise-missing-from
|
||||
raise CommentClientRequestError(f"Cannot perform action {action} without id") # lint-amnesty, pylint: disable=raise-missing-from
|
||||
else: # action must be in DEFAULT_ACTIONS_WITHOUT_ID now
|
||||
return cls.url_without_id()
|
||||
|
||||
@@ -39,7 +39,7 @@ class Thread(models.Model):
|
||||
# initializable_fields are sent in POST requests
|
||||
initializable_fields = updatable_fields + ['thread_type', 'context']
|
||||
|
||||
base_url = "{prefix}/threads".format(prefix=settings.PREFIX)
|
||||
base_url = f"{settings.PREFIX}/threads"
|
||||
default_retrieve_params = {'recursive': False}
|
||||
type = 'thread'
|
||||
|
||||
@@ -69,7 +69,7 @@ class Thread(models.Model):
|
||||
'get',
|
||||
url,
|
||||
params,
|
||||
metric_tags=[u'course_id:{}'.format(query_params['course_id'])],
|
||||
metric_tags=['course_id:{}'.format(query_params['course_id'])],
|
||||
metric_action='thread.search',
|
||||
paged_results=True
|
||||
)
|
||||
@@ -93,8 +93,8 @@ class Thread(models.Model):
|
||||
}
|
||||
)
|
||||
log.info(
|
||||
u'forum_text_search query="{search_query}" corrected_text="{corrected_text}" course_id={course_id} '
|
||||
u'group_id={group_id} page={requested_page} total_results={total_results}'.format(
|
||||
'forum_text_search query="{search_query}" corrected_text="{corrected_text}" course_id={course_id} '
|
||||
'group_id={group_id} page={requested_page} total_results={total_results}'.format(
|
||||
search_query=search_query,
|
||||
corrected_text=corrected_text,
|
||||
course_id=course_id,
|
||||
@@ -115,16 +115,16 @@ class Thread(models.Model):
|
||||
@classmethod
|
||||
def url_for_threads(cls, params=None):
|
||||
if params and params.get('commentable_id'):
|
||||
return u"{prefix}/{commentable_id}/threads".format(
|
||||
return "{prefix}/{commentable_id}/threads".format(
|
||||
prefix=settings.PREFIX,
|
||||
commentable_id=params['commentable_id'],
|
||||
)
|
||||
else:
|
||||
return u"{prefix}/threads".format(prefix=settings.PREFIX)
|
||||
return f"{settings.PREFIX}/threads"
|
||||
|
||||
@classmethod
|
||||
def url_for_search_threads(cls):
|
||||
return "{prefix}/search/threads".format(prefix=settings.PREFIX)
|
||||
return f"{settings.PREFIX}/search/threads"
|
||||
|
||||
@classmethod
|
||||
def url(cls, action, params=None):
|
||||
@@ -135,7 +135,7 @@ class Thread(models.Model):
|
||||
elif action == 'search':
|
||||
return cls.url_for_search_threads()
|
||||
else:
|
||||
return super(Thread, cls).url(action, params)
|
||||
return super().url(action, params)
|
||||
|
||||
# TODO: This is currently overriding Model._retrieve only to add parameters
|
||||
# for the request. Model._retrieve should be modified to handle this such
|
||||
@@ -221,16 +221,16 @@ class Thread(models.Model):
|
||||
|
||||
|
||||
def _url_for_flag_abuse_thread(thread_id):
|
||||
return "{prefix}/threads/{thread_id}/abuse_flag".format(prefix=settings.PREFIX, thread_id=thread_id)
|
||||
return f"{settings.PREFIX}/threads/{thread_id}/abuse_flag"
|
||||
|
||||
|
||||
def _url_for_unflag_abuse_thread(thread_id):
|
||||
return "{prefix}/threads/{thread_id}/abuse_unflag".format(prefix=settings.PREFIX, thread_id=thread_id)
|
||||
return f"{settings.PREFIX}/threads/{thread_id}/abuse_unflag"
|
||||
|
||||
|
||||
def _url_for_pin_thread(thread_id):
|
||||
return "{prefix}/threads/{thread_id}/pin".format(prefix=settings.PREFIX, thread_id=thread_id)
|
||||
return f"{settings.PREFIX}/threads/{thread_id}/pin"
|
||||
|
||||
|
||||
def _url_for_un_pin_thread(thread_id):
|
||||
return "{prefix}/threads/{thread_id}/unpin".format(prefix=settings.PREFIX, thread_id=thread_id)
|
||||
return f"{settings.PREFIX}/threads/{thread_id}/unpin"
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
""" User model wrapper for comment service"""
|
||||
|
||||
|
||||
from six import text_type
|
||||
|
||||
from . import models, settings, utils
|
||||
|
||||
|
||||
@@ -22,7 +20,7 @@ class User(models.Model):
|
||||
|
||||
metric_tag_fields = ['course_id']
|
||||
|
||||
base_url = "{prefix}/users".format(prefix=settings.PREFIX)
|
||||
base_url = f"{settings.PREFIX}/users"
|
||||
default_retrieve_params = {'complete': True}
|
||||
type = 'user'
|
||||
|
||||
@@ -42,7 +40,7 @@ class User(models.Model):
|
||||
_url_for_read(self.id),
|
||||
params,
|
||||
metric_action='user.read',
|
||||
metric_tags=self._metric_tags + ['target.type:{}'.format(source.type)],
|
||||
metric_tags=self._metric_tags + [f'target.type:{source.type}'],
|
||||
)
|
||||
|
||||
def follow(self, source):
|
||||
@@ -52,7 +50,7 @@ class User(models.Model):
|
||||
_url_for_subscription(self.id),
|
||||
params,
|
||||
metric_action='user.follow',
|
||||
metric_tags=self._metric_tags + ['target.type:{}'.format(source.type)],
|
||||
metric_tags=self._metric_tags + [f'target.type:{source.type}'],
|
||||
)
|
||||
|
||||
def unfollow(self, source):
|
||||
@@ -62,7 +60,7 @@ class User(models.Model):
|
||||
_url_for_subscription(self.id),
|
||||
params,
|
||||
metric_action='user.unfollow',
|
||||
metric_tags=self._metric_tags + ['target.type:{}'.format(source.type)],
|
||||
metric_tags=self._metric_tags + [f'target.type:{source.type}'],
|
||||
)
|
||||
|
||||
def vote(self, voteable, value):
|
||||
@@ -78,7 +76,7 @@ class User(models.Model):
|
||||
url,
|
||||
params,
|
||||
metric_action='user.vote',
|
||||
metric_tags=self._metric_tags + ['target.type:{}'.format(voteable.type)],
|
||||
metric_tags=self._metric_tags + [f'target.type:{voteable.type}'],
|
||||
)
|
||||
voteable._update_from_response(response)
|
||||
|
||||
@@ -95,7 +93,7 @@ class User(models.Model):
|
||||
url,
|
||||
params,
|
||||
metric_action='user.unvote',
|
||||
metric_tags=self._metric_tags + ['target.type:{}'.format(voteable.type)],
|
||||
metric_tags=self._metric_tags + [f'target.type:{voteable.type}'],
|
||||
)
|
||||
voteable._update_from_response(response)
|
||||
|
||||
@@ -105,7 +103,7 @@ class User(models.Model):
|
||||
if not self.course_id:
|
||||
raise utils.CommentClientRequestError("Must provide course_id when retrieving active threads for the user")
|
||||
url = _url_for_user_active_threads(self.id)
|
||||
params = {'course_id': text_type(self.course_id)}
|
||||
params = {'course_id': str(self.course_id)}
|
||||
params.update(query_params)
|
||||
response = utils.perform_request(
|
||||
'get',
|
||||
@@ -125,7 +123,7 @@ class User(models.Model):
|
||||
"Must provide course_id when retrieving subscribed threads for the user",
|
||||
)
|
||||
url = _url_for_user_subscribed_threads(self.id)
|
||||
params = {'course_id': text_type(self.course_id)}
|
||||
params = {'course_id': str(self.course_id)}
|
||||
params.update(query_params)
|
||||
response = utils.perform_request(
|
||||
'get',
|
||||
@@ -147,7 +145,7 @@ class User(models.Model):
|
||||
retrieve_params = self.default_retrieve_params.copy()
|
||||
retrieve_params.update(kwargs)
|
||||
if self.attributes.get('course_id'):
|
||||
retrieve_params['course_id'] = text_type(self.course_id)
|
||||
retrieve_params['course_id'] = str(self.course_id)
|
||||
if self.attributes.get('group_id'):
|
||||
retrieve_params['group_id'] = self.group_id
|
||||
try:
|
||||
@@ -200,41 +198,41 @@ class User(models.Model):
|
||||
|
||||
|
||||
def _url_for_vote_comment(comment_id):
|
||||
return "{prefix}/comments/{comment_id}/votes".format(prefix=settings.PREFIX, comment_id=comment_id)
|
||||
return f"{settings.PREFIX}/comments/{comment_id}/votes"
|
||||
|
||||
|
||||
def _url_for_vote_thread(thread_id):
|
||||
return "{prefix}/threads/{thread_id}/votes".format(prefix=settings.PREFIX, thread_id=thread_id)
|
||||
return f"{settings.PREFIX}/threads/{thread_id}/votes"
|
||||
|
||||
|
||||
def _url_for_subscription(user_id):
|
||||
return "{prefix}/users/{user_id}/subscriptions".format(prefix=settings.PREFIX, user_id=user_id)
|
||||
return f"{settings.PREFIX}/users/{user_id}/subscriptions"
|
||||
|
||||
|
||||
def _url_for_user_active_threads(user_id):
|
||||
return "{prefix}/users/{user_id}/active_threads".format(prefix=settings.PREFIX, user_id=user_id)
|
||||
return f"{settings.PREFIX}/users/{user_id}/active_threads"
|
||||
|
||||
|
||||
def _url_for_user_subscribed_threads(user_id):
|
||||
return "{prefix}/users/{user_id}/subscribed_threads".format(prefix=settings.PREFIX, user_id=user_id)
|
||||
return f"{settings.PREFIX}/users/{user_id}/subscribed_threads"
|
||||
|
||||
|
||||
def _url_for_read(user_id):
|
||||
"""
|
||||
Returns cs_comments_service url endpoint to mark thread as read for given user_id
|
||||
"""
|
||||
return "{prefix}/users/{user_id}/read".format(prefix=settings.PREFIX, user_id=user_id)
|
||||
return f"{settings.PREFIX}/users/{user_id}/read"
|
||||
|
||||
|
||||
def _url_for_retire(user_id):
|
||||
"""
|
||||
Returns cs_comments_service url endpoint to retire a user (remove all post content, etc.)
|
||||
"""
|
||||
return "{prefix}/users/{user_id}/retire".format(prefix=settings.PREFIX, user_id=user_id)
|
||||
return f"{settings.PREFIX}/users/{user_id}/retire"
|
||||
|
||||
|
||||
def _url_for_username_replacement(user_id):
|
||||
"""
|
||||
Returns cs_comments_servuce url endpoint to replace the username of a user
|
||||
"""
|
||||
return "{prefix}/users/{user_id}/replace_username".format(prefix=settings.PREFIX, user_id=user_id)
|
||||
return f"{settings.PREFIX}/users/{user_id}/replace_username"
|
||||
|
||||
@@ -6,7 +6,6 @@ import logging
|
||||
from uuid import uuid4
|
||||
|
||||
import requests
|
||||
import six
|
||||
from django.utils.translation import get_language
|
||||
|
||||
from .settings import SERVICE_HOST as COMMENTS_SERVICE
|
||||
@@ -15,13 +14,13 @@ log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def strip_none(dic):
|
||||
return dict([(k, v) for k, v in six.iteritems(dic) if v is not None]) # lint-amnesty, pylint: disable=consider-using-dict-comprehension
|
||||
return {k: v for k, v in dic.items() if v is not None} # lint-amnesty, pylint: disable=consider-using-dict-comprehension
|
||||
|
||||
|
||||
def strip_blank(dic):
|
||||
def _is_blank(v):
|
||||
return isinstance(v, str) and len(v.strip()) == 0
|
||||
return dict([(k, v) for k, v in six.iteritems(dic) if not _is_blank(v)]) # lint-amnesty, pylint: disable=consider-using-dict-comprehension
|
||||
return {k: v for k, v in dic.items() if not _is_blank(v)} # lint-amnesty, pylint: disable=consider-using-dict-comprehension
|
||||
|
||||
|
||||
def extract(dic, keys):
|
||||
@@ -43,9 +42,9 @@ def perform_request(method, url, data_or_params=None, raw=False,
|
||||
if metric_tags is None:
|
||||
metric_tags = []
|
||||
|
||||
metric_tags.append(u'method:{}'.format(method))
|
||||
metric_tags.append(f'method:{method}')
|
||||
if metric_action:
|
||||
metric_tags.append(u'action:{}'.format(metric_action))
|
||||
metric_tags.append(f'action:{metric_action}')
|
||||
|
||||
if data_or_params is None:
|
||||
data_or_params = {}
|
||||
@@ -72,12 +71,12 @@ def perform_request(method, url, data_or_params=None, raw=False,
|
||||
timeout=config.connection_timeout
|
||||
)
|
||||
|
||||
metric_tags.append(u'status_code:{}'.format(response.status_code))
|
||||
metric_tags.append(f'status_code:{response.status_code}')
|
||||
status_code = int(response.status_code)
|
||||
if status_code > 200:
|
||||
metric_tags.append(u'result:failure')
|
||||
metric_tags.append('result:failure')
|
||||
else:
|
||||
metric_tags.append(u'result:success')
|
||||
metric_tags.append('result:success')
|
||||
|
||||
if 200 < status_code < 500: # lint-amnesty, pylint: disable=no-else-raise
|
||||
raise CommentClientRequestError(response.text, response.status_code)
|
||||
@@ -94,7 +93,7 @@ def perform_request(method, url, data_or_params=None, raw=False,
|
||||
data = response.json()
|
||||
except ValueError:
|
||||
raise CommentClientError( # lint-amnesty, pylint: disable=raise-missing-from
|
||||
u"Invalid JSON response for request {request_id}; first 100 characters: '{content}'".format(
|
||||
"Invalid JSON response for request {request_id}; first 100 characters: '{content}'".format(
|
||||
request_id=request_id,
|
||||
content=response.text[:100]
|
||||
)
|
||||
@@ -108,7 +107,7 @@ class CommentClientError(Exception):
|
||||
|
||||
class CommentClientRequestError(CommentClientError):
|
||||
def __init__(self, msg, status_codes=400):
|
||||
super(CommentClientRequestError, self).__init__(msg) # lint-amnesty, pylint: disable=super-with-arguments
|
||||
super().__init__(msg)
|
||||
self.status_code = status_codes
|
||||
|
||||
|
||||
@@ -120,7 +119,7 @@ class CommentClientMaintenanceError(CommentClientError):
|
||||
pass
|
||||
|
||||
|
||||
class CommentClientPaginatedResult(object):
|
||||
class CommentClientPaginatedResult:
|
||||
""" class for paginated results returned from comment services"""
|
||||
|
||||
def __init__(self, collection, page, num_pages, thread_count=0, corrected_text=None):
|
||||
@@ -155,4 +154,4 @@ def check_forum_heartbeat():
|
||||
else:
|
||||
return 'forum', False, res.get('check', 'Forum heartbeat failed')
|
||||
except Exception as fail:
|
||||
return 'forum', False, six.text_type(fail)
|
||||
return 'forum', False, str(fail)
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
from opaque_keys.edx.django.models import CourseKeyField
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
@@ -14,6 +11,6 @@ class Migration(migrations.Migration):
|
||||
migrations.AlterField(
|
||||
model_name='forumsconfig',
|
||||
name='connection_timeout',
|
||||
field=models.FloatField(default=5.0, help_text=u'Seconds to wait when trying to connect to the comment service.'),
|
||||
field=models.FloatField(default=5.0, help_text='Seconds to wait when trying to connect to the comment service.'),
|
||||
),
|
||||
]
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
from django.db import migrations, models
|
||||
from opaque_keys.edx.django.models import CourseKeyField
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.12 on 2018-04-23 21:09
|
||||
|
||||
|
||||
@@ -16,6 +15,6 @@ class Migration(migrations.Migration):
|
||||
migrations.AddField(
|
||||
model_name='coursediscussionsettings',
|
||||
name='discussions_id_map',
|
||||
field=jsonfield.fields.JSONField(blank=True, help_text=u'Key/value store mapping discussion IDs to discussion XBlock usage keys.', null=True),
|
||||
field=jsonfield.fields.JSONField(blank=True, help_text='Key/value store mapping discussion IDs to discussion XBlock usage keys.', null=True),
|
||||
),
|
||||
]
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.13 on 2018-06-13 12:10
|
||||
|
||||
|
||||
@@ -18,7 +17,7 @@ class Migration(migrations.Migration):
|
||||
name='DiscussionsIdMapping',
|
||||
fields=[
|
||||
('course_id', opaque_keys.edx.django.models.CourseKeyField(db_index=True, max_length=255, primary_key=True, serialize=False)),
|
||||
('mapping', jsonfield.fields.JSONField(help_text=u'Key/value store mapping discussion IDs to discussion XBlock usage keys.')),
|
||||
('mapping', jsonfield.fields.JSONField(help_text='Key/value store mapping discussion IDs to discussion XBlock usage keys.')),
|
||||
],
|
||||
options={
|
||||
'db_table': 'django_comment_common_discussionsidmapping',
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ from django.utils.encoding import python_2_unicode_compatible
|
||||
from django.utils.translation import ugettext_noop
|
||||
from jsonfield.fields import JSONField
|
||||
from opaque_keys.edx.django.models import CourseKeyField
|
||||
from six import text_type
|
||||
|
||||
from openedx.core.djangoapps.xmodule_django.models import NoneToEmptyManager
|
||||
from common.djangoapps.student.models import CourseEnrollment
|
||||
@@ -64,7 +63,7 @@ def assign_role(course_id, user, rolename):
|
||||
"""
|
||||
role, created = Role.objects.get_or_create(course_id=course_id, name=rolename)
|
||||
if created:
|
||||
logging.info(u"EDUCATOR-1635: Created role {} for course {}".format(role, course_id))
|
||||
logging.info(f"EDUCATOR-1635: Created role {role} for course {course_id}")
|
||||
user.roles.add(role)
|
||||
|
||||
|
||||
@@ -82,12 +81,12 @@ class Role(models.Model):
|
||||
users = models.ManyToManyField(User, related_name="roles")
|
||||
course_id = CourseKeyField(max_length=255, blank=True, db_index=True)
|
||||
|
||||
class Meta(object):
|
||||
class Meta:
|
||||
# use existing table that was originally created from lms.djangoapps.discussion.django_comment_client app
|
||||
db_table = 'django_comment_client_role'
|
||||
|
||||
def __str__(self):
|
||||
return self.name + " for " + (text_type(self.course_id) if self.course_id else "all courses")
|
||||
return self.name + " for " + (str(self.course_id) if self.course_id else "all courses")
|
||||
|
||||
# TODO the name of this method is a little bit confusing,
|
||||
# since it's one-off and doesn't handle inheritance later
|
||||
@@ -98,7 +97,7 @@ class Role(models.Model):
|
||||
"""
|
||||
if role.course_id and role.course_id != self.course_id:
|
||||
logging.warning(
|
||||
u"%s cannot inherit permissions from %s due to course_id inconsistency",
|
||||
"%s cannot inherit permissions from %s due to course_id inconsistency",
|
||||
self,
|
||||
role,
|
||||
)
|
||||
@@ -138,7 +137,7 @@ class Permission(models.Model):
|
||||
name = models.CharField(max_length=30, null=False, blank=False, primary_key=True)
|
||||
roles = models.ManyToManyField(Role, related_name="permissions")
|
||||
|
||||
class Meta(object):
|
||||
class Meta:
|
||||
# use existing table that was originally created from lms.djangoapps.discussion.django_comment_client app
|
||||
db_table = 'django_comment_client_permission'
|
||||
|
||||
@@ -205,7 +204,7 @@ class ForumsConfig(ConfigurationModel):
|
||||
|
||||
connection_timeout = models.FloatField(
|
||||
default=5.0,
|
||||
help_text=u"Seconds to wait when trying to connect to the comment service.",
|
||||
help_text="Seconds to wait when trying to connect to the comment service.",
|
||||
)
|
||||
|
||||
class Meta(ConfigurationModel.Meta):
|
||||
@@ -221,7 +220,7 @@ class ForumsConfig(ConfigurationModel):
|
||||
"""
|
||||
Simple representation so the admin screen looks less ugly.
|
||||
"""
|
||||
return u"ForumsConfig: timeout={}".format(self.connection_timeout)
|
||||
return f"ForumsConfig: timeout={self.connection_timeout}"
|
||||
|
||||
|
||||
class CourseDiscussionSettings(models.Model):
|
||||
@@ -239,7 +238,7 @@ class CourseDiscussionSettings(models.Model):
|
||||
discussions_id_map = JSONField(
|
||||
null=True,
|
||||
blank=True,
|
||||
help_text=u"Key/value store mapping discussion IDs to discussion XBlock usage keys.",
|
||||
help_text="Key/value store mapping discussion IDs to discussion XBlock usage keys.",
|
||||
)
|
||||
always_divide_inline_discussions = models.BooleanField(default=False)
|
||||
_divided_discussions = models.TextField(db_column='divided_discussions', null=True, blank=True) # JSON list
|
||||
@@ -250,7 +249,7 @@ class CourseDiscussionSettings(models.Model):
|
||||
ASSIGNMENT_TYPE_CHOICES = ((NONE, 'None'), (COHORT, 'Cohort'), (ENROLLMENT_TRACK, 'Enrollment Track'))
|
||||
division_scheme = models.CharField(max_length=20, choices=ASSIGNMENT_TYPE_CHOICES, default=NONE)
|
||||
|
||||
class Meta(object):
|
||||
class Meta:
|
||||
# use existing table that was originally created from django_comment_common app
|
||||
db_table = 'django_comment_common_coursediscussionsettings'
|
||||
|
||||
@@ -277,10 +276,10 @@ class DiscussionsIdMapping(models.Model):
|
||||
"""
|
||||
course_id = CourseKeyField(db_index=True, primary_key=True, max_length=255)
|
||||
mapping = JSONField(
|
||||
help_text=u"Key/value store mapping discussion IDs to discussion XBlock usage keys.",
|
||||
help_text="Key/value store mapping discussion IDs to discussion XBlock usage keys.",
|
||||
)
|
||||
|
||||
class Meta(object):
|
||||
class Meta:
|
||||
# use existing table that was originally created from django_comment_common app
|
||||
db_table = 'django_comment_common_discussionsidmapping'
|
||||
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
# pylint: disable=missing-docstring
|
||||
|
||||
|
||||
import six
|
||||
import pytest
|
||||
from contracts import new_contract
|
||||
from django.test import TestCase
|
||||
from opaque_keys.edx.locator import CourseLocator
|
||||
from six import text_type
|
||||
|
||||
from openedx.core.djangoapps.course_groups.cohorts import CourseCohortsSettings
|
||||
from openedx.core.djangoapps.django_comment_common.models import CourseDiscussionSettings, Role
|
||||
@@ -20,7 +18,7 @@ from xmodule.modulestore.django import modulestore
|
||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.factories import CourseFactory
|
||||
|
||||
new_contract('basestring', six.string_types[0])
|
||||
new_contract('basestring', str)
|
||||
|
||||
|
||||
class RoleAssignmentTest(TestCase):
|
||||
@@ -30,7 +28,7 @@ class RoleAssignmentTest(TestCase):
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super(RoleAssignmentTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
super().setUp()
|
||||
# Check a staff account because those used to get the Moderator role
|
||||
self.staff_user = User.objects.create_user(
|
||||
"patty",
|
||||
@@ -78,7 +76,7 @@ class RoleAssignmentTest(TestCase):
|
||||
class CourseDiscussionSettingsTest(ModuleStoreTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(CourseDiscussionSettingsTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
|
||||
super().setUp()
|
||||
self.course = CourseFactory.create()
|
||||
|
||||
def test_get_course_discussion_settings(self):
|
||||
@@ -128,7 +126,7 @@ class CourseDiscussionSettingsTest(ModuleStoreTestCase):
|
||||
def test_invalid_data_types(self):
|
||||
exception_msg_template = "Incorrect field type for `{}`. Type must be `{}`"
|
||||
fields = [
|
||||
{'name': 'division_scheme', 'type': six.string_types[0]},
|
||||
{'name': 'division_scheme', 'type': (str,)[0]},
|
||||
{'name': 'always_divide_inline_discussions', 'type': bool},
|
||||
{'name': 'divided_discussions', 'type': list}
|
||||
]
|
||||
@@ -138,4 +136,4 @@ class CourseDiscussionSettingsTest(ModuleStoreTestCase):
|
||||
with pytest.raises(ValueError) as value_error:
|
||||
set_course_discussion_settings(self.course.id, **{field['name']: invalid_value})
|
||||
|
||||
assert text_type(value_error.value) == exception_msg_template.format(field['name'], field['type'].__name__)
|
||||
assert str(value_error.value) == exception_msg_template.format(field['name'], field['type'].__name__)
|
||||
|
||||
@@ -4,7 +4,6 @@ Common comment client utility functions.
|
||||
"""
|
||||
|
||||
|
||||
import six
|
||||
from contracts import new_contract
|
||||
|
||||
from openedx.core.djangoapps.course_groups.cohorts import get_legacy_discussion_settings
|
||||
@@ -19,10 +18,10 @@ from openedx.core.djangoapps.django_comment_common.models import (
|
||||
)
|
||||
from openedx.core.lib.cache_utils import request_cached
|
||||
|
||||
new_contract('basestring', six.string_types[0])
|
||||
new_contract('basestring', str)
|
||||
|
||||
|
||||
class ThreadContext(object):
|
||||
class ThreadContext:
|
||||
""" An enumeration that represents the context of a thread. Used primarily by the comments service. """
|
||||
STANDALONE = 'standalone'
|
||||
COURSE = 'course'
|
||||
@@ -152,7 +151,7 @@ def set_course_discussion_settings(course_key, **kwargs):
|
||||
A CourseDiscussionSettings object.
|
||||
"""
|
||||
fields = {
|
||||
'division_scheme': six.string_types[0],
|
||||
'division_scheme': (str,)[0],
|
||||
'always_divide_inline_discussions': bool,
|
||||
'divided_discussions': list,
|
||||
}
|
||||
@@ -161,7 +160,7 @@ def set_course_discussion_settings(course_key, **kwargs):
|
||||
for field, field_type in fields.items():
|
||||
if field in kwargs:
|
||||
if not isinstance(kwargs[field], field_type):
|
||||
raise ValueError(u"Incorrect field type for `{}`. Type must be `{}`".format(field, field_type.__name__))
|
||||
raise ValueError(f"Incorrect field type for `{field}`. Type must be `{field_type.__name__}`")
|
||||
setattr(course_discussion_settings, field, kwargs[field])
|
||||
|
||||
course_discussion_settings.save()
|
||||
|
||||
Reference in New Issue
Block a user