From 802072caed76c82b854ad82c6f556227ab285851 Mon Sep 17 00:00:00 2001 From: "Brian S. Stephan" Date: Thu, 19 Sep 2019 00:21:18 -0500 Subject: [PATCH] add markov RPC method for learning a line --- markov/urls.py | 3 ++- markov/views.py | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/markov/urls.py b/markov/urls.py index 1fcb1a9..946becf 100644 --- a/markov/urls.py +++ b/markov/urls.py @@ -2,11 +2,12 @@ from django.urls import path from django.views.generic import TemplateView -from markov.views import context_index, rpc_generate_line_for_context +from markov.views import context_index, rpc_generate_line_for_context, rpc_learn_line_for_context urlpatterns = [ path('', TemplateView.as_view(template_name='index.html'), name='markov_index'), path('context//', context_index, name='markov_context_index'), path('rpc/context//generate/', rpc_generate_line_for_context, name='markov_rpc_generate_line'), + path('rpc/context//learn/', rpc_learn_line_for_context, name='markov_rpc_learn_line'), ] diff --git a/markov/views.py b/markov/views.py index 5e3f87b..ab7958e 100644 --- a/markov/views.py +++ b/markov/views.py @@ -61,3 +61,22 @@ def rpc_generate_line_for_context(request, context): 'context': context, 'topics': topics, 'generated_line': ' '.join(generated_words), 'generated_words': generated_words }) + + +@api_view(['POST']) +@authentication_classes((BasicAuthentication, )) +@permission_classes((IsAuthenticated, )) +def rpc_learn_line_for_context(request, context): + """Learn a line for a given context.""" + if request.method != 'POST': + return Response({'detail': "Supported method: POST."}, status=405) + + try: + markov_data = json.loads(request.body) + line = markov_data.get('line', []) + except (json.decoder.JSONDecodeError, KeyError): + return Response({'detail': "Request body must be JSON with a 'line' parameter."}, status=400) + + context_id = markovlib.get_or_create_target_context(context) + markovlib.learn_line(line, context_id) + return Response({'status': "OK", 'context': context, 'line': line})