diff --git a/docker/configs/settings_local.py b/docker/configs/settings_local.py index e570946e415..766e39d1a90 100644 --- a/docker/configs/settings_local.py +++ b/docker/configs/settings_local.py @@ -61,6 +61,7 @@ APP_API_TOKENS = { "ietf.api.views.rpc_person" : ["devtoken"], + "ietf.api.views.rpc_draft" : ["devtoken"], "ietf.api.views.submitted_to_rpc" : ["devtoken"], "ietf.api.views.create_demo_resources" : ["devtoken"], # remove for production! } diff --git a/ietf/api/urls.py b/ietf/api/urls.py index f53bcdce5ea..545842266bd 100644 --- a/ietf/api/urls.py +++ b/ietf/api/urls.py @@ -63,6 +63,7 @@ url(r'^rpc/person/(?P[0-9]+)$', api_views.rpc_person), url(r'^rpc/persons/$', api_views.rpc_persons), url(r'^rpc/doc/submitted_to_rpc/$', api_views.submitted_to_rpc), + url(r'^rpc/doc/drafts/(?P[0-9]+)$', api_views.rpc_draft), url(r'^rpc/person/create_demo_person/$', api_views.create_demo_person), url(r'^rpc/doc/create_demo_draft/$', api_views.create_demo_draft), diff --git a/ietf/api/views.py b/ietf/api/views.py index 79948014a70..54d75d4acf5 100644 --- a/ietf/api/views.py +++ b/ietf/api/views.py @@ -15,7 +15,13 @@ from django.core.exceptions import ValidationError from django.core.validators import validate_email from django.db.models import Q -from django.http import HttpResponse, Http404, JsonResponse, HttpResponseForbidden +from django.http import ( + HttpResponse, + Http404, + JsonResponse, + HttpResponseNotAllowed, + HttpResponseNotFound, +) from django.shortcuts import render, get_object_or_404 from django.urls import reverse from django.utils.decorators import method_decorator @@ -454,7 +460,7 @@ def rpc_person(request, person_id): def rpc_persons(request): """ Get a batch of rpc person names""" if request.method != "POST": - return HttpResponseForbidden() + return HttpResponseNotAllowed(["POST"]) pks = json.loads(request.body) response = dict() @@ -462,6 +468,30 @@ def rpc_persons(request): response[str(p.pk)] = p.plain_name() return JsonResponse(response) +@csrf_exempt +@requires_api_token +def rpc_draft(request, doc_id): + if request.method != "GET": + return HttpResponseNotAllowed(["GET"]) + + try: + d = Document.objects.get(pk=doc_id, type_id="draft") + except Document.DoesNotExist: + return HttpResponseNotFound() + return JsonResponse({ + "id": d.pk, + "name": d.name, + "rev": d.rev, + "stream": d.stream.slug, + "title": d.title, + "pages": d.pages, + "authors": [ + { + "id": p.pk, + "plain_name": p.plain_name(), + } for p in d.documentauthor_set.all() + ] + }) @csrf_exempt @requires_api_token @@ -488,7 +518,7 @@ def create_demo_person(request): """ if request.method != "POST": - return HttpResponseForbidden() + return HttpResponseNotAllowed(["POST"]) request_params = json.loads(request.body) name = request_params["name"] @@ -503,21 +533,18 @@ def create_demo_draft(request): """ if request.method != "POST": - return HttpResponseForbidden() - + return HttpResponseNotAllowed(["POST"]) + request_params = json.loads(request.body) name = request_params.get("name") rev = request_params.get("rev") states = request_params.get("states") stream_id = request_params.get("stream_id", "ietf") - exists = False doc = None if not name: return HttpResponse(status=400, content="Name is required") doc = Document.objects.filter(name=name).first() - if doc: - exists = True - else: + if not doc: kwargs = {"name": name, "stream_id": stream_id} if states: kwargs["states"] = states diff --git a/rpcapi.yaml b/rpcapi.yaml index b3d5b663af9..e314e4cae85 100644 --- a/rpcapi.yaml +++ b/rpcapi.yaml @@ -55,7 +55,7 @@ paths: /person/create_demo_person/: post: operationId: create_demo_person - summary: Build a datatraker Person for RPC demo purposes + summary: Build a datatracker Person for RPC demo purposes description: returns a datatracker User id for a person created with the given name requestBody: required: true @@ -129,25 +129,27 @@ paths: schema: $ref: '#/components/schemas/SubmittedToQueue' -# /subject/person{subjectId}: -# get: -# operationId: get_subject_person_by_id -# summary: Find person for a 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' + /doc/drafts/{docId}: + get: + operationId: get_draft_by_id + summary: Get a draft + description: Returns the draft for the requested ID + parameters: + - name: docId + in: path + description: ID of draft to retrieve + required: true + schema: + type: integer + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Draft' + '404': + description: Not found components: schemas: @@ -178,7 +180,25 @@ components: submitted: type: string format: date - + Draft: + type: object + properties: + id: + type: integer + name: + type: string + rev: + type: string + stream: + type: string + title: + type: string + pages: + type: integer + authors: + type: array + items: + $ref: '#/components/schemas/Person' securitySchemes: ApiKeyAuth: