Plain is headed towards 1.0! Subscribe for development updates →

 1import logging
 2
 3from plain.auth.requests import get_request_user
 4from plain.auth.views import AuthViewMixin
 5from plain.http import Response, ResponseRedirect
 6from plain.views import TemplateView, View
 7
 8from .exceptions import (
 9    OAuthError,
10)
11from .providers import get_oauth_provider_instance
12
13logger = logging.getLogger(__name__)
14
15
16class OAuthLoginView(View):
17    def post(self) -> Response:
18        request = self.request
19        provider = self.url_kwargs["provider"]
20        if get_request_user(request):
21            return ResponseRedirect("/")
22
23        provider_instance = get_oauth_provider_instance(provider_key=provider)
24        return provider_instance.handle_login_request(request=request)
25
26
27class OAuthCallbackView(TemplateView):
28    """
29    The callback view is used for signup, login, and connect.
30    """
31
32    template_name = "oauth/callback.html"
33
34    def get(self) -> Response:
35        provider = self.url_kwargs["provider"]
36        provider_instance = get_oauth_provider_instance(provider_key=provider)
37        try:
38            return provider_instance.handle_callback_request(request=self.request)
39        except OAuthError as e:
40            logger.exception("OAuth error")
41            self.oauth_error = e
42
43            response = super().get()
44            response.status_code = 400
45            return response
46
47    def get_template_context(self) -> dict:
48        context = super().get_template_context()
49        context["oauth_error"] = getattr(self, "oauth_error", None)
50        return context
51
52
53class OAuthConnectView(AuthViewMixin, View):
54    def post(self) -> Response:
55        request = self.request
56        provider = self.url_kwargs["provider"]
57        provider_instance = get_oauth_provider_instance(provider_key=provider)
58        return provider_instance.handle_connect_request(request=request)
59
60
61class OAuthDisconnectView(AuthViewMixin, View):
62    def post(self) -> Response:
63        request = self.request
64        provider = self.url_kwargs["provider"]
65        provider_instance = get_oauth_provider_instance(provider_key=provider)
66        # try:
67        return provider_instance.handle_disconnect_request(request=request)
68        # except OAuthCannotDisconnectError:
69        #     return render(
70        #         request,
71        #         "oauth/error.html",
72        #         {
73        #             "oauth_error": "This connection can't be removed. You must have a usable password or at least one active connection."
74        #         },
75        #         status_code=400,
76        #     )