INCR-222: Run python-modernize on common/test/acceptance/tests/lms (#20420)
* Run python-modernize on common/test/acceptance/tests/lms * Fix code quality issues * tweak mport order
This commit is contained in:
committed by
Michael Youngstrom
parent
41bec63cc7
commit
a85f456e21
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
End-to-end tests for the Account Settings page.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from datetime import datetime
|
||||
from unittest import skip
|
||||
|
||||
@@ -12,6 +13,7 @@ from common.test.acceptance.pages.common.auto_auth import AutoAuthPage, FULL_NAM
|
||||
from common.test.acceptance.pages.lms.account_settings import AccountSettingsPage
|
||||
from common.test.acceptance.pages.lms.dashboard import DashboardPage
|
||||
from common.test.acceptance.tests.helpers import AcceptanceTest, EventsTestMixin
|
||||
import six
|
||||
|
||||
|
||||
class AccountSettingsTestMixin(EventsTestMixin, AcceptanceTest):
|
||||
@@ -468,12 +470,12 @@ class AccountSettingsPageTest(AccountSettingsTestMixin, AcceptanceTest):
|
||||
'price': 'Cost:\n$100.00',
|
||||
}
|
||||
|
||||
for field_name, value in expected_order_data_first_row.iteritems():
|
||||
for field_name, value in six.iteritems(expected_order_data_first_row):
|
||||
self.assertEqual(
|
||||
self.account_settings_page.get_value_of_order_history_row_item('order-Edx-123', field_name)[0], value
|
||||
)
|
||||
|
||||
for field_name, value in expected_order_data_second_row.iteritems():
|
||||
for field_name, value in six.iteritems(expected_order_data_second_row):
|
||||
self.assertEqual(
|
||||
self.account_settings_page.get_value_of_order_history_row_item('order-Edx-123', field_name)[1], value
|
||||
)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
End-to-end tests for the courseware unit bookmarks.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import json
|
||||
from unittest import skip
|
||||
|
||||
@@ -16,6 +17,7 @@ from common.test.acceptance.pages.lms.course_home import CourseHomePage
|
||||
from common.test.acceptance.pages.lms.courseware import CoursewarePage
|
||||
from common.test.acceptance.pages.studio.overview import CourseOutlinePage as StudioCourseOutlinePage
|
||||
from common.test.acceptance.tests.helpers import EventsTestMixin, UniqueCourseTest, is_404_page
|
||||
from six.moves import range
|
||||
|
||||
|
||||
class BookmarksTestMixin(EventsTestMixin, UniqueCourseTest):
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
End-to-end tests for the CCX dashboard.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from common.test.acceptance.fixtures.course import CourseFixture
|
||||
from common.test.acceptance.pages.common.auto_auth import AutoAuthPage
|
||||
from common.test.acceptance.pages.lms.ccx_dashboard_page import CoachDashboardPage
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""
|
||||
Acceptance tests for the certificate web view feature.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from common.test.acceptance.fixtures.certificates import CertificateConfigFixture
|
||||
from common.test.acceptance.fixtures.course import CourseFixture
|
||||
from common.test.acceptance.pages.common.auto_auth import AutoAuthPage
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
Bok choy acceptance tests for conditionals in the LMS
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
from capa.tests.response_xml_factory import StringResponseXMLFactory
|
||||
from common.test.acceptance.fixtures.course import CourseFixture, XBlockFixtureDesc
|
||||
from common.test.acceptance.pages.common.auto_auth import AutoAuthPage
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
End-to-end tests for Student's Profile Page.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from contextlib import contextmanager
|
||||
from datetime import datetime
|
||||
from unittest import skip
|
||||
@@ -11,6 +12,7 @@ from common.test.acceptance.pages.common.logout import LogoutPage
|
||||
from common.test.acceptance.pages.lms.account_settings import AccountSettingsPage
|
||||
from common.test.acceptance.pages.lms.learner_profile import LearnerProfilePage
|
||||
from common.test.acceptance.tests.helpers import AcceptanceTest, EventsTestMixin
|
||||
import six
|
||||
|
||||
|
||||
class LearnerProfileTestMixin(EventsTestMixin):
|
||||
@@ -130,7 +132,7 @@ class LearnerProfileTestMixin(EventsTestMixin):
|
||||
'event': {
|
||||
'user_id': int(profile_user_id),
|
||||
'page': 'profile',
|
||||
'visibility': unicode(visibility)
|
||||
'visibility': six.text_type(visibility)
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
End-to-end tests for LibraryContent block in LMS
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import textwrap
|
||||
|
||||
import ddt
|
||||
@@ -16,6 +17,7 @@ from common.test.acceptance.pages.lms.library import LibraryContentXBlockWrapper
|
||||
from common.test.acceptance.pages.studio.library import StudioLibraryContainerXBlockWrapper, StudioLibraryContentEditor
|
||||
from common.test.acceptance.pages.studio.overview import CourseOutlinePage as StudioCourseOutlinePage
|
||||
from common.test.acceptance.tests.helpers import TestWithSearchIndexMixin, UniqueCourseTest
|
||||
import six
|
||||
|
||||
SECTION_NAME = 'Test Section'
|
||||
SUBSECTION_NAME = 'Test Subsection'
|
||||
@@ -66,7 +68,7 @@ class LibraryContentTestBase(UniqueCourseTest):
|
||||
)
|
||||
|
||||
library_content_metadata = {
|
||||
'source_library_id': unicode(self.library_key),
|
||||
'source_library_id': six.text_type(self.library_key),
|
||||
'mode': 'random',
|
||||
'max_count': 1,
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
End-to-end tests for the LMS.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import json
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
@@ -44,6 +45,7 @@ from common.test.acceptance.tests.helpers import (
|
||||
remove_file
|
||||
)
|
||||
from openedx.core.lib.tests import attr
|
||||
from six.moves import range
|
||||
|
||||
|
||||
@attr(shard=19)
|
||||
@@ -972,7 +974,7 @@ class EntranceExamTest(UniqueCourseTest):
|
||||
"""
|
||||
# visit the course outline and make sure there is no "Entrance Exam" section.
|
||||
self.course_home_page.visit()
|
||||
self.assertFalse('Entrance Exam' in self.course_home_page.outline.sections.keys())
|
||||
self.assertNotIn('Entrance Exam', list(self.course_home_page.outline.sections.keys()))
|
||||
|
||||
# Logout and login as a staff.
|
||||
LogoutPage(self.browser).visit()
|
||||
@@ -989,7 +991,7 @@ class EntranceExamTest(UniqueCourseTest):
|
||||
|
||||
# visit the course outline and make sure there is an "Entrance Exam" section.
|
||||
self.course_home_page.visit()
|
||||
self.assertTrue('Entrance Exam' in self.course_home_page.outline.sections.keys())
|
||||
self.assertIn('Entrance Exam', list(self.course_home_page.outline.sections.keys()))
|
||||
|
||||
# TODO: TNL-6546: Remove test
|
||||
def test_entrance_exam_section_2(self):
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
End-to-end tests for the LMS.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
import pytest
|
||||
|
||||
from common.test.acceptance.fixtures.course import CourseFixture, XBlockFixtureDesc
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
Test courseware search
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
import json
|
||||
import uuid
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""
|
||||
Test course discovery.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import datetime
|
||||
import json
|
||||
import uuid
|
||||
@@ -10,6 +11,7 @@ from common.test.acceptance.pages.common.auto_auth import AutoAuthPage
|
||||
from common.test.acceptance.pages.common.logout import LogoutPage
|
||||
from common.test.acceptance.pages.lms.discovery import CourseDiscoveryPage
|
||||
from common.test.acceptance.tests.helpers import AcceptanceTest, remove_file
|
||||
from six.moves import range
|
||||
|
||||
|
||||
class CourseDiscoveryTest(AcceptanceTest):
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
End-to-end tests for the LMS that utilize the course home page and course outline.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
import six
|
||||
from common.test.acceptance.pages.lms.create_mode import ModeCreationPage
|
||||
from openedx.core.lib.tests import attr
|
||||
|
||||
@@ -97,7 +99,7 @@ class CourseHomeTest(CourseHomeBaseTest):
|
||||
}
|
||||
|
||||
actual_sections = self.course_home_page.outline.sections
|
||||
for section, subsections in EXPECTED_SECTIONS.iteritems():
|
||||
for section, _ in six.iteritems(EXPECTED_SECTIONS):
|
||||
self.assertIn(section, actual_sections)
|
||||
self.assertEqual(actual_sections[section], EXPECTED_SECTIONS[section])
|
||||
|
||||
|
||||
@@ -3,9 +3,10 @@
|
||||
End-to-end tests for the LMS.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from six.moves import range
|
||||
import ddt
|
||||
|
||||
from openedx.core.lib.tests import attr
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""
|
||||
Test courseware search
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import json
|
||||
|
||||
from common.test.acceptance.fixtures.course import CourseFixture, XBlockFixtureDesc
|
||||
|
||||
@@ -2,12 +2,14 @@
|
||||
"""
|
||||
End-to-end tests for the main LMS Dashboard (aka, Student Dashboard).
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import datetime
|
||||
|
||||
from common.test.acceptance.fixtures.course import CourseFixture
|
||||
from common.test.acceptance.pages.common.auto_auth import AutoAuthPage
|
||||
from common.test.acceptance.pages.lms.dashboard import DashboardPage
|
||||
from common.test.acceptance.tests.helpers import UniqueCourseTest, generate_course_key
|
||||
import six
|
||||
|
||||
DEFAULT_SHORT_DATE_FORMAT = u'{dt:%b} {dt.day}, {dt.year}'
|
||||
TEST_DATE_FORMAT = u'{dt:%b} {dt.day}, {dt.year} {dt.hour:02}:{dt.minute:02}'
|
||||
@@ -102,7 +104,7 @@ class BaseLmsDashboardTestMultiple(UniqueCourseTest):
|
||||
self.course_keys = {}
|
||||
self.course_fixtures = {}
|
||||
|
||||
for key, value in self.courses.iteritems():
|
||||
for key, value in six.iteritems(self.courses):
|
||||
course_key = generate_course_key(
|
||||
value['org'],
|
||||
value['number'],
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""
|
||||
Test dashboard search
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import json
|
||||
import os
|
||||
|
||||
@@ -13,6 +14,7 @@ from common.test.acceptance.pages.studio.container import ContainerPage
|
||||
from common.test.acceptance.pages.studio.overview import CourseOutlinePage as StudioCourseOutlinePage
|
||||
from common.test.acceptance.pages.studio.utils import add_html_component, type_in_codemirror
|
||||
from common.test.acceptance.tests.helpers import AcceptanceTest, generate_course_key
|
||||
import six
|
||||
|
||||
|
||||
class DashboardSearchTest(AcceptanceTest):
|
||||
@@ -64,7 +66,7 @@ class DashboardSearchTest(AcceptanceTest):
|
||||
# generate course fixtures and outline pages
|
||||
self.studio_course_outlines = {}
|
||||
self.course_fixtures = {}
|
||||
for key, course_info in self.courses.iteritems():
|
||||
for key, course_info in six.iteritems(self.courses):
|
||||
studio_course_outline = StudioCourseOutlinePage(
|
||||
self.browser,
|
||||
course_info['org'],
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""
|
||||
Test LMS Notes
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import random
|
||||
from datetime import datetime
|
||||
from unittest import skip
|
||||
@@ -14,6 +15,7 @@ from common.test.acceptance.pages.lms.courseware import CoursewarePage
|
||||
from common.test.acceptance.pages.lms.edxnotes import EdxNotesPage, EdxNotesPageNoContent, EdxNotesUnitPage
|
||||
from common.test.acceptance.tests.helpers import EventsTestMixin, UniqueCourseTest
|
||||
from openedx.core.lib.tests import attr
|
||||
from six.moves import range
|
||||
|
||||
|
||||
class EdxNotesTestMixin(UniqueCourseTest):
|
||||
@@ -166,12 +168,12 @@ class EdxNotesDefaultInteractionsTest(EdxNotesTestMixin):
|
||||
|
||||
def assert_text_in_notes(self, notes):
|
||||
actual = [note.text for note in notes]
|
||||
expected = [u"TEST TEXT {}".format(i) for i in xrange(len(notes))]
|
||||
expected = [u"TEST TEXT {}".format(i) for i in range(len(notes))]
|
||||
self.assertEqual(expected, actual)
|
||||
|
||||
def assert_tags_in_notes(self, notes, expected_tags):
|
||||
actual = [note.tags for note in notes]
|
||||
expected = [expected_tags[i] for i in xrange(len(notes))]
|
||||
expected = [expected_tags[i] for i in range(len(notes))]
|
||||
self.assertEqual(expected, actual)
|
||||
|
||||
def test_can_create_notes(self):
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
Bok choy acceptance tests for Entrance exams in the LMS
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from textwrap import dedent
|
||||
|
||||
from common.test.acceptance.fixtures.course import CourseFixture, XBlockFixtureDesc
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
End-to-end tests for the gating feature.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from textwrap import dedent
|
||||
|
||||
from common.test.acceptance.fixtures.course import CourseFixture, XBlockFixtureDesc
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
Test Help links in LMS
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
from common.test.acceptance.fixtures.course import CourseFixture
|
||||
from common.test.acceptance.pages.lms.instructor_dashboard import InstructorDashboardPage
|
||||
from common.test.acceptance.tests.discussion.helpers import CohortTestMixin
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
End-to-end tests for the LMS Index page (aka, Home page). Note that this is different than
|
||||
what students see @ edx.org because we redirect requests to a separate web application.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import datetime
|
||||
|
||||
from common.test.acceptance.pages.lms.index import IndexPage
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
End-to-end tests for the LMS Instructor Dashboard.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
import ddt
|
||||
from bok_choy.promise import EmptyPromise
|
||||
|
||||
@@ -31,6 +32,7 @@ from common.test.acceptance.tests.helpers import (
|
||||
get_modal_alert
|
||||
)
|
||||
from openedx.core.lib.tests import attr
|
||||
from six.moves import range
|
||||
|
||||
|
||||
class BaseInstructorDashboardTest(EventsTestMixin, UniqueCourseTest):
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
Bok choy acceptance tests for LTI xblock
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import os
|
||||
|
||||
from common.test.acceptance.pages.lms.instructor_dashboard import (
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
"""
|
||||
Bok choy acceptance tests for problems in the LMS
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from textwrap import dedent
|
||||
import time
|
||||
import ddt
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
Test courseware search
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
import json
|
||||
|
||||
from common.test.acceptance.fixtures.course import XBlockFixtureDesc
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
Tests the "preview" selector in the LMS that allows changing between Staff, Learner, and Content Groups.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
from textwrap import dedent
|
||||
|
||||
from common.test.acceptance.fixtures.course import CourseFixture, XBlockFixtureDesc
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Tests for OAuth2 permission delegation."""
|
||||
|
||||
from urlparse import parse_qsl, urlparse
|
||||
from __future__ import absolute_import
|
||||
from six.moves.urllib.parse import parse_qsl, urlparse # pylint: disable=import-error
|
||||
|
||||
from common.test.acceptance.pages.common.auto_auth import AutoAuthPage
|
||||
from common.test.acceptance.pages.lms.oauth2_confirmation import OAuth2Confirmation
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""
|
||||
Bok choy acceptance and a11y tests for problem types in the LMS
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import random
|
||||
import textwrap
|
||||
from abc import ABCMeta, abstractmethod
|
||||
@@ -30,6 +31,8 @@ from common.test.acceptance.pages.lms.problem import ProblemPage
|
||||
from common.test.acceptance.tests.helpers import EventsTestMixin, select_option_by_text
|
||||
from common.test.acceptance.tests.lms.test_lms_problems import ProblemsTest
|
||||
from openedx.core.lib.tests import attr
|
||||
import six
|
||||
from six.moves import range
|
||||
|
||||
|
||||
class ProblemTypeTestBaseMeta(ABCMeta):
|
||||
@@ -62,7 +65,7 @@ class ProblemTypeTestBaseMeta(ABCMeta):
|
||||
return obj
|
||||
|
||||
|
||||
class ProblemTypeTestBase(ProblemsTest, EventsTestMixin):
|
||||
class ProblemTypeTestBase(six.with_metaclass(ProblemTypeTestBaseMeta, ProblemsTest, EventsTestMixin)):
|
||||
"""
|
||||
Base class for testing assesment problem types in bok choy.
|
||||
|
||||
@@ -78,7 +81,6 @@ class ProblemTypeTestBase(ProblemsTest, EventsTestMixin):
|
||||
Additionally, the default values for factory_kwargs and status_indicators
|
||||
may need to be overridden for some problem types.
|
||||
"""
|
||||
__metaclass__ = ProblemTypeTestBaseMeta
|
||||
|
||||
problem_name = None
|
||||
problem_type = None
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
"""Acceptance tests for LMS-hosted Programs pages"""
|
||||
from __future__ import absolute_import
|
||||
from common.test.acceptance.fixtures.catalog import CatalogFixture, CatalogIntegrationMixin
|
||||
from common.test.acceptance.fixtures.course import CourseFixture
|
||||
from common.test.acceptance.fixtures.programs import ProgramsConfigMixin
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
End-to-end tests for the LMS that utilize the
|
||||
progress page.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
from six.moves import range
|
||||
from contextlib import contextmanager
|
||||
|
||||
import ddt
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
"""
|
||||
Acceptance tests for the teams feature.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
import json
|
||||
import random
|
||||
import time
|
||||
@@ -29,6 +30,8 @@ from common.test.acceptance.pages.lms.teams import (
|
||||
)
|
||||
from common.test.acceptance.tests.helpers import EventsTestMixin, UniqueCourseTest, get_modal_alert
|
||||
from openedx.core.lib.tests import attr
|
||||
from six.moves import map
|
||||
from six.moves import range
|
||||
|
||||
TOPICS_PER_PAGE = 12
|
||||
|
||||
@@ -47,12 +50,12 @@ class TeamsTabBase(EventsTestMixin, ForumsConfigMixin, UniqueCourseTest):
|
||||
|
||||
def create_topics(self, num_topics):
|
||||
"""Create `num_topics` test topics."""
|
||||
return [{u"description": i, u"name": i, u"id": i} for i in map(str, xrange(num_topics))]
|
||||
return [{u"description": i, u"name": i, u"id": i} for i in map(str, range(num_topics))]
|
||||
|
||||
def create_teams(self, topic, num_teams, time_between_creation=0):
|
||||
"""Create `num_teams` teams belonging to `topic`."""
|
||||
teams = []
|
||||
for i in xrange(num_teams):
|
||||
for i in range(num_teams):
|
||||
team = {
|
||||
'course_id': self.course_id,
|
||||
'topic_id': topic['id'],
|
||||
@@ -83,7 +86,7 @@ class TeamsTabBase(EventsTestMixin, ForumsConfigMixin, UniqueCourseTest):
|
||||
"""Create `num_memberships` users and assign them to `team_id`. The
|
||||
last user created becomes the current user."""
|
||||
memberships = []
|
||||
for __ in xrange(num_memberships):
|
||||
for __ in range(num_memberships):
|
||||
user_info = AutoAuthPage(self.browser, course_id=self.course_id).visit().user_info
|
||||
memberships.append(user_info)
|
||||
self.create_membership(user_info['username'], team_id)
|
||||
@@ -142,7 +145,7 @@ class TeamsTabBase(EventsTestMixin, ForumsConfigMixin, UniqueCourseTest):
|
||||
|
||||
team_card_names = page.team_names
|
||||
team_card_descriptions = page.team_descriptions
|
||||
map(assert_team_equal, expected_teams, team_card_names, team_card_descriptions)
|
||||
list(map(assert_team_equal, expected_teams, team_card_names, team_card_descriptions))
|
||||
|
||||
def verify_my_team_count(self, expected_number_of_teams):
|
||||
""" Verify the number of teams shown on "My Team". """
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
End-to-end tests for admin change view.
|
||||
"""
|
||||
|
||||
from __future__ import absolute_import
|
||||
from common.test.acceptance.pages.common.auto_auth import AutoAuthPage
|
||||
from common.test.acceptance.pages.lms.admin import ChangeUserAdminPage
|
||||
from common.test.acceptance.tests.helpers import AcceptanceTest
|
||||
|
||||
Reference in New Issue
Block a user