Browse Source

ref: fix some `request` types (#52295)

<!-- Describe your PR here. -->
anthony sottile 1 year ago
parent
commit
84ff7c0b8f

+ 4 - 5
src/sentry/web/frontend/auth_logout.py

@@ -1,8 +1,7 @@
 from django.contrib.auth import REDIRECT_FIELD_NAME, logout
 from django.contrib.auth.models import AnonymousUser
-from django.http import HttpResponse
+from django.http import HttpRequest, HttpResponse
 from django.utils.http import is_safe_url
-from rest_framework.request import Request
 
 from sentry.utils import auth
 from sentry.web.frontend.base import BaseView
@@ -11,16 +10,16 @@ from sentry.web.frontend.base import BaseView
 class AuthLogoutView(BaseView):
     auth_required = False
 
-    def redirect(self, request: Request) -> HttpResponse:
+    def redirect(self, request: HttpRequest) -> HttpResponse:
         next_url = request.GET.get(REDIRECT_FIELD_NAME, "")
         if not is_safe_url(next_url, allowed_hosts=(request.get_host(),)):
             next_url = auth.get_login_url()
         return super().redirect(next_url)
 
-    def get(self, request: Request) -> HttpResponse:
+    def get(self, request: HttpRequest) -> HttpResponse:
         return self.respond("sentry/logout.html")
 
-    def post(self, request: Request) -> HttpResponse:
+    def post(self, request: HttpRequest) -> HttpResponse:
         logout(request)
         request.user = AnonymousUser()
         return self.redirect(request)

+ 42 - 40
src/sentry/web/frontend/base.py

@@ -12,12 +12,12 @@ from django.http import (
     HttpResponseNotFound,
     HttpResponseRedirect,
 )
+from django.http.response import HttpResponseBase
 from django.middleware.csrf import CsrfViewMiddleware
 from django.template.context_processors import csrf
 from django.urls import reverse
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic import View
-from rest_framework.request import Request
 
 from sentry import options
 from sentry.api.utils import generate_organization_url, is_member_disabled_from_limit
@@ -52,7 +52,7 @@ class _HasRespond(Protocol):
 
     def respond(
         self, template: str, context: dict[str, Any] | None = None, status: int = 200
-    ) -> HttpResponse:
+    ) -> HttpResponseBase:
         ...
 
 
@@ -65,7 +65,7 @@ class OrganizationMixin:
     # as it's only used in a single location and over complicates the rest of
     # the code
     def determine_active_organization(
-        self, request: Request, organization_slug: str | None = None
+        self, request: HttpRequest, organization_slug: str | None = None
     ) -> None:
         """
         Using the current request and potentially optional organization_slug, 'determines'
@@ -100,7 +100,7 @@ class OrganizationMixin:
         self.active_organization = active_organization
 
     def _lookup_organizations(
-        self, is_implicit: bool, organization_slug: str | None, request: Request
+        self, is_implicit: bool, organization_slug: str | None, request: HttpRequest
     ) -> tuple[RpcUserOrganizationContext | None, RpcOrganizationSummary | None]:
         active_organization: RpcUserOrganizationContext | None = self._try_superuser_org_lookup(
             organization_slug, request
@@ -124,7 +124,7 @@ class OrganizationMixin:
         is_implicit: bool,
         organization_slug: str,
         organizations: list[RpcOrganizationSummary],
-        request: Request,
+        request: HttpRequest,
     ) -> RpcUserOrganizationContext | None:
         try:
             backup_org: RpcOrganizationSummary | None = next(
@@ -145,7 +145,7 @@ class OrganizationMixin:
         return None
 
     def _try_superuser_org_lookup(
-        self, organization_slug: str | None, request: Request
+        self, organization_slug: str | None, request: HttpRequest
     ) -> RpcUserOrganizationContext | None:
         active_organization: RpcUserOrganizationContext | None = None
         if organization_slug is not None:
@@ -155,7 +155,7 @@ class OrganizationMixin:
                 )
         return active_organization
 
-    def _find_implicit_slug(self, request: Request) -> str | None:
+    def _find_implicit_slug(self, request: HttpRequest) -> str | None:
         organization_slug = request.session.get("activeorg")
         if request.subdomain is not None and request.subdomain != organization_slug:
             # Customer domain is being used, set the subdomain as the requesting org slug.
@@ -163,7 +163,7 @@ class OrganizationMixin:
         return organization_slug
 
     def is_not_2fa_compliant(
-        self, request: Request, organization: RpcOrganization | Organization
+        self, request: HttpRequest, organization: RpcOrganization | Organization
     ) -> bool:
         return (
             organization.flags.require_2fa
@@ -172,12 +172,12 @@ class OrganizationMixin:
         )
 
     def is_member_disabled_from_limit(
-        self, request: Request, organization: RpcUserOrganizationContext | RpcOrganization
+        self, request: HttpRequest, organization: RpcUserOrganizationContext | RpcOrganization
     ) -> bool:
         return is_member_disabled_from_limit(request, organization)
 
     def get_active_team(
-        self, request: Request, organization: RpcOrganization, team_slug: str
+        self, request: HttpRequest, organization: RpcOrganization, team_slug: str
     ) -> Team | None:
         """
         Returns the currently selected team for the request or None
