Source code for accounts.views.settings

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.sessions.models import Session
from django.http import HttpResponse
from django.shortcuts import render
from fcm_django.models import FCMDevice

from accounts.forms import UserSettingsForm
from accounts.models import APIToken, UnregisteredUser
from notifications.models import UnregisteredBlockedEmail
from notifications.views.user import notifications_in_english
from organisations.club_admin_core import (
    get_club_emails_for_system_number,
)
from rbac.core import rbac_user_has_role


[docs] @login_required def user_settings(request): """User settings form. Allow user to choose preferences Args: request - standard request object Returns: HttpResponse """ if request.method == "POST": form = UserSettingsForm(data=request.POST, instance=request.user) if form.is_valid(): form.save() message = "Settings saved" messages.success(request, message, extra_tags="cobalt-message-success") else: form = UserSettingsForm(instance=request.user) notifications_list = notifications_in_english(request.user) # Check if user is a developer. When we have more than one role we may need a better approach such as a specific # RBAC role for developers. is_developer = rbac_user_has_role(request.user, "notifications.realtime_send.edit") # If user has a registered FCM device, show them the option to send a test message fcm_devices = FCMDevice.objects.filter(user=request.user).order_by("-date_created") ################################################################################ # PERFORMANCE FOR THIS IS TERRIBLE! COMMENTING OUT FOR NOW - 2023-02-10 MARK # IT IS NOT AVAILABLE ON THE PAGE ANYWAY ################################################################################# # Get user sessions so they can manage them - maybe # all_sessions = Session.objects.all() # # session_list = [] # # for session in all_sessions: # if ( # "_auth_user_id" in session.get_decoded() # and int(session.get_decoded()["_auth_user_id"]) == request.user.id # ): # session_list.append(session) return render( request, "accounts/settings/user_settings.html", { "form": form, "notifications_list": notifications_list, "is_developer": is_developer, "fcm_devices": fcm_devices, # "sessions": session_list, # Comment out sessions for now "sessions": [], }, )
[docs] @login_required() def developer_settings_htmx(request): """Manage settings for developers. Built into the normal settings page""" if "add" in request.POST: APIToken(user=request.user).save() api_tokens = APIToken.objects.filter(user=request.user) return render( request, "accounts/developer/settings.html", {"api_tokens": api_tokens} )
[docs] @login_required() def developer_settings_delete_token_htmx(request): """Delete a token for a developer""" APIToken.objects.filter(pk=request.POST.get("token_id"), user=request.user).delete() api_tokens = APIToken.objects.filter(user=request.user) return render( request, "accounts/developer/settings.html", {"api_tokens": api_tokens} )
[docs] def unregistered_user_settings(request, identifier): """allow an unregistered user to control their email preferences""" unregistered = UnregisteredUser.objects.filter(identifier=identifier).first() if not unregistered: return HttpResponse("Invalid identifier") # get any other emails related to this user additional_email_set = set( get_club_emails_for_system_number(unregistered.system_number) ) # don't show if already blocked blocked_email_set = set( UnregisteredBlockedEmail.objects.filter( un_registered_user=unregistered ).values_list("email", flat=True) ) additional_emails = list(additional_email_set - blocked_email_set) if request.POST: email = request.POST.get("block_email") if not email: return HttpResponse("An error occurred") block, _ = UnregisteredBlockedEmail.objects.get_or_create( un_registered_user=unregistered, email=email ) block.save() return HttpResponse("Email removed. You will receive no further notifications.") return render( request, "accounts/settings/unregistered_user_settings.html", { "unregistered": unregistered, "additional_emails": additional_emails, }, )