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