@@ -194,7 +194,7 @@ class OrganizationMixin:
         return team
 
     def get_active_project(
-        self, request: Request, organization: RpcOrganization, project_slug: str
+        self, request: HttpRequest, organization: RpcOrganization, project_slug: str
     ) -> Project | None:
         try:
             project = Project.objects.get(slug=project_slug, organization=organization)
@@ -206,7 +206,7 @@ class OrganizationMixin:
 
         return project
 
-    def redirect_to_org(self: _HasRespond, request: Request) -> HttpResponse:
+    def redirect_to_org(self: _HasRespond, request: HttpRequest) -> HttpResponseBase:
         from sentry import features
 
         using_customer_domain = request and is_using_customer_domain(request)
@@ -273,7 +273,7 @@ class BaseView(View, OrganizationMixin):
         super().__init__(*args, **kwargs)
 
     @csrf_exempt
-    def dispatch(self, request: Request, *args: Any, **kwargs: Any) -> HttpResponse:
+    def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponseBase:
         """
         A note on the CSRF protection process.
 
@@ -337,28 +337,28 @@ class BaseView(View, OrganizationMixin):
 
         return self.handle(request, *args, **kwargs)
 
-    def test_csrf(self, request: Request) -> HttpResponse:
+    def test_csrf(self, request: HttpRequest) -> HttpResponse:
         def _fake_get_response(request: HttpRequest) -> HttpResponse:
             raise AssertionError("this should be unreachable")
 
         middleware = CsrfViewMiddleware(_fake_get_response)
         return middleware.process_view(request, self.dispatch, [request], {})
 
-    def get_access(self, request: Request, *args: Any, **kwargs: Any) -> access.Access:
+    def get_access(self, request: HttpRequest, *args: Any, **kwargs: Any) -> access.Access:
         return access.DEFAULT
 
     def convert_args(
-        self, request: Request, *args: Any, **kwargs: Any
+        self, request: HttpRequest, *args: Any, **kwargs: Any
     ) -> tuple[tuple[Any, ...], dict[str, Any]]:
         return (args, kwargs)
 
-    def handle(self, request: Request, *args: Any, **kwargs: Any) -> HttpResponse:
+    def handle(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
         return super().dispatch(request, *args, **kwargs)
 
-    def is_auth_required(self, request: Request, *args: Any, **kwargs: Any) -> bool:
+    def is_auth_required(self, request: HttpRequest, *args: Any, **kwargs: Any) -> bool:
         return self.auth_required and not (request.user.is_authenticated and request.user.is_active)
 
-    def handle_auth_required(self, request: Request, *args: Any, **kwargs: Any) -> HttpResponse:
+    def handle_auth_required(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
         auth.initiate_login(request, next_url=request.get_full_path())
         if "organization_slug" in kwargs:
             redirect_to = reverse("sentry-auth-organization", args=[kwargs["organization_slug"]])
@@ -366,38 +366,40 @@ class BaseView(View, OrganizationMixin):
             redirect_to = auth.get_login_url()
         return self.redirect(redirect_to, headers={"X-Robots-Tag": "noindex, nofollow"})
 
-    def is_sudo_required(self, request: Request, *args: Any, **kwargs: Any) -> bool:
+    def is_sudo_required(self, request: HttpRequest, *args: Any, **kwargs: Any) -> bool:
         return self.sudo_required and not request.is_sudo()
 
-    def handle_sudo_required(self, request: Request, *args: Any, **kwargs: Any) -> HttpResponse:
+    def handle_sudo_required(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
         return redirect_to_sudo(request.get_full_path())
 
-    def has_permission(self, request: Request, *args: Any, **kwargs: Any) -> bool:
+    def has_permission(self, request: HttpRequest, *args: Any, **kwargs: Any) -> bool:
         return True
 
     def handle_permission_required(
-        self, request: Request, *args: Any, **kwargs: Any
+        self, request: HttpRequest, *args: Any, **kwargs: Any
     ) -> HttpResponse:
         redirect_uri = self.get_no_permission_url(request, *args, **kwargs)
         return self.redirect(redirect_uri)
 
-    def handle_not_2fa_compliant(self, request: Request, *args: Any, **kwargs: Any) -> HttpResponse:
+    def handle_not_2fa_compliant(
+        self, request: HttpRequest, *args: Any, **kwargs: Any
+    ) -> HttpResponse:
         redirect_uri = self.get_not_2fa_compliant_url(request, *args, **kwargs)
         return self.redirect(redirect_uri)
 
-    def get_no_permission_url(self, request: Request, *args: Any, **kwargs: Any) -> str:
+    def get_no_permission_url(self, request: HttpRequest, *args: Any, **kwargs: Any) -> str:
         return reverse("sentry-login")
 
-    def get_not_2fa_compliant_url(self, request: Request, *args: Any, **kwargs: Any) -> str:
+    def get_not_2fa_compliant_url(self, request: HttpRequest, *args: Any, **kwargs: Any) -> str:
         return reverse("sentry-account-settings-security")
 
-    def get_context_data(self, request: Request, **kwargs: Any) -> dict[str, Any]:
+    def get_context_data(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]:
         context = csrf(request)
         return context
 
     def respond(
         self, template: str, context: dict[str, Any] | None = None, status: int = 200
-    ) -> HttpResponse:
+    ) -> HttpResponseBase:
         default_context = self.default_context
         if context:
             default_context.update(context)
@@ -415,7 +417,7 @@ class BaseView(View, OrganizationMixin):
         return Team.objects.get_for_user(organization=organization, user=user, with_projects=True)
 
     def create_audit_entry(
-        self, request: Request, transaction_id: int | None = None, **kwargs: Any
+        self, request: HttpRequest, transaction_id: int | None = None, **kwargs: Any
     ) -> object:
         return create_audit_entry(request, transaction_id, audit_logger, **kwargs)
 
@@ -434,19 +436,19 @@ class AbstractOrganizationView(BaseView, abc.ABC):
     required_scope: str | None = None
     valid_sso_required = True
 
-    def get_access(self, request: Request, *args: Any, **kwargs: Any) -> access.Access:
+    def get_access(self, request: HttpRequest, *args: Any, **kwargs: Any) -> access.Access:
         if self.active_organization is None:
             return access.DEFAULT
         return access.from_request_org_and_scopes(
             request=request, rpc_user_org_context=self.active_organization
         )
 
-    def get_context_data(self, request: Request, organization: RpcOrganization | Organization, **kwargs: Any) -> dict[str, Any]:  # type: ignore[override]
+    def get_context_data(self, request: HttpRequest, organization: RpcOrganization | Organization, **kwargs: Any) -> dict[str, Any]:  # type: ignore[override]
         context = super().get_context_data(request)
         context["organization"] = organization
         return context
 
-    def has_permission(self, request: Request, organization: RpcOrganization | Organization, *args: Any, **kwargs: Any) -> bool:  # type: ignore[override]
+    def has_permission(self, request: HttpRequest, organization: RpcOrganization | Organization, *args: Any, **kwargs: Any) -> bool:  # type: ignore[override]
         if organization is None:
             return False
         if self.valid_sso_required:
@@ -465,7 +467,7 @@ class AbstractOrganizationView(BaseView, abc.ABC):
         return True
 
     def is_auth_required(
-        self, request: Request, organization_slug: str | None = None, *args: Any, **kwargs: Any
+        self, request: HttpRequest, organization_slug: str | None = None, *args: Any, **kwargs: Any
     ) -> bool:
         result = super().is_auth_required(request, *args, **kwargs)
         if result:
@@ -492,7 +494,7 @@ class AbstractOrganizationView(BaseView, abc.ABC):
 
         return False
 
-    def handle_permission_required(self, request: Request, organization: Organization | RpcOrganization | None, *args: Any, **kwargs: Any) -> HttpResponse:  # type: ignore[override]
+    def handle_permission_required(self, request: HttpRequest, organization: Organization | RpcOrganization | None, *args: Any, **kwargs: Any) -> HttpResponse:  # type: ignore[override]
         if organization and self.needs_sso(request, organization):
             logger.info(
                 "access.must-sso",
@@ -529,7 +531,7 @@ class AbstractOrganizationView(BaseView, abc.ABC):
             redirect_uri = self.get_no_permission_url(request, *args, **kwargs)
         return self.redirect(redirect_uri)
 
-    def needs_sso(self, request: Request, organization: Organization | RpcOrganization) -> bool:
+    def needs_sso(self, request: HttpRequest, organization: Organization | RpcOrganization) -> bool:
         if not organization:
             return False
         # XXX(dcramer): this branch should really never hit
@@ -550,7 +552,7 @@ class AbstractOrganizationView(BaseView, abc.ABC):
         raise NotImplementedError
 
     def convert_args(
-        self, request: Request, organization_slug: str | None = None, *args: Any, **kwargs: Any
+        self, request: HttpRequest, organization_slug: str | None = None, *args: Any, **kwargs: Any
     ) -> tuple[tuple[Any, ...], dict[str, Any]]:
         if "organization" not in kwargs:
             kwargs["organization"] = self._get_organization()
@@ -598,7 +600,7 @@ class ProjectView(OrganizationView):
     - project
     """
 
