diff --git a/gregui/api/views/userinfo.py b/gregui/api/views/userinfo.py index a16fe70caca461454a5b6df79e505d326e6f28a1..b2e17997d1c50815c546f824839438480e9f9425 100644 --- a/gregui/api/views/userinfo.py +++ b/gregui/api/views/userinfo.py @@ -3,13 +3,12 @@ from typing import ( Type, ) -from rest_framework import permissions from rest_framework.authentication import BaseAuthentication, SessionAuthentication from rest_framework.permissions import AllowAny, BasePermission from rest_framework.status import HTTP_403_FORBIDDEN from rest_framework.views import APIView from rest_framework.response import Response -from greg.models import Identity, InvitationLink +from greg.models import InvitationLink from gregui.models import GregUserProfile @@ -27,112 +26,77 @@ class UserInfoView(APIView): def get(self, request, format=None): """ - Get info about the visiting user + Get info about the visiting user. Works for users logged in using Feide, and those relying solely on an - invitation id. - - TODO: Can this be modified into a permission class to reduce clutter? + invitation id. Pure django users, and anonymous users are denied access. """ user = request.user invite_id = request.session.get("invite_id") - # Authenticated user, allow access - if user.is_authenticated: - user_profile = GregUserProfile.objects.get(user=user) - sponsor_id = None - person_id = None - if user_profile.sponsor: - sponsor_id = user_profile.sponsor.id - if user_profile.person: - person_id = user_profile.person.id - content = { - "feide_id": user_profile.userid_feide, - "sponsor_id": sponsor_id, - "person_id": person_id, - "roles": [], - } - person = user_profile.person - if person: - passports = person.identities.filter( - type=Identity.IdentityType.PASSPORT_NUMBER - ).first() + person = None + sponsor = None + content = { + "feide_id": None, + "sponsor_id": None, + "person_id": None, + "roles": [], + } + # Fetch sponsor and/or person object from profile of authenticated user + if user.is_authenticated: + try: + user_profile = GregUserProfile.objects.get(user=user) + sponsor = user_profile.sponsor + person = user_profile.person content.update( { - "first_name": person.first_name, - "last_name": person.last_name, - "email": person.private_email and person.private_email.value, - "mobile_phone": person.private_mobile - and person.private_mobile.value, - "fnr": person.fnr and "".join((person.fnr.value[:-5], "*****")), - "passport": passports and passports.value, - "roles": [], + "feide_id": user_profile.userid_feide, } ) - roles = person.roles - if roles: - content.update( - { - "roles": [ - { - "id": role.id, - "ou_nb": role.orgunit.name_nb, - "ou_en": role.orgunit.name_en, - "name_nb": role.type.name_nb, - "name_en": role.type.name_en, - "start_date": role.start_date, - "end_date": role.end_date, - "sponsor": { - "first_name": role.sponsor.first_name, - "last_name": role.sponsor.last_name, - }, - } - for role in roles.all() - ], - } - ) - return Response(content) + except GregUserProfile.DoesNotExist: + return Response(status=HTTP_403_FORBIDDEN) - # Invitation cookie, allow access + # Or fetch person info for invited guest elif invite_id: link = InvitationLink.objects.get(uuid=invite_id) - invitation = link.invitation - person = invitation.role.person - passports = person.identities.filter( - type=Identity.IdentityType.PASSPORT_NUMBER - ).first() - - content = { - "feide_id": None, - "sponsor_id": None, - "person_id": person.id, - "first_name": person.first_name, - "last_name": person.last_name, - "email": person.private_email and person.private_email.value, - "mobile_phone": person.private_mobile and person.private_mobile.value, - "fnr": person.fnr and "".join((person.fnr.value[:-5], "*****")), - "passport": passports and passports.value, - "roles": [ - { - "id": role.id, - "ou_nb": role.orgunit.name_nb, - "ou_en": role.orgunit.name_en, - "name_nb": role.type.name_nb, - "name_en": role.type.name_en, - "start_date": role.start_date, - "end_date": role.end_date, - "sponsor": { - "first_name": role.sponsor.first_name, - "last_name": role.sponsor.last_name, - }, - } - for role in person.roles.all() - ], - } - - return Response(content) + person = link.invitation.role.person - # Neither, deny access + # Otherwise, deny access else: return Response(status=HTTP_403_FORBIDDEN) + + # Add sponsor fields if sponsor object present + if sponsor: + content.update({"sponsor_id": user_profile.sponsor.id}) + # Add person fields if person object present + if person: + content.update( + { + "person_id": person.id, + "first_name": person.first_name, + "last_name": person.last_name, + "email": person.private_email and person.private_email.value, + "mobile_phone": person.private_mobile + and person.private_mobile.value, + "fnr": person.fnr and "".join((person.fnr.value[:-5], "*****")), + "passport": person.passport and person.passport.value, + "roles": [ + { + "id": role.id, + "ou_nb": role.orgunit.name_nb, + "ou_en": role.orgunit.name_en, + "name_nb": role.type.name_nb, + "name_en": role.type.name_en, + "start_date": role.start_date, + "end_date": role.end_date, + "sponsor": { + "first_name": role.sponsor.first_name, + "last_name": role.sponsor.last_name, + }, + } + for role in person.roles.all() + ], + } + ) + return Response(content)