diff --git a/backlogger/admin.py b/backlogger/admin.py index c7f6669..ee5b334 100644 --- a/backlogger/admin.py +++ b/backlogger/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from django.contrib.auth.models import User from .models import Item @@ -7,3 +9,14 @@ class ItemAdmin(admin.ModelAdmin): list_display = ['name', 'category', 'progress_percent', 'favorite', 'created_at'] list_filter = ['category', 'favorite'] search_fields = ['name'] + + +admin.site.unregister(User) + + +@admin.register(User) +class CustomUserAdmin(UserAdmin): + list_display = ['username', 'email', 'is_active', 'date_joined'] + list_editable = ['is_active'] + list_filter = ['is_active'] + ordering = ['date_joined'] diff --git a/backlogger/forms.py b/backlogger/forms.py index 674c78e..351ac85 100644 --- a/backlogger/forms.py +++ b/backlogger/forms.py @@ -1,7 +1,17 @@ from django import forms +from django.contrib.auth.forms import UserCreationForm +from django.contrib.auth.models import User from .models import Item +class SignupForm(UserCreationForm): + email = forms.EmailField(required=True) + + class Meta: + model = User + fields = ['username', 'email', 'password1', 'password2'] + + class ItemForm(forms.ModelForm): progress_percent = forms.FloatField( min_value=0, diff --git a/backlogger/templates/backlogger/login.html b/backlogger/templates/backlogger/login.html index fe4df84..19c5e9b 100644 --- a/backlogger/templates/backlogger/login.html +++ b/backlogger/templates/backlogger/login.html @@ -89,7 +89,13 @@

Backlogger

{% if form.non_field_errors %} -
Invalid username or password.
+ {% for error in form.non_field_errors %} + {% if 'inactive' in error|lower or 'active' in error|lower %} +
Your account is pending approval. You'll be able to log in once it's activated.
+ {% else %} +
Invalid username or password.
+ {% endif %} + {% endfor %} {% endif %}
@@ -109,6 +115,9 @@
+

+ No account? Sign up +

diff --git a/backlogger/templates/backlogger/signup.html b/backlogger/templates/backlogger/signup.html new file mode 100644 index 0000000..ac7b90d --- /dev/null +++ b/backlogger/templates/backlogger/signup.html @@ -0,0 +1,117 @@ + + + + + + Sign up — Backlogger + + + +
+ killmybacklog.com +

Create an account

+ +
+ {% csrf_token %} + +
+ + {{ form.username }} + {{ form.username.errors }} +
+ +
+ + {{ form.email }} + {{ form.email.errors }} +
+ +
+ + {{ form.password1 }} + {{ form.password1.errors }} +
+ +
+ + {{ form.password2 }} + {{ form.password2.errors }} +
+ + +
+

+ Already have an account? Log in +

+
+ + diff --git a/backlogger/templates/backlogger/signup_pending.html b/backlogger/templates/backlogger/signup_pending.html new file mode 100644 index 0000000..65a450b --- /dev/null +++ b/backlogger/templates/backlogger/signup_pending.html @@ -0,0 +1,51 @@ + + + + + + Account requested — Backlogger + + + +
+ killmybacklog.com +
+

Account requested

+

Your account is pending approval.
You'll receive access once it's activated.

+

Back to log in

+
+ + diff --git a/backlogger/views.py b/backlogger/views.py index 75ea047..90c09b8 100644 --- a/backlogger/views.py +++ b/backlogger/views.py @@ -1,7 +1,20 @@ from django.contrib.auth.decorators import login_required from django.shortcuts import render, get_object_or_404, redirect from .models import Item -from .forms import ItemForm +from .forms import ItemForm, SignupForm + + +def signup(request): + if request.method == 'POST': + form = SignupForm(request.POST) + if form.is_valid(): + user = form.save(commit=False) + user.is_active = False + user.save() + return render(request, 'backlogger/signup_pending.html') + else: + form = SignupForm() + return render(request, 'backlogger/signup.html', {'form': form}) SORT_MAP = { diff --git a/kboris/urls.py b/kboris/urls.py index c5c6a03..ae98541 100644 --- a/kboris/urls.py +++ b/kboris/urls.py @@ -1,11 +1,13 @@ from django.contrib import admin from django.contrib.auth import views as auth_views from django.urls import path, include +from backlogger.views import signup urlpatterns = [ path('admin/', admin.site.urls), path('accounts/login/', auth_views.LoginView.as_view(template_name='backlogger/login.html'), name='login'), path('accounts/logout/', auth_views.LogoutView.as_view(), name='logout'), + path('accounts/signup/', signup, name='signup'), path('backlogger/', include('backlogger.urls')), path('daily-stone/', include('dailystone.urls')), path('', include('core.urls')),