-    def get_context_data(self, request: Request, organization: Organization, project: Project, **kwargs: Any) -> dict[str, Any]:  # type: ignore[override]
+    def get_context_data(self, request: HttpRequest, organization: Organization, project: Project, **kwargs: Any) -> dict[str, Any]:  # type: ignore[override]
         from sentry.api.serializers import serialize
 
         context = super().get_context_data(request, organization)
@@ -606,7 +608,7 @@ class ProjectView(OrganizationView):
         context["processing_issues"] = serialize(project).get("processingIssues", 0)
         return context
 
-    def has_permission(self, request: Request, organization: Organization, project: Project, *args: Any, **kwargs: Any) -> bool:  # type: ignore[override]
+    def has_permission(self, request: HttpRequest, organization: Organization, project: Project, *args: Any, **kwargs: Any) -> bool:  # type: ignore[override]
         if project is None:
             return False
         rv = super().has_permission(request, organization)
@@ -629,7 +631,7 @@ class ProjectView(OrganizationView):
             return False
         return True
 
-    def convert_args(self, request: Request, organization_slug: str, project_slug: str, *args: Any, **kwargs: Any) -> tuple[tuple[Any, ...], dict[str, Any]]:  # type: ignore[override]
+    def convert_args(self, request: HttpRequest, organization_slug: str, project_slug: str, *args: Any, **kwargs: Any) -> tuple[tuple[Any, ...], dict[str, Any]]:  # type: ignore[override]
         organization: Organization | None = None
         active_project: Project | None = None
         if self.active_organization:
