BOM-2329: Applied pylint-amnesty to system_wide_roles, theming, user_api, user_authn

This commit is contained in:
Jawayria
2021-02-04 14:57:59 +05:00
parent 308c152c29
commit 9ecbe15d91
87 changed files with 339 additions and 338 deletions

View File

@@ -41,7 +41,7 @@ class SystemWideRoleAssignment(UserRoleAssignment): # pylint: disable=model-mis
str_representation = "<SystemWideRoleAssignment for User {user} assigned to role {role}>"
return str_representation.format(
user=self.user.id,
role=self.role.name
role=self.role.name # lint-amnesty, pylint: disable=no-member
)
def __repr__(self):

View File

@@ -13,7 +13,7 @@ class SystemWideRoleTests(TestCase):
""" Tests for SystemWideRole in system_wide_roles app """
def setUp(self):
super(SystemWideRoleTests, self).setUp()
super(SystemWideRoleTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.role = SystemWideRole.objects.create(name='TestRole')
def test_str(self):
@@ -27,7 +27,7 @@ class SystemWideRoleAssignmentTests(TestCase):
""" Tests for SystemWideRoleAssignment in system_wide_roles app """
def setUp(self):
super(SystemWideRoleAssignmentTests, self).setUp()
super(SystemWideRoleAssignmentTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create()
self.role = SystemWideRole.objects.create(name='TestRole')

View File

@@ -1,4 +1,4 @@
# lint-amnesty, pylint: disable=missing-module-docstring
from django.apps import AppConfig
from edx_django_utils.plugins import PluginURLs
@@ -8,7 +8,7 @@ from openedx.core.djangoapps.plugins.constants import ProjectType
plugin_urls_config = {PluginURLs.NAMESPACE: u'theming', PluginURLs.REGEX: r'^theming/'}
class ThemingConfig(AppConfig):
class ThemingConfig(AppConfig): # lint-amnesty, pylint: disable=missing-class-docstring
name = 'openedx.core.djangoapps.theming'
plugin_app = {
PluginURLs.CONFIG: {
@@ -20,4 +20,4 @@ class ThemingConfig(AppConfig):
def ready(self):
# settings validations related to theming.
from . import checks
from . import checks # lint-amnesty, pylint: disable=unused-import

View File

@@ -11,7 +11,7 @@ from django.core.checks import Error, Tags, register
@register(Tags.compatibility)
def check_comprehensive_theme_settings(app_configs, **kwargs):
def check_comprehensive_theme_settings(app_configs, **kwargs): # lint-amnesty, pylint: disable=unused-argument
"""
Checks the comprehensive theming theme directory settings.
@@ -24,7 +24,7 @@ def check_comprehensive_theme_settings(app_configs, **kwargs):
Returns:
List of any Errors.
"""
if not getattr(settings, "ENABLE_COMPREHENSIVE_THEMING"):
if not getattr(settings, "ENABLE_COMPREHENSIVE_THEMING"): # lint-amnesty, pylint: disable=literal-used-as-attribute
# Only perform checks when comprehensive theming is enabled.
return []

View File

@@ -30,7 +30,7 @@ from openedx.core.djangoapps.theming.helpers import get_themes
from openedx.core.djangoapps.theming.storage import ThemeStorage
class ThemeFilesFinder(BaseFinder):
class ThemeFilesFinder(BaseFinder): # lint-amnesty, pylint: disable=abstract-method
"""
A static files finder that looks in the directory of each theme as
specified in the source_dir attribute.
@@ -55,7 +55,7 @@ class ThemeFilesFinder(BaseFinder):
if theme.theme_dir_name not in self.themes:
self.themes.append(theme.theme_dir_name)
super(ThemeFilesFinder, self).__init__(*args, **kwargs)
super(ThemeFilesFinder, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
def list(self, ignore_patterns):
"""

View File

@@ -27,7 +27,7 @@ logger = getLogger(__name__) # pylint: disable=invalid-name
@request_cached()
def get_template_path(relative_path, **kwargs):
def get_template_path(relative_path, **kwargs): # lint-amnesty, pylint: disable=unused-argument
"""
The calculated value is cached for the lifetime of the current request.
"""

View File

@@ -1,4 +1,4 @@
# lint-amnesty, pylint: disable=missing-module-docstring
from django.contrib.staticfiles.storage import staticfiles_storage

View File

@@ -9,7 +9,7 @@ import logging
import os
from textwrap import dedent
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.contrib.sites.models import Site
from django.core.management.base import BaseCommand
from oauth2_provider.models import Application

View File

@@ -4,7 +4,7 @@ Test cases for create_sites_and_configurations command.
import mock
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.contrib.sites.models import Site
from django.core.management import CommandError, call_command
from django.test import TestCase
@@ -54,7 +54,7 @@ def _get_sites(dns_name, devstack=False):
class TestCreateSiteAndConfiguration(TestCase):
""" Test the create_site_and_configuration command """
def setUp(self):
super(TestCreateSiteAndConfiguration, self).setUp()
super(TestCreateSiteAndConfiguration, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.dns_name = "dummy_dns"
self.theme_path = "/dummyA/dummyB/"
@@ -79,7 +79,7 @@ class TestCreateSiteAndConfiguration(TestCase):
_generate_site_config(self.dns_name, site.name)
)
def _assert_service_user_is_valid(self, username):
def _assert_service_user_is_valid(self, username): # lint-amnesty, pylint: disable=missing-function-docstring
service_user = User.objects.filter(username=username)
self.assertEqual(len(service_user), 1)
self.assertTrue(service_user[0].is_active)

View File

@@ -41,7 +41,7 @@ class ThemeMixin(object):
def __init__(self, **kwargs):
self.prefix = kwargs.pop('prefix', None)
super(ThemeMixin, self).__init__(**kwargs)
super(ThemeMixin, self).__init__(**kwargs) # lint-amnesty, pylint: disable=super-with-arguments
def url(self, name):
"""
@@ -70,7 +70,7 @@ class ThemeMixin(object):
if prefix and self.themed(name, prefix):
name = os.path.join(prefix, name)
return super(ThemeMixin, self).url(name)
return super(ThemeMixin, self).url(name) # lint-amnesty, pylint: disable=super-with-arguments
def themed(self, name, theme):
"""
@@ -287,7 +287,7 @@ class ThemePipelineMixin(PipelineMixin):
paths[output_file] = (self, output_file)
yield output_file, output_file, True
super_class = super(ThemePipelineMixin, self)
super_class = super(ThemePipelineMixin, self) # lint-amnesty, pylint: disable=super-with-arguments
if hasattr(super_class, 'post_process'):
for name, hashed_name, processed in super_class.post_process(paths.copy(), dry_run, **options):
yield name, hashed_name, processed

View File

@@ -17,7 +17,7 @@ class ThemeTemplateLoader(MakoLoader):
_accepts_engine_in_init = True
def __init__(self, *args):
MakoLoader.__init__(self, ThemeFilesystemLoader(*args))
MakoLoader.__init__(self, ThemeFilesystemLoader(*args)) # lint-amnesty, pylint: disable=no-value-for-parameter
class ThemeFilesystemLoader(FilesystemLoader):
@@ -33,7 +33,7 @@ class ThemeFilesystemLoader(FilesystemLoader):
theme_dirs = self.get_theme_template_sources()
if isinstance(theme_dirs, list):
self.dirs = theme_dirs + self.dirs
super(ThemeFilesystemLoader, self).__init__(engine, self.dirs)
super(ThemeFilesystemLoader, self).__init__(engine, self.dirs) # lint-amnesty, pylint: disable=super-with-arguments
@staticmethod
def get_theme_template_sources():

View File

@@ -56,7 +56,7 @@ def stylesheet(parser, token): # pylint: disable=unused-argument
try:
_, name = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError(
raise template.TemplateSyntaxError( # lint-amnesty, pylint: disable=raise-missing-from
u'%r requires exactly one argument: the name of a group in the PIPELINE["STYLESHEETS"] setting' %
token.split_contents()[0]
)
@@ -71,7 +71,7 @@ def javascript(parser, token): # pylint: disable=unused-argument
try:
_, name = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError(
raise template.TemplateSyntaxError( # lint-amnesty, pylint: disable=raise-missing-from
u'%r requires exactly one argument: the name of a group in the PIPELINE["JAVASCRIPT"] setting' %
token.split_contents()[0]
)

View File

@@ -16,7 +16,7 @@ class TestUpdateAssets(TestCase):
Test comprehensive theming helper functions.
"""
def setUp(self):
super(TestUpdateAssets, self).setUp()
super(TestUpdateAssets, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.themes = get_themes()
def test_errors_for_invalid_arguments(self):

View File

@@ -17,7 +17,7 @@ class TestThemeFinders(TestCase):
"""
def setUp(self):
super(TestThemeFinders, self).setUp()
super(TestThemeFinders, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.finder = ThemeFilesFinder()
def test_find_first_themed_asset(self):

View File

@@ -6,7 +6,7 @@ Test helpers for Comprehensive Theming.
import six
from django.conf import settings
from django.test import TestCase, override_settings
from edx_django_utils.cache import RequestCache
from edx_django_utils.cache import RequestCache # lint-amnesty, pylint: disable=unused-import
from mock import Mock, patch
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers

View File

@@ -24,7 +24,7 @@ class TestCurrentSiteThemeMiddleware(TestCase):
"""
Initialize middleware and related objects
"""
super(TestCurrentSiteThemeMiddleware, self).setUp()
super(TestCurrentSiteThemeMiddleware, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.site_theme_middleware = CurrentSiteThemeMiddleware()
self.user = UserFactory.create()
@@ -59,8 +59,8 @@ class TestCurrentSiteThemeMiddleware(TestCase):
"""
request = self.create_mock_get_request()
self.assertEqual(self.site_theme_middleware.process_request(request), None)
self.assertIsNotNone(request.site_theme)
self.assertEqual(request.site_theme.theme_dir_name, TEST_THEME_NAME)
self.assertIsNotNone(request.site_theme) # lint-amnesty, pylint: disable=no-member
self.assertEqual(request.site_theme.theme_dir_name, TEST_THEME_NAME) # lint-amnesty, pylint: disable=no-member
@override_settings(DEFAULT_SITE_THEME=None)
def test_default_site_theme_2(self):
@@ -70,7 +70,7 @@ class TestCurrentSiteThemeMiddleware(TestCase):
"""
request = self.create_mock_get_request()
self.assertEqual(self.site_theme_middleware.process_request(request), None)
self.assertIsNone(request.site_theme)
self.assertIsNone(request.site_theme) # lint-amnesty, pylint: disable=no-member
def test_preview_theme(self):
"""
@@ -84,7 +84,7 @@ class TestCurrentSiteThemeMiddleware(TestCase):
# Next request a page and verify that the theme is returned
get_request = self.create_mock_get_request()
self.assertEqual(self.site_theme_middleware.process_request(get_request), None)
self.assertEqual(get_request.site_theme.theme_dir_name, TEST_THEME_NAME)
self.assertEqual(get_request.site_theme.theme_dir_name, TEST_THEME_NAME) # lint-amnesty, pylint: disable=no-member
# Request to reset the theme
post_request = RequestFactory().post('/test')
@@ -94,9 +94,9 @@ class TestCurrentSiteThemeMiddleware(TestCase):
# Verify that no theme is returned now
get_request = self.create_mock_get_request()
self.assertEqual(self.site_theme_middleware.process_request(get_request), None)
self.assertIsNone(get_request.site_theme)
self.assertIsNone(get_request.site_theme) # lint-amnesty, pylint: disable=no-member
# Verify that we can still force the theme with a querystring arg
get_request = self.create_mock_get_request(qs_theme=TEST_THEME_NAME)
self.assertEqual(self.site_theme_middleware.process_request(get_request), None)
self.assertEqual(get_request.site_theme.theme_dir_name, TEST_THEME_NAME)
self.assertEqual(get_request.site_theme.theme_dir_name, TEST_THEME_NAME) # lint-amnesty, pylint: disable=no-member

View File

@@ -23,7 +23,7 @@ class TestStorageLMS(TestCase):
"""
def setUp(self):
super(TestStorageLMS, self).setUp()
super(TestStorageLMS, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.themes_dir = get_theme_base_dirs()[0]
self.enabled_theme = "red-theme"
self.system_dir = settings.REPO_ROOT / "lms"

View File

@@ -9,7 +9,7 @@ from django.test import TestCase
from django.urls import reverse
from openedx.core.djangoapps.theming.tests.test_util import with_comprehensive_theme
from openedx.core.djangolib.testing.utils import skip_unless_cms, skip_unless_lms
from openedx.core.djangolib.testing.utils import skip_unless_cms, skip_unless_lms # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.student.tests.factories import UserFactory
@@ -23,7 +23,7 @@ class TestComprehensiveThemeLMS(TestCase):
"""
Clear static file finders cache and register cleanup methods.
"""
super(TestComprehensiveThemeLMS, self).setUp()
super(TestComprehensiveThemeLMS, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory()
# Clear the internal staticfiles caches, to get test isolation.
@@ -152,7 +152,7 @@ class TestComprehensiveThemeDisabledLMS(TestCase):
"""
Clear static file finders cache.
"""
super(TestComprehensiveThemeDisabledLMS, self).setUp()
super(TestComprehensiveThemeDisabledLMS, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
# Clear the internal staticfiles caches, to get test isolation.
staticfiles.finders.get_finder.cache_clear()
@@ -177,7 +177,7 @@ class TestStanfordTheme(TestCase):
"""
Clear static file finders cache and register cleanup methods.
"""
super(TestStanfordTheme, self).setUp()
super(TestStanfordTheme, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
# Clear the internal staticfiles caches, to get test isolation.
staticfiles.finders.get_finder.cache_clear()

View File

@@ -25,7 +25,7 @@ class TestThemingViews(TestCase):
"""
Initialize middleware and related objects
"""
super(TestThemingViews, self).setUp()
super(TestThemingViews, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.site_theme_middleware = CurrentSiteThemeMiddleware()
self.user = UserFactory.create()

View File

@@ -91,7 +91,7 @@ class ThemingAdministrationFragmentView(EdxFragmentView):
Fragment view to allow a user to administer theming.
"""
def render_to_fragment(self, request, course_id=None, **kwargs):
def render_to_fragment(self, request, course_id=None, **kwargs): # lint-amnesty, pylint: disable=arguments-differ, unused-argument
"""
Renders the theming administration view as a fragment.
"""
@@ -105,10 +105,10 @@ class ThemingAdministrationFragmentView(EdxFragmentView):
"""
if not user_can_preview_themes(request.user):
raise Http404
return super(ThemingAdministrationFragmentView, self).get(request, *args, **kwargs)
return super(ThemingAdministrationFragmentView, self).get(request, *args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
@method_decorator(login_required)
def post(self, request, **kwargs):
def post(self, request, **kwargs): # lint-amnesty, pylint: disable=unused-argument
"""
Accept requests to update the theme preview.
"""

View File

@@ -161,11 +161,11 @@ def update_account_settings(requesting_user, update, username=None):
_update_state_if_needed(update, user_profile)
except PreferenceValidationError as err:
raise AccountValidationError(err.preference_errors)
raise AccountValidationError(err.preference_errors) # lint-amnesty, pylint: disable=raise-missing-from
except (AccountUpdateError, AccountValidationError) as err:
raise err
except Exception as err:
raise AccountUpdateError(
raise AccountUpdateError( # lint-amnesty, pylint: disable=raise-missing-from
u"Error thrown when saving account updates: '{}'".format(text_type(err))
)
@@ -323,7 +323,7 @@ def _send_email_change_requests_if_needed(data, user):
try:
student_views.do_email_change_request(user, new_email)
except ValueError as err:
raise AccountUpdateError(
raise AccountUpdateError( # lint-amnesty, pylint: disable=raise-missing-from
u"Error thrown from do_email_change_request: '{}'".format(text_type(err)),
user_message=text_type(err)
)
@@ -337,7 +337,7 @@ def _send_email_change_requests_if_needed(data, user):
secondary_email_change_request=True,
)
except ValueError as err:
raise AccountUpdateError(
raise AccountUpdateError( # lint-amnesty, pylint: disable=raise-missing-from
u"Error thrown from do_email_change_request: '{}'".format(text_type(err)),
user_message=text_type(err)
)
@@ -459,7 +459,7 @@ def _get_user_and_profile(username):
try:
existing_user = User.objects.get(username=username)
except ObjectDoesNotExist:
raise errors.UserNotFound()
raise errors.UserNotFound() # lint-amnesty, pylint: disable=raise-missing-from
existing_user_profile, _ = UserProfile.objects.get_or_create(user=existing_user)
@@ -589,7 +589,7 @@ def _validate_country(country):
:return: None
"""
if country == '' or country == '--':
if country == '' or country == '--': # lint-amnesty, pylint: disable=consider-using-in
raise errors.AccountCountryInvalid(accounts.REQUIRED_FIELD_COUNTRY_MSG)
@@ -601,7 +601,7 @@ def _validate_username_doesnt_exist(username):
:raises: errors.AccountUsernameAlreadyExists
"""
if username is not None and username_exists_or_retired(username):
raise errors.AccountUsernameAlreadyExists(_(accounts.USERNAME_CONFLICT_MSG).format(username=username))
raise errors.AccountUsernameAlreadyExists(_(accounts.USERNAME_CONFLICT_MSG).format(username=username)) # lint-amnesty, pylint: disable=translation-of-non-string
def _validate_email_doesnt_exist(email):
@@ -612,7 +612,7 @@ def _validate_email_doesnt_exist(email):
:raises: errors.AccountEmailAlreadyExists
"""
if email is not None and email_exists_or_retired(email):
raise errors.AccountEmailAlreadyExists(_(accounts.EMAIL_CONFLICT_MSG).format(email_address=email))
raise errors.AccountEmailAlreadyExists(_(accounts.EMAIL_CONFLICT_MSG).format(email_address=email)) # lint-amnesty, pylint: disable=translation-of-non-string
def _validate_secondary_email_doesnt_exist(email):
@@ -646,10 +646,10 @@ def _validate_password_works_with_username(password, username=None):
:raises: errors.AccountPasswordInvalid
"""
if password == username:
raise errors.AccountPasswordInvalid(accounts.PASSWORD_CANT_EQUAL_USERNAME_MSG)
raise errors.AccountPasswordInvalid(accounts.PASSWORD_CANT_EQUAL_USERNAME_MSG) # lint-amnesty, pylint: disable=no-member
def _validate_type(data, type, err):
def _validate_type(data, type, err): # lint-amnesty, pylint: disable=redefined-builtin
"""Checks whether the input data is of type. If not,
throws a generic error message.
@@ -664,7 +664,7 @@ def _validate_type(data, type, err):
raise errors.AccountDataBadType(err)
def _validate_length(data, min, max, err):
def _validate_length(data, min, max, err): # lint-amnesty, pylint: disable=redefined-builtin
"""Validate that the data's length is less than or equal to max,
and greater than or equal to min.
@@ -695,4 +695,4 @@ def _validate_unicode(data, err=u"Input not valid unicode"):
# In some cases we pass the above, but it's still inappropriate utf-8.
six.text_type(data)
except UnicodeError:
raise UnicodeError(err)
raise UnicodeError(err) # lint-amnesty, pylint: disable=raise-missing-from

View File

@@ -149,14 +149,14 @@ def set_has_profile_image(username, is_uploaded, upload_dt=None):
ValueError: is_uploaded was True, but no upload datetime was supplied.
UserNotFound: no user with username `username` exists.
"""
if is_uploaded and upload_dt is None:
if is_uploaded and upload_dt is None: # lint-amnesty, pylint: disable=no-else-raise
raise ValueError("No upload datetime was supplied.")
elif not is_uploaded:
upload_dt = None
try:
profile = UserProfile.objects.get(user__username=username)
except ObjectDoesNotExist:
raise UserNotFound()
raise UserNotFound() # lint-amnesty, pylint: disable=raise-missing-from
profile.profile_image_uploaded_at = upload_dt
profile.save()

View File

@@ -8,7 +8,7 @@ import logging
import re
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.exceptions import ObjectDoesNotExist
from django.urls import reverse
from rest_framework import serializers
@@ -39,7 +39,7 @@ PROFILE_IMAGE_KEY_PREFIX = 'image_url'
LOGGER = logging.getLogger(__name__)
class PhoneNumberSerializer(serializers.BaseSerializer):
class PhoneNumberSerializer(serializers.BaseSerializer): # lint-amnesty, pylint: disable=abstract-method
"""
Class to serialize phone number into a digit only representation
"""
@@ -90,7 +90,7 @@ class SocialLinkSerializer(serializers.ModelSerializer):
return platform
class UserReadOnlySerializer(serializers.Serializer):
class UserReadOnlySerializer(serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method
"""
Class that serializes the User model and UserProfile model together.
"""
@@ -103,9 +103,9 @@ class UserReadOnlySerializer(serializers.Serializer):
# Don't pass the 'custom_fields' arg up to the superclass
self.custom_fields = kwargs.pop('custom_fields', [])
super(UserReadOnlySerializer, self).__init__(*args, **kwargs)
super(UserReadOnlySerializer, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
def to_representation(self, user):
def to_representation(self, user): # lint-amnesty, pylint: disable=arguments-differ
"""
Overwrite to_native to handle custom logic since we are serializing three models as one here
:param user: User object
@@ -285,7 +285,7 @@ class AccountLegacyProfileSerializer(serializers.HyperlinkedModelSerializer, Rea
"""
Enforce all languages are unique.
"""
language_proficiencies = [language for language in value]
language_proficiencies = [language for language in value] # lint-amnesty, pylint: disable=unnecessary-comprehension
unique_language_proficiencies = set(language["code"] for language in language_proficiencies)
if len(language_proficiencies) != len(unique_language_proficiencies):
raise serializers.ValidationError("The language_proficiencies field must consist of unique languages.")
@@ -295,7 +295,7 @@ class AccountLegacyProfileSerializer(serializers.HyperlinkedModelSerializer, Rea
"""
Enforce only one entry for a particular social platform.
"""
social_links = [social_link for social_link in value]
social_links = [social_link for social_link in value] # lint-amnesty, pylint: disable=unnecessary-comprehension
unique_social_links = set(social_link["platform"] for social_link in social_links)
if len(social_links) != len(unique_social_links):
raise serializers.ValidationError("The social_links field must consist of unique social platforms.")
@@ -437,7 +437,7 @@ class AccountLegacyProfileSerializer(serializers.HyperlinkedModelSerializer, Rea
])
# Update the user's social links
requested_social_links = self._kwargs['data'].get('social_links')
requested_social_links = self._kwargs['data'].get('social_links') # lint-amnesty, pylint: disable=no-member
if requested_social_links:
self._update_social_links(instance, requested_social_links)

View File

@@ -113,11 +113,11 @@ def account_settings_context(request):
'country': {
'options': list(countries),
}, 'gender': {
'options': [(choice[0], _(choice[1])) for choice in UserProfile.GENDER_CHOICES],
'options': [(choice[0], _(choice[1])) for choice in UserProfile.GENDER_CHOICES], # lint-amnesty, pylint: disable=translation-of-non-string
}, 'language': {
'options': released_languages(),
}, 'level_of_education': {
'options': [(choice[0], _(choice[1])) for choice in UserProfile.LEVEL_OF_EDUCATION_CHOICES],
'options': [(choice[0], _(choice[1])) for choice in UserProfile.LEVEL_OF_EDUCATION_CHOICES], # lint-amnesty, pylint: disable=translation-of-non-string
}, 'password': {
'url': reverse('password_reset'),
}, 'year_of_birth': {

View File

@@ -152,10 +152,10 @@ class RetirementTestCase(TestCase):
return [create_retirement_status(UserFactory(), state=state) for state in RetirementState.objects.all()]
def _get_non_dead_end_states(self):
return [state for state in RetirementState.objects.filter(is_dead_end_state=False)]
return [state for state in RetirementState.objects.filter(is_dead_end_state=False)] # lint-amnesty, pylint: disable=unnecessary-comprehension
def _get_dead_end_states(self):
return [state for state in RetirementState.objects.filter(is_dead_end_state=True)]
return [state for state in RetirementState.objects.filter(is_dead_end_state=True)] # lint-amnesty, pylint: disable=unnecessary-comprehension
def fake_requested_retirement(user):

View File

@@ -11,7 +11,7 @@ import unicodedata
import ddt
from django.conf import settings
from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.http import HttpResponse
from django.test import TestCase
from django.test.client import RequestFactory
@@ -64,7 +64,7 @@ def mock_render_to_response(template_name):
return HttpResponse(template_name)
class CreateAccountMixin(object):
class CreateAccountMixin(object): # lint-amnesty, pylint: disable=missing-class-docstring
def create_account(self, username, password, email):
# pylint: disable=missing-docstring
registration_url = reverse('user_api_registration')
@@ -80,7 +80,7 @@ class CreateAccountMixin(object):
@skip_unless_lms
@ddt.ddt
@patch('common.djangoapps.student.views.management.render_to_response', Mock(side_effect=mock_render_to_response, autospec=True))
@patch('common.djangoapps.student.views.management.render_to_response', Mock(side_effect=mock_render_to_response, autospec=True)) # lint-amnesty, pylint: disable=line-too-long
class TestAccountApi(UserSettingsEventTestMixin, EmailTemplateTagMixin, CreateAccountMixin, RetirementTestCase):
"""
These tests specifically cover the parts of the API methods that are not covered by test_views.py.
@@ -90,7 +90,7 @@ class TestAccountApi(UserSettingsEventTestMixin, EmailTemplateTagMixin, CreateAc
password = "test"
def setUp(self):
super(TestAccountApi, self).setUp()
super(TestAccountApi, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.request_factory = RequestFactory()
self.table = "student_languageproficiency"
self.user = UserFactory.create(password=self.password)
@@ -366,7 +366,7 @@ class TestAccountApi(UserSettingsEventTestMixin, EmailTemplateTagMixin, CreateAc
self.assertIn("Full Name cannot contain the following characters: < >", field_errors["name"]["user_message"])
@patch('django.core.mail.EmailMultiAlternatives.send')
@patch('common.djangoapps.student.views.management.render_to_string', Mock(side_effect=mock_render_to_string, autospec=True))
@patch('common.djangoapps.student.views.management.render_to_string', Mock(side_effect=mock_render_to_string, autospec=True)) # lint-amnesty, pylint: disable=line-too-long
def test_update_sending_email_fails(self, send_mail):
"""Test what happens if all validation checks pass, but sending the email for email change fails."""
send_mail.side_effect = [Exception, None]

View File

@@ -12,7 +12,7 @@ from pytz import UTC
from openedx.core.djangolib.testing.utils import skip_unless_lms
from common.djangoapps.student.tests.factories import UserFactory
from six import text_type
from six import text_type # lint-amnesty, pylint: disable=wrong-import-order
from ..image_helpers import get_profile_image_urls_for_user
@@ -28,12 +28,12 @@ class ProfileImageUrlTestCase(TestCase):
"""
def setUp(self):
super(ProfileImageUrlTestCase, self).setUp()
super(ProfileImageUrlTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory()
# Ensure that parental controls don't apply to this user
self.user.profile.year_of_birth = 1980
self.user.profile.profile_image_uploaded_at = TEST_PROFILE_IMAGE_UPLOAD_DT
self.user.profile.save()
self.user.profile.save() # lint-amnesty, pylint: disable=no-member
def verify_url(self, actual_url, expected_name, expected_pixels, expected_version):
"""
@@ -73,12 +73,12 @@ class ProfileImageUrlTestCase(TestCase):
Tests `get_profile_image_urls_for_user`
"""
self.user.profile.profile_image_uploaded_at = TEST_PROFILE_IMAGE_UPLOAD_DT
self.user.profile.save()
self.user.profile.save() # lint-amnesty, pylint: disable=no-member
expected_name = hashlib.md5((
'secret' + text_type(self.user.username)).encode('utf-8')).hexdigest()
actual_urls = get_profile_image_urls_for_user(self.user)
self.verify_urls(actual_urls, expected_name, is_default=False)
self.user.profile.profile_image_uploaded_at = None
self.user.profile.save()
self.user.profile.save() # lint-amnesty, pylint: disable=no-member
self.verify_urls(get_profile_image_urls_for_user(self.user), 'default', is_default=True)

View File

@@ -6,14 +6,14 @@ Tests for User deactivation API permissions
from django.test import RequestFactory, TestCase
from openedx.core.djangoapps.user_api.accounts.permissions import CanDeactivateUser, CanRetireUser
from common.djangoapps.student.tests.factories import ContentTypeFactory, PermissionFactory, SuperuserFactory, UserFactory
from common.djangoapps.student.tests.factories import ContentTypeFactory, PermissionFactory, SuperuserFactory, UserFactory # lint-amnesty, pylint: disable=line-too-long
class CanDeactivateUserTest(TestCase):
""" Tests for user deactivation API permissions """
def setUp(self):
super(CanDeactivateUserTest, self).setUp()
super(CanDeactivateUserTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.request = RequestFactory().get('/test/url')
def test_api_permission_superuser(self):
@@ -46,7 +46,7 @@ class CanRetireUserTest(TestCase):
""" Tests for user retirement API permissions """
def setUp(self):
super(CanRetireUserTest, self).setUp()
super(CanRetireUserTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.request = RequestFactory().get('/test/url')
def test_api_permission_superuser(self):

View File

@@ -14,7 +14,7 @@ import pytz
import six
from consent.models import DataSharingConsent
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.contrib.sites.models import Site
from django.core import mail
from django.core.cache import cache
@@ -109,7 +109,7 @@ class TestAccountDeactivation(TestCase):
"""
def setUp(self):
super(TestAccountDeactivation, self).setUp()
super(TestAccountDeactivation, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_user = UserFactory()
self.url = reverse('accounts_deactivation', kwargs={'username': self.test_user.username})
@@ -180,7 +180,7 @@ class TestDeactivateLogout(RetirementTestCase):
Tests the account deactivation/logout endpoint.
"""
def setUp(self):
super(TestDeactivateLogout, self).setUp()
super(TestDeactivateLogout, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_password = 'password'
self.test_user = UserFactory(password=self.test_password)
UserSocialAuth.objects.create(
@@ -277,7 +277,7 @@ class TestPartnerReportingCleanup(ModuleStoreTestCase):
"""
def setUp(self):
super(TestPartnerReportingCleanup, self).setUp()
super(TestPartnerReportingCleanup, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_superuser = SuperuserFactory()
self.course = CourseFactory()
self.course_awesome_org = CourseFactory(org='awesome_org')
@@ -389,7 +389,7 @@ class TestPartnerReportingPut(RetirementTestCase, ModuleStoreTestCase):
"""
def setUp(self):
super(TestPartnerReportingPut, self).setUp()
super(TestPartnerReportingPut, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_superuser = SuperuserFactory()
self.course = CourseFactory()
self.course_awesome_org = CourseFactory(org='awesome_org')
@@ -468,8 +468,8 @@ class TestPartnerReportingPut(RetirementTestCase, ModuleStoreTestCase):
# the orgs from our PUT operation, so this is the best way to make sure it's doing the right
# thing.
orgs = AccountRetirementPartnerReportView._get_orgs_for_user(user) # pylint: disable=protected-access
self.assertTrue(len(orgs) == 1)
self.assertTrue('edX' in orgs)
self.assertTrue(len(orgs) == 1) # lint-amnesty, pylint: disable=wrong-assert-type
self.assertTrue('edX' in orgs) # lint-amnesty, pylint: disable=wrong-assert-type
# PUT should succeed
self.put_and_assert_status({'username': user.username})
@@ -496,7 +496,7 @@ class TestPartnerReportingList(ModuleStoreTestCase):
]
def setUp(self):
super(TestPartnerReportingList, self).setUp()
super(TestPartnerReportingList, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_superuser = SuperuserFactory()
self.course = CourseFactory()
self.course_awesome_org = CourseFactory(org='awesome_org')
@@ -596,8 +596,8 @@ class TestPartnerReportingList(ModuleStoreTestCase):
"""
Basic test to make sure that users in two different orgs are returned.
"""
user_dicts, users = self.create_partner_reporting_statuses()
additional_dicts, additional_users = self.create_partner_reporting_statuses(courses=(self.course_awesome_org,))
user_dicts, users = self.create_partner_reporting_statuses() # lint-amnesty, pylint: disable=unused-variable
additional_dicts, additional_users = self.create_partner_reporting_statuses(courses=(self.course_awesome_org,)) # lint-amnesty, pylint: disable=unused-variable
user_dicts += additional_dicts
self.assert_status_and_user_list(user_dicts)
@@ -606,7 +606,7 @@ class TestPartnerReportingList(ModuleStoreTestCase):
"""
Checks that only users in the correct is_being_processed state (False) are returned.
"""
user_dicts, users = self.create_partner_reporting_statuses()
user_dicts, users = self.create_partner_reporting_statuses() # lint-amnesty, pylint: disable=unused-variable
# These should not come back
self.create_partner_reporting_statuses(courses=(self.course_awesome_org,), is_being_processed=True)
@@ -621,7 +621,7 @@ class TestPartnerReportingList(ModuleStoreTestCase):
path = 'openedx.core.djangoapps.user_api.accounts.views.has_ever_consented_to_coaching'
with mock.patch(path, return_value=True) as mock_has_ever_consented:
user_dicts, users = self.create_partner_reporting_statuses(num=1)
external_id, created = ExternalId.add_new_user_id(
external_id, created = ExternalId.add_new_user_id( # lint-amnesty, pylint: disable=unused-variable
user=users[0],
type_name=ExternalIdType.MICROBACHELORS_COACHING
)
@@ -642,7 +642,7 @@ class TestPartnerReportingList(ModuleStoreTestCase):
"""
path = 'openedx.core.djangoapps.user_api.accounts.views.has_ever_consented_to_coaching'
with mock.patch(path, return_value=True) as mock_has_ever_consented:
user_dicts, users = self.create_partner_reporting_statuses(num=1)
user_dicts, users = self.create_partner_reporting_statuses(num=1) # lint-amnesty, pylint: disable=unused-variable
self.assert_status_and_user_list(user_dicts)
mock_has_ever_consented.assert_called_once()
@@ -682,7 +682,7 @@ class TestPartnerReportingList(ModuleStoreTestCase):
Checks that users are progressed to "is_being_processed" True upon being returned
from this call.
"""
user_dicts, users = self.create_partner_reporting_statuses()
user_dicts, users = self.create_partner_reporting_statuses() # lint-amnesty, pylint: disable=unused-variable
# First time through we should get the users
self.assert_status_and_user_list(user_dicts)
@@ -698,7 +698,7 @@ class TestAccountRetirementList(RetirementTestCase):
"""
def setUp(self):
super(TestAccountRetirementList, self).setUp()
super(TestAccountRetirementList, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_superuser = SuperuserFactory()
self.headers = build_jwt_headers(self.test_superuser)
self.url = reverse('accounts_retirement_queue')
@@ -723,7 +723,7 @@ class TestAccountRetirementList(RetirementTestCase):
try:
states_to_request = [s.state_name for s in states_to_request]
except AttributeError:
states_to_request = states_to_request
states_to_request = states_to_request # lint-amnesty, pylint: disable=self-assigning-variable
data = {'cool_off_days': cool_off_days, 'states': states_to_request}
response = self.client.get(self.url, data, **self.headers)
@@ -858,7 +858,7 @@ class TestAccountRetirementsByStatusAndDate(RetirementTestCase):
"""
def setUp(self):
super(TestAccountRetirementsByStatusAndDate, self).setUp()
super(TestAccountRetirementsByStatusAndDate, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_superuser = SuperuserFactory()
self.headers = build_jwt_headers(self.test_superuser)
self.url = reverse('accounts_retirements_by_status_and_date')
@@ -952,7 +952,7 @@ class TestAccountRetirementsByStatusAndDate(RetirementTestCase):
complete_state = RetirementState.objects.get(state_name='COMPLETE')
# Create retirements for the last 10 days
for days_back in range(0, 10):
for days_back in range(0, 10): # lint-amnesty, pylint: disable=simplifiable-range
create_datetime = datetime.datetime.now(pytz.UTC) - datetime.timedelta(days=days_back)
ret = create_retirement_status(UserFactory(), state=complete_state, create_datetime=create_datetime)
retirements.append(self._retirement_to_dict(ret))
@@ -1005,7 +1005,7 @@ class TestAccountRetirementRetrieve(RetirementTestCase):
Tests the account retirement retrieval endpoint.
"""
def setUp(self):
super(TestAccountRetirementRetrieve, self).setUp()
super(TestAccountRetirementRetrieve, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_user = UserFactory()
self.test_superuser = SuperuserFactory()
self.url = reverse('accounts_retirement_retrieve', kwargs={'username': self.test_user.username})
@@ -1076,7 +1076,7 @@ class TestAccountRetirementCleanup(RetirementTestCase):
Tests the account retirement cleanup endpoint.
"""
def setUp(self):
super(TestAccountRetirementCleanup, self).setUp()
super(TestAccountRetirementCleanup, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.pending_state = RetirementState.objects.get(state_name='PENDING')
self.complete_state = RetirementState.objects.get(state_name='COMPLETE')
self.retirements = []
@@ -1153,7 +1153,7 @@ class TestAccountRetirementUpdate(RetirementTestCase):
Tests the account retirement endpoint.
"""
def setUp(self):
super(TestAccountRetirementUpdate, self).setUp()
super(TestAccountRetirementUpdate, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.pending_state = RetirementState.objects.get(state_name='PENDING')
self.locking_state = RetirementState.objects.get(state_name='LOCKING_ACCOUNT')
@@ -1293,7 +1293,7 @@ class TestAccountRetirementPost(RetirementTestCase):
Tests the account retirement endpoint.
"""
def setUp(self):
super(TestAccountRetirementPost, self).setUp()
super(TestAccountRetirementPost, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_user = UserFactory()
self.test_superuser = SuperuserFactory()
@@ -1574,7 +1574,7 @@ class TestLMSAccountRetirementPost(RetirementTestCase, ModuleStoreTestCase):
Tests the LMS account retirement (GDPR P2) endpoint.
"""
def setUp(self):
super(TestLMSAccountRetirementPost, self).setUp()
super(TestLMSAccountRetirementPost, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.pii_standin = 'PII here'
self.course = CourseFactory()
self.test_user = UserFactory()
@@ -1602,14 +1602,14 @@ class TestLMSAccountRetirementPost(RetirementTestCase, ModuleStoreTestCase):
ArticleRevision.objects.create(ip_address="ipaddresss", user=self.test_user, article=article)
# ManualEnrollmentAudit setup
course_enrollment = CourseEnrollment.enroll(user=self.test_user, course_key=self.course.id)
course_enrollment = CourseEnrollment.enroll(user=self.test_user, course_key=self.course.id) # lint-amnesty, pylint: disable=no-member
ManualEnrollmentAudit.objects.create(
enrollment=course_enrollment, reason=self.pii_standin, enrolled_email=self.pii_standin
)
# CreditRequest and CreditRequirementStatus setup
provider = CreditProvider.objects.create(provider_id="Hogwarts")
credit_course = CreditCourse.objects.create(course_key=self.course.id)
credit_course = CreditCourse.objects.create(course_key=self.course.id) # lint-amnesty, pylint: disable=no-member
CreditRequest.objects.create(
username=self.test_user.username,
course=credit_course,

View File

@@ -16,9 +16,9 @@ from common.djangoapps.student.tests.factories import UserFactory
LOGGER_NAME = "openedx.core.djangoapps.user_api.accounts.serializers"
class UserReadOnlySerializerTest(TestCase):
class UserReadOnlySerializerTest(TestCase): # lint-amnesty, pylint: disable=missing-class-docstring
def setUp(self):
super(UserReadOnlySerializerTest, self).setUp()
super(UserReadOnlySerializerTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
request_factory = RequestFactory()
self.request = request_factory.get('/api/user/v1/accounts/')
self.user = UserFactory.build(username='test_user', email='test_user@test.com')

View File

@@ -49,7 +49,7 @@ class AccountSettingsViewTest(ThirdPartyAuthTestMixin, SiteMixin, ProgramsApiCon
@mock.patch("django.conf.settings.MESSAGE_STORAGE", 'django.contrib.messages.storage.cookie.CookieStorage')
def setUp(self): # pylint: disable=arguments-differ
super(AccountSettingsViewTest, self).setUp()
super(AccountSettingsViewTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create(username=self.USERNAME, password=self.PASSWORD)
CommerceConfiguration.objects.create(cache_ttl=10, enabled=True)
self.client.login(username=self.USERNAME, password=self.PASSWORD)

View File

@@ -21,8 +21,8 @@ from ..utils import format_social_link, validate_social_link
class UserAccountSettingsTest(TestCase):
"""Unit tests for setting Social Media Links."""
def setUp(self):
super(UserAccountSettingsTest, self).setUp()
def setUp(self): # lint-amnesty, pylint: disable=useless-super-delegation
super(UserAccountSettingsTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
def validate_social_link(self, social_platform, link):
"""
@@ -71,7 +71,7 @@ class CompletionUtilsTestCase(SharedModuleStoreTestCase, CompletionWaffleTestMix
"""
Creates a test course that can be used for non-destructive tests
"""
super(CompletionUtilsTestCase, self).setUp()
super(CompletionUtilsTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.override_waffle_switch(True)
self.engaged_user = UserFactory.create()
self.cruft_user = UserFactory.create()

View File

@@ -47,7 +47,7 @@ class UserAPITestCase(APITestCase):
"""
def setUp(self):
super(UserAPITestCase, self).setUp()
super(UserAPITestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.anonymous_client = APIClient()
self.different_user = UserFactory.create(password=TEST_PASSWORD)
@@ -156,7 +156,7 @@ class TestOwnUsernameAPI(CacheIsolationTestCase, UserAPITestCase):
ENABLED_CACHES = ['default']
def setUp(self):
super(TestOwnUsernameAPI, self).setUp()
super(TestOwnUsernameAPI, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse("own_username_api")
@@ -214,7 +214,7 @@ class TestAccountsAPI(CacheIsolationTestCase, UserAPITestCase):
ENABLED_CACHES = ['default']
def setUp(self):
super(TestAccountsAPI, self).setUp()
super(TestAccountsAPI, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse("accounts_api", kwargs={'username': self.user.username})
@@ -948,7 +948,7 @@ class TestAccountAPITransactions(TransactionTestCase):
"""
def setUp(self):
super(TestAccountAPITransactions, self).setUp()
super(TestAccountAPITransactions, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.client = APIClient()
self.user = UserFactory.create(password=TEST_PASSWORD)
self.url = reverse("accounts_api", kwargs={'username': self.user.username})
@@ -983,7 +983,7 @@ class UsernameReplacementViewTests(APITestCase):
SERVICE_USERNAME = 'test_replace_username_service_worker'
def setUp(self):
super(UsernameReplacementViewTests, self).setUp()
super(UsernameReplacementViewTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.service_user = UserFactory(username=self.SERVICE_USERNAME)
self.url = reverse("username_replacement")

View File

@@ -11,7 +11,7 @@ from completion.models import BlockCompletion
from django.conf import settings
from django.utils.translation import ugettext as _
from six import text_type
from six.moves import range
from six.moves import range # lint-amnesty, pylint: disable=unused-import
from six.moves.urllib.parse import urlparse # pylint: disable=import-error
from common.djangoapps.third_party_auth.config.waffle import ENABLE_MULTIPLE_SSO_ACCOUNTS_ASSOCIATION_TO_SAML_USER

View File

@@ -52,7 +52,7 @@ from openedx.core.djangoapps.user_authn.exceptions import AuthFailedError
from openedx.core.djangolib.oauth2_retirement_utils import retire_dot_oauth2_models
from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser
from openedx.core.lib.api.parsers import MergePatchParser
from common.djangoapps.student.models import (
from common.djangoapps.student.models import ( # lint-amnesty, pylint: disable=unused-import
AccountRecovery,
CourseEnrollment,
CourseEnrollmentAllowed,
@@ -869,7 +869,7 @@ class AccountRetirementStatusView(ViewSet):
# than one row returned here (due to our MySQL collation being case-insensitive), and need
# to disambiguate them in Python, which will respect case in the comparison.
retirement = None
if len(retirements) < 1:
if len(retirements) < 1: # lint-amnesty, pylint: disable=no-else-raise
raise UserRetirementStatus.DoesNotExist()
elif len(retirements) >= 1:
for r in retirements:
@@ -1078,7 +1078,7 @@ class AccountRetirementView(ViewSet):
DataSharingConsent.objects.filter(username=username).update(username=retired_username)
@staticmethod
def retire_sapsf_data_transmission(user):
def retire_sapsf_data_transmission(user): # lint-amnesty, pylint: disable=missing-function-docstring
for ent_user in EnterpriseCustomerUser.objects.filter(user_id=user.id):
for enrollment in EnterpriseCourseEnrollment.objects.filter(
enterprise_customer_user=ent_user
@@ -1089,7 +1089,7 @@ class AccountRetirementView(ViewSet):
audits.update(sapsf_user_id='')
@staticmethod
def retire_degreed_data_transmission(user):
def retire_degreed_data_transmission(user): # lint-amnesty, pylint: disable=missing-function-docstring
for ent_user in EnterpriseCustomerUser.objects.filter(user_id=user.id):
for enrollment in EnterpriseCourseEnrollment.objects.filter(
enterprise_customer_user=ent_user

View File

@@ -87,7 +87,7 @@ class UserRetirementStatusAdmin(admin.ModelAdmin):
"""
Adds our custom URL to the admin
"""
urls = super(UserRetirementStatusAdmin, self).get_urls()
urls = super(UserRetirementStatusAdmin, self).get_urls() # lint-amnesty, pylint: disable=super-with-arguments
custom_urls = [
url(
r'^(?P<retirement_id>.+)/cancel_retirement/$',
@@ -121,7 +121,7 @@ class UserRetirementStatusAdmin(admin.ModelAdmin):
Removes the default bulk delete option provided by Django,
it doesn't do what we need for this model.
"""
actions = super(UserRetirementStatusAdmin, self).get_actions(request)
actions = super(UserRetirementStatusAdmin, self).get_actions(request) # lint-amnesty, pylint: disable=super-with-arguments
if 'delete_selected' in actions:
del actions['delete_selected']
return actions

View File

@@ -20,7 +20,7 @@ from ..models import UserCourseTag
COURSE_SCOPE = 'course'
class BulkCourseTags(object):
class BulkCourseTags(object): # lint-amnesty, pylint: disable=missing-class-docstring
CACHE_NAMESPACE = u'user_api.course_tag.api'
@classmethod

View File

@@ -16,7 +16,7 @@ class TestCourseTagAPI(TestCase):
"""
def setUp(self):
super(TestCourseTagAPI, self).setUp()
super(TestCourseTagAPI, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create()
self.course_id = CourseLocator('test_org', 'test_course_number', 'test_run')
self.test_key = 'test_key'

View File

@@ -5,72 +5,72 @@ Errors thrown by the various user APIs.
class UserAPIRequestError(Exception):
"""There was a problem with the request to the User API. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class UserAPIInternalError(Exception):
"""An internal error occurred in the User API. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class UserNotFound(UserAPIRequestError):
"""The requested user does not exist. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class UserNotAuthorized(UserAPIRequestError):
"""The user is not authorized to perform the requested action. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountRequestError(UserAPIRequestError):
"""There was a problem with the request to the account API. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountUserAlreadyExists(AccountRequestError):
"""User with the same username and/or email already exists. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountUsernameAlreadyExists(AccountRequestError):
"""User with the same username already exists. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountEmailAlreadyExists(AccountRequestError):
"""User with the same email already exists. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountUsernameInvalid(AccountRequestError):
"""The requested username is not in a valid format. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountEmailInvalid(AccountRequestError):
"""The requested email is not in a valid format. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountPasswordInvalid(AccountRequestError):
"""The requested password is not in a valid format. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountCountryInvalid(AccountRequestError):
"""The requested country does not exist. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountDataBadLength(AccountRequestError):
"""The requested account data is either too short or too long. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountDataBadType(AccountRequestError):
"""The requested account data is of the wrong type. """
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class AccountUpdateError(AccountRequestError):
@@ -78,7 +78,7 @@ class AccountUpdateError(AccountRequestError):
An update to the account failed. More detailed information is present in developer_message,
and depending on the type of error encountered, there may also be a non-null user_message field.
"""
def __init__(self, developer_message, user_message=None):
def __init__(self, developer_message, user_message=None): # lint-amnesty, pylint: disable=super-init-not-called
self.developer_message = developer_message
self.user_message = user_message
@@ -90,13 +90,13 @@ class AccountValidationError(AccountRequestError):
there will be at least a developer_message describing the validation issue, and possibly
also a user_message.
"""
def __init__(self, field_errors):
def __init__(self, field_errors): # lint-amnesty, pylint: disable=super-init-not-called
self.field_errors = field_errors
class PreferenceRequestError(UserAPIRequestError):
"""There was a problem with a preference request."""
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class PreferenceValidationError(PreferenceRequestError):
@@ -108,7 +108,7 @@ class PreferenceValidationError(PreferenceRequestError):
"""
def __init__(self, preference_errors):
self.preference_errors = preference_errors
super(PreferenceValidationError, self).__init__(preference_errors)
super(PreferenceValidationError, self).__init__(preference_errors) # lint-amnesty, pylint: disable=super-with-arguments
class PreferenceUpdateError(PreferenceRequestError):
@@ -119,9 +119,9 @@ class PreferenceUpdateError(PreferenceRequestError):
def __init__(self, developer_message, user_message=None):
self.developer_message = developer_message
self.user_message = user_message
super(PreferenceUpdateError, self).__init__(developer_message)
super(PreferenceUpdateError, self).__init__(developer_message) # lint-amnesty, pylint: disable=super-with-arguments
class CountryCodeError(ValueError):
"""There was a problem with the country code"""
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass

View File

@@ -64,7 +64,7 @@ def intercept_errors(api_error, ignore_errors=None):
func_name=func.__name__,
args=args,
kwargs=kwargs,
exception=ex.developer_message if hasattr(ex, 'developer_message') else repr(ex)
exception=ex.developer_message if hasattr(ex, 'developer_message') else repr(ex) # lint-amnesty, pylint: disable=no-member
)
LOGGER.warning(msg)
raise
@@ -80,11 +80,11 @@ def intercept_errors(api_error, ignore_errors=None):
func_name=func.__name__,
args=args,
kwargs=kwargs,
exception=ex.developer_message if hasattr(ex, 'developer_message') else repr(ex),
exception=ex.developer_message if hasattr(ex, 'developer_message') else repr(ex), # lint-amnesty, pylint: disable=no-member
caller=caller.strip(),
)
LOGGER.exception(msg)
raise api_error(msg)
raise api_error(msg) # lint-amnesty, pylint: disable=raise-missing-from
return _wrapped
return _decorator
@@ -347,13 +347,13 @@ class LocalizedJSONEncoder(DjangoJSONEncoder):
JSON handler that evaluates ugettext_lazy promises.
"""
# pylint: disable=method-hidden
def default(self, obj):
def default(self, obj): # lint-amnesty, pylint: disable=arguments-differ
"""
Forces evaluation of ugettext_lazy promises.
"""
if isinstance(obj, Promise):
return force_text(obj)
super(LocalizedJSONEncoder, self).default(obj)
super(LocalizedJSONEncoder, self).default(obj) # lint-amnesty, pylint: disable=super-with-arguments
def serializer_is_dirty(preference_serializer):

View File

@@ -3,7 +3,7 @@ Defines the URL routes for this app.
"""
from django.conf import settings
from django.conf import settings # lint-amnesty, pylint: disable=unused-import
from django.conf.urls import include, url
from rest_framework import routers

View File

@@ -37,7 +37,7 @@ class Command(BaseCommand):
original_email=email_address
)
except UserRetirementStatus.DoesNotExist:
raise CommandError(u"No retirement request with email address '{}' exists.".format(email_address))
raise CommandError(u"No retirement request with email address '{}' exists.".format(email_address)) # lint-amnesty, pylint: disable=raise-missing-from
# Check if the user has started the retirement process -or- not.
if retirement_status.current_state.state_name != 'PENDING':

View File

@@ -10,7 +10,7 @@ from textwrap import dedent
from uuid import uuid4
from consent.models import DataSharingConsent
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.management.base import BaseCommand
from enterprise.models import (
EnterpriseCourseEnrollment,

View File

@@ -32,7 +32,7 @@ from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.db import connections
from django.utils import timezone
from opaque_keys.edx.keys import CourseKey
from opaque_keys.edx.keys import CourseKey # lint-amnesty, pylint: disable=unused-import
import six
from six import text_type
from six.moves import range

View File

@@ -1,7 +1,8 @@
# lint-amnesty, pylint: disable=missing-module-docstring
import logging
from django.contrib.auth import get_user_model, logout
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model, logout # lint-amnesty, pylint: disable=unused-import
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.management.base import BaseCommand, CommandError
from django.db import transaction
from social_django.models import UserSocialAuth
@@ -61,7 +62,7 @@ class Command(BaseCommand):
'trying again'
)
logger.error(error_message)
raise CommandError(error_message)
raise CommandError(error_message) # lint-amnesty, pylint: disable=raise-missing-from
user_model = get_user_model()
@@ -86,14 +87,14 @@ class Command(BaseCommand):
except KeyError:
error_message = 'Username not specified {}'.format(user)
logger.error(error_message)
raise CommandError(error_message)
raise CommandError(error_message) # lint-amnesty, pylint: disable=raise-missing-from
except user_model.DoesNotExist:
error_message = 'The user "{}" does not exist.'.format(user.username)
logger.error(error_message)
raise CommandError(error_message)
raise CommandError(error_message) # lint-amnesty, pylint: disable=raise-missing-from
except Exception as exc: # pylint: disable=broad-except
error_message = '500 error deactivating account {}'.format(exc)
logger.error(error_message)
raise CommandError(error_message)
raise CommandError(error_message) # lint-amnesty, pylint: disable=raise-missing-from
logger.info("User succesfully moved to the retirment pipeline")

View File

@@ -12,7 +12,7 @@ from datetime import datetime, timedelta
from textwrap import dedent
import six.moves.urllib.parse # pylint: disable=import-error
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.management.base import BaseCommand, CommandError
from edx_rest_api_client.client import EdxRestApiClient
from slumber.exceptions import HttpClientError, HttpServerError
@@ -145,7 +145,7 @@ class Command(BaseCommand):
return len(contacts)
except (HttpClientError, HttpServerError) as ex:
message = u'An error occurred while syncing batch of contacts for site {domain}, {message}'.format(
domain=site_conf.site.domain, message=ex.message
domain=site_conf.site.domain, message=ex.message # lint-amnesty, pylint: disable=no-member
)
self.stderr.write(message)
return 0
@@ -226,4 +226,4 @@ class Command(BaseCommand):
except Exception as ex:
traceback.print_exc()
raise CommandError(u'Command failed with traceback %s' % str(ex))
raise CommandError(u'Command failed with traceback %s' % str(ex)) # lint-amnesty, pylint: disable=raise-missing-from

View File

@@ -5,7 +5,7 @@ Test the cancel_user_retirement_request management command
import pytest
from django.contrib.auth.hashers import UNUSABLE_PASSWORD_PREFIX
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.management import CommandError, call_command
from openedx.core.djangoapps.user_api.accounts.tests.retirement_helpers import ( # pylint: disable=unused-import

View File

@@ -10,7 +10,7 @@ from collections import defaultdict
import ddt
import six
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.management import call_command
from django.core.management.base import CommandError
from six import text_type
@@ -50,7 +50,7 @@ class EmailOptInListTest(ModuleStoreTestCase):
DEFAULT_DATETIME_STR = "2014-12-01 00:00:00"
def setUp(self):
super(EmailOptInListTest, self).setUp()
super(EmailOptInListTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create(
username=self.USER_USERNAME,
@@ -413,7 +413,7 @@ class EmailOptInListTest(ModuleStoreTestCase):
try:
with open(output_path) as output_file:
reader = csv.DictReader(output_file, fieldnames=self.OUTPUT_FIELD_NAMES)
rows = [row for row in reader]
rows = [row for row in reader] # lint-amnesty, pylint: disable=unnecessary-comprehension
except IOError:
self.fail(u"Could not find or open output file at '{path}'".format(path=output_path))

View File

@@ -4,22 +4,22 @@ Test the retire_user management command
import pytest
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.management import CommandError, call_command
from ...models import UserRetirementStatus
from openedx.core.djangoapps.user_api.accounts.tests.retirement_helpers import ( # pylint: disable=unused-import
from openedx.core.djangoapps.user_api.accounts.tests.retirement_helpers import ( # lint-amnesty, pylint: disable=unused-import, wrong-import-order
setup_retirement_states
)
from openedx.core.djangolib.testing.utils import skip_unless_lms
from common.djangoapps.student.tests.factories import UserFactory
from openedx.core.djangolib.testing.utils import skip_unless_lms # lint-amnesty, pylint: disable=wrong-import-order
from common.djangoapps.student.tests.factories import UserFactory # lint-amnesty, pylint: disable=wrong-import-order
pytestmark = pytest.mark.django_db
@skip_unless_lms
def test_successful_retire(setup_retirement_states):
def test_successful_retire(setup_retirement_states): # lint-amnesty, pylint: disable=redefined-outer-name, unused-argument
user = UserFactory()
username = user.username
user_email = user.email
@@ -33,7 +33,7 @@ def test_successful_retire(setup_retirement_states):
@skip_unless_lms
def test_retire_user_with_usename_email_mismatch(setup_retirement_states):
def test_retire_user_with_usename_email_mismatch(setup_retirement_states): # lint-amnesty, pylint: disable=redefined-outer-name, unused-argument
user = UserFactory()
username = user.username
user_email = "other@edx.org"

View File

@@ -38,7 +38,7 @@ class TestHubspotSyncCommand(TestCase):
cls._create_users(cls.site_config)
@classmethod
def _create_users(cls, site_conf):
def _create_users(cls, site_conf): # lint-amnesty, pylint: disable=missing-function-docstring
# Create some test users
for i in range(1, 20):
profile_meta = {

View File

@@ -14,7 +14,7 @@ class DeletionNotificationMessage(BaseMessageType):
Message to notify learners that their account is queued for deletion.
"""
def __init__(self, *args, **kwargs):
super(DeletionNotificationMessage, self).__init__(*args, **kwargs)
super(DeletionNotificationMessage, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
self.options['transactional'] = True # pylint: disable=unsupported-assignment-operation
self.options['from_address'] = helpers.get_value( # pylint: disable=unsupported-assignment-operation

View File

@@ -3,7 +3,7 @@ Django ORM model specifications for the User API application
"""
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.validators import RegexValidator
from django.db import models
from django.db.models.signals import post_delete, post_save, pre_save
@@ -61,7 +61,7 @@ class UserPreference(models.Model):
Returns: Set of (preference type, value) pairs for each of the user's preferences
"""
return dict([(pref.key, pref.value) for pref in user.preferences.all()])
return dict([(pref.key, pref.value) for pref in user.preferences.all()]) # lint-amnesty, pylint: disable=consider-using-dict-comprehension
@classmethod
def get_value(cls, user, preference_key, default=None):
@@ -318,7 +318,7 @@ class UserRetirementStatus(TimeStampedModel):
err = u'{} does not exist or is an eariler state than current state {}'.format(
new_state, self.current_state
)
raise RetirementStateError(err)
raise RetirementStateError(err) # lint-amnesty, pylint: disable=raise-missing-from
def _validate_update_data(self, data):
"""
@@ -347,7 +347,7 @@ class UserRetirementStatus(TimeStampedModel):
try:
pending = RetirementState.objects.all().order_by('state_execution_order')[0]
except IndexError:
raise RetirementStateError('Default state does not exist! Populate retirement states to retire users.')
raise RetirementStateError('Default state does not exist! Populate retirement states to retire users.') # lint-amnesty, pylint: disable=raise-missing-from
if cls.objects.filter(user=user).exists():
raise RetirementStateError(u'User {} already has a retirement status row!'.format(user))

View File

@@ -3,7 +3,7 @@ Permissions classes for User-API aware views.
"""
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.http import Http404
from django.shortcuts import get_object_or_404
from rest_framework import permissions

View File

@@ -18,7 +18,7 @@ from openedx.core.lib.time_zone_utils import get_display_time_zone
from common.djangoapps.student.models import User, UserProfile
from common.djangoapps.track import segment
from ..errors import (
from ..errors import ( # lint-amnesty, pylint: disable=unused-import
CountryCodeError,
PreferenceUpdateError,
PreferenceValidationError,
@@ -169,7 +169,7 @@ def update_user_preferences(requesting_user, update, user=None):
if serializer_is_dirty(serializer):
serializer.save()
except Exception as error:
raise _create_preference_update_error(preference_key, preference_value, error)
raise _create_preference_update_error(preference_key, preference_value, error) # lint-amnesty, pylint: disable=raise-missing-from
else:
delete_user_preference(requesting_user, preference_key)
@@ -209,7 +209,7 @@ def set_user_preference(requesting_user, preference_key, preference_value, usern
try:
serializer.save()
except Exception as error:
raise _create_preference_update_error(preference_key, preference_value, error)
raise _create_preference_update_error(preference_key, preference_value, error) # lint-amnesty, pylint: disable=raise-missing-from
@intercept_errors(UserAPIInternalError, ignore_errors=[UserAPIRequestError])
@@ -247,7 +247,7 @@ def delete_user_preference(requesting_user, preference_key, username=None):
try:
user_preference.delete()
except Exception as error:
raise PreferenceUpdateError(
raise PreferenceUpdateError( # lint-amnesty, pylint: disable=raise-missing-from
developer_message=u"Delete failed for user preference '{preference_key}': {error}".format(
preference_key=preference_key, error=error
),
@@ -285,7 +285,7 @@ def update_email_opt_in(user, org, opt_in):
try:
user_profile = UserProfile.objects.get(user=user)
except ObjectDoesNotExist:
raise UserNotFound()
raise UserNotFound() # lint-amnesty, pylint: disable=raise-missing-from
if user_profile.requires_parental_consent(
age_limit=getattr(settings, 'EMAIL_OPTIN_MINIMUM_AGE', 13),
default_requires_consent=False,
@@ -345,7 +345,7 @@ def _get_authorized_user(requesting_user, username=None, allow_staff=False):
try:
existing_user = User.objects.get(username=username)
except ObjectDoesNotExist:
raise UserNotFound()
raise UserNotFound() # lint-amnesty, pylint: disable=raise-missing-from
return existing_user
@@ -404,7 +404,7 @@ def validate_user_preference_serializer(serializer, preference_key, preference_v
raise PreferenceValidationError({
preference_key: {
"developer_message": format_string.format(preference_key=preference_key),
"user_message": _(format_string).format(preference_key=preference_key)
"user_message": _(format_string).format(preference_key=preference_key) # lint-amnesty, pylint: disable=translation-of-non-string
}
})
if not serializer.is_valid():

View File

@@ -8,7 +8,7 @@ import datetime
import ddt
from dateutil.parser import parse as parse_datetime
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.test.utils import override_settings
from django.urls import reverse
from mock import patch
@@ -21,7 +21,7 @@ from common.djangoapps.student.tests.factories import UserFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
from ...errors import (
from ...errors import ( # lint-amnesty, pylint: disable=unused-import
CountryCodeError,
PreferenceUpdateError,
PreferenceValidationError,
@@ -50,7 +50,7 @@ class TestPreferenceAPI(CacheIsolationTestCase):
password = "test"
def setUp(self):
super(TestPreferenceAPI, self).setUp()
super(TestPreferenceAPI, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create(password=self.password)
self.different_user = UserFactory.create(password=self.password)
self.staff_user = UserFactory.create(is_staff=True, password=self.password)
@@ -487,7 +487,7 @@ def get_expected_validation_developer_message(preference_key, preference_value):
)
def get_expected_key_error_user_message(preference_key, preference_value):
def get_expected_key_error_user_message(preference_key, preference_value): # lint-amnesty, pylint: disable=unused-argument
"""
Returns the expected user message for an invalid key.
"""

View File

@@ -30,7 +30,7 @@ class TestPreferencesAPI(UserAPITestCase):
Unit tests /api/user/v1/accounts/{username}/
"""
def setUp(self):
super(TestPreferencesAPI, self).setUp()
super(TestPreferencesAPI, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url_endpoint_name = "preferences_api"
self.url = reverse(self.url_endpoint_name, kwargs={'username': self.user.username})
@@ -96,7 +96,7 @@ class TestPreferencesAPI(UserAPITestCase):
# Log in the client and do the GET.
client = self.login_client(api_client, user)
response = self.send_get(client)
self.assertEqual({"dict_pref": "{'int_key': 10}", "string_pref": "value", "time_zone": "Asia/Tokyo"}, # pylint: disable=unicode-format-string
self.assertEqual({"dict_pref": "{'int_key': 10}", "string_pref": "value", "time_zone": "Asia/Tokyo"}, # lint-amnesty, pylint: disable=bad-option-value, unicode-format-string
response.data)
@ddt.data(
@@ -155,7 +155,7 @@ class TestPreferencesAPI(UserAPITestCase):
if six.PY2:
pref_dict = {u"dict_pref": u"{u'int_key': 10}", u"string_pref": u"value"}
else:
# pylint: disable=unicode-format-string
# lint-amnesty, pylint: disable=bad-option-value, unicode-format-string
pref_dict = {"dict_pref": "{'int_key': 10}", "string_pref": "value"}
self.assertEqual(pref_dict, response.data)
@@ -204,7 +204,7 @@ class TestPreferencesAPI(UserAPITestCase):
# Verify that GET returns the updated preferences
response = self.send_get(self.client)
expected_preferences = {
"dict_pref": "{'int_key': 10}", # pylint: disable=unicode-format-string
"dict_pref": "{'int_key': 10}", # lint-amnesty, pylint: disable=bad-option-value, unicode-format-string
"string_pref": "updated_value",
"new_pref": "new_value",
"time_zone": "Europe/London",
@@ -330,7 +330,7 @@ class TestPreferencesAPITransactions(TransactionTestCase):
test_password = "test"
def setUp(self):
super(TestPreferencesAPITransactions, self).setUp()
super(TestPreferencesAPITransactions, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.client = APIClient()
self.user = UserFactory.create(password=TEST_PASSWORD)
self.url = reverse("preferences_api", kwargs={'username': self.user.username})
@@ -375,7 +375,7 @@ class TestPreferencesDetailAPI(UserAPITestCase):
Unit tests /api/user/v1/accounts/{username}/{preference_key}
"""
def setUp(self):
super(TestPreferencesDetailAPI, self).setUp()
super(TestPreferencesDetailAPI, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.test_pref_key = "test_key"
self.test_pref_value = "test_value"
set_user_preference(self.user, self.test_pref_key, self.test_pref_value)

View File

@@ -3,8 +3,8 @@ Django REST Framework serializers for the User API application
"""
from django.contrib.auth.models import User
from django.utils.timezone import now
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.utils.timezone import now # lint-amnesty, pylint: disable=unused-import
from rest_framework import serializers
from lms.djangoapps.verify_student.models import (
@@ -101,7 +101,7 @@ class CountryTimeZoneSerializer(serializers.Serializer): # pylint: disable=abst
description = serializers.CharField()
class IDVerificationDetailsSerializer(serializers.Serializer):
class IDVerificationDetailsSerializer(serializers.Serializer): # lint-amnesty, pylint: disable=abstract-method, missing-class-docstring
type = serializers.SerializerMethodField()
status = serializers.CharField()
expiration_datetime = serializers.DateTimeField()
@@ -109,7 +109,7 @@ class IDVerificationDetailsSerializer(serializers.Serializer):
updated_at = serializers.DateTimeField()
receipt_id = serializers.SerializerMethodField()
def get_type(self, obj):
def get_type(self, obj): # lint-amnesty, pylint: disable=missing-function-docstring
if isinstance(obj, SoftwareSecurePhotoVerification):
return 'Software Secure'
elif isinstance(obj, ManualVerification):
@@ -117,7 +117,7 @@ class IDVerificationDetailsSerializer(serializers.Serializer):
else:
return 'SSO'
def get_message(self, obj):
def get_message(self, obj): # lint-amnesty, pylint: disable=missing-function-docstring
if isinstance(obj, SoftwareSecurePhotoVerification):
return obj.error_msg
elif isinstance(obj, ManualVerification):

View File

@@ -6,7 +6,7 @@ Tests for helper functions.
import json
import re
import ddt
import ddt # lint-amnesty, pylint: disable=unused-import
import mock
import pytest
from django import forms
@@ -18,12 +18,12 @@ from ..helpers import FormDescription, InvalidFieldError, intercept_errors
class FakeInputException(Exception):
"""Fake exception that should be intercepted."""
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
class FakeOutputException(Exception):
"""Fake exception that should be raised."""
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
@intercept_errors(FakeOutputException, ignore_errors=[ValueError])

View File

@@ -17,7 +17,7 @@ class TagsMiddlewareTest(TestCase):
Test the UserTagsEventContextMiddleware
"""
def setUp(self):
super(TagsMiddlewareTest, self).setUp()
super(TagsMiddlewareTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.middleware = UserTagsEventContextMiddleware()
self.user = UserFactory.create()
self.other_user = UserFactory.create()

View File

@@ -129,7 +129,7 @@ class TestUserPreferenceEvents(UserSettingsEventTestMixin, TestCase):
Mixin for verifying that user preference events are fired correctly.
"""
def setUp(self):
super(TestUserPreferenceEvents, self).setUp()
super(TestUserPreferenceEvents, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.table = "user_api_userpreference"
self.user = UserFactory.create()
self.TEST_KEY = "test key"

View File

@@ -33,7 +33,7 @@ class MemoryCourseTagAPI(object):
class BulkCourseTags(object):
@classmethod
def is_prefetched(self, course_id):
def is_prefetched(self, course_id): # lint-amnesty, pylint: disable=bad-classmethod-argument, unused-argument
return False
@@ -46,7 +46,7 @@ class TestRandomUserPartitionScheme(PartitionTestCase):
MOCK_COURSE_ID = "mock-course-id"
def setUp(self):
super(TestRandomUserPartitionScheme, self).setUp()
super(TestRandomUserPartitionScheme, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
# Patch in a memory-based user service instead of using the persistent version
course_tag_api = MemoryCourseTagAPI()
self.user_service_patcher = patch(

View File

@@ -1,40 +1,40 @@
"""Tests for the user API at the HTTP request level. """
import json
from unittest import skipUnless
import json # lint-amnesty, pylint: disable=unused-import
from unittest import skipUnless # lint-amnesty, pylint: disable=unused-import
import ddt
import httpretty
import mock
import httpretty # lint-amnesty, pylint: disable=unused-import
import mock # lint-amnesty, pylint: disable=unused-import
import six
from django.conf import settings
from django.contrib.auth.models import User
from django.core import mail
from django.test.client import RequestFactory
from django.test.testcases import TransactionTestCase
from django.conf import settings # lint-amnesty, pylint: disable=unused-import
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user, unused-import
from django.core import mail # lint-amnesty, pylint: disable=unused-import
from django.test.client import RequestFactory # lint-amnesty, pylint: disable=unused-import
from django.test.testcases import TransactionTestCase # lint-amnesty, pylint: disable=unused-import
from django.test.utils import override_settings
from django.urls import reverse
from opaque_keys.edx.keys import CourseKey
from pytz import UTC, common_timezones_set
from pytz import UTC, common_timezones_set # lint-amnesty, pylint: disable=unused-import
from six import text_type
from six.moves import range
from social_django.models import Partial, UserSocialAuth
from social_django.models import Partial, UserSocialAuth # lint-amnesty, pylint: disable=unused-import
from openedx.core.djangoapps.django_comment_common import models
from openedx.core.djangoapps.site_configuration.helpers import get_value
from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration
from openedx.core.djangoapps.site_configuration.helpers import get_value # lint-amnesty, pylint: disable=unused-import
from openedx.core.djangoapps.site_configuration.tests.test_util import with_site_configuration # lint-amnesty, pylint: disable=unused-import
from openedx.core.djangolib.testing.utils import CacheIsolationTestCase, skip_unless_lms
from openedx.core.lib.api.test_utils import TEST_API_KEY, ApiTestCase
from openedx.core.lib.time_zone_utils import get_display_time_zone
from common.djangoapps.student.tests.factories import UserFactory
from common.djangoapps.third_party_auth.tests.testutil import ThirdPartyAuthTestMixin, simulate_running_pipeline
from common.djangoapps.third_party_auth.tests.utils import (
from common.djangoapps.third_party_auth.tests.testutil import ThirdPartyAuthTestMixin, simulate_running_pipeline # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.third_party_auth.tests.utils import ( # lint-amnesty, pylint: disable=unused-import
ThirdPartyOAuthTestMixin,
ThirdPartyOAuthTestMixinFacebook,
ThirdPartyOAuthTestMixinGoogle
)
from common.djangoapps.util.password_policy_validators import (
from common.djangoapps.util.password_policy_validators import ( # lint-amnesty, pylint: disable=unused-import
create_validator_config,
password_validators_instruction_texts,
password_validators_restrictions
@@ -42,7 +42,7 @@ from common.djangoapps.util.password_policy_validators import (
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory
from ..accounts import (
from ..accounts import ( # lint-amnesty, pylint: disable=unused-import
EMAIL_MAX_LENGTH,
EMAIL_MIN_LENGTH,
NAME_MAX_LENGTH,
@@ -50,7 +50,7 @@ from ..accounts import (
USERNAME_MAX_LENGTH,
USERNAME_MIN_LENGTH
)
from ..accounts.api import get_account_settings
from ..accounts.api import get_account_settings # lint-amnesty, pylint: disable=unused-import
from ..accounts.tests.retirement_helpers import ( # pylint: disable=unused-import
RetirementTestCase,
fake_requested_retirement,
@@ -58,8 +58,8 @@ from ..accounts.tests.retirement_helpers import ( # pylint: disable=unused-impo
)
from ..models import UserOrgTag
from ..tests.factories import UserPreferenceFactory
from ..tests.test_constants import SORTED_COUNTRIES
from .test_helpers import TestCaseForm
from ..tests.test_constants import SORTED_COUNTRIES # lint-amnesty, pylint: disable=unused-import
from .test_helpers import TestCaseForm # lint-amnesty, pylint: disable=unused-import
USER_LIST_URI = "/api/user/v1/users/"
USER_PREFERENCE_LIST_URI = "/api/user/v1/user_prefs/"
@@ -94,7 +94,7 @@ class UserAPITestCase(ApiTestCase):
six.assertCountEqual(
self,
list(user["preferences"].items()),
[(pref.key, pref.value) for pref in self.prefs if pref.user.id == user["id"]]
[(pref.key, pref.value) for pref in self.prefs if pref.user.id == user["id"]] # lint-amnesty, pylint: disable=no-member
)
self.assertSelfReferential(user)
@@ -140,7 +140,7 @@ class UserApiTestCase(UserAPITestCase):
Generalized test case class for specific implementations below
"""
def setUp(self):
super(UserApiTestCase, self).setUp()
super(UserApiTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.users = [
UserFactory.create(
email="test{0}@test.org".format(i),
@@ -164,7 +164,7 @@ class RoleTestCase(UserApiTestCase):
LIST_URI = ROLE_LIST_URI + "?course_id=" + six.text_type(course_id)
def setUp(self):
super(RoleTestCase, self).setUp()
super(RoleTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
(role, _) = models.Role.objects.get_or_create(
name=models.FORUM_ROLE_MODERATOR,
course_id=self.course_id
@@ -253,7 +253,7 @@ class UserViewSetTest(UserApiTestCase):
LIST_URI = USER_LIST_URI
def setUp(self):
super(UserViewSetTest, self).setUp()
super(UserViewSetTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.detail_uri = self.get_uri_for_user(self.users[0])
# List view tests
@@ -353,7 +353,7 @@ class UserViewSetTest(UserApiTestCase):
"id": user.id,
"name": user.profile.name,
"username": user.username,
"preferences": dict([
"preferences": dict([ # lint-amnesty, pylint: disable=consider-using-dict-comprehension
(user_pref.key, user_pref.value)
for user_pref in self.prefs
if user_pref.user == user
@@ -373,7 +373,7 @@ class UserPreferenceViewSetTest(CacheIsolationTestCase, UserApiTestCase):
ENABLED_CACHES = ['default']
def setUp(self):
super(UserPreferenceViewSetTest, self).setUp()
super(UserPreferenceViewSetTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.detail_uri = self.get_uri_for_pref(self.prefs[0])
# List view tests
@@ -495,7 +495,7 @@ class UserPreferenceViewSetTest(CacheIsolationTestCase, UserApiTestCase):
"id": pref.user.id,
"name": pref.user.profile.name,
"username": pref.user.username,
"preferences": dict([
"preferences": dict([ # lint-amnesty, pylint: disable=consider-using-dict-comprehension
(user_pref.key, user_pref.value)
for user_pref in self.prefs
if user_pref.user == pref.user
@@ -586,7 +586,7 @@ class UpdateEmailOptInTestCase(UserAPITestCase, SharedModuleStoreTestCase):
def setUp(self):
""" Create a course and user, then log in. """
super(UpdateEmailOptInTestCase, self).setUp()
super(UpdateEmailOptInTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create(username=self.USERNAME, email=self.EMAIL, password=self.PASSWORD)
self.client.login(username=self.USERNAME, password=self.PASSWORD)

View File

@@ -10,7 +10,7 @@ from django.test import TestCase
from django.test.utils import override_settings
from django.urls import reverse
from lms.djangoapps.verify_student.models import ManualVerification, SoftwareSecurePhotoVerification, SSOVerification
from lms.djangoapps.verify_student.models import ManualVerification, SoftwareSecurePhotoVerification, SSOVerification # lint-amnesty, pylint: disable=unused-import
from lms.djangoapps.verify_student.tests.factories import SSOVerificationFactory
from common.djangoapps.student.tests.factories import UserFactory
@@ -137,12 +137,12 @@ class VerificationsDetailsViewTests(VerificationStatusViewTestsMixin, TestCase):
}]
def test_multiple_verification_types(self):
self.manual_verification = ManualVerification.objects.create(
self.manual_verification = ManualVerification.objects.create( # lint-amnesty, pylint: disable=attribute-defined-outside-init
user=self.user,
status='approved',
reason='testing'
)
self.sso_verification = SSOVerificationFactory(user=self.user, status='approved')
self.sso_verification = SSOVerificationFactory(user=self.user, status='approved') # lint-amnesty, pylint: disable=attribute-defined-outside-init
self.photo_verification.error_msg = 'tested_error'
self.photo_verification.error_code = 'error_code'
self.photo_verification.status = 'denied'
@@ -180,7 +180,7 @@ class VerificationsDetailsViewTests(VerificationStatusViewTestsMixin, TestCase):
self.assertEqual(json.loads(response.content.decode('utf-8')), expected)
def test_multiple_verification_instances(self):
self.sso_verification = SSOVerificationFactory(user=self.user, status='approved')
self.sso_verification = SSOVerificationFactory(user=self.user, status='approved') # lint-amnesty, pylint: disable=attribute-defined-outside-init
second_ss_photo_verification = SoftwareSecurePhotoVerification.objects.create(
user=self.user,
status='denied',

View File

@@ -19,7 +19,7 @@ class IDVerificationStatusView(APIView):
authentication_classes = (JwtAuthentication, BearerAuthentication, SessionAuthentication,)
permission_classes = (IsStaffOrOwner,)
def get(self, request, **kwargs):
def get(self, request, **kwargs): # lint-amnesty, pylint: disable=missing-function-docstring
username = kwargs.get('username')
User = get_user_model()
try:
@@ -35,7 +35,7 @@ class IDVerificationStatusView(APIView):
})
except User.DoesNotExist:
raise Http404
raise Http404 # lint-amnesty, pylint: disable=raise-missing-from
class IDVerificationStatusDetailsView(ListAPIView):
@@ -59,4 +59,4 @@ class IDVerificationStatusDetailsView(ListAPIView):
return sorted(verifications, key=lambda x: x.updated_at, reverse=True)
except User.DoesNotExist:
raise Http404
raise Http404 # lint-amnesty, pylint: disable=raise-missing-from

View File

@@ -1,12 +1,12 @@
"""HTTP end-points for the User API. """
from django.contrib.auth.models import User
from django.core.exceptions import NON_FIELD_ERRORS, PermissionDenied, ValidationError
from django.db import transaction
from django.http import HttpResponse, HttpResponseForbidden
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.exceptions import NON_FIELD_ERRORS, PermissionDenied, ValidationError # lint-amnesty, pylint: disable=unused-import
from django.db import transaction # lint-amnesty, pylint: disable=unused-import
from django.http import HttpResponse, HttpResponseForbidden # lint-amnesty, pylint: disable=unused-import
from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext as _ # lint-amnesty, pylint: disable=unused-import
from django.views.decorators.csrf import ensure_csrf_cookie
from django_filters.rest_framework import DjangoFilterBackend
from edx_rest_framework_extensions.auth.session.authentication import SessionAuthenticationAllowInactiveUser
@@ -17,10 +17,10 @@ from rest_framework import authentication, generics, status, viewsets
from rest_framework.exceptions import ParseError
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from six import text_type
from six import text_type # lint-amnesty, pylint: disable=unused-import
from openedx.core.djangoapps.django_comment_common.models import Role
from openedx.core.djangoapps.user_api import accounts
from openedx.core.djangoapps.user_api import accounts # lint-amnesty, pylint: disable=unused-import
from openedx.core.lib.api.view_utils import require_post_params
from openedx.core.djangoapps.user_api.models import UserPreference
from openedx.core.djangoapps.user_api.preferences.api import get_country_time_zones, update_email_opt_in
@@ -30,8 +30,8 @@ from openedx.core.djangoapps.user_api.serializers import (
UserSerializer
)
from openedx.core.lib.api.permissions import ApiKeyHeaderPermission
from common.djangoapps.student.helpers import AccountValidationError
from common.djangoapps.util.json_request import JsonResponse
from common.djangoapps.student.helpers import AccountValidationError # lint-amnesty, pylint: disable=unused-import
from common.djangoapps.util.json_request import JsonResponse # lint-amnesty, pylint: disable=unused-import
class UserViewSet(viewsets.ReadOnlyModelViewSet):

View File

@@ -24,7 +24,7 @@ class TPAContextViewTest(ThirdPartyAuthTestMixin, APITestCase):
"""
Test Setup
"""
super(TPAContextViewTest, self).setUp()
super(TPAContextViewTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse('third_party_auth_context')
self.query_params = {'redirect_to': '/dashboard'}

View File

@@ -26,7 +26,7 @@ class TPAContextView(APIView):
"""
throttle_classes = [ThirdPartyAuthContextThrottle]
def get(self, request, **kwargs):
def get(self, request, **kwargs): # lint-amnesty, pylint: disable=unused-argument
"""
Returns the context for third party auth providers and the currently running pipeline.

View File

@@ -9,7 +9,7 @@ import time
import six
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.dispatch import Signal
from django.urls import NoReverseMatch, reverse
from django.utils.http import http_date, parse_http_date
@@ -349,6 +349,6 @@ def _get_login_oauth_client():
try:
return Application.objects.get(client_id=login_client_id)
except Application.DoesNotExist:
raise AuthFailedError(
raise AuthFailedError( # lint-amnesty, pylint: disable=raise-missing-from
u"OAuth Client for the Login service, '{}', is not configured.".format(login_client_id)
)

View File

@@ -9,10 +9,10 @@ class AuthFailedError(Exception):
This is a helper for the login view, allowing the various sub-methods to error out with an appropriate failure
message.
"""
def __init__(
def __init__( # lint-amnesty, pylint: disable=dangerous-default-value
self, value=None, redirect=None, redirect_url=None, error_code=None, context={},
):
super(AuthFailedError, self).__init__()
super(AuthFailedError, self).__init__() # lint-amnesty, pylint: disable=super-with-arguments
self.value = Text(value)
self.redirect = redirect
self.redirect_url = redirect_url

View File

@@ -10,7 +10,7 @@ class PasswordReset(BaseMessageType):
A message to the user with password reset link.
"""
def __init__(self, *args, **kwargs):
super(PasswordReset, self).__init__(*args, **kwargs)
super(PasswordReset, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
# pylint: disable=unsupported-assignment-operation
self.options['transactional'] = True
@@ -22,5 +22,5 @@ class PasswordResetSuccess(BaseMessageType):
"""
def __init__(self, *args, **kwargs):
super(PasswordResetSuccess, self).__init__(*args, **kwargs)
super(PasswordResetSuccess, self).__init__(*args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
self.options['transactional'] = True

View File

@@ -24,7 +24,7 @@ from openedx.core.djangoapps.user_api.accounts.image_helpers import get_profile_
class CookieTests(TestCase):
def setUp(self):
super(CookieTests, self).setUp()
super(CookieTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create()
self.user.profile = UserProfileFactory.create(user=self.user)
self.request = RequestFactory().get('/')
@@ -102,7 +102,7 @@ class CookieTests(TestCase):
""" Verify cookies in the response have the same expiration, as expected. """
self.assertEqual(
num_of_unique_expires,
len(set([response.cookies[c]['expires'] for c in response.cookies])),
len(set([response.cookies[c]['expires'] for c in response.cookies])), # lint-amnesty, pylint: disable=consider-using-set-comprehension
)
@skip_unless_lms

View File

@@ -20,7 +20,7 @@ class TestRedirectUtils(TestCase):
"""Test redirect utility methods."""
def setUp(self):
super(TestRedirectUtils, self).setUp()
super(TestRedirectUtils, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.request = RequestFactory()
RedirectCase = namedtuple('RedirectCase', ['url', 'host', 'req_is_secure', 'expected_is_safe'])

View File

@@ -61,7 +61,7 @@ class AuthAndScopesTestMixin(object):
user_password = 'test'
def setUp(self):
super(AuthAndScopesTestMixin, self).setUp()
super(AuthAndScopesTestMixin, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.student = UserFactory.create(password=self.user_password)
self.other_student = UserFactory.create(password=self.user_password)
self.global_staff = UserFactory.create(password=self.user_password, is_staff=True)

View File

@@ -6,7 +6,7 @@ import uuid
from django.conf import settings
from django.contrib.auth import login as django_login
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.exceptions import PermissionDenied
from django.core.validators import ValidationError
from django.http import HttpResponseForbidden

View File

@@ -12,7 +12,7 @@ from django.conf import settings
from django.contrib.auth import authenticate
from django.contrib.auth import login as django_login
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.contrib import admin
from django.http import HttpRequest, HttpResponse, HttpResponseForbidden
from django.shortcuts import redirect
@@ -88,7 +88,7 @@ def _do_third_party_auth(request):
)
)
raise AuthFailedError(message, error_code='third-party-auth-with-no-linked-account')
raise AuthFailedError(message, error_code='third-party-auth-with-no-linked-account') # lint-amnesty, pylint: disable=raise-missing-from
def _get_user_by_email(request):
@@ -145,7 +145,7 @@ def _generate_locked_out_error_message():
locked_out_period=int(locked_out_period_in_sec / 60)))
def _enforce_password_policy_compliance(request, user):
def _enforce_password_policy_compliance(request, user): # lint-amnesty, pylint: disable=missing-function-docstring
try:
password_policy_compliance.enforce_compliance_on_login(user, request.POST.get('password'))
except password_policy_compliance.NonCompliantPasswordWarning as e:
@@ -155,7 +155,7 @@ def _enforce_password_policy_compliance(request, user):
AUDIT_LOG.info("Password reset initiated for email %s.", user.email)
send_password_reset_email_for_user(user, request)
# Prevent the login attempt.
raise AuthFailedError(HTML(six.text_type(e)), error_code=e.__class__.__name__)
raise AuthFailedError(HTML(six.text_type(e)), error_code=e.__class__.__name__) # lint-amnesty, pylint: disable=raise-missing-from
def _log_and_raise_inactive_user_auth_error(unauthenticated_user):
@@ -210,7 +210,7 @@ def _authenticate_first_party(request, unauthenticated_user, third_party_auth_re
# This occurs when there are too many attempts from the same IP address
except RateLimitException:
raise AuthFailedError(_('Too many failed login attempts. Try again later.'))
raise AuthFailedError(_('Too many failed login attempts. Try again later.')) # lint-amnesty, pylint: disable=raise-missing-from
def _handle_failed_authentication(user, authenticated_user):
@@ -357,7 +357,7 @@ def _check_user_auth_flow(site, user):
# we don't record their e-mail in case there is sensitive info accidentally
# in there.
set_custom_attribute('login_tpa_domain_shortcircuit_user_id', user.id)
log.warn("User %s has nonstandard e-mail. Shortcircuiting THIRD_PART_AUTH_ONLY_DOMAIN check.", user.id)
log.warn("User %s has nonstandard e-mail. Shortcircuiting THIRD_PART_AUTH_ONLY_DOMAIN check.", user.id) # lint-amnesty, pylint: disable=deprecated-method
return
user_domain = email_parts[1].strip().lower()
@@ -412,7 +412,7 @@ def finish_auth(request):
rate=settings.LOGISTRATION_RATELIMIT_RATE,
method='POST',
block=True
)
) # lint-amnesty, pylint: disable=too-many-statements
def login_user(request):
"""
AJAX request to log in the user.
@@ -539,7 +539,7 @@ def login_user(request):
# complexity.
@csrf_exempt
@require_http_methods(['POST'])
def login_refresh(request):
def login_refresh(request): # lint-amnesty, pylint: disable=missing-function-docstring
if not request.user.is_authenticated or request.user.is_anonymous:
return JsonResponse('Unauthorized', status=401)
@@ -570,7 +570,7 @@ class LoginSessionView(APIView):
@method_decorator(ensure_csrf_cookie)
def get(self, request):
return HttpResponse(get_login_session_form(request).to_json(), content_type="application/json")
return HttpResponse(get_login_session_form(request).to_json(), content_type="application/json") # lint-amnesty, pylint: disable=http-response-with-content-type-json
@method_decorator(require_post_params(["email", "password"]))
@method_decorator(csrf_protect)
@@ -591,7 +591,7 @@ class LoginSessionView(APIView):
@method_decorator(sensitive_post_parameters("password"))
def dispatch(self, request, *args, **kwargs):
return super(LoginSessionView, self).dispatch(request, *args, **kwargs)
return super(LoginSessionView, self).dispatch(request, *args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
def _parse_analytics_param_for_course_id(request):

View File

@@ -162,7 +162,7 @@ def login_and_registration_form(request, initial_mode="login"):
# Our ?next= URL may itself contain a parameter 'tpa_hint=x' that we need to check.
# If present, we display a login page focused on third-party auth with that provider.
third_party_auth_hint = None
if '?' in redirect_to:
if '?' in redirect_to: # lint-amnesty, pylint: disable=too-many-nested-blocks
try:
next_args = six.moves.urllib.parse.parse_qs(six.moves.urllib.parse.urlparse(redirect_to).query)
if 'tpa_hint' in next_args:

View File

@@ -76,7 +76,7 @@ class LogoutView(TemplateView):
logout(request)
response = super(LogoutView, self).dispatch(request, *args, **kwargs)
response = super(LogoutView, self).dispatch(request, *args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
# Clear the cookie used by the edx.org marketing site
delete_logged_in_cookies(response)
@@ -123,7 +123,7 @@ class LogoutView(TemplateView):
return False
def get_context_data(self, **kwargs):
context = super(LogoutView, self).get_context_data(**kwargs)
context = super(LogoutView, self).get_context_data(**kwargs) # lint-amnesty, pylint: disable=super-with-arguments
# Create a list of URIs that must be called to log the user out of all of the IDAs.
uris = []

View File

@@ -7,7 +7,7 @@ from django.conf import settings
from django.contrib import messages
from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm
from django.contrib.auth.hashers import UNUSABLE_PASSWORD_PREFIX
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.views import INTERNAL_RESET_SESSION_TOKEN, PasswordResetConfirmView
from django.core.exceptions import ObjectDoesNotExist
@@ -235,7 +235,7 @@ class PasswordResetView(APIView):
@method_decorator(ensure_csrf_cookie)
def get(self, request):
return HttpResponse(get_password_reset_form().to_json(), content_type="application/json")
return HttpResponse(get_password_reset_form().to_json(), content_type="application/json") # lint-amnesty, pylint: disable=http-response-with-content-type-json
@helpers.intercept_errors(errors.UserAPIInternalError, ignore_errors=[errors.UserAPIRequestError])
@@ -359,7 +359,7 @@ class PasswordResetConfirmWrapper(PasswordResetConfirmView):
self.uidb64 = ''
self.uid_int = -1
def _process_password_reset_success(self, request, token, uidb64, extra_context):
def _process_password_reset_success(self, request, token, uidb64, extra_context): # lint-amnesty, pylint: disable=missing-function-docstring
self.user = self.get_user(uidb64)
form = SetPasswordForm(self.user, request.POST)
if self.token_generator.check_token(self.user, token) and form.is_valid():
@@ -382,7 +382,7 @@ class PasswordResetConfirmWrapper(PasswordResetConfirmView):
def _get_platform_name():
return {"platform_name": configuration_helpers.get_value('platform_name', settings.PLATFORM_NAME)}
def _set_user(self, request):
def _set_user(self, request): # lint-amnesty, pylint: disable=missing-function-docstring
try:
self.uid_int = base36_to_int(self.uidb36)
if request.user.is_authenticated and request.user.id != self.uid_int:
@@ -391,7 +391,7 @@ class PasswordResetConfirmWrapper(PasswordResetConfirmView):
except (ValueError, User.DoesNotExist):
# if there's any error getting a user, just let django's
# password_reset_confirm function handle it.
return super(PasswordResetConfirmWrapper, self).dispatch(request, uidb64=self.uidb64, token=self.token,
return super(PasswordResetConfirmWrapper, self).dispatch(request, uidb64=self.uidb64, token=self.token, # lint-amnesty, pylint: disable=super-with-arguments
extra_context=self.platform_name)
def _handle_retired_user(self, request):
@@ -410,7 +410,7 @@ class PasswordResetConfirmWrapper(PasswordResetConfirmView):
request, 'registration/password_reset_confirm.html', context
)
def _validate_password(self, password, request):
def _validate_password(self, password, request): # lint-amnesty, pylint: disable=missing-function-docstring
try:
validate_password(password, user=self.user)
except ValidationError as err:
@@ -425,7 +425,7 @@ class PasswordResetConfirmWrapper(PasswordResetConfirmView):
request, 'registration/password_reset_confirm.html', context
)
def _handle_password_reset_failure(self, response):
def _handle_password_reset_failure(self, response): # lint-amnesty, pylint: disable=missing-function-docstring
form_valid = response.context_data['form'].is_valid() if response.context_data['form'] else False
if not form_valid:
log.warning(
@@ -436,7 +436,7 @@ class PasswordResetConfirmWrapper(PasswordResetConfirmView):
response.context_data['err_msg'] = _('Error in resetting your password. Please try again.')
return response
def _handle_primary_email_update(self, updated_user):
def _handle_primary_email_update(self, updated_user): # lint-amnesty, pylint: disable=missing-function-docstring
try:
updated_user.email = updated_user.account_recovery.secondary_email
updated_user.account_recovery.delete()
@@ -531,7 +531,7 @@ class PasswordResetConfirmWrapper(PasswordResetConfirmView):
self.token = self._get_token_from_session(self.request)
return self.post(self.request, *args, **kwargs)
else:
response = super(PasswordResetConfirmWrapper, self).dispatch(
response = super(PasswordResetConfirmWrapper, self).dispatch( # lint-amnesty, pylint: disable=super-with-arguments
self.request,
uidb64=self.uidb64,
token=self.token,
@@ -642,7 +642,7 @@ def password_change_request_handler(request):
return HttpResponseBadRequest(_("No email address provided."))
class PasswordResetTokenValidation(APIView):
class PasswordResetTokenValidation(APIView): # lint-amnesty, pylint: disable=missing-class-docstring
def post(self, request):
""" HTTP end-point to validate password reset token. """
@@ -668,7 +668,7 @@ class PasswordResetTokenValidation(APIView):
return Response({'is_valid': is_valid})
class LogistrationPasswordResetView(APIView):
class LogistrationPasswordResetView(APIView): # lint-amnesty, pylint: disable=missing-class-docstring
def post(self, request, **kwargs):
""" Reset learner password using passed token and new credentials """
@@ -682,7 +682,7 @@ class LogistrationPasswordResetView(APIView):
AUDIT_LOG.exception("Invalid password reset confirm token")
return Response({'reset_status': reset_status})
request.data._mutable = True
request.data._mutable = True # lint-amnesty, pylint: disable=protected-access
request.data['new_password1'] = normalize_password(request.data['new_password1'])
request.data['new_password2'] = normalize_password(request.data['new_password2'])

View File

@@ -9,7 +9,7 @@ import logging
from django.conf import settings
from django.contrib.auth import login as django_login
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.exceptions import NON_FIELD_ERRORS, PermissionDenied
from django.core.validators import ValidationError
from django.db import transaction
@@ -463,11 +463,11 @@ class RegistrationView(APIView):
@method_decorator(transaction.non_atomic_requests)
@method_decorator(sensitive_post_parameters("password"))
def dispatch(self, request, *args, **kwargs):
return super(RegistrationView, self).dispatch(request, *args, **kwargs)
return super(RegistrationView, self).dispatch(request, *args, **kwargs) # lint-amnesty, pylint: disable=super-with-arguments
@method_decorator(ensure_csrf_cookie)
def get(self, request):
return HttpResponse(RegistrationFormFactory().get_registration_form(request).to_json(),
return HttpResponse(RegistrationFormFactory().get_registration_form(request).to_json(), # lint-amnesty, pylint: disable=http-response-with-content-type-json
content_type="application/json")
@method_decorator(csrf_exempt)
@@ -576,7 +576,7 @@ class RegistrationView(APIView):
return
try:
for field_key, errors in errors.items():
for field_key, errors in errors.items(): # lint-amnesty, pylint: disable=redefined-argument-from-local
for error in errors:
log.info(
'message=registration_failed, status_code=%d, agent="%s", field="%s", error="%s"',
@@ -587,7 +587,7 @@ class RegistrationView(APIView):
)
except: # pylint: disable=bare-except
log.exception("Failed to log registration validation error")
pass
pass # lint-amnesty, pylint: disable=unnecessary-pass
# pylint: disable=line-too-long

View File

@@ -10,7 +10,7 @@ import six
from django import forms
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core.exceptions import ImproperlyConfigured
from django.core.validators import RegexValidator, ValidationError, slug_re
from django.forms import widgets
@@ -108,8 +108,8 @@ class UsernameField(forms.CharField):
default_validators = [validate_username]
def __init__(self, *args, **kwargs):
super(UsernameField, self).__init__(
def __init__(self, *args, **kwargs): # lint-amnesty, pylint: disable=unused-argument
super(UsernameField, self).__init__( # lint-amnesty, pylint: disable=super-with-arguments
min_length=accounts.USERNAME_MIN_LENGTH,
max_length=accounts.USERNAME_MAX_LENGTH,
error_messages={
@@ -127,7 +127,7 @@ class UsernameField(forms.CharField):
"""
value = self.to_python(value).strip()
return super(UsernameField, self).clean(value)
return super(UsernameField, self).clean(value) # lint-amnesty, pylint: disable=super-with-arguments
class AccountCreationForm(forms.Form):
@@ -172,7 +172,7 @@ class AccountCreationForm(forms.Form):
do_third_party_auth=True,
tos_required=True
):
super(AccountCreationForm, self).__init__(data)
super(AccountCreationForm, self).__init__(data) # lint-amnesty, pylint: disable=super-with-arguments
extra_fields = extra_fields or {}
self.extended_profile_fields = extended_profile_fields or {}

View File

@@ -6,7 +6,7 @@ import json
import ddt
import six
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.test import TestCase
from django.test.client import Client
from mock import Mock, patch
@@ -48,7 +48,7 @@ class AutoAuthEnabledTestCase(AutoAuthTestCase):
# value affects the contents of urls.py,
# so we need to call super.setUp() which reloads urls.py (because
# of the UrlResetMixin)
super(AutoAuthEnabledTestCase, self).setUp()
super(AutoAuthEnabledTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = '/auto_auth'
self.client = Client()
@@ -309,7 +309,7 @@ class AutoAuthDisabledTestCase(AutoAuthTestCase):
# value affects the contents of urls.py,
# so we need to call super.setUp() which reloads urls.py (because
# of the UrlResetMixin)
super(AutoAuthDisabledTestCase, self).setUp()
super(AutoAuthDisabledTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = '/auto_auth'
self.client = Client()
@@ -333,7 +333,7 @@ class AutoAuthRestrictedTestCase(AutoAuthTestCase):
# value affects the contents of urls.py,
# so we need to call super.setUp() which reloads urls.py (because
# of the UrlResetMixin)
super(AutoAuthRestrictedTestCase, self).setUp()
super(AutoAuthRestrictedTestCase, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = '/auto_auth'
self.client = Client()

View File

@@ -11,7 +11,7 @@ import unicodedata
import ddt
import six
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core import mail
from django.core.cache import cache
from django.http import HttpResponse
@@ -55,7 +55,7 @@ class LoginTest(SiteMixin, CacheIsolationTestCase):
def setUp(self):
"""Setup a test user along with its registration and profile"""
super(LoginTest, self).setUp()
super(LoginTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = self._create_user(self.username, self.user_email)
RegistrationFactory(user=self.user)
@@ -817,7 +817,7 @@ class LoginSessionViewTest(ApiTestCase):
PASSWORD = "password"
def setUp(self):
super(LoginSessionViewTest, self).setUp()
super(LoginSessionViewTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse("user_api_login_session")
@ddt.data("get", "post")

View File

@@ -47,7 +47,7 @@ class LoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMixin, ModuleSto
@mock.patch.dict(settings.FEATURES, {'EMBARGO': True})
def setUp(self): # pylint: disable=arguments-differ
super(LoginAndRegistrationTest, self).setUp()
super(LoginAndRegistrationTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
# Several third party auth providers are created for these tests:
self.google_provider = self.configure_google_provider(enabled=True, visible=True)
@@ -662,7 +662,7 @@ class AccountCreationTestCaseWithSiteOverrides(SiteMixin, TestCase):
def setUp(self):
"""Set up the tests"""
super(AccountCreationTestCaseWithSiteOverrides, self).setUp()
super(AccountCreationTestCaseWithSiteOverrides, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
# Set the feature flag ALLOW_PUBLIC_ACCOUNT_CREATION to False
self.site_configuration_values = {

View File

@@ -24,7 +24,7 @@ class LogoutTests(TestCase):
def setUp(self):
""" Create a course and user, then log in. """
super(LogoutTests, self).setUp()
super(LogoutTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory()
self.client.login(username=self.user.username, password='test')

View File

@@ -108,7 +108,7 @@ class TestPasswordChange(CreateAccountMixin, CacheIsolationTestCase):
ENABLED_CACHES = ['default']
def setUp(self):
super(TestPasswordChange, self).setUp()
super(TestPasswordChange, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.create_account(self.USERNAME, self.OLD_PASSWORD, self.OLD_EMAIL)
result = self.client.login(username=self.USERNAME, password=self.OLD_PASSWORD)

View File

@@ -10,7 +10,7 @@ import httpretty
import mock
import six
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user
from django.core import mail
from django.core.cache import cache
from django.test import TransactionTestCase
@@ -90,7 +90,7 @@ class RegistrationViewValidationErrorTest(ThirdPartyAuthTestMixin, UserAPITestCa
GOALS = "Learn all the things!"
def setUp(self): # pylint: disable=arguments-differ
super(RegistrationViewValidationErrorTest, self).setUp()
super(RegistrationViewValidationErrorTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse("user_api_registration")
@mock.patch.dict(settings.FEATURES, {
@@ -411,7 +411,7 @@ class RegistrationViewTestV1(ThirdPartyAuthTestMixin, UserAPITestCase):
link_template = u"<a href='/honor' rel='noopener' target='_blank'>{link_label}</a>"
def setUp(self): # pylint: disable=arguments-differ
super(RegistrationViewTestV1, self).setUp()
super(RegistrationViewTestV1, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse("user_api_registration")
@ddt.data("get", "post")
@@ -613,7 +613,7 @@ class RegistrationViewTestV1(ThirdPartyAuthTestMixin, UserAPITestCase):
{
"value": country_code,
"name": six.text_type(country_name),
"default": True if country_code == expected_country_code else False
"default": True if country_code == expected_country_code else False # lint-amnesty, pylint: disable=simplifiable-if-expression
}
for country_code, country_name in SORTED_COUNTRIES
]
@@ -1757,7 +1757,7 @@ class RegistrationViewTestV2(RegistrationViewTestV1):
# pylint: disable=test-inherits-tests
def setUp(self): # pylint: disable=arguments-differ
super(RegistrationViewTestV1, self).setUp()
super(RegistrationViewTestV1, self).setUp() # lint-amnesty, pylint: disable=bad-super-call
self.url = reverse("user_api_registration_v2")
@override_settings(
@@ -2042,11 +2042,11 @@ class ThirdPartyRegistrationTestMixin(ThirdPartyOAuthTestMixin, CacheIsolationTe
__test__ = False
def setUp(self):
super(ThirdPartyRegistrationTestMixin, self).setUp()
super(ThirdPartyRegistrationTestMixin, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse('user_api_registration')
def tearDown(self):
super(ThirdPartyRegistrationTestMixin, self).tearDown()
super(ThirdPartyRegistrationTestMixin, self).tearDown() # lint-amnesty, pylint: disable=super-with-arguments
Partial.objects.all().delete()
def data(self, user=None):
@@ -2224,7 +2224,7 @@ class RegistrationValidationViewTests(test_utils.ApiTestCase):
path = reverse(endpoint_name)
def setUp(self):
super(RegistrationValidationViewTests, self).setUp()
super(RegistrationValidationViewTests, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
cache.clear()
def get_validation_decision(self, data):
@@ -2256,11 +2256,11 @@ class RegistrationValidationViewTests(test_utils.ApiTestCase):
)
@ddt.data(
['name', [name for name in testutils.VALID_NAMES]],
['email', [email for email in testutils.VALID_EMAILS]],
['password', [password for password in testutils.VALID_PASSWORDS]],
['username', [username for username in testutils.VALID_USERNAMES]],
['country', [country for country in testutils.VALID_COUNTRIES]]
['name', [name for name in testutils.VALID_NAMES]], # lint-amnesty, pylint: disable=unnecessary-comprehension
['email', [email for email in testutils.VALID_EMAILS]], # lint-amnesty, pylint: disable=unnecessary-comprehension
['password', [password for password in testutils.VALID_PASSWORDS]], # lint-amnesty, pylint: disable=unnecessary-comprehension
['username', [username for username in testutils.VALID_USERNAMES]], # lint-amnesty, pylint: disable=unnecessary-comprehension
['country', [country for country in testutils.VALID_COUNTRIES]] # lint-amnesty, pylint: disable=unnecessary-comprehension
)
@ddt.unpack
def test_positive_validation_decision(self, form_field_name, user_data):
@@ -2274,11 +2274,11 @@ class RegistrationValidationViewTests(test_utils.ApiTestCase):
@ddt.data(
# Skip None type for invalidity checks.
['name', [name for name in testutils.INVALID_NAMES[1:]]],
['email', [email for email in testutils.INVALID_EMAILS[1:]]],
['password', [password for password in testutils.INVALID_PASSWORDS[1:]]],
['username', [username for username in testutils.INVALID_USERNAMES[1:]]],
['country', [country for country in testutils.INVALID_COUNTRIES[1:]]]
['name', [name for name in testutils.INVALID_NAMES[1:]]], # lint-amnesty, pylint: disable=unnecessary-comprehension
['email', [email for email in testutils.INVALID_EMAILS[1:]]], # lint-amnesty, pylint: disable=unnecessary-comprehension
['password', [password for password in testutils.INVALID_PASSWORDS[1:]]], # lint-amnesty, pylint: disable=unnecessary-comprehension
['username', [username for username in testutils.INVALID_USERNAMES[1:]]], # lint-amnesty, pylint: disable=unnecessary-comprehension
['country', [country for country in testutils.INVALID_COUNTRIES[1:]]] # lint-amnesty, pylint: disable=unnecessary-comprehension
)
@ddt.unpack
def test_negative_validation_decision(self, form_field_name, user_data):

View File

@@ -11,7 +11,7 @@ from datetime import datetime, timedelta
import ddt
from django.conf import settings
from django.contrib.auth.hashers import UNUSABLE_PASSWORD_PREFIX, make_password
from django.contrib.auth.models import AnonymousUser, User
from django.contrib.auth.models import AnonymousUser, User # lint-amnesty, pylint: disable=imported-auth-user
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.views import INTERNAL_RESET_SESSION_TOKEN, PasswordResetConfirmView
from django.contrib.sessions.middleware import SessionMiddleware
@@ -69,7 +69,7 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase):
ENABLED_CACHES = ['default']
def setUp(self): # pylint: disable=arguments-differ
super(ResetPasswordTests, self).setUp('openedx.core.djangoapps.user_authn.views.password_reset.tracker')
super(ResetPasswordTests, self).setUp('openedx.core.djangoapps.user_authn.views.password_reset.tracker') # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create()
self.user.is_active = False
self.user.save()
@@ -241,7 +241,7 @@ class ResetPasswordTests(EventTestMixin, CacheIsolationTestCase):
cache.clear()
def request_password_reset(self, status, new_ip=None):
def request_password_reset(self, status, new_ip=None): # lint-amnesty, pylint: disable=missing-function-docstring
extra_args = {}
if new_ip:
extra_args = {'REMOTE_ADDR': new_ip}
@@ -623,7 +623,7 @@ class PasswordResetViewTest(UserAPITestCase):
"""Tests of the user API's password reset endpoint. """
def setUp(self):
super(PasswordResetViewTest, self).setUp()
super(PasswordResetViewTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.url = reverse("user_api_password_reset")
@ddt.data("get", "post")
@@ -682,7 +682,7 @@ class PasswordResetTokenValidateViewTest(UserAPITestCase):
"""Tests of the user API's password reset endpoint. """
def setUp(self):
super(PasswordResetTokenValidateViewTest, self).setUp()
super(PasswordResetTokenValidateViewTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create()
self.user.is_active = False
self.user.save()
@@ -736,8 +736,8 @@ class ResetPasswordAPITests(EventTestMixin, CacheIsolationTestCase):
request_factory = RequestFactory()
ENABLED_CACHES = ['default']
def setUp(self):
super(ResetPasswordAPITests, self).setUp('openedx.core.djangoapps.user_authn.views.password_reset.tracker')
def setUp(self): # lint-amnesty, pylint: disable=arguments-differ
super(ResetPasswordAPITests, self).setUp('openedx.core.djangoapps.user_authn.views.password_reset.tracker') # lint-amnesty, pylint: disable=super-with-arguments
self.user = UserFactory.create()
self.user.save()
self.token = default_token_generator.make_token(self.user)