diff --git a/ietf/api/urls_rpc.py b/ietf/api/urls_rpc.py index 0e3b176710..7a0223b414 100644 --- a/ietf/api/urls_rpc.py +++ b/ietf/api/urls_rpc.py @@ -5,10 +5,11 @@ from ietf.utils.urls import url urlpatterns = [ - url(r'^doc/create_demo_draft/$', views_rpc.create_demo_draft), - url(r'^doc/drafts/(?P[0-9]+)$', views_rpc.rpc_draft), - url(r'^doc/submitted_to_rpc/$', views_rpc.submitted_to_rpc), - url(r'^person/create_demo_person/$', views_rpc.create_demo_person), - url(r'^person/(?P[0-9]+)$', views_rpc.rpc_person), - url(r'^persons/$', views_rpc.rpc_persons), + url(r"^doc/create_demo_draft/$", views_rpc.create_demo_draft), + url(r"^doc/drafts/(?P[0-9]+)$", views_rpc.rpc_draft), + url(r"^doc/submitted_to_rpc/$", views_rpc.submitted_to_rpc), + url(r"^person/create_demo_person/$", views_rpc.create_demo_person), + url(r"^person/(?P[0-9]+)$", views_rpc.rpc_person), + url(r"^persons/$", views_rpc.rpc_persons), + url(r"^subject/(?P[0-9]+)/person/$", views_rpc.rpc_subject_person), ] diff --git a/ietf/api/views_rpc.py b/ietf/api/views_rpc.py index 38d42ba8da..b689faa281 100644 --- a/ietf/api/views_rpc.py +++ b/ietf/api/views_rpc.py @@ -11,6 +11,7 @@ ) from django.shortcuts import get_object_or_404 from django.views.decorators.csrf import csrf_exempt +from django.contrib.auth.models import User from ietf.api.ietf_utils import requires_api_token from ietf.doc.factories import WgDraftFactory # DO NOT MERGE INTO MAIN @@ -27,6 +28,22 @@ def rpc_person(request, person_id): "plain_name": person.plain_name(), }) +@csrf_exempt +@requires_api_token("ietf.api.views_rpc") +def rpc_subject_person(request, subject_id): + try: + user_id = int(subject_id) + except ValueError: + return JsonResponse({"error": "Invalid subject id"}, status=400) + try: + user = User.objects.get(pk=user_id) + except User.DoesNotExist: + return JsonResponse({"error": "Unknown subject"}, status=404) + if hasattr(user, "person"): # test this way to avoid exception on reverse OneToOneField + return rpc_person(request, person_id=user.person.pk) + return JsonResponse({"error": "Subject has no person"}, status=404) + + @csrf_exempt @requires_api_token("ietf.api.views_rpc") def rpc_persons(request): diff --git a/rpcapi.yaml b/rpcapi.yaml index 1f9c0ef909..66cfa5cbef 100644 --- a/rpcapi.yaml +++ b/rpcapi.yaml @@ -128,7 +128,7 @@ paths: application/json: schema: $ref: '#/components/schemas/SubmittedToQueue' - + /doc/drafts/{docId}: get: operationId: get_draft_by_id @@ -151,6 +151,38 @@ paths: '404': description: Not found + /subject/{subjectId}/person: + get: + operationId: get_subject_person_by_id + summary: Find person for OIDC subject by ID + description: Returns a single person + parameters: + - name: subjectId + in: path + description: subject ID of person to return + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Person' + '400': + description: No such subject or no person for this subject + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: No such subject or no person for this subject + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + components: schemas: Person: @@ -180,6 +212,13 @@ components: submitted: type: string format: date + + ErrorResponse: + type: object + properties: + error: + type: string + Draft: type: object properties: