diff --git a/ietf/api/serializers_rpc.py b/ietf/api/serializers_rpc.py index 5ce588a9761..85872becc70 100644 --- a/ietf/api/serializers_rpc.py +++ b/ietf/api/serializers_rpc.py @@ -79,7 +79,7 @@ class DocumentAuthorSerializer(serializers.ModelSerializer): """Serializer for a Person in a response""" plain_name = serializers.SerializerMethodField() - + class Meta: model = DocumentAuthor fields = ["person", "plain_name"] @@ -192,3 +192,57 @@ class Meta: model = Document fields = ["id", "name"] read_only_fields = ["id", "name"] + + +class CreateDocumentAuthorSerializer(serializers.ModelSerializer): + class Meta: + model = DocumentAuthor + fields = ["person", "email", "affiliation", "country"] + + +class CreateRfcSerializer(serializers.ModelSerializer): + # fields based on ietf.sync.rfceditor.update_docs_from_rfc_index() + authors = CreateDocumentAuthorSerializer(many=True) # todo what about non-Person authors? + + class Meta: + model = Document + fields = [ + "rfc_number", + "title", + "authors", + "stream", + "group", + "abstract", + "pages", + "words", + "formal_languages", + "std_level", + "ad", + "external_url", + "uploaded_filename", + "note", + ] + + def create(self, validated_data): + authors_data = validated_data.pop("authors") + rfc = Document.objects.create( + type_id="rfc", + name=f"rfc{validated_data['rfc_number']}", + **validated_data, + ) + for order, author_data in enumerate(authors_data): + rfc.documentauthor_set.create( + order=order, + **author_data, + ) + + +class RfcPubNotificationSerializer(serializers.Serializer): + published = serializers.DateTimeField(default_timezone=datetime.timezone.utc) + draft_name = serializers.CharField(allow_blank=True) + draft_rev = serializers.CharField(allow_blank=True) + rfc = CreateRfcSerializer() + + +class NotificationAckSerializer(serializers.Serializer): + message = serializers.CharField(default="ack") diff --git a/ietf/api/urls_rpc.py b/ietf/api/urls_rpc.py index 925a091cb9c..ac7c62a3912 100644 --- a/ietf/api/urls_rpc.py +++ b/ietf/api/urls_rpc.py @@ -20,6 +20,7 @@ urlpatterns = [ url(r"^doc/drafts_by_names/", views_rpc.DraftsByNamesView.as_view()), + url(r"^notify/pub/", views_rpc.RfcPubNotificationView.as_view()), url(r"^persons/search/", views_rpc.RpcPersonSearch.as_view()), path(r"subject//person/", views_rpc.SubjectPersonView.as_view()), ] diff --git a/ietf/api/views_rpc.py b/ietf/api/views_rpc.py index f3ca2545970..87402159d4c 100644 --- a/ietf/api/views_rpc.py +++ b/ietf/api/views_rpc.py @@ -24,7 +24,7 @@ ReferenceSerializer, EmailPersonSerializer, RfcWithAuthorsSerializer, - DraftWithAuthorsSerializer, + DraftWithAuthorsSerializer, RfcPubNotificationSerializer, NotificationAckSerializer, ) from ietf.doc.models import Document, DocHistory from ietf.person.models import Email, Person @@ -280,3 +280,22 @@ def post(self, request): names = request.data docs = Document.objects.filter(type_id="draft", name__in=names) return Response(DraftSerializer(docs, many=True).data) + + +class RfcPubNotificationView(APIView): + api_key_endpoint = "ietf.api.views_rpc" + + @extend_schema( + operation_id="notify_rfc_published", + summary="Notify datatracker of RFC publication", + request=RfcPubNotificationSerializer, + responses=NotificationAckSerializer, + ) + def post(self, request): + # todo implement this for real + serializer = RfcPubNotificationSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + print(">>> Notified of RFC publication!!") + from pprint import pp + pp(serializer.validated_data) + return Response(NotificationAckSerializer().data)