import base64 import json from io import BytesIO from PIL import Image from django.contrib.auth import login, logout from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib import messages from django.http import JsonResponse from django.shortcuts import render, redirect, get_object_or_404 from django.urls import reverse from markdownx.utils import markdownify from web.forms import SignupForm, ThreadPostForm, EditProfileForm from web.models.forum_subcategory import ForumSubcategory from web.models.forum_post import ForumPost from web.models.custom_user import CustomUser # def send_email(subject, body, recipients=None): # if not recipients: # recipients = [x[0] for x in CustomUser.objects.filter(is_superuser=True).all().values_list('email') if x[0] != ''] # send_mail(subject, body, 'domdit@gmail.com', recipients, fail_silently=False) def is_member(user): if user.is_authenticated: return user.groups.filter(name='Member').exists() return False # def test_endpoint(request): # send_email('this is a subject', 'this is a body') # return render(request, 'index.html') # ACCOUNT MANAGEMENT ###################################### def signup(request): if request.method == 'POST': form = SignupForm(request.POST) if form.is_valid(): user = form.save() login(request, user) messages.success(request, "You have successfully applied for membership, we will review your submission and send you an email once we have added you as a member! In the meantime, please start setting up the webring widget on your website!") return redirect(reverse('login')) else: form = SignupForm() context = { 'form': form } return render(request, 'signup.html', context) def denied(request): messages.warning(request, "You are not a member yet and cannot access the member site. Please wait for an admin to add you. If you have waited a long time, please send an email to domdit@gmail.com") return redirect(reverse('login')) @login_required @user_passes_test(is_member, login_url='/accounts/denied/') def custom_logout(request): logout(request) return redirect(reverse('login')) @login_required @user_passes_test(is_member, login_url='/accounts/denied/') def profile(request): if request.method == 'POST': form = EditProfileForm(request.POST) if form.is_valid(): if request.FILES: avatar_size = 200, 200 image = Image.open(request.FILES['avatar']) image.thumbnail(avatar_size, Image.Resampling.LANCZOS) buffered = BytesIO() image.save(buffered, format="png") img_str = base64.b64encode(buffered.getvalue()) img_base64 = bytes("data:image/png;base64,", encoding='utf-8') + img_str request.user.avatar = img_base64.decode('utf-8') request.user.description = request.POST['description'] request.user.url = request.POST['url'] request.user.save() form = EditProfileForm() context = { 'user': request.user, 'form': form, } return render(request, 'profile.html', context) @login_required @user_passes_test(is_member, login_url='/accounts/denied/') def user_profile(request, user_id): context = { 'user': get_object_or_404(CustomUser, pk=user_id), } return render(request, 'user.html', context) # FORUM ################################################### @login_required @user_passes_test(is_member, login_url='/accounts/denied/') def forum_threads(request): parsed_forum_threads = {} forum_subcategories = ForumSubcategory.objects.filter(active=True).order_by('created_at').order_by('-sticky').all() for forum_subcategory in forum_subcategories: if forum_subcategory.forum_category.title not in parsed_forum_threads: parsed_forum_threads[forum_subcategory.forum_category.title] = [] data = { 'id': forum_subcategory.id, 'title': forum_subcategory.title, 'description': forum_subcategory.description, 'post_count': len(forum_subcategory.posts.all()), 'most_recent_poster': forum_subcategory.posts.first().created_by if forum_subcategory.posts.first() else 'admin', 'most_recent_post_date': forum_subcategory.posts.first().created_at if forum_subcategory.posts.first() else forum_subcategory.created_at, } parsed_forum_threads[forum_subcategory.forum_category.title].append(data) context = { 'threads': parsed_forum_threads } return render(request, 'forum_threads.html', context) @login_required @user_passes_test(is_member, login_url='/accounts/denied/') def thread(request, thread_id): thread = get_object_or_404(ForumSubcategory, pk=thread_id) if request.method == 'POST': anonymous = False form = ThreadPostForm(request.POST) if form.is_valid(): if 'anonymous' in form.data: if form.data['anonymous'] == 'on': anonymous = True post = ForumPost( content=markdownify(form.data['content']), forum_subcategory=thread, created_by=CustomUser.objects.filter(username='Anonymous').first() if anonymous else request.user, edited=False, sticky=False, ) post.save() form = ThreadPostForm() posts = ForumPost.objects.filter(forum_subcategory=thread).all() context = { 'can_be_anon': thread.can_by_anon, 'thread_name': thread.title, 'thread_category': thread.forum_category.title, 'posts': posts, 'form': form } return render(request, 'thread.html', context) # API ############################################## def users(request): parsed_users = {'users': []} admin_only = request.GET.get('admin', False) users = CustomUser.objects.filter(is_active=True).filter(groups__name='Member') if admin_only == 'true': users = users.filter(is_superuser=True) users = users.all().values('username', 'description', 'url') for user in users: parsed_users['users'].append(user) return JsonResponse(parsed_users)