From 75511b96d14fb70c3c87d7b95a4d713cc6432c02 Mon Sep 17 00:00:00 2001 From: Dominic DiTaranto Date: Sun, 16 Nov 2025 17:40:38 -0500 Subject: [PATCH] adding user management --- TODO.txt | 14 +-------- cwr/urls.py | 17 +++++++++-- web/templates/user_management.html | 34 ++++++++++++++++++++++ web/views.py | 46 ++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 web/templates/user_management.html diff --git a/TODO.txt b/TODO.txt index b7b8bf6..5e555e2 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,4 +1,5 @@ v1.1 +[ ] get stickies working [ ] polls [ ] watch forum, get email notifications when someone replies [ ] @ replies? @@ -7,19 +8,6 @@ v1.1 [ ] chat room? IRC? ACTION ITEMS: -DOMINIC --- -[x] join option without member area access -[x] NAV BAR -[x] list user api endpoint -[x] CSS -[x] Assets -[x] Pick better anonymous avatar -[x] figure out backing up DB -[x] soft-release -[x] GET Domain -[ ] email notifications when user signs up: disroot email -[ ] maybe start sending emails to users automatically too -[ ] full-release KYRIE ---- [x] Welcome message diff --git a/cwr/urls.py b/cwr/urls.py index dfc4f26..76db28a 100644 --- a/cwr/urls.py +++ b/cwr/urls.py @@ -1,15 +1,28 @@ from django.contrib import admin from django.urls import path, include -from web.views import signup, forum_threads, thread, custom_logout, profile, user_profile, denied, users, code_of_ethics, test_email +from web.views import ( + signup, + forum_threads, + thread, + custom_logout, + profile, + user_profile, + denied, + users, + code_of_ethics, + # test_email, + manage_users +) urlpatterns = [ path('markdownx/', include('markdownx.urls')), path('admin/', admin.site.urls), path('api/users/', users, name='users'), path("accounts/", include("django.contrib.auth.urls")), - path("accounts/signup/", signup, name="signup"), path("accounts/profile/", profile, name="profile"), + path("accounts/signup/", signup, name="signup"), + path('accounts/user_management/', manage_users, name="user_management"), path("accounts/user/", user_profile, name="user"), path("accounts/denied/", denied, name="denied"), path("code_of_ethics", code_of_ethics, name="code_of_ethics"), diff --git a/web/templates/user_management.html b/web/templates/user_management.html new file mode 100644 index 0000000..db1777f --- /dev/null +++ b/web/templates/user_management.html @@ -0,0 +1,34 @@ + +{% extends "base.html" %} +{% block content %} + + + + + + + + + + {% for user in parsed_users %} + + + + + + + + + {% endfor %} +
User IDUserNameUser EmailUser WebsiteIs MemberActions
{{ user.id }}{{ user.username }}{{ user.email }} + link + {{ user.is_member }} +
+ {% csrf_token %} + + + + +
+
+{% endblock %} diff --git a/web/views.py b/web/views.py index 0a1e163..5abdf02 100644 --- a/web/views.py +++ b/web/views.py @@ -3,6 +3,7 @@ from io import BytesIO from PIL import Image from django.contrib.auth import login, logout +from django.contrib.auth.models import Group from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib import messages from django.core.mail import send_mail @@ -16,6 +17,7 @@ from web.models.forum_subcategory import ForumSubcategory from web.models.forum_post import ForumPost from web.models.custom_user import CustomUser + def test_email(request): send_mail( subject='test email', @@ -37,12 +39,19 @@ def send_email(subject, message, recipients=None): ) +def is_superuser(user): + if user.is_authenticated: + return user.is_superuser + return False + + def is_member(user): if user.is_authenticated: return user.groups.filter(name='Member').exists() return False + # ACCOUNT MANAGEMENT ###################################### def signup(request): if request.method == 'POST': @@ -128,6 +137,43 @@ def code_of_ethics(request): return render(request, 'code_of_ethics.html') +# ADMIN UTILS ############################################# + +@login_required +@user_passes_test(is_superuser, login_url='/accounts/denied/') +def manage_users(request): + context = {} + + if request.method == 'POST': + if 'make_member' in request.POST: + user_id = request.POST.get('make_member') + user = CustomUser.objects.filter(id=user_id).first() + member_group = Group.objects.get(name='Member') + user.groups.add(member_group) + send_email( + subject='Christian Webring - You have been added as a member!', + message=f'Hello {user.username},\n\nYou have been added as a member to the christian webring, please login here: https://members.christian-webring.org \n\n Thanks, \n the Christian Webring Team', + recipients=[user.email] + ) + messages.success(request, f"You added {user.username} as a member!") + + non_members = [] + members = [] + users = CustomUser.objects.all() + for user in users: + if user.groups.filter(name='Member').exists(): + user.is_member = True + members.append(user) + else: + user.is_member = False + non_members.append(user) + + non_members.extend(members) + + context['parsed_users'] = non_members + + return render(request, 'user_management.html', context) + # FORUM ################################################### @login_required @user_passes_test(is_member, login_url='/accounts/denied/')