aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/home/views
diff options
context:
space:
mode:
authorGravatar Gareth Coles <[email protected]>2019-10-23 01:07:24 +0100
committerGravatar Gareth Coles <[email protected]>2019-10-23 01:07:24 +0100
commit49376a76289ab22f1aff55d8971b0ea198ec9316 (patch)
tree5ad08c22d37dcf2c922e3d15c9df5df435bbdf2f /pydis_site/apps/home/views
parentAdd role mapping migration I forgot to commit (diff)
Add user settings modal, with connections management and account deletion
Diffstat (limited to 'pydis_site/apps/home/views')
-rw-r--r--pydis_site/apps/home/views/account/settings.py48
1 files changed, 45 insertions, 3 deletions
diff --git a/pydis_site/apps/home/views/account/settings.py b/pydis_site/apps/home/views/account/settings.py
index ee9011da..84a2dea0 100644
--- a/pydis_site/apps/home/views/account/settings.py
+++ b/pydis_site/apps/home/views/account/settings.py
@@ -1,12 +1,20 @@
+from allauth.socialaccount.models import SocialAccount
+from allauth.socialaccount.providers import registry
from django.contrib.auth.mixins import LoginRequiredMixin
+from django.contrib.messages import ERROR, INFO, add_message
from django.http import HttpRequest, HttpResponse
-from django.shortcuts import render
+from django.shortcuts import redirect, render
from django.urls import reverse
from django.views import View
class SettingsView(LoginRequiredMixin, View):
- """Account settings view, for managing and deleting user accounts and connections."""
+ """
+ Account settings view, for managing and deleting user accounts and connections.
+
+ This view actually renders a template with a bare modal, and is intended to be
+ inserted into another template using JavaScript.
+ """
def __init__(self, *args, **kwargs):
self.login_url = reverse("home")
@@ -14,4 +22,38 @@ class SettingsView(LoginRequiredMixin, View):
def get(self, request: HttpRequest) -> HttpResponse:
"""HTTP GET: Return the view template."""
- return render(request, "home/account/settings.html")
+ context = {
+ "groups": request.user.groups.all(),
+
+ "discord": None,
+ "github": None,
+
+ "discord_provider": registry.provider_map.get("discord"),
+ "github_provider": registry.provider_map.get("github"),
+ }
+
+ for account in SocialAccount.objects.filter(user=request.user).all():
+ if account.provider == "discord":
+ context["discord"] = account
+
+ elif account.provider == "github":
+ context["github"] = account
+
+ return render(request, "home/account/settings.html", context=context)
+
+ def post(self, request: HttpRequest) -> HttpResponse:
+ """HTTP POST: Process account disconnections."""
+ provider = request.POST["provider"]
+
+ if provider == "github":
+ try:
+ account = SocialAccount.objects.get(user=request.user, provider=provider)
+ except SocialAccount.DoesNotExist:
+ add_message(request, ERROR, "You do not have a GitHub account linked.")
+ else:
+ account.delete()
+ add_message(request, INFO, "The social account has been disconnected.")
+ else:
+ add_message(request, ERROR, f"Unknown provider: {provider}")
+
+ return redirect(reverse("home"))