@@ -649,7 +651,7 @@ class ProjectView(OrganizationView):
 class AvatarPhotoView(View):
     model: type[AvatarBase]
 
-    def get(self, request: Request, *args: Any, **kwargs: Any) -> HttpResponse:
+    def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
         avatar_id = kwargs["avatar_id"]
         try:
             avatar = self.model.objects.get(ident=avatar_id)

+ 4 - 4
src/sentry/web/frontend/debug/debug_assigned_email.py

@@ -1,4 +1,4 @@
-from rest_framework.request import Request
+from django.http import HttpRequest
 
 from sentry.types.activity import ActivityType
 
@@ -6,7 +6,7 @@ from .mail import ActivityMailDebugView
 
 
 class DebugAssignedEmailView(ActivityMailDebugView):
-    def get_activity(self, request: Request, event):
+    def get_activity(self, request: HttpRequest, event):
         return {
             "type": ActivityType.ASSIGNED.value,
             "user_id": request.user.id,
@@ -19,7 +19,7 @@ class DebugAssignedEmailView(ActivityMailDebugView):
 
 
 class DebugSelfAssignedEmailView(ActivityMailDebugView):
-    def get_activity(self, request: Request, event):
+    def get_activity(self, request: HttpRequest, event):
         return {
             "type": ActivityType.ASSIGNED.value,
             "user_id": request.user.id,
@@ -32,7 +32,7 @@ class DebugSelfAssignedEmailView(ActivityMailDebugView):
 
 
 class DebugSelfAssignedTeamEmailView(ActivityMailDebugView):
-    def get_activity(self, request: Request, event):
+    def get_activity(self, request: HttpRequest, event):
         return {
             "type": ActivityType.ASSIGNED.value,
             "user_id": request.user.id,

+ 3 - 4
src/sentry/web/frontend/debug/debug_auth_views.py

@@ -1,13 +1,12 @@
-from django.http import HttpResponse
+from django.http import HttpRequest, HttpResponse
 from django.views.generic import View
-from rest_framework.request import Request
 
 from sentry.models import User
 from sentry.web.helpers import render_to_response
 
 
 class DebugAuthConfirmIdentity(View):
-    def get(self, request: Request) -> HttpResponse:
+    def get(self, request: HttpRequest) -> HttpResponse:
         auth_identity = {"id": "bar@example.com", "email": "bar@example.com"}
         return render_to_response(
             "sentry/auth-confirm-identity.html",
@@ -23,7 +22,7 @@ class DebugAuthConfirmIdentity(View):
 
 
 class DebugAuthConfirmLink(View):
-    def get(self, request: Request) -> HttpResponse:
+    def get(self, request: HttpRequest) -> HttpResponse:
         auth_identity = {"id": "bar@example.com", "email": "bar@example.com"}
         return render_to_response(
             "sentry/auth-confirm-link.html",

+ 2 - 3
src/sentry/web/frontend/debug/debug_chart_renderer.py

@@ -1,6 +1,5 @@
-from django.http import HttpResponse
+from django.http import HttpRequest, HttpResponse
 from django.views.generic import View
-from rest_framework.request import Request
 
 from sentry.charts import backend as charts
 from sentry.charts.types import ChartType
@@ -521,7 +520,7 @@ crash_free_metric_alert = {
 
 
 class DebugChartRendererView(View):
-    def get(self, request: Request) -> HttpResponse:
+    def get(self, request: HttpRequest) -> HttpResponse:
         ret = []
 
         ret.append(

+ 2 - 3
src/sentry/web/frontend/debug/debug_codeowners_auto_sync_failure_email.py

@@ -1,6 +1,5 @@
+from django.http import HttpRequest, HttpResponse
 from django.views.generic import View
-from rest_framework.request import Request
-from rest_framework.response import Response
 
 from sentry.models import Organization, OrganizationMember, Project, User
 from sentry.notifications.notifications.codeowners_auto_sync import AutoSyncNotification
@@ -9,7 +8,7 @@ from .mail import render_preview_email_for_notification
 
 
 class DebugCodeOwnersAutoSyncFailureView(View):
-    def get(self, request: Request) -> Response:
+    def get(self, request: HttpRequest) -> HttpResponse:
         org = Organization(id=1, slug="petal", name="Petal")
         project = Project(id=1, slug="nodejs", name="Node.js", organization=org)
         user = User(name="Nisanthan", actor_id=1)

+ 2 - 3
src/sentry/web/frontend/debug/debug_error_embed.py

@@ -1,9 +1,8 @@
 from urllib.parse import urlencode
 
 from django.conf import settings
-from django.http import HttpResponse
+from django.http import HttpRequest, HttpResponse
 from django.views.generic import View
-from rest_framework.request import Request
 
 from sentry.models import ProjectKey
 from sentry.web.helpers import render_to_response
@@ -13,7 +12,7 @@ class DebugErrorPageEmbedView(View):
     def _get_project_key(self):
         return ProjectKey.objects.filter(project=settings.SENTRY_PROJECT)[0]
 
-    def get(self, request: Request) -> HttpResponse:
+    def get(self, request: HttpRequest) -> HttpResponse:
         context = {
             "query_params": urlencode(
                 {

+ 2 - 3
src/sentry/web/frontend/debug/debug_incident_activity_email.py

@@ -1,6 +1,5 @@
+from django.http import HttpRequest, HttpResponse
 from django.views.generic import View
-from rest_framework.request import Request
-from rest_framework.response import Response
 
 from sentry.incidents.models import Incident, IncidentActivity, IncidentActivityType
 from sentry.incidents.tasks import generate_incident_activity_email
@@ -11,7 +10,7 @@ from .mail import MailPreview
 
 
 class DebugIncidentActivityEmailView(View):
-    def get(self, request: Request) -> Response:
+    def get(self, request: HttpRequest) -> HttpResponse:
         organization = Organization(slug="myorg")
         user = User(id=1235, name="Hello There", actor_id=1)
         incident = Incident(

+ 2 - 3
src/sentry/web/frontend/debug/debug_invalid_identity_email.py

@@ -1,6 +1,5 @@
+from django.http import HttpRequest, HttpResponse
 from django.views.generic import View
-from rest_framework.request import Request
-from rest_framework.response import Response
 
 from sentry.tasks.commits import generate_invalid_identity_email
 from social_auth.models import UserSocialAuth
@@ -9,7 +8,7 @@ from .mail import MailPreview
 
 
 class DebugInvalidIdentityEmailView(View):
-    def get(self, request: Request) -> Response:
+    def get(self, request: HttpRequest) -> HttpResponse:
         identity = UserSocialAuth(user=request.user, provider="dummy")
 
         email = generate_invalid_identity_email(identity=identity)

+ 2 - 3
src/sentry/web/frontend/debug/debug_mfa_added_email.py

@@ -1,8 +1,7 @@
 import datetime
 
+from django.http import HttpRequest, HttpResponse
 from django.views.generic import View
-from rest_framework.request import Request
-from rest_framework.response import Response
 
 from sentry.models import Authenticator
 from sentry.security.emails import generate_security_email
@@ -11,7 +10,7 @@ from .mail import MailPreview
 
 
 class DebugMfaAddedEmailView(View):
-    def get(self, request: Request) -> Response:
+    def get(self, request: HttpRequest) -> HttpResponse:
         authenticator = Authenticator(id=0, type=3, user=request.user)  # u2f
 
         email = generate_security_email(

Some files were not shown because too many files changed in this diff