mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 13:00:39 +03:00
Backend refactoring: use PrimaryKeyRelatedField
This commit is contained in:
parent
38bbf04de6
commit
a6822e2f2b
|
@ -4,9 +4,6 @@
|
||||||
def constituentaNotOwned(title: str):
|
def constituentaNotOwned(title: str):
|
||||||
return f'Конституента не принадлежит схеме: {title}'
|
return f'Конституента не принадлежит схеме: {title}'
|
||||||
|
|
||||||
def constituentaNotExists():
|
|
||||||
return 'Конституента не существует'
|
|
||||||
|
|
||||||
def renameTrivial(name: str):
|
def renameTrivial(name: str):
|
||||||
return f'Имя должно отличаться от текущего: {name}'
|
return f'Имя должно отличаться от текущего: {name}'
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,13 @@ from .data_access import (
|
||||||
VersionSerializer,
|
VersionSerializer,
|
||||||
VersionCreateSerializer,
|
VersionCreateSerializer,
|
||||||
ConstituentaSerializer,
|
ConstituentaSerializer,
|
||||||
CstStructuredSerializer,
|
CstTargetSerializer,
|
||||||
CstMoveSerializer,
|
CstMoveSerializer,
|
||||||
CstSubstituteSerializer,
|
CstSubstituteSerializer,
|
||||||
CstCreateSerializer,
|
CstCreateSerializer,
|
||||||
CstRenameSerializer,
|
CstRenameSerializer,
|
||||||
CstListSerializer
|
CstListSerializer,
|
||||||
|
InlineSynthesisSerializer
|
||||||
)
|
)
|
||||||
from .schema_typing import (
|
from .schema_typing import (
|
||||||
NewCstResponse,
|
NewCstResponse,
|
||||||
|
|
|
@ -5,10 +5,6 @@ from rest_framework import serializers
|
||||||
from cctext import Resolver, Reference, ReferenceType, EntityReference, SyntacticReference
|
from cctext import Resolver, Reference, ReferenceType, EntityReference, SyntacticReference
|
||||||
|
|
||||||
|
|
||||||
ConstituentaID = serializers.IntegerField
|
|
||||||
NodeID = serializers.IntegerField
|
|
||||||
|
|
||||||
|
|
||||||
class ExpressionSerializer(serializers.Serializer):
|
class ExpressionSerializer(serializers.Serializer):
|
||||||
''' Serializer: RSLang expression. '''
|
''' Serializer: RSLang expression. '''
|
||||||
expression = serializers.CharField()
|
expression = serializers.CharField()
|
||||||
|
@ -77,7 +73,7 @@ class NodeDataSerializer(serializers.Serializer):
|
||||||
|
|
||||||
class ASTNodeSerializer(serializers.Serializer):
|
class ASTNodeSerializer(serializers.Serializer):
|
||||||
''' Serializer: Syntax tree node. '''
|
''' Serializer: Syntax tree node. '''
|
||||||
uid = NodeID()
|
uid = serializers.IntegerField()
|
||||||
parent = serializers.IntegerField() # type: ignore
|
parent = serializers.IntegerField() # type: ignore
|
||||||
typeID = serializers.IntegerField()
|
typeID = serializers.IntegerField()
|
||||||
start = serializers.IntegerField()
|
start = serializers.IntegerField()
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
''' Serializers for persistent data manipulation. '''
|
''' Serializers for persistent data manipulation. '''
|
||||||
from typing import Optional, cast
|
from typing import Optional, cast
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from rest_framework.serializers import PrimaryKeyRelatedField as PKField
|
||||||
|
|
||||||
from .basics import ConstituentaID, CstParseSerializer
|
from .basics import CstParseSerializer
|
||||||
|
|
||||||
from .io_pyconcept import PyConceptAdapter
|
from .io_pyconcept import PyConceptAdapter
|
||||||
|
|
||||||
|
@ -10,20 +11,6 @@ from ..models import Constituenta, LibraryItem, RSForm, Version, CstType
|
||||||
from .. import messages as msg
|
from .. import messages as msg
|
||||||
|
|
||||||
|
|
||||||
def _try_access_constituenta(item_id: str, schema: LibraryItem) -> Constituenta:
|
|
||||||
try:
|
|
||||||
cst = Constituenta.objects.get(pk=item_id)
|
|
||||||
except Constituenta.DoesNotExist as exception:
|
|
||||||
raise serializers.ValidationError({
|
|
||||||
f'{item_id}': msg.constituentaNotExists()
|
|
||||||
}) from exception
|
|
||||||
if cst.schema != schema:
|
|
||||||
raise serializers.ValidationError({
|
|
||||||
f'{item_id}': msg.constituentaNotOwned(schema.title)
|
|
||||||
})
|
|
||||||
return cst
|
|
||||||
|
|
||||||
|
|
||||||
class LibraryItemSerializer(serializers.ModelSerializer):
|
class LibraryItemSerializer(serializers.ModelSerializer):
|
||||||
''' Serializer: LibraryItem entry. '''
|
''' Serializer: LibraryItem entry. '''
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -106,6 +93,16 @@ class ConstituentaSerializer(serializers.ModelSerializer):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
class CstDetailsSerializer(serializers.ModelSerializer):
|
||||||
|
''' Serializer: Constituenta data including parse. '''
|
||||||
|
parse = CstParseSerializer()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
''' serializer metadata. '''
|
||||||
|
model = Constituenta
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class CstCreateSerializer(serializers.ModelSerializer):
|
class CstCreateSerializer(serializers.ModelSerializer):
|
||||||
''' Serializer: Constituenta creation. '''
|
''' Serializer: Constituenta creation. '''
|
||||||
insert_after = serializers.IntegerField(required=False, allow_null=True)
|
insert_after = serializers.IntegerField(required=False, allow_null=True)
|
||||||
|
@ -119,49 +116,6 @@ class CstCreateSerializer(serializers.ModelSerializer):
|
||||||
'insert_after', 'term_forms'
|
'insert_after', 'term_forms'
|
||||||
|
|
||||||
|
|
||||||
class CstStructuredSerializer(serializers.ModelSerializer):
|
|
||||||
''' Serializer: Constituenta structure production. '''
|
|
||||||
class Meta:
|
|
||||||
''' serializer metadata. '''
|
|
||||||
model = Constituenta
|
|
||||||
fields = ('id',)
|
|
||||||
|
|
||||||
def validate(self, attrs):
|
|
||||||
schema = cast(LibraryItem, self.context['schema'])
|
|
||||||
cst = _try_access_constituenta(self.initial_data['id'], schema)
|
|
||||||
if cst.cst_type not in [CstType.FUNCTION, CstType.STRUCTURED, CstType.TERM]:
|
|
||||||
raise serializers.ValidationError({
|
|
||||||
f'{cst.id}': msg.constituentaNoStructure()
|
|
||||||
})
|
|
||||||
self.instance = cst
|
|
||||||
return attrs
|
|
||||||
|
|
||||||
|
|
||||||
class CstRenameSerializer(serializers.ModelSerializer):
|
|
||||||
''' Serializer: Constituenta renaming. '''
|
|
||||||
class Meta:
|
|
||||||
''' serializer metadata. '''
|
|
||||||
model = Constituenta
|
|
||||||
fields = 'id', 'alias', 'cst_type'
|
|
||||||
|
|
||||||
def validate(self, attrs):
|
|
||||||
schema = cast(LibraryItem, self.context['schema'])
|
|
||||||
cst = _try_access_constituenta(self.initial_data['id'], schema)
|
|
||||||
new_alias = self.initial_data['alias']
|
|
||||||
if cst.alias == new_alias:
|
|
||||||
raise serializers.ValidationError({
|
|
||||||
'alias': msg.renameTrivial(new_alias)
|
|
||||||
})
|
|
||||||
if RSForm(schema).constituents().filter(alias=new_alias).exists():
|
|
||||||
raise serializers.ValidationError({
|
|
||||||
'alias': msg.renameTaken(new_alias)
|
|
||||||
})
|
|
||||||
self.instance = cst
|
|
||||||
attrs['schema'] = schema
|
|
||||||
attrs['id'] = self.initial_data['id']
|
|
||||||
return attrs
|
|
||||||
|
|
||||||
|
|
||||||
class RSFormSerializer(serializers.ModelSerializer):
|
class RSFormSerializer(serializers.ModelSerializer):
|
||||||
''' Serializer: Detailed data for RSForm. '''
|
''' Serializer: Detailed data for RSForm. '''
|
||||||
subscribers = serializers.ListField(
|
subscribers = serializers.ListField(
|
||||||
|
@ -204,16 +158,6 @@ class RSFormSerializer(serializers.ModelSerializer):
|
||||||
return result | data
|
return result | data
|
||||||
|
|
||||||
|
|
||||||
class CstDetailsSerializer(serializers.ModelSerializer):
|
|
||||||
''' Serializer: Constituenta data including parse. '''
|
|
||||||
parse = CstParseSerializer()
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
''' serializer metadata. '''
|
|
||||||
model = Constituenta
|
|
||||||
fields = '__all__'
|
|
||||||
|
|
||||||
|
|
||||||
class RSFormParseSerializer(serializers.ModelSerializer):
|
class RSFormParseSerializer(serializers.ModelSerializer):
|
||||||
''' Serializer: Detailed data for RSForm including parse. '''
|
''' Serializer: Detailed data for RSForm including parse. '''
|
||||||
subscribers = serializers.ListField(
|
subscribers = serializers.ListField(
|
||||||
|
@ -250,14 +194,14 @@ class RSFormParseSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class CstSubstituteSerializer(serializers.Serializer):
|
class CstSubstituteSerializer(serializers.Serializer):
|
||||||
''' Serializer: Constituenta substitution. '''
|
''' Serializer: Constituenta substitution. '''
|
||||||
original = ConstituentaID()
|
original = PKField(many=False, queryset=Constituenta.objects.all())
|
||||||
substitution = ConstituentaID()
|
substitution = PKField(many=False, queryset=Constituenta.objects.all())
|
||||||
transfer_term = serializers.BooleanField(required=False, default=False)
|
transfer_term = serializers.BooleanField(required=False, default=False)
|
||||||
|
|
||||||
def validate(self, attrs):
|
def validate(self, attrs):
|
||||||
schema = cast(LibraryItem, self.context['schema'])
|
schema = cast(LibraryItem, self.context['schema'])
|
||||||
original_cst = Constituenta.objects.get(pk=self.initial_data['original'])
|
original_cst = cast(Constituenta, attrs['original'])
|
||||||
substitution_cst = Constituenta.objects.get(pk=self.initial_data['substitution'])
|
substitution_cst = cast(Constituenta, attrs['substitution'])
|
||||||
if original_cst.alias == substitution_cst.alias:
|
if original_cst.alias == substitution_cst.alias:
|
||||||
raise serializers.ValidationError({
|
raise serializers.ValidationError({
|
||||||
'alias': msg.substituteTrivial(original_cst.alias)
|
'alias': msg.substituteTrivial(original_cst.alias)
|
||||||
|
@ -276,22 +220,81 @@ class CstSubstituteSerializer(serializers.Serializer):
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
|
|
||||||
class CstListSerializer(serializers.Serializer):
|
class CstTargetSerializer(serializers.Serializer):
|
||||||
''' Serializer: List of constituents from one origin. '''
|
''' Serializer: Target single Constituenta. '''
|
||||||
items = serializers.ListField(
|
target = PKField(many=False, queryset=Constituenta.objects.all())
|
||||||
child=serializers.IntegerField()
|
|
||||||
)
|
|
||||||
|
|
||||||
def validate(self, attrs):
|
def validate(self, attrs):
|
||||||
schema = cast(LibraryItem, self.context['schema'])
|
schema = cast(LibraryItem, self.context['schema'])
|
||||||
cstList = []
|
cst = cast(Constituenta, attrs['target'])
|
||||||
|
if schema and cst.schema != schema:
|
||||||
|
raise serializers.ValidationError({
|
||||||
|
f'{cst.id}': msg.constituentaNotOwned(schema.title)
|
||||||
|
})
|
||||||
|
if cst.cst_type not in [CstType.FUNCTION, CstType.STRUCTURED, CstType.TERM]:
|
||||||
|
raise serializers.ValidationError({
|
||||||
|
f'{cst.id}': msg.constituentaNoStructure()
|
||||||
|
})
|
||||||
|
self.instance = cst
|
||||||
|
return attrs
|
||||||
|
|
||||||
|
|
||||||
|
class CstRenameSerializer(serializers.Serializer):
|
||||||
|
''' Serializer: Constituenta renaming. '''
|
||||||
|
target = PKField(many=False, queryset=Constituenta.objects.all())
|
||||||
|
alias = serializers.CharField()
|
||||||
|
cst_type = serializers.CharField()
|
||||||
|
|
||||||
|
def validate(self, attrs):
|
||||||
|
attrs = super().validate(attrs)
|
||||||
|
schema = cast(LibraryItem, self.context['schema'])
|
||||||
|
cst = cast(Constituenta, attrs['target'])
|
||||||
|
if cst.schema != schema:
|
||||||
|
raise serializers.ValidationError({
|
||||||
|
f'{cst.id}': msg.constituentaNotOwned(schema.title)
|
||||||
|
})
|
||||||
|
new_alias = self.initial_data['alias']
|
||||||
|
if cst.alias == new_alias:
|
||||||
|
raise serializers.ValidationError({
|
||||||
|
'alias': msg.renameTrivial(new_alias)
|
||||||
|
})
|
||||||
|
if RSForm(schema).constituents().filter(alias=new_alias).exists():
|
||||||
|
raise serializers.ValidationError({
|
||||||
|
'alias': msg.renameTaken(new_alias)
|
||||||
|
})
|
||||||
|
return attrs
|
||||||
|
|
||||||
|
|
||||||
|
class CstListSerializer(serializers.Serializer):
|
||||||
|
''' Serializer: List of constituents from one origin. '''
|
||||||
|
items = PKField(many=True, queryset=Constituenta.objects.all())
|
||||||
|
|
||||||
|
def validate(self, attrs):
|
||||||
|
schema = cast(LibraryItem, self.context['schema'])
|
||||||
|
if not schema:
|
||||||
|
return attrs
|
||||||
|
|
||||||
for item in attrs['items']:
|
for item in attrs['items']:
|
||||||
cst = _try_access_constituenta(item, schema)
|
if item.schema != schema:
|
||||||
cstList.append(cst)
|
raise serializers.ValidationError({
|
||||||
attrs['constituents'] = cstList
|
f'{item.id}': msg.constituentaNotOwned(schema.title)
|
||||||
|
})
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
|
|
||||||
class CstMoveSerializer(CstListSerializer):
|
class CstMoveSerializer(CstListSerializer):
|
||||||
''' Serializer: Change constituenta position. '''
|
''' Serializer: Change constituenta position. '''
|
||||||
move_to = serializers.IntegerField()
|
move_to = serializers.IntegerField()
|
||||||
|
|
||||||
|
|
||||||
|
class InlineSynthesisSerializer(serializers.Serializer):
|
||||||
|
''' Serializer: Inline synthesis operation input. '''
|
||||||
|
receiver = PKField(many=False, queryset=LibraryItem.objects.all())
|
||||||
|
source = PKField(many=False, queryset=LibraryItem.objects.all()) # type: ignore
|
||||||
|
items = PKField(many=True, queryset=Constituenta.objects.all())
|
||||||
|
substitutions = serializers.ListField(
|
||||||
|
child=CstSubstituteSerializer()
|
||||||
|
)
|
||||||
|
|
||||||
|
def validate(self, attrs):
|
||||||
|
return attrs
|
||||||
|
|
|
@ -220,7 +220,7 @@ class TestRSFormViewset(APITestCase):
|
||||||
definition_resolved='Test2'
|
definition_resolved='Test2'
|
||||||
)
|
)
|
||||||
|
|
||||||
data = {'id': cst2.pk, 'alias': 'D2', 'cst_type': 'term'}
|
data = {'target': cst2.pk, 'alias': 'D2', 'cst_type': 'term'}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{self.unowned.item.id}/cst-rename',
|
f'/api/rsforms/{self.unowned.item.id}/cst-rename',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
|
@ -233,21 +233,21 @@ class TestRSFormViewset(APITestCase):
|
||||||
)
|
)
|
||||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
data = {'id': cst1.pk, 'alias': cst1.alias, 'cst_type': 'term'}
|
data = {'target': cst1.pk, 'alias': cst1.alias, 'cst_type': 'term'}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{self.owned.item.id}/cst-rename',
|
f'/api/rsforms/{self.owned.item.id}/cst-rename',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
)
|
)
|
||||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
data = {'id': cst1.pk, 'alias': cst3.alias}
|
data = {'target': cst1.pk, 'alias': cst3.alias}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{self.owned.item.id}/cst-rename',
|
f'/api/rsforms/{self.owned.item.id}/cst-rename',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
)
|
)
|
||||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
data = {'alias': 'D2', 'cst_type': 'term', 'id': cst1.pk}
|
data = {'target': cst1.pk, 'alias': 'D2', 'cst_type': 'term'}
|
||||||
item = self.owned.item
|
item = self.owned.item
|
||||||
d1 = Constituenta.objects.create(schema=item, alias='D1', cst_type='term', order=4)
|
d1 = Constituenta.objects.create(schema=item, alias='D1', cst_type='term', order=4)
|
||||||
d1.term_raw = '@{X1|plur}'
|
d1.term_raw = '@{X1|plur}'
|
||||||
|
@ -519,21 +519,21 @@ class TestRSFormViewset(APITestCase):
|
||||||
a1.save()
|
a1.save()
|
||||||
f1.save()
|
f1.save()
|
||||||
|
|
||||||
data = {'id': invalid_id}
|
data = {'target': invalid_id}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{item.id}/cst-produce-structure',
|
f'/api/rsforms/{item.id}/cst-produce-structure',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
)
|
)
|
||||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
data = {'id': x1.id}
|
data = {'target': x1.id}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{item.id}/cst-produce-structure',
|
f'/api/rsforms/{item.id}/cst-produce-structure',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
)
|
)
|
||||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
data = {'id': s2.id}
|
data = {'target': s2.id}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{item.id}/cst-produce-structure',
|
f'/api/rsforms/{item.id}/cst-produce-structure',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
|
@ -542,7 +542,7 @@ class TestRSFormViewset(APITestCase):
|
||||||
|
|
||||||
# Testing simple structure
|
# Testing simple structure
|
||||||
s1.refresh_from_db()
|
s1.refresh_from_db()
|
||||||
data = {'id': s1.id}
|
data = {'target': s1.id}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{item.id}/cst-produce-structure',
|
f'/api/rsforms/{item.id}/cst-produce-structure',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
|
@ -558,7 +558,7 @@ class TestRSFormViewset(APITestCase):
|
||||||
|
|
||||||
# Testing complex structure
|
# Testing complex structure
|
||||||
s3.refresh_from_db()
|
s3.refresh_from_db()
|
||||||
data = {'id': s3.id}
|
data = {'target': s3.id}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{item.id}/cst-produce-structure',
|
f'/api/rsforms/{item.id}/cst-produce-structure',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
|
@ -572,7 +572,7 @@ class TestRSFormViewset(APITestCase):
|
||||||
|
|
||||||
# Testing function
|
# Testing function
|
||||||
f1.refresh_from_db()
|
f1.refresh_from_db()
|
||||||
data = {'id': f1.id}
|
data = {'target': f1.id}
|
||||||
response = self.client.patch(
|
response = self.client.patch(
|
||||||
f'/api/rsforms/{item.id}/cst-produce-structure',
|
f'/api/rsforms/{item.id}/cst-produce-structure',
|
||||||
data=data, format='json'
|
data=data, format='json'
|
||||||
|
|
|
@ -19,6 +19,8 @@ urlpatterns = [
|
||||||
path('rsforms/<int:pk_item>/versions/create', views.create_version),
|
path('rsforms/<int:pk_item>/versions/create', views.create_version),
|
||||||
path('rsforms/<int:pk_item>/versions/<int:pk_version>', views.retrieve_version),
|
path('rsforms/<int:pk_item>/versions/<int:pk_version>', views.retrieve_version),
|
||||||
|
|
||||||
|
path('operations/inline-synthesis', views.inline_synthesis),
|
||||||
|
|
||||||
path('rslang/parse-expression', views.parse_expression),
|
path('rslang/parse-expression', views.parse_expression),
|
||||||
path('rslang/to-ascii', views.convert_to_ascii),
|
path('rslang/to-ascii', views.convert_to_ascii),
|
||||||
path('rslang/to-math', views.convert_to_math),
|
path('rslang/to-math', views.convert_to_math),
|
||||||
|
|
|
@ -15,6 +15,7 @@ from .rsforms import (
|
||||||
RSFormViewSet, TrsImportView,
|
RSFormViewSet, TrsImportView,
|
||||||
create_rsform
|
create_rsform
|
||||||
)
|
)
|
||||||
|
from .operations import inline_synthesis
|
||||||
from .cctext import (
|
from .cctext import (
|
||||||
parse_text,
|
parse_text,
|
||||||
generate_lexeme,
|
generate_lexeme,
|
||||||
|
|
33
rsconcept/backend/apps/rsform/views/operations.py
Normal file
33
rsconcept/backend/apps/rsform/views/operations.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
''' Endpoints for RSForm. '''
|
||||||
|
from rest_framework.decorators import api_view
|
||||||
|
from rest_framework.response import Response
|
||||||
|
from rest_framework.request import Request
|
||||||
|
from drf_spectacular.utils import extend_schema
|
||||||
|
from rest_framework import status as c
|
||||||
|
|
||||||
|
from .. import models as m
|
||||||
|
from .. import serializers as s
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
summary='Inline synthesis: merge one schema into another',
|
||||||
|
tags=['Operations'],
|
||||||
|
request=s.InlineSynthesisSerializer,
|
||||||
|
responses={c.HTTP_200_OK: s.RSFormParseSerializer}
|
||||||
|
)
|
||||||
|
@api_view(['PATCH'])
|
||||||
|
def inline_synthesis(request: Request):
|
||||||
|
''' Endpoint: Inline synthesis. '''
|
||||||
|
serializer = s.InlineSynthesisSerializer(data=request.data)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
|
||||||
|
schema = m.RSForm(serializer.validated_data['receiver'])
|
||||||
|
# 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
|
||||||
|
)
|
|
@ -68,7 +68,7 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr
|
||||||
@extend_schema(
|
@extend_schema(
|
||||||
summary='produce the structure of a given constituenta',
|
summary='produce the structure of a given constituenta',
|
||||||
tags=['RSForm'],
|
tags=['RSForm'],
|
||||||
request=s.CstStructuredSerializer,
|
request=s.CstTargetSerializer,
|
||||||
responses={c.HTTP_200_OK: s.NewMultiCstResponse}
|
responses={c.HTTP_200_OK: s.NewMultiCstResponse}
|
||||||
)
|
)
|
||||||
@action(detail=True, methods=['patch'], url_path='cst-produce-structure')
|
@action(detail=True, methods=['patch'], url_path='cst-produce-structure')
|
||||||
|
@ -76,9 +76,9 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr
|
||||||
''' Produce a term for every element of the target constituenta typification. '''
|
''' Produce a term for every element of the target constituenta typification. '''
|
||||||
schema = self._get_schema()
|
schema = self._get_schema()
|
||||||
|
|
||||||
serializer = s.CstStructuredSerializer(data=request.data, context={'schema': schema.item})
|
serializer = s.CstTargetSerializer(data=request.data, context={'schema': schema.item})
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
cst = cast(m.Constituenta, serializer.instance)
|
cst = cast(m.Constituenta, serializer.validated_data['target'])
|
||||||
|
|
||||||
schema_details = s.RSFormParseSerializer(schema.item).data['items']
|
schema_details = s.RSFormParseSerializer(schema.item).data['items']
|
||||||
cst_parse = next(item for item in schema_details if item['id']==cst.id)['parse']
|
cst_parse = next(item for item in schema_details if item['id']==cst.id)['parse']
|
||||||
|
@ -110,12 +110,19 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr
|
||||||
schema = self._get_schema()
|
schema = self._get_schema()
|
||||||
serializer = s.CstRenameSerializer(data=request.data, context={'schema': schema.item})
|
serializer = s.CstRenameSerializer(data=request.data, context={'schema': schema.item})
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
old_alias = m.Constituenta.objects.get(pk=request.data['id']).alias
|
|
||||||
serializer.save()
|
cst = cast(m.Constituenta, serializer.validated_data['target'])
|
||||||
mapping = { old_alias: serializer.validated_data['alias'] }
|
old_alias = cst.alias
|
||||||
|
|
||||||
|
cst.alias = serializer.validated_data['alias']
|
||||||
|
cst.cst_type = serializer.validated_data['cst_type']
|
||||||
|
cst.save()
|
||||||
|
|
||||||
|
mapping = { old_alias: cst.alias }
|
||||||
schema.apply_mapping(mapping, change_aliases=False)
|
schema.apply_mapping(mapping, change_aliases=False)
|
||||||
schema.item.refresh_from_db()
|
schema.item.refresh_from_db()
|
||||||
cst = m.Constituenta.objects.get(pk=serializer.validated_data['id'])
|
cst.refresh_from_db()
|
||||||
|
|
||||||
return Response(
|
return Response(
|
||||||
status=c.HTTP_200_OK,
|
status=c.HTTP_200_OK,
|
||||||
data={
|
data={
|
||||||
|
@ -166,7 +173,7 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr
|
||||||
context={'schema': schema.item}
|
context={'schema': schema.item}
|
||||||
)
|
)
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
schema.delete_cst(serializer.validated_data['constituents'])
|
schema.delete_cst(serializer.validated_data['items'])
|
||||||
schema.item.refresh_from_db()
|
schema.item.refresh_from_db()
|
||||||
return Response(
|
return Response(
|
||||||
status=c.HTTP_200_OK,
|
status=c.HTTP_200_OK,
|
||||||
|
@ -189,7 +196,7 @@ class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.Retr
|
||||||
)
|
)
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
schema.move_cst(
|
schema.move_cst(
|
||||||
listCst=serializer.validated_data['constituents'],
|
listCst=serializer.validated_data['items'],
|
||||||
target=serializer.validated_data['move_to']
|
target=serializer.validated_data['move_to']
|
||||||
)
|
)
|
||||||
schema.item.refresh_from_db()
|
schema.item.refresh_from_db()
|
||||||
|
|
|
@ -11,10 +11,10 @@ import {
|
||||||
IConstituentaList,
|
IConstituentaList,
|
||||||
IConstituentaMeta,
|
IConstituentaMeta,
|
||||||
ICstCreateData,
|
ICstCreateData,
|
||||||
ICstID,
|
|
||||||
ICstMovetoData,
|
ICstMovetoData,
|
||||||
ICstRenameData,
|
ICstRenameData,
|
||||||
ICstSubstituteData,
|
ICstSubstituteData,
|
||||||
|
ICstTarget,
|
||||||
ICstUpdateData,
|
ICstUpdateData,
|
||||||
IRSForm,
|
IRSForm,
|
||||||
IRSFormUploadData
|
IRSFormUploadData
|
||||||
|
@ -64,7 +64,7 @@ interface IRSFormContext {
|
||||||
upload: (data: IRSFormUploadData, callback: () => void) => void;
|
upload: (data: IRSFormUploadData, callback: () => void) => void;
|
||||||
|
|
||||||
resetAliases: (callback: () => void) => void;
|
resetAliases: (callback: () => void) => void;
|
||||||
produceStructure: (data: ICstID, callback?: DataCallback<ConstituentaID[]>) => void;
|
produceStructure: (data: ICstTarget, callback?: DataCallback<ConstituentaID[]>) => void;
|
||||||
|
|
||||||
cstCreate: (data: ICstCreateData, callback?: DataCallback<IConstituentaMeta>) => void;
|
cstCreate: (data: ICstCreateData, callback?: DataCallback<IConstituentaMeta>) => void;
|
||||||
cstRename: (data: ICstRenameData, callback?: DataCallback<IConstituentaMeta>) => void;
|
cstRename: (data: ICstRenameData, callback?: DataCallback<IConstituentaMeta>) => void;
|
||||||
|
@ -265,7 +265,7 @@ export const RSFormState = ({ schemaID, versionID, children }: RSFormStateProps)
|
||||||
);
|
);
|
||||||
|
|
||||||
const produceStructure = useCallback(
|
const produceStructure = useCallback(
|
||||||
(data: ICstID, callback?: DataCallback<ConstituentaID[]>) => {
|
(data: ICstTarget, callback?: DataCallback<ConstituentaID[]>) => {
|
||||||
setError(undefined);
|
setError(undefined);
|
||||||
patchProduceStructure(schemaID, {
|
patchProduceStructure(schemaID, {
|
||||||
data: data,
|
data: data,
|
||||||
|
|
|
@ -83,9 +83,11 @@ export interface IConstituentaMeta {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents id for {@link IConstituenta}.
|
* Represents target {@link IConstituenta}.
|
||||||
*/
|
*/
|
||||||
export interface ICstID extends Pick<IConstituentaMeta, 'id'> {}
|
export interface ICstTarget {
|
||||||
|
target: ConstituentaID;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents Constituenta.
|
* Represents Constituenta.
|
||||||
|
@ -143,7 +145,7 @@ export interface ICstUpdateData
|
||||||
/**
|
/**
|
||||||
* Represents data, used in renaming {@link IConstituenta}.
|
* Represents data, used in renaming {@link IConstituenta}.
|
||||||
*/
|
*/
|
||||||
export interface ICstRenameData extends Pick<IConstituentaMeta, 'id' | 'alias' | 'cst_type'> {}
|
export interface ICstRenameData extends ICstTarget, Pick<IConstituentaMeta, 'alias' | 'cst_type'> {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents data, used in merging {@link IConstituenta}.
|
* Represents data, used in merging {@link IConstituenta}.
|
||||||
|
|
|
@ -33,10 +33,10 @@ import {
|
||||||
IConstituenta,
|
IConstituenta,
|
||||||
IConstituentaMeta,
|
IConstituentaMeta,
|
||||||
ICstCreateData,
|
ICstCreateData,
|
||||||
ICstID,
|
|
||||||
ICstMovetoData,
|
ICstMovetoData,
|
||||||
ICstRenameData,
|
ICstRenameData,
|
||||||
ICstSubstituteData,
|
ICstSubstituteData,
|
||||||
|
ICstTarget,
|
||||||
ICstUpdateData,
|
ICstUpdateData,
|
||||||
IRSForm,
|
IRSForm,
|
||||||
TermForm
|
TermForm
|
||||||
|
@ -351,7 +351,7 @@ export const RSEditState = ({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const data: ICstRenameData = {
|
const data: ICstRenameData = {
|
||||||
id: activeCst.id,
|
target: activeCst.id,
|
||||||
alias: activeCst.alias,
|
alias: activeCst.alias,
|
||||||
cst_type: activeCst.cst_type
|
cst_type: activeCst.cst_type
|
||||||
};
|
};
|
||||||
|
@ -390,8 +390,8 @@ export const RSEditState = ({
|
||||||
if (!activeCst) {
|
if (!activeCst) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const data: ICstID = {
|
const data: ICstTarget = {
|
||||||
id: activeCst.id
|
target: activeCst.id
|
||||||
};
|
};
|
||||||
model.produceStructure(data, cstList => {
|
model.produceStructure(data, cstList => {
|
||||||
toast.success(`Добавлены конституенты: ${cstList.length}`);
|
toast.success(`Добавлены конституенты: ${cstList.length}`);
|
||||||
|
|
|
@ -27,10 +27,10 @@ import {
|
||||||
IConstituentaMeta,
|
IConstituentaMeta,
|
||||||
ICstCreateData,
|
ICstCreateData,
|
||||||
ICstCreatedResponse,
|
ICstCreatedResponse,
|
||||||
ICstID,
|
|
||||||
ICstMovetoData,
|
ICstMovetoData,
|
||||||
ICstRenameData,
|
ICstRenameData,
|
||||||
ICstSubstituteData,
|
ICstSubstituteData,
|
||||||
|
ICstTarget,
|
||||||
ICstUpdateData,
|
ICstUpdateData,
|
||||||
IProduceStructureResponse,
|
IProduceStructureResponse,
|
||||||
IRSFormCreateData,
|
IRSFormCreateData,
|
||||||
|
@ -319,15 +319,15 @@ export function patchConstituenta(target: string, request: FrontExchange<ICstUpd
|
||||||
|
|
||||||
export function patchRenameConstituenta(schema: string, request: FrontExchange<ICstRenameData, ICstCreatedResponse>) {
|
export function patchRenameConstituenta(schema: string, request: FrontExchange<ICstRenameData, ICstCreatedResponse>) {
|
||||||
AxiosPatch({
|
AxiosPatch({
|
||||||
title: `Renaming constituenta id=${request.data.id} for schema id=${schema}`,
|
title: `Renaming constituenta id=${request.data.target} for schema id=${schema}`,
|
||||||
endpoint: `/api/rsforms/${schema}/cst-rename`,
|
endpoint: `/api/rsforms/${schema}/cst-rename`,
|
||||||
request: request
|
request: request
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function patchProduceStructure(schema: string, request: FrontExchange<ICstID, IProduceStructureResponse>) {
|
export function patchProduceStructure(schema: string, request: FrontExchange<ICstTarget, IProduceStructureResponse>) {
|
||||||
AxiosPatch({
|
AxiosPatch({
|
||||||
title: `Producing structure constituenta id=${request.data.id} for schema id=${schema}`,
|
title: `Producing structure constituenta id=${request.data.target} for schema id=${schema}`,
|
||||||
endpoint: `/api/rsforms/${schema}/cst-produce-structure`,
|
endpoint: `/api/rsforms/${schema}/cst-produce-structure`,
|
||||||
request: request
|
request: request
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user