summaryrefslogtreecommitdiffstats
path: root/users/views
diff options
context:
space:
mode:
Diffstat (limited to 'users/views')
-rw-r--r--users/views/admin.py5
-rw-r--r--users/views/auth.py81
2 files changed, 86 insertions, 0 deletions
diff --git a/users/views/admin.py b/users/views/admin.py
index d7f23e8..93bf4ec 100644
--- a/users/views/admin.py
+++ b/users/views/admin.py
@@ -62,6 +62,10 @@ class BasicPage(AdminSettingsPage):
"title": "Site Banner",
"help_text": "Must be at least 650px wide. 3:1 ratio of width:height recommended.",
},
+ "identity_max_per_user": {
+ "title": "Maximum Identities Per User",
+ "help_text": "Non-admins will be blocked from creating more than this",
+ },
}
layout = {
@@ -73,6 +77,7 @@ class BasicPage(AdminSettingsPage):
"highlight_color",
],
"Posts": ["post_length"],
+ "Identities": ["identity_max_per_user"],
}
diff --git a/users/views/auth.py b/users/views/auth.py
index 1acf920..7d4040b 100644
--- a/users/views/auth.py
+++ b/users/views/auth.py
@@ -1,4 +1,10 @@
+from django import forms
+from django.contrib.auth.password_validation import validate_password
from django.contrib.auth.views import LoginView, LogoutView
+from django.shortcuts import get_object_or_404, render
+from django.views.generic import FormView
+
+from users.models import PasswordReset, User
class Login(LoginView):
@@ -8,3 +14,78 @@ class Login(LoginView):
class Logout(LogoutView):
pass
+
+
+class Signup(FormView):
+
+ template_name = "auth/signup.html"
+
+ class form_class(forms.Form):
+
+ email = forms.EmailField(
+ help_text="We will send a link to this email to set your password and create your account",
+ )
+
+ def clean_email(self):
+ email = self.cleaned_data.get("email").lower()
+ if not email:
+ return
+ if User.objects.filter(email=email).exists():
+ raise forms.ValidationError("This email already has an account")
+ return email
+
+ def form_valid(self, form):
+ user = User.objects.create(email=form.cleaned_data["email"])
+ PasswordReset.create_for_user(user)
+ return render(
+ self.request,
+ "auth/signup_success.html",
+ {"email": user.email},
+ )
+
+
+class Reset(FormView):
+
+ template_name = "auth/reset.html"
+
+ class form_class(forms.Form):
+
+ password = forms.CharField(
+ widget=forms.PasswordInput,
+ help_text="Must be at least 8 characters, and contain both letters and numbers.",
+ )
+
+ repeat_password = forms.CharField(
+ widget=forms.PasswordInput,
+ )
+
+ def clean_password(self):
+ password = self.cleaned_data["password"]
+ validate_password(password)
+ return password
+
+ def clean_repeat_password(self):
+ if self.cleaned_data.get("password") != self.cleaned_data.get(
+ "repeat_password"
+ ):
+ raise forms.ValidationError("Passwords do not match")
+ return self.cleaned_data.get("repeat_password")
+
+ def dispatch(self, request, token):
+ self.reset = get_object_or_404(PasswordReset, token=token)
+ return super().dispatch(request)
+
+ def form_valid(self, form):
+ self.reset.user.set_password(form.cleaned_data["password"])
+ self.reset.user.save()
+ self.reset.delete()
+ return render(
+ self.request,
+ "auth/reset_success.html",
+ {"email": self.reset.user.email},
+ )
+
+ def get_context_data(self, *args, **kwargs):
+ context = super().get_context_data(*args, **kwargs)
+ context["reset"] = self.reset
+ return context