Plain is headed towards 1.0! Subscribe for development updates →

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