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 # )