diff options
Diffstat (limited to 'users/views')
-rw-r--r-- | users/views/admin.py | 5 | ||||
-rw-r--r-- | users/views/auth.py | 81 |
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 |