2023-08-17 15:43:39 +03:00
|
|
|
''' REST API: RSForms for conceptual schemas. '''
|
2023-07-15 17:46:19 +03:00
|
|
|
import json
|
2024-03-03 22:00:22 +03:00
|
|
|
from typing import cast, Union
|
2023-08-23 12:15:16 +03:00
|
|
|
from django.db import transaction
|
2023-07-15 17:46:19 +03:00
|
|
|
from django.http import HttpResponse
|
|
|
|
from django_filters.rest_framework import DjangoFilterBackend
|
2023-08-01 20:14:03 +03:00
|
|
|
from django.db.models import Q
|
2023-07-18 14:55:40 +03:00
|
|
|
from rest_framework import views, viewsets, filters, generics, permissions
|
2024-03-03 22:00:22 +03:00
|
|
|
from rest_framework.decorators import action, api_view, permission_classes
|
2023-07-15 17:46:19 +03:00
|
|
|
from rest_framework.response import Response
|
2024-03-03 22:00:22 +03:00
|
|
|
from rest_framework.request import Request
|
2023-09-21 23:09:51 +03:00
|
|
|
from drf_spectacular.utils import extend_schema, extend_schema_view
|
2023-09-22 23:26:22 +03:00
|
|
|
from rest_framework import status as c
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
import pyconcept
|
2023-09-24 19:08:17 +03:00
|
|
|
import cctext
|
2023-08-25 22:51:20 +03:00
|
|
|
from . import models as m
|
|
|
|
from . import serializers as s
|
2023-07-15 17:46:19 +03:00
|
|
|
from . import utils
|
|
|
|
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(tags=['Library'])
|
|
|
|
@extend_schema_view()
|
2023-08-25 22:51:20 +03:00
|
|
|
class LibraryActiveView(generics.ListAPIView):
|
2023-10-23 20:55:12 +03:00
|
|
|
''' Endpoint: Get list of library items available for active user. '''
|
2023-08-01 20:14:03 +03:00
|
|
|
permission_classes = (permissions.AllowAny,)
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer_class = s.LibraryItemSerializer
|
2023-08-01 20:14:03 +03:00
|
|
|
|
|
|
|
def get_queryset(self):
|
2024-03-03 22:00:22 +03:00
|
|
|
if self.request.user.is_anonymous:
|
|
|
|
return m.LibraryItem.objects.filter(is_common=True).order_by('-time_update')
|
|
|
|
else:
|
|
|
|
user = cast(m.User, self.request.user)
|
2023-08-27 15:39:49 +03:00
|
|
|
# pylint: disable=unsupported-binary-operation
|
2023-09-01 23:44:02 +03:00
|
|
|
return m.LibraryItem.objects.filter(
|
|
|
|
Q(is_common=True) | Q(owner=user) | Q(subscription__user=user)
|
2023-09-10 20:17:18 +03:00
|
|
|
).distinct().order_by('-time_update')
|
2024-01-15 23:37:14 +03:00
|
|
|
|
2023-10-23 20:55:12 +03:00
|
|
|
|
|
|
|
@extend_schema(tags=['Library'])
|
|
|
|
@extend_schema_view()
|
|
|
|
class LibraryTemplatesView(generics.ListAPIView):
|
|
|
|
''' Endpoint: Get list of templates. '''
|
|
|
|
permission_classes = (permissions.AllowAny,)
|
|
|
|
serializer_class = s.LibraryItemSerializer
|
|
|
|
|
|
|
|
def get_queryset(self):
|
|
|
|
template_ids = m.LibraryTemplate.objects.values_list('lib_source', flat=True)
|
|
|
|
return m.LibraryItem.objects.filter(pk__in=template_ids)
|
2023-08-01 20:14:03 +03:00
|
|
|
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(tags=['Constituenta'])
|
|
|
|
@extend_schema_view()
|
2023-07-18 14:55:40 +03:00
|
|
|
class ConstituentAPIView(generics.RetrieveUpdateAPIView):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Get / Update Constituenta. '''
|
2023-08-25 22:51:20 +03:00
|
|
|
queryset = m.Constituenta.objects.all()
|
|
|
|
serializer_class = s.ConstituentaSerializer
|
2023-07-18 14:55:40 +03:00
|
|
|
|
|
|
|
def get_permissions(self):
|
|
|
|
result = super().get_permissions()
|
|
|
|
if self.request.method.lower() == 'get':
|
|
|
|
result.append(permissions.AllowAny())
|
|
|
|
else:
|
|
|
|
result.append(utils.SchemaOwnerOrAdmin())
|
|
|
|
return result
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
|
2023-08-17 15:43:39 +03:00
|
|
|
# pylint: disable=too-many-ancestors
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(tags=['Library'])
|
|
|
|
@extend_schema_view()
|
2023-08-25 22:51:20 +03:00
|
|
|
class LibraryViewSet(viewsets.ModelViewSet):
|
|
|
|
''' Endpoint: Library operations. '''
|
|
|
|
queryset = m.LibraryItem.objects.all()
|
|
|
|
serializer_class = s.LibraryItemSerializer
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
filter_backends = (DjangoFilterBackend, filters.OrderingFilter)
|
2023-08-25 22:51:20 +03:00
|
|
|
filterset_fields = ['item_type', 'owner', 'is_common', 'is_canonical']
|
|
|
|
ordering_fields = ('item_type', 'owner', 'title', 'time_update')
|
2023-08-17 15:43:39 +03:00
|
|
|
ordering = '-time_update'
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
def perform_create(self, serializer):
|
|
|
|
if not self.request.user.is_anonymous and 'owner' not in self.request.POST:
|
|
|
|
return serializer.save(owner=self.request.user)
|
|
|
|
else:
|
|
|
|
return serializer.save()
|
|
|
|
|
|
|
|
def get_permissions(self):
|
2023-08-25 22:51:20 +03:00
|
|
|
if self.action in ['update', 'destroy', 'partial_update']:
|
2024-03-03 22:00:22 +03:00
|
|
|
permission_list = [utils.ObjectOwnerOrAdmin]
|
2023-08-26 17:26:49 +03:00
|
|
|
elif self.action in ['create', 'clone', 'subscribe', 'unsubscribe']:
|
2024-03-03 22:00:22 +03:00
|
|
|
permission_list = [permissions.IsAuthenticated]
|
2023-08-25 22:51:20 +03:00
|
|
|
elif self.action in ['claim']:
|
2024-03-03 22:00:22 +03:00
|
|
|
permission_list = [utils.IsClaimable]
|
2023-08-25 22:51:20 +03:00
|
|
|
else:
|
2024-03-03 22:00:22 +03:00
|
|
|
permission_list = [permissions.AllowAny]
|
|
|
|
return [permission() for permission in permission_list]
|
2023-08-25 22:51:20 +03:00
|
|
|
|
2023-08-26 17:26:49 +03:00
|
|
|
def _get_item(self) -> m.LibraryItem:
|
|
|
|
return cast(m.LibraryItem, self.get_object())
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='clone item including contents',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['Library'],
|
|
|
|
request=s.LibraryItemSerializer,
|
|
|
|
responses={
|
|
|
|
c.HTTP_201_CREATED: s.RSFormParseSerializer,
|
|
|
|
c.HTTP_404_NOT_FOUND: None
|
|
|
|
}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-08-25 22:51:20 +03:00
|
|
|
@transaction.atomic
|
|
|
|
@action(detail=True, methods=['post'], url_path='clone')
|
2024-03-03 22:00:22 +03:00
|
|
|
def clone(self, request: Request, pk):
|
2023-08-25 22:51:20 +03:00
|
|
|
''' Endpoint: Create deep copy of library item. '''
|
|
|
|
serializer = s.LibraryItemSerializer(data=request.data)
|
|
|
|
serializer.is_valid(raise_exception=True)
|
2023-08-26 17:26:49 +03:00
|
|
|
item = self._get_item()
|
2023-08-25 22:51:20 +03:00
|
|
|
if item.item_type == m.LibraryItemType.RSFORM:
|
|
|
|
schema = m.RSForm(item)
|
|
|
|
clone_data = s.RSFormTRSSerializer(schema).data
|
|
|
|
clone_data['item_type'] = item.item_type
|
|
|
|
clone_data['owner'] = self.request.user
|
|
|
|
clone_data['title'] = serializer.validated_data['title']
|
|
|
|
clone_data['alias'] = serializer.validated_data.get('alias', '')
|
|
|
|
clone_data['comment'] = serializer.validated_data.get('comment', '')
|
|
|
|
clone_data['is_common'] = serializer.validated_data.get('is_common', False)
|
|
|
|
clone_data['is_canonical'] = serializer.validated_data.get('is_canonical', False)
|
|
|
|
clone = s.RSFormTRSSerializer(data=clone_data, context={'load_meta': True})
|
|
|
|
clone.is_valid(raise_exception=True)
|
|
|
|
new_schema = clone.save()
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_201_CREATED,
|
|
|
|
data=s.RSFormParseSerializer(new_schema.item).data
|
|
|
|
)
|
|
|
|
return Response(status=c.HTTP_404_NOT_FOUND)
|
2023-08-25 22:51:20 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='claim item',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['Library'],
|
|
|
|
request=None,
|
|
|
|
responses={c.HTTP_200_OK: s.LibraryItemSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-08-26 17:26:49 +03:00
|
|
|
@transaction.atomic
|
2023-08-25 22:51:20 +03:00
|
|
|
@action(detail=True, methods=['post'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def claim(self, request: Request, pk=None):
|
2023-08-25 22:51:20 +03:00
|
|
|
''' Endpoint: Claim ownership of LibraryItem. '''
|
2023-08-26 17:26:49 +03:00
|
|
|
item = self._get_item()
|
2023-08-25 22:51:20 +03:00
|
|
|
if item.owner == self.request.user:
|
2024-03-03 22:00:22 +03:00
|
|
|
return Response(status=c.HTTP_304_NOT_MODIFIED)
|
2023-08-25 22:51:20 +03:00
|
|
|
else:
|
2024-03-03 22:00:22 +03:00
|
|
|
item.owner = cast(m.User, self.request.user)
|
2023-08-25 22:51:20 +03:00
|
|
|
item.save()
|
2023-08-26 17:26:49 +03:00
|
|
|
m.Subscription.subscribe(user=item.owner, item=item)
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=s.LibraryItemSerializer(item).data
|
|
|
|
)
|
2023-08-25 22:51:20 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='subscribe to item',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['Library'],
|
|
|
|
request=None,
|
|
|
|
responses={c.HTTP_204_NO_CONTENT: None}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-08-26 17:26:49 +03:00
|
|
|
@action(detail=True, methods=['post'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def subscribe(self, request: Request, pk):
|
2023-08-26 17:26:49 +03:00
|
|
|
''' Endpoint: Subscribe current user to item. '''
|
|
|
|
item = self._get_item()
|
2024-03-03 22:00:22 +03:00
|
|
|
m.Subscription.subscribe(user=cast(m.User, self.request.user), item=item)
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(status=c.HTTP_204_NO_CONTENT)
|
2023-08-26 17:26:49 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='unsubscribe from item',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['Library'],
|
|
|
|
request=None,
|
|
|
|
responses={c.HTTP_204_NO_CONTENT: None},
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-08-26 17:26:49 +03:00
|
|
|
@action(detail=True, methods=['delete'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def unsubscribe(self, request: Request, pk):
|
2023-08-26 17:26:49 +03:00
|
|
|
''' Endpoint: Unsubscribe current user from item. '''
|
|
|
|
item = self._get_item()
|
2024-03-03 22:00:22 +03:00
|
|
|
m.Subscription.unsubscribe(user=cast(m.User, self.request.user), item=item)
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(status=c.HTTP_204_NO_CONTENT)
|
2023-08-26 17:26:49 +03:00
|
|
|
|
2023-08-25 22:51:20 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(tags=['RSForm'])
|
|
|
|
@extend_schema_view()
|
2023-08-25 22:51:20 +03:00
|
|
|
class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.RetrieveAPIView):
|
|
|
|
''' Endpoint: RSForm operations. '''
|
2023-08-26 17:26:49 +03:00
|
|
|
queryset = m.LibraryItem.objects.filter(item_type=m.LibraryItemType.RSFORM)
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer_class = s.LibraryItemSerializer
|
|
|
|
|
|
|
|
def _get_schema(self) -> m.RSForm:
|
2024-03-03 22:00:22 +03:00
|
|
|
return m.RSForm(cast(m.LibraryItem, self.get_object()))
|
2023-08-25 22:51:20 +03:00
|
|
|
|
|
|
|
def get_permissions(self):
|
|
|
|
''' Determine permission class. '''
|
2023-12-27 19:34:39 +03:00
|
|
|
if self.action in ['load_trs', 'cst_create', 'cst_delete_multiple',
|
2024-01-15 23:37:14 +03:00
|
|
|
'reset_aliases', 'cst_rename', 'cst_substitute']:
|
2023-08-25 22:51:20 +03:00
|
|
|
permission_classes = [utils.ObjectOwnerOrAdmin]
|
2023-07-15 17:46:19 +03:00
|
|
|
else:
|
|
|
|
permission_classes = [permissions.AllowAny]
|
|
|
|
return [permission() for permission in permission_classes]
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='create constituenta',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['Constituenta'],
|
|
|
|
request=s.CstCreateSerializer,
|
|
|
|
responses={c.HTTP_201_CREATED: s.NewCstResponse}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-23 21:38:04 +03:00
|
|
|
@action(detail=True, methods=['post'], url_path='cst-create')
|
2024-03-03 22:00:22 +03:00
|
|
|
def cst_create(self, request: Request, pk):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Create new constituenta. '''
|
2023-07-27 22:04:25 +03:00
|
|
|
schema = self._get_schema()
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer = s.CstCreateSerializer(data=request.data)
|
2023-07-23 15:23:01 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
2023-08-21 00:25:12 +03:00
|
|
|
data = serializer.validated_data
|
2023-09-25 14:17:52 +03:00
|
|
|
new_cst = schema.create_cst(
|
|
|
|
data=data,
|
|
|
|
insert_after=data['insert_after'] if 'insert_after' in data else None
|
|
|
|
)
|
2023-08-25 22:51:20 +03:00
|
|
|
schema.item.refresh_from_db()
|
2023-09-22 23:26:22 +03:00
|
|
|
response = Response(
|
|
|
|
status=c.HTTP_201_CREATED,
|
|
|
|
data={
|
|
|
|
'new_cst': s.ConstituentaSerializer(new_cst).data,
|
|
|
|
'schema': s.RSFormParseSerializer(schema.item).data
|
|
|
|
}
|
|
|
|
)
|
2023-08-21 00:25:12 +03:00
|
|
|
response['Location'] = new_cst.get_absolute_url()
|
2023-07-24 22:34:03 +03:00
|
|
|
return response
|
2023-07-23 15:23:01 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='rename constituenta',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['Constituenta'],
|
|
|
|
request=s.CstRenameSerializer,
|
|
|
|
responses={c.HTTP_200_OK: s.NewCstResponse}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-08-23 12:15:16 +03:00
|
|
|
@transaction.atomic
|
|
|
|
@action(detail=True, methods=['patch'], url_path='cst-rename')
|
2024-03-03 22:00:22 +03:00
|
|
|
def cst_rename(self, request: Request, pk):
|
2023-08-23 12:15:16 +03:00
|
|
|
''' Rename constituenta possibly changing type. '''
|
|
|
|
schema = self._get_schema()
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer = s.CstRenameSerializer(data=request.data, context={'schema': schema})
|
2023-08-23 12:15:16 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
2023-08-25 22:51:20 +03:00
|
|
|
old_alias = m.Constituenta.objects.get(pk=request.data['id']).alias
|
2023-08-23 12:15:16 +03:00
|
|
|
serializer.save()
|
|
|
|
mapping = { old_alias: serializer.validated_data['alias'] }
|
|
|
|
schema.apply_mapping(mapping, change_aliases=False)
|
2023-08-25 22:51:20 +03:00
|
|
|
schema.item.refresh_from_db()
|
|
|
|
cst = m.Constituenta.objects.get(pk=serializer.validated_data['id'])
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data={
|
|
|
|
'new_cst': s.ConstituentaSerializer(cst).data,
|
|
|
|
'schema': s.RSFormParseSerializer(schema.item).data
|
|
|
|
}
|
|
|
|
)
|
2023-08-23 12:15:16 +03:00
|
|
|
|
2024-01-15 23:37:14 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='substitute constituenta',
|
|
|
|
tags=['Constituenta'],
|
|
|
|
request=s.CstSubstituteSerializer,
|
|
|
|
responses={c.HTTP_200_OK: s.RSFormParseSerializer}
|
|
|
|
)
|
|
|
|
@transaction.atomic
|
|
|
|
@action(detail=True, methods=['patch'], url_path='cst-substitute')
|
2024-03-03 22:00:22 +03:00
|
|
|
def cst_substitute(self, request: Request, pk):
|
2024-01-15 23:37:14 +03:00
|
|
|
''' Substitute occurrences of constituenta with another one. '''
|
|
|
|
schema = self._get_schema()
|
|
|
|
serializer = s.CstSubstituteSerializer(data=request.data, context={'schema': schema})
|
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
schema.substitute(
|
|
|
|
original=serializer.validated_data['original'],
|
|
|
|
substitution=serializer.validated_data['substitution'],
|
|
|
|
transfer_term=serializer.validated_data['transfer_term']
|
|
|
|
)
|
|
|
|
schema.item.refresh_from_db()
|
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=s.RSFormParseSerializer(schema.item).data
|
|
|
|
)
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='delete constituents',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['Constituenta'],
|
|
|
|
request=s.CstListSerializer,
|
|
|
|
responses={c.HTTP_202_ACCEPTED: s.RSFormParseSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-12-27 19:34:39 +03:00
|
|
|
@action(detail=True, methods=['patch'], url_path='cst-delete-multiple')
|
2024-03-03 22:00:22 +03:00
|
|
|
def cst_delete_multiple(self, request: Request, pk):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Delete multiple constituents. '''
|
2023-07-27 22:04:25 +03:00
|
|
|
schema = self._get_schema()
|
2023-09-25 14:17:52 +03:00
|
|
|
serializer = s.CstListSerializer(
|
|
|
|
data=request.data,
|
|
|
|
context={'schema': schema}
|
|
|
|
)
|
2023-07-23 21:38:04 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
2023-07-24 22:34:03 +03:00
|
|
|
schema.delete_cst(serializer.validated_data['constituents'])
|
2023-08-25 22:51:20 +03:00
|
|
|
schema.item.refresh_from_db()
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_202_ACCEPTED,
|
|
|
|
data=s.RSFormParseSerializer(schema.item).data
|
|
|
|
)
|
2023-07-23 21:38:04 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='move constituenta',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['Constituenta'],
|
|
|
|
request=s.CstMoveSerializer,
|
|
|
|
responses={c.HTTP_200_OK: s.RSFormParseSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-24 22:34:03 +03:00
|
|
|
@action(detail=True, methods=['patch'], url_path='cst-moveto')
|
2024-03-03 22:00:22 +03:00
|
|
|
def cst_moveto(self, request: Request, pk):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Move multiple constituents. '''
|
2023-08-17 21:23:54 +03:00
|
|
|
schema = self._get_schema()
|
2023-09-25 14:17:52 +03:00
|
|
|
serializer = s.CstMoveSerializer(
|
|
|
|
data=request.data,
|
|
|
|
context={'schema': schema}
|
|
|
|
)
|
2023-07-24 22:34:03 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
2023-09-25 14:17:52 +03:00
|
|
|
schema.move_cst(
|
|
|
|
listCst=serializer.validated_data['constituents'],
|
|
|
|
target=serializer.validated_data['move_to']
|
|
|
|
)
|
2023-08-25 22:51:20 +03:00
|
|
|
schema.item.refresh_from_db()
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=s.RSFormParseSerializer(schema.item).data
|
|
|
|
)
|
2023-07-24 22:34:03 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='reset aliases, update expressions and references',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm'],
|
|
|
|
request=None,
|
|
|
|
responses={c.HTTP_200_OK: s.RSFormParseSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-27 22:04:25 +03:00
|
|
|
@action(detail=True, methods=['patch'], url_path='reset-aliases')
|
2024-03-03 22:00:22 +03:00
|
|
|
def reset_aliases(self, request: Request, pk):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Recreate all aliases based on order. '''
|
2023-07-27 22:04:25 +03:00
|
|
|
schema = self._get_schema()
|
2023-08-22 17:52:59 +03:00
|
|
|
schema.reset_aliases()
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=s.RSFormParseSerializer(schema.item).data
|
|
|
|
)
|
2023-07-27 22:04:25 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='load data from TRS file',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm'],
|
|
|
|
request=s.RSFormUploadSerializer,
|
|
|
|
responses={c.HTTP_200_OK: s.RSFormParseSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-27 22:04:25 +03:00
|
|
|
@action(detail=True, methods=['patch'], url_path='load-trs')
|
2024-03-03 22:00:22 +03:00
|
|
|
def load_trs(self, request: Request, pk):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Load data from file and replace current schema. '''
|
2024-03-03 22:00:22 +03:00
|
|
|
input_serializer = s.RSFormUploadSerializer(data=request.data)
|
|
|
|
input_serializer.is_valid(raise_exception=True)
|
2023-07-27 22:04:25 +03:00
|
|
|
schema = self._get_schema()
|
2024-03-03 22:00:22 +03:00
|
|
|
load_metadata = input_serializer.validated_data['load_metadata']
|
2023-07-27 22:04:25 +03:00
|
|
|
data = utils.read_trs(request.FILES['file'].file)
|
2023-08-25 22:51:20 +03:00
|
|
|
data['id'] = schema.item.pk
|
2023-08-22 17:52:59 +03:00
|
|
|
|
2023-09-25 14:17:52 +03:00
|
|
|
serializer = s.RSFormTRSSerializer(
|
|
|
|
data=data,
|
|
|
|
context={'load_meta': load_metadata}
|
|
|
|
)
|
2023-08-22 17:52:59 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
2024-03-03 22:00:22 +03:00
|
|
|
result = serializer.save()
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
2024-03-03 22:00:22 +03:00
|
|
|
data=s.RSFormParseSerializer(result.item).data
|
2023-09-22 23:26:22 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='get all constituents data from DB',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm'],
|
|
|
|
request=None,
|
|
|
|
responses={c.HTTP_200_OK: s.RSFormSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
@action(detail=True, methods=['get'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def contents(self, request: Request, pk):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: View schema db contents (including constituents). '''
|
2023-09-22 23:26:22 +03:00
|
|
|
schema = s.RSFormSerializer(self.get_object())
|
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=schema.data
|
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='get all constituents data and parses',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm'],
|
|
|
|
request=None,
|
|
|
|
responses={c.HTTP_200_OK: s.RSFormParseSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
@action(detail=True, methods=['get'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def details(self, request: Request, pk):
|
2023-08-22 17:52:59 +03:00
|
|
|
''' Endpoint: Detailed schema view including statuses and parse. '''
|
2024-03-03 22:00:22 +03:00
|
|
|
serializer = s.RSFormParseSerializer(cast(m.LibraryItem, self.get_object()))
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=serializer.data
|
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='check RSLang expression',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm', 'FormalLanguage'],
|
|
|
|
request=s.ExpressionSerializer,
|
|
|
|
responses={c.HTTP_200_OK: s.ExpressionParseSerializer},
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
@action(detail=True, methods=['post'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def check(self, request: Request, pk):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Check RSLang expression against schema context. '''
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer = s.ExpressionSerializer(data=request.data)
|
2023-07-15 17:46:19 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
expression = serializer.validated_data['expression']
|
2023-09-01 00:39:28 +03:00
|
|
|
schema = s.PyConceptAdapter(self._get_schema())
|
2023-08-22 17:52:59 +03:00
|
|
|
result = pyconcept.check_expression(json.dumps(schema.data), expression)
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=json.loads(result)
|
|
|
|
)
|
2023-08-23 23:19:43 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='resolve text with references',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm', 'NaturalLanguage'],
|
|
|
|
request=s.TextSerializer,
|
|
|
|
responses={c.HTTP_200_OK: s.ResolverSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-08-23 22:57:25 +03:00
|
|
|
@action(detail=True, methods=['post'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def resolve(self, request: Request, pk):
|
2023-12-26 14:23:51 +03:00
|
|
|
''' Endpoint: Resolve references in text against schema terms context. '''
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer = s.TextSerializer(data=request.data)
|
2023-08-23 22:57:25 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
text = serializer.validated_data['text']
|
2023-09-01 00:39:28 +03:00
|
|
|
resolver = self._get_schema().resolver()
|
2023-08-23 22:57:25 +03:00
|
|
|
resolver.resolve(text)
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=s.ResolverSerializer(resolver).data
|
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='export as TRS file',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm'],
|
|
|
|
request=None,
|
|
|
|
responses={(c.HTTP_200_OK, 'application/zip'): bytes}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
@action(detail=True, methods=['get'], url_path='export-trs')
|
2024-03-03 22:00:22 +03:00
|
|
|
def export_trs(self, request: Request, pk):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Download Exteor compatible file. '''
|
2023-08-25 22:51:20 +03:00
|
|
|
schema = s.RSFormTRSSerializer(self._get_schema()).data
|
2023-07-15 17:46:19 +03:00
|
|
|
trs = utils.write_trs(schema)
|
2023-08-25 22:51:20 +03:00
|
|
|
filename = self._get_schema().item.alias
|
2023-07-15 17:46:19 +03:00
|
|
|
if filename == '' or not filename.isascii():
|
|
|
|
# Note: non-ascii symbols in Content-Disposition
|
|
|
|
# are not supported by some browsers
|
|
|
|
filename = 'Schema'
|
|
|
|
filename += '.trs'
|
|
|
|
|
|
|
|
response = HttpResponse(trs, content_type='application/zip')
|
|
|
|
response['Content-Disposition'] = f'attachment; filename={filename}'
|
|
|
|
return response
|
|
|
|
|
|
|
|
|
|
|
|
class TrsImportView(views.APIView):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Upload RS form in Exteor format. '''
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer_class = s.FileSerializer
|
2024-03-03 22:00:22 +03:00
|
|
|
permission_classes = [permissions.IsAuthenticated]
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='import TRS file into RSForm',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm'],
|
|
|
|
request=s.FileSerializer,
|
|
|
|
responses={c.HTTP_201_CREATED: s.LibraryItemSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2024-03-03 22:00:22 +03:00
|
|
|
def post(self, request: Request):
|
2023-07-15 17:46:19 +03:00
|
|
|
data = utils.read_trs(request.FILES['file'].file)
|
2024-03-03 22:00:22 +03:00
|
|
|
owner = cast(m.User, self.request.user)
|
2023-08-22 17:52:59 +03:00
|
|
|
_prepare_rsform_data(data, request, owner)
|
2023-09-25 14:17:52 +03:00
|
|
|
serializer = s.RSFormTRSSerializer(
|
|
|
|
data=data,
|
|
|
|
context={'load_meta': True}
|
|
|
|
)
|
2023-08-22 17:52:59 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
schema = serializer.save()
|
2023-08-25 22:51:20 +03:00
|
|
|
result = s.LibraryItemSerializer(schema.item)
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_201_CREATED,
|
|
|
|
data=result.data
|
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='create new RSForm empty or from file',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['RSForm'],
|
|
|
|
request=s.LibraryItemSerializer,
|
|
|
|
responses={c.HTTP_201_CREATED: s.LibraryItemSerializer}
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
@api_view(['POST'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def create_rsform(request: Request):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Create RSForm from user input and/or trs file. '''
|
2024-03-03 22:00:22 +03:00
|
|
|
owner = cast(m.User, request.user) if not request.user.is_anonymous else None
|
2023-08-17 15:43:39 +03:00
|
|
|
if 'file' not in request.FILES:
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer = s.LibraryItemSerializer(data=request.data)
|
2023-07-15 17:46:19 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
2023-08-25 22:51:20 +03:00
|
|
|
schema = m.RSForm.create(
|
2023-07-27 22:04:25 +03:00
|
|
|
title=serializer.validated_data['title'],
|
2023-07-15 17:46:19 +03:00
|
|
|
owner=owner,
|
2023-07-27 22:04:25 +03:00
|
|
|
alias=serializer.validated_data.get('alias', ''),
|
|
|
|
comment=serializer.validated_data.get('comment', ''),
|
|
|
|
is_common=serializer.validated_data.get('is_common', False),
|
2023-08-25 22:51:20 +03:00
|
|
|
is_canonical=serializer.validated_data.get('is_canonical', False),
|
2023-07-15 17:46:19 +03:00
|
|
|
)
|
|
|
|
else:
|
|
|
|
data = utils.read_trs(request.FILES['file'].file)
|
2023-08-22 17:52:59 +03:00
|
|
|
_prepare_rsform_data(data, request, owner)
|
2024-03-03 22:00:22 +03:00
|
|
|
serializer_rsform = s.RSFormTRSSerializer(data=data, context={'load_meta': True})
|
|
|
|
serializer_rsform.is_valid(raise_exception=True)
|
|
|
|
schema = serializer_rsform.save()
|
2023-08-25 22:51:20 +03:00
|
|
|
result = s.LibraryItemSerializer(schema.item)
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_201_CREATED,
|
|
|
|
data=result.data
|
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2024-03-03 22:00:22 +03:00
|
|
|
|
|
|
|
def _prepare_rsform_data(data: dict, request: Request, owner: Union[m.User, None]):
|
2023-08-25 22:51:20 +03:00
|
|
|
data['owner'] = owner
|
2023-08-22 17:52:59 +03:00
|
|
|
if 'title' in request.data and request.data['title'] != '':
|
|
|
|
data['title'] = request.data['title']
|
|
|
|
if data['title'] == '':
|
|
|
|
data['title'] = 'Без названия ' + request.FILES['file'].fileName
|
|
|
|
if 'alias' in request.data and request.data['alias'] != '':
|
|
|
|
data['alias'] = request.data['alias']
|
|
|
|
if 'comment' in request.data and request.data['comment'] != '':
|
|
|
|
data['comment'] = request.data['comment']
|
2023-08-25 22:51:20 +03:00
|
|
|
|
2023-08-22 17:52:59 +03:00
|
|
|
is_common = True
|
|
|
|
if 'is_common' in request.data:
|
|
|
|
is_common = request.data['is_common'] == 'true'
|
|
|
|
data['is_common'] = is_common
|
2023-08-25 22:51:20 +03:00
|
|
|
|
|
|
|
is_canonical = False
|
|
|
|
if 'is_canonical' in request.data:
|
|
|
|
is_canonical = request.data['is_canonical'] == 'true'
|
|
|
|
data['is_canonical'] = is_canonical
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
|
2024-03-03 22:00:22 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='save version for RSForm copying current content',
|
|
|
|
tags=['Versions'],
|
|
|
|
request=s.VersionCreateSerializer,
|
|
|
|
responses={
|
|
|
|
c.HTTP_201_CREATED: s.RSFormParseSerializer,
|
|
|
|
c.HTTP_403_FORBIDDEN: None,
|
|
|
|
c.HTTP_404_NOT_FOUND: None
|
|
|
|
}
|
|
|
|
)
|
|
|
|
@api_view(['POST'])
|
|
|
|
@permission_classes([permissions.IsAuthenticated])
|
|
|
|
def create_version(request: Request, pk_item: int):
|
|
|
|
''' Endpoint: Create new version for RSForm copying current content. '''
|
|
|
|
try:
|
|
|
|
item = m.LibraryItem.objects.get(pk=pk_item)
|
|
|
|
except m.LibraryItem.DoesNotExist:
|
|
|
|
return Response(status=c.HTTP_404_NOT_FOUND)
|
|
|
|
creator = request.user
|
|
|
|
if not creator.is_staff and creator != item.owner:
|
|
|
|
return Response(status=c.HTTP_403_FORBIDDEN)
|
|
|
|
|
|
|
|
version_input = s.VersionCreateSerializer(data=request.data)
|
|
|
|
version_input.is_valid(raise_exception=True)
|
|
|
|
data = s.RSFormSerializer(item).to_versioned_data()
|
|
|
|
result = m.RSForm(item).create_version(
|
|
|
|
version=version_input.validated_data['version'],
|
|
|
|
description=version_input.validated_data['description'],
|
|
|
|
data=data
|
|
|
|
)
|
|
|
|
return Response(
|
|
|
|
status=c.HTTP_201_CREATED,
|
|
|
|
data={
|
|
|
|
'version': result.pk,
|
|
|
|
'schema': s.RSFormParseSerializer(item).data
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='RS expression into Syntax Tree',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['FormalLanguage'],
|
|
|
|
request=s.ExpressionSerializer,
|
|
|
|
responses={c.HTTP_200_OK: s.ExpressionParseSerializer},
|
|
|
|
auth=None
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
@api_view(['POST'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def parse_expression(request: Request):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Parse RS expression. '''
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer = s.ExpressionSerializer(data=request.data)
|
2023-07-15 17:46:19 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
expression = serializer.validated_data['expression']
|
|
|
|
result = pyconcept.parse_expression(expression)
|
2023-09-22 23:26:22 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=json.loads(result)
|
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='Unicode syntax to ASCII TeX',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['FormalLanguage'],
|
|
|
|
request=s.ExpressionSerializer,
|
|
|
|
responses={c.HTTP_200_OK: s.ResultTextResponse},
|
|
|
|
auth=None
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
@api_view(['POST'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def convert_to_ascii(request: Request):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Convert expression to ASCII syntax. '''
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer = s.ExpressionSerializer(data=request.data)
|
2023-07-15 17:46:19 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
expression = serializer.validated_data['expression']
|
|
|
|
result = pyconcept.convert_to_ascii(expression)
|
2023-09-24 19:08:17 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data={'result': result}
|
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
|
2023-09-21 23:09:51 +03:00
|
|
|
@extend_schema(
|
|
|
|
summary='ASCII TeX syntax to Unicode symbols',
|
2023-09-22 23:26:22 +03:00
|
|
|
tags=['FormalLanguage'],
|
|
|
|
request=s.ExpressionSerializer,
|
|
|
|
responses={200: s.ResultTextResponse},
|
|
|
|
auth=None
|
2023-09-21 23:09:51 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
@api_view(['POST'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def convert_to_math(request: Request):
|
2023-08-17 15:43:39 +03:00
|
|
|
''' Endpoint: Convert expression to MATH syntax. '''
|
2023-08-25 22:51:20 +03:00
|
|
|
serializer = s.ExpressionSerializer(data=request.data)
|
2023-07-15 17:46:19 +03:00
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
expression = serializer.validated_data['expression']
|
|
|
|
result = pyconcept.convert_to_math(expression)
|
2023-09-24 19:08:17 +03:00
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data={'result': result}
|
|
|
|
)
|
|
|
|
|
|
|
|
@extend_schema(
|
|
|
|
summary='generate wordform',
|
|
|
|
tags=['NaturalLanguage'],
|
|
|
|
request=s.WordFormSerializer,
|
|
|
|
responses={200: s.ResultTextResponse},
|
|
|
|
auth=None
|
|
|
|
)
|
|
|
|
@api_view(['POST'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def inflect(request: Request):
|
2023-09-24 19:08:17 +03:00
|
|
|
''' Endpoint: Generate wordform with set grammemes. '''
|
|
|
|
serializer = s.WordFormSerializer(data=request.data)
|
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
text = serializer.validated_data['text']
|
|
|
|
grams = serializer.validated_data['grams']
|
|
|
|
result = cctext.inflect(text, grams)
|
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data={'result': result}
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@extend_schema(
|
2023-09-25 14:17:52 +03:00
|
|
|
summary='all wordforms for current lexeme',
|
2023-09-24 19:08:17 +03:00
|
|
|
tags=['NaturalLanguage'],
|
|
|
|
request=s.TextSerializer,
|
|
|
|
responses={200: s.MultiFormSerializer},
|
|
|
|
auth=None
|
|
|
|
)
|
|
|
|
@api_view(['POST'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def generate_lexeme(request: Request):
|
2023-09-25 14:17:52 +03:00
|
|
|
''' Endpoint: Generate complete set of wordforms for lexeme. '''
|
2023-09-24 19:08:17 +03:00
|
|
|
serializer = s.TextSerializer(data=request.data)
|
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
nominal = serializer.validated_data['text']
|
|
|
|
result = cctext.generate_lexeme(nominal)
|
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data=s.MultiFormSerializer.from_list(result)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@extend_schema(
|
2023-09-25 14:17:52 +03:00
|
|
|
summary='get likely parse grammemes',
|
2023-09-24 19:08:17 +03:00
|
|
|
tags=['NaturalLanguage'],
|
|
|
|
request=s.TextSerializer,
|
|
|
|
responses={200: s.ResultTextResponse},
|
|
|
|
auth=None
|
|
|
|
)
|
|
|
|
@api_view(['POST'])
|
2024-03-03 22:00:22 +03:00
|
|
|
def parse_text(request: Request):
|
2023-09-24 19:08:17 +03:00
|
|
|
''' Endpoint: Get likely vocabulary parse. '''
|
|
|
|
serializer = s.TextSerializer(data=request.data)
|
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
text = serializer.validated_data['text']
|
|
|
|
result = cctext.parse(text)
|
|
|
|
return Response(
|
|
|
|
status=c.HTTP_200_OK,
|
|
|
|
data={'result': result}
|
|
|
|
)
|