adding user management
This commit is contained in:
parent
f27769e177
commit
75511b96d1
4 changed files with 96 additions and 15 deletions
14
TODO.txt
14
TODO.txt
|
|
@ -1,4 +1,5 @@
|
||||||
v1.1
|
v1.1
|
||||||
|
[ ] get stickies working
|
||||||
[ ] polls
|
[ ] polls
|
||||||
[ ] watch forum, get email notifications when someone replies
|
[ ] watch forum, get email notifications when someone replies
|
||||||
[ ] @ replies?
|
[ ] @ replies?
|
||||||
|
|
@ -7,19 +8,6 @@ v1.1
|
||||||
[ ] chat room? IRC?
|
[ ] chat room? IRC?
|
||||||
|
|
||||||
ACTION ITEMS:
|
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 ----
|
KYRIE ----
|
||||||
[x] Welcome message
|
[x] Welcome message
|
||||||
|
|
|
||||||
17
cwr/urls.py
17
cwr/urls.py
|
|
@ -1,15 +1,28 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path, include
|
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 = [
|
urlpatterns = [
|
||||||
path('markdownx/', include('markdownx.urls')),
|
path('markdownx/', include('markdownx.urls')),
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
path('api/users/', users, name='users'),
|
path('api/users/', users, name='users'),
|
||||||
path("accounts/", include("django.contrib.auth.urls")),
|
path("accounts/", include("django.contrib.auth.urls")),
|
||||||
path("accounts/signup/", signup, name="signup"),
|
|
||||||
path("accounts/profile/", profile, name="profile"),
|
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_id>", user_profile, name="user"),
|
path("accounts/user/<user_id>", user_profile, name="user"),
|
||||||
path("accounts/denied/", denied, name="denied"),
|
path("accounts/denied/", denied, name="denied"),
|
||||||
path("code_of_ethics", code_of_ethics, name="code_of_ethics"),
|
path("code_of_ethics", code_of_ethics, name="code_of_ethics"),
|
||||||
|
|
|
||||||
34
web/templates/user_management.html
Normal file
34
web/templates/user_management.html
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>User ID</th>
|
||||||
|
<th>UserName</th>
|
||||||
|
<th>User Email</th>
|
||||||
|
<th>User Website</th>
|
||||||
|
<th>Is Member</th>
|
||||||
|
<th>Actions</th>
|
||||||
|
</tr>
|
||||||
|
{% for user in parsed_users %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ user.id }}</td>
|
||||||
|
<td>{{ user.username }}</td>
|
||||||
|
<td>{{ user.email }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{ user.url }}">link</a>
|
||||||
|
</td>
|
||||||
|
<td>{{ user.is_member }}</td>
|
||||||
|
<td>
|
||||||
|
<form method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<a href="{% url 'admin:web_customuser_change' user.id %}">
|
||||||
|
<button>View Details</button>
|
||||||
|
</a>
|
||||||
|
<button type="submit" value="{{ user.id }}" name='make_member'>Make Member</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
{% endblock %}
|
||||||
46
web/views.py
46
web/views.py
|
|
@ -3,6 +3,7 @@ from io import BytesIO
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
from django.contrib.auth import login, logout
|
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.auth.decorators import login_required, user_passes_test
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.core.mail import send_mail
|
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.forum_post import ForumPost
|
||||||
from web.models.custom_user import CustomUser
|
from web.models.custom_user import CustomUser
|
||||||
|
|
||||||
|
|
||||||
def test_email(request):
|
def test_email(request):
|
||||||
send_mail(
|
send_mail(
|
||||||
subject='test email',
|
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):
|
def is_member(user):
|
||||||
if user.is_authenticated:
|
if user.is_authenticated:
|
||||||
return user.groups.filter(name='Member').exists()
|
return user.groups.filter(name='Member').exists()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ACCOUNT MANAGEMENT ######################################
|
# ACCOUNT MANAGEMENT ######################################
|
||||||
def signup(request):
|
def signup(request):
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
|
|
@ -128,6 +137,43 @@ def code_of_ethics(request):
|
||||||
return render(request, 'code_of_ethics.html')
|
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 ###################################################
|
# FORUM ###################################################
|
||||||
@login_required
|
@login_required
|
||||||
@user_passes_test(is_member, login_url='/accounts/denied/')
|
@user_passes_test(is_member, login_url='/accounts/denied/')
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue