Source code for accounts.views.api

from django.contrib import auth
from django.contrib.sessions.backends.db import SessionStore
from django.contrib.sessions.models import Session
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from fcm_django.models import FCMDevice

from accounts.models import User, UnregisteredUser
from cobalt.settings import ALL_SYSTEM_ACCOUNTS
from masterpoints.views import search_mpc_users_by_name


[docs] def create_user_session_id(user): """Create a new session for a user. Used by the mobile API when we register a new device so it can login the webpage view using only the session_id and doesn't need to come in through the login page. """ # Create new session for user session = SessionStore(None) session.clear() session.cycle_key() session[auth.SESSION_KEY] = user._meta.pk.value_to_string(user) session[auth.BACKEND_SESSION_KEY] = "accounts.backend.CobaltBackend" session[auth.HASH_SESSION_KEY] = user.get_session_auth_hash() session.save() return session.session_key
[docs] def delete_fcm_device_ajax(request): """Ajax call to delete an FCM device""" device_id = request.GET.get("device_id") device = get_object_or_404(FCMDevice, id=device_id) if device.user != request.user: response_data = {"message": "Error. This is not your device."} return JsonResponse({"data": response_data}) device.delete() response_data = {"message": "Success"} return JsonResponse({"data": response_data})
[docs] def delete_session_ajax(request): """Ajax call to delete a session""" session_id = request.GET.get("session_id") session = get_object_or_404(Session, pk=session_id) if ( "_auth_user_id" in session.get_decoded() and int(session.get_decoded()["_auth_user_id"]) == request.user.id ): session.delete() response_data = {"message": "Success"} else: response_data = {"message": "Error. No matching session found."} return JsonResponse({"data": response_data})
[docs] def search_for_user_in_cobalt_and_mpc( first_name_search, last_name_search, last_name_only=False ): """Search for a user in Cobalt or MPC If last_name_only is specified the MPC serach will be on last name only. This is useful if the provided first name is the prefered name (eg Jack versus John) """ # Cobalt registered users registered_users = User.objects.exclude(pk__in=ALL_SYSTEM_ACCOUNTS) if first_name_search: registered_users = registered_users.filter( first_name__istartswith=first_name_search ) if last_name_search: registered_users = registered_users.filter( last_name__istartswith=last_name_search ) registered_users = registered_users[:11] # Cobalt unregistered users un_registered_users = UnregisteredUser.objects.all() if first_name_search: un_registered_users = un_registered_users.filter( first_name__istartswith=first_name_search ) if last_name_search: un_registered_users = un_registered_users.filter( last_name__istartswith=last_name_search ) un_registered_users = un_registered_users[:11] # Masterpoints Centre if last_name_only: mpc_users = search_mpc_users_by_name(None, last_name_search.replace("'", "''")) else: mpc_users = search_mpc_users_by_name( first_name_search.replace("'", "''"), last_name_search.replace("'", "''") ) # Combine the lists user_list = [] already_present = [] for registered_user in registered_users[:10]: if registered_user.system_number not in already_present: user_list.append( { "system_number": registered_user.system_number, "first_name": registered_user.first_name, "last_name": registered_user.last_name, "home_club": None, "source": "registered", } ) already_present.append(registered_user.system_number) for un_registered_user in un_registered_users[:10]: if un_registered_user.system_number not in already_present: user_list.append( { "system_number": un_registered_user.system_number, "first_name": un_registered_user.first_name, "last_name": un_registered_user.last_name, "mpc_email": None, "home_club": None, "source": "unregistered", } ) already_present.append(un_registered_user.system_number) # A user might not be in the top 11 of registered or unregistered users, but could still be in the top # 11 of MPC users, in which case they will be reported incorrectly # There can be no overlap between registered and unregistered, so just double check the MPC ones check_user_list = [mpc_user["ABFNumber"] for mpc_user in mpc_users[:10]] # Check real users really_registered = User.objects.filter(system_number__in=check_user_list) for registered_user in really_registered: if registered_user.system_number not in already_present: user_list.append( { "system_number": registered_user.system_number, "first_name": registered_user.first_name, "last_name": registered_user.last_name, "home_club": None, "source": "registered", } ) already_present.append(registered_user.system_number) # Check real un_registered really_un_registered = UnregisteredUser.objects.filter( system_number__in=check_user_list ) for un_registered_user in really_un_registered[:10]: if un_registered_user.system_number not in already_present: user_list.append( { "system_number": un_registered_user.system_number, "first_name": un_registered_user.first_name, "last_name": un_registered_user.last_name, # "mpc_email": un_registered_user.email, "home_club": None, "source": "unregistered", } ) already_present.append(un_registered_user.system_number) for mpc_user in mpc_users[:10]: if int(mpc_user["ABFNumber"]) not in already_present: user_list.append( { "system_number": mpc_user["ABFNumber"], "first_name": mpc_user["GivenNames"], "last_name": mpc_user["Surname"], "home_club": mpc_user["ClubName"], "mpc_email": mpc_user["EmailAddress"], "source": "mpc", } ) # Sort user_list = sorted(user_list, key=lambda d: d["first_name"]) # Check if we have more data anywhere. We ask for 11 but only use 10 if ( len(registered_users) > 10 or len(un_registered_users) > 10 or len(mpc_users) > 10 ): more_data = True else: more_data = False return user_list, more_data