diff --git a/analytics/views/activity_common.py b/analytics/views/activity_common.py index 675578d661..e8bde1ead9 100644 --- a/analytics/views/activity_common.py +++ b/analytics/views/activity_common.py @@ -8,7 +8,7 @@ from django.conf import settings from django.db.backends.utils import CursorWrapper from django.template import loader from django.urls import reverse -from markupsafe import Markup as mark_safe +from markupsafe import Markup from zerver.models import UserActivity @@ -58,36 +58,36 @@ def format_date_for_activity_reports(date: Optional[datetime]) -> str: return "" -def user_activity_link(email: str, user_profile_id: int) -> mark_safe: +def user_activity_link(email: str, user_profile_id: int) -> Markup: from analytics.views.user_activity import get_user_activity url = reverse(get_user_activity, kwargs=dict(user_profile_id=user_profile_id)) email_link = f'{escape(email)}' - return mark_safe(email_link) + return Markup(email_link) -def realm_activity_link(realm_str: str) -> mark_safe: +def realm_activity_link(realm_str: str) -> Markup: from analytics.views.realm_activity import get_realm_activity url = reverse(get_realm_activity, kwargs=dict(realm_str=realm_str)) realm_link = f'{escape(realm_str)}' - return mark_safe(realm_link) + return Markup(realm_link) -def realm_stats_link(realm_str: str) -> mark_safe: +def realm_stats_link(realm_str: str) -> Markup: from analytics.views.stats import stats_for_realm url = reverse(stats_for_realm, kwargs=dict(realm_str=realm_str)) stats_link = f'{escape(realm_str)}' - return mark_safe(stats_link) + return Markup(stats_link) -def remote_installation_stats_link(server_id: int, hostname: str) -> mark_safe: +def remote_installation_stats_link(server_id: int, hostname: str) -> Markup: from analytics.views.stats import stats_for_remote_installation url = reverse(stats_for_remote_installation, kwargs=dict(remote_server_id=server_id)) stats_link = f'{escape(hostname)}' - return mark_safe(stats_link) + return Markup(stats_link) def get_user_activity_summary(records: Collection[UserActivity]) -> Dict[str, Any]: diff --git a/analytics/views/installation_activity.py b/analytics/views/installation_activity.py index aefba2623c..05914c23ed 100644 --- a/analytics/views/installation_activity.py +++ b/analytics/views/installation_activity.py @@ -10,7 +10,7 @@ from django.http import HttpRequest, HttpResponse from django.shortcuts import render from django.template import loader from django.utils.timezone import now as timezone_now -from markupsafe import Markup as mark_safe +from markupsafe import Markup from psycopg2.sql import SQL, Composable, Literal from analytics.lib.counts import COUNT_STATS @@ -305,7 +305,7 @@ def realm_summary_table(realm_minutes: Dict[str, float]) -> str: return content -def user_activity_intervals() -> Tuple[mark_safe, Dict[str, float]]: +def user_activity_intervals() -> Tuple[Markup, Dict[str, float]]: day_end = timestamp_to_datetime(time.time()) day_start = day_end - timedelta(hours=24) @@ -357,7 +357,7 @@ def user_activity_intervals() -> Tuple[mark_safe, Dict[str, float]]: output += f"\nTotal duration: {total_duration}\n" output += f"\nTotal duration in minutes: {total_duration.total_seconds() / 60.}\n" output += f"Total duration amortized to a month: {total_duration.total_seconds() * 30. / 60.}" - content = mark_safe("
" + output + "") + content = Markup("
" + output + "") return content, realm_minutes @@ -372,7 +372,7 @@ def ad_hoc_queries() -> List[Dict[str, str]]: cursor.close() def fix_rows( - i: int, fixup_func: Union[Callable[[str], mark_safe], Callable[[datetime], str]] + i: int, fixup_func: Union[Callable[[str], Markup], Callable[[datetime], str]] ) -> None: for row in rows: row[i] = fixup_func(row[i]) diff --git a/zerver/forms.py b/zerver/forms.py index f866375d6d..868164d323 100644 --- a/zerver/forms.py +++ b/zerver/forms.py @@ -18,7 +18,7 @@ from django.utils.http import urlsafe_base64_encode from django.utils.translation import get_language from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy -from markupsafe import Markup as mark_safe +from markupsafe import Markup from two_factor.forms import AuthenticationTokenForm as TwoFactorAuthenticationTokenForm from two_factor.utils import totp_digits @@ -75,9 +75,9 @@ def email_is_not_mit_mailing_list(email: str) -> None: DNS.dnslookup(f"{address.username}.pobox.ns.athena.mit.edu", DNS.Type.TXT) except DNS.Base.ServerError as e: if e.rcode == DNS.Status.NXDOMAIN: - # This error is mark_safe only because 1. it needs to render HTML + # This error is Markup only because 1. it needs to render HTML # 2. It's not formatted with any user input. - raise ValidationError(mark_safe(MIT_VALIDATION_ERROR)) + raise ValidationError(Markup(MIT_VALIDATION_ERROR)) else: raise AssertionError("Unexpected DNS error") diff --git a/zerver/lib/markdown/__init__.py b/zerver/lib/markdown/__init__.py index d51af110b4..c35b0582c3 100644 --- a/zerver/lib/markdown/__init__.py +++ b/zerver/lib/markdown/__init__.py @@ -26,7 +26,6 @@ from typing import ( Union, ) from urllib.parse import urlencode, urljoin, urlsplit -from xml.etree import ElementTree as etree from xml.etree.ElementTree import Element, SubElement import ahocorasick @@ -1713,7 +1712,7 @@ class BlockQuoteProcessor(markdown.blockprocessors.BlockQuoteProcessor): # a blank line intentionally. # # This is a new blockquote. Create a new parent element. - quote = etree.SubElement(parent, "blockquote") + quote = SubElement(parent, "blockquote") # Recursively parse block with blockquote as parent. # change parser state so blockquotes embedded in lists use p tags diff --git a/zerver/lib/upload.py b/zerver/lib/upload.py index e732c0e54e..df6585dc6e 100644 --- a/zerver/lib/upload.py +++ b/zerver/lib/upload.py @@ -23,7 +23,7 @@ from django.core.files.uploadedfile import UploadedFile from django.core.signing import BadSignature, TimestampSigner from django.urls import reverse from django.utils.translation import gettext as _ -from markupsafe import Markup as mark_safe +from markupsafe import Markup from mypy_boto3_s3.client import S3Client from mypy_boto3_s3.service_resource import Bucket, Object from PIL import GifImagePlugin, Image, ImageOps, PngImagePlugin @@ -112,7 +112,7 @@ def sanitize_name(value: str) -> str: value = re.sub(r"[^\w\s.-]", "", value).strip() value = re.sub(r"[-\s]+", "-", value) assert value not in {"", ".", ".."} - return mark_safe(value) + return Markup(value) class BadImageError(JsonableError): diff --git a/zerver/views/auth.py b/zerver/views/auth.py index 12f2778464..8d0668f093 100644 --- a/zerver/views/auth.py +++ b/zerver/views/auth.py @@ -25,7 +25,7 @@ from django.utils.http import url_has_allowed_host_and_scheme from django.utils.translation import gettext as _ from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_safe -from markupsafe import Markup as mark_safe +from markupsafe import Markup from social_django.utils import load_backend, load_strategy from two_factor.forms import BackupTokenForm from two_factor.views import LoginView as BaseTwoFactorLoginView @@ -718,7 +718,7 @@ def update_login_page_context(request: HttpRequest, context: Dict[str, Any]) -> return try: validate_email(deactivated_email) - context["deactivated_account_error"] = mark_safe( + context["deactivated_account_error"] = Markup( DEACTIVATED_ACCOUNT_ERROR.format(username=escape(deactivated_email)) ) except ValidationError: