diff --git a/rsconcept/backend/apps/rsform/models/api_RSForm.py b/rsconcept/backend/apps/rsform/models/api_RSForm.py index e0c03e12..45ee0ffb 100644 --- a/rsconcept/backend/apps/rsform/models/api_RSForm.py +++ b/rsconcept/backend/apps/rsform/models/api_RSForm.py @@ -1,6 +1,6 @@ ''' Models: RSForm API. ''' from copy import deepcopy -from typing import Optional, Union, cast +from typing import Optional, cast from cctext import Entity, Resolver, TermForm, extract_entities, split_grams from django.core.exceptions import ValidationError @@ -39,7 +39,7 @@ class RSForm: def create(**kwargs) -> 'RSForm': return RSForm(LibraryItem.objects.create(item_type=LibraryItemType.RSFORM, **kwargs)) - def constituents(self) -> QuerySet['Constituenta']: + def constituents(self) -> QuerySet[Constituenta]: ''' Get QuerySet containing all constituents of current RSForm. ''' return Constituenta.objects.filter(schema=self.item) @@ -104,11 +104,40 @@ class RSForm: result = max(result, int(alias[1:])) return result + @transaction.atomic + def create_cst(self, data: dict, insert_after: Optional[str] = None) -> Constituenta: + ''' Create new cst from data. ''' + if insert_after is None: + position = _INSERT_LAST + else: + cst_after = Constituenta.objects.get(pk=insert_after) + position = cst_after.order + 1 + result = self.insert_new(data['alias'], data['cst_type'], position) + result.convention = data.get('convention', '') + result.definition_formal = data.get('definition_formal', '') + result.term_forms = data.get('term_forms', []) + result.term_raw = data.get('term_raw', '') + result.definition_raw = data.get('definition_raw', '') + + if result.term_raw != '' or result.definition_raw != '': + resolver = self.resolver() + if result.term_raw != '': + resolved = resolver.resolve(result.term_raw) + result.term_resolved = resolved + resolver.context[result.alias] = Entity(result.alias, resolved) + if result.definition_raw != '': + result.definition_resolved = resolver.resolve(result.definition_raw) + + result.save() + self.on_term_change([result.id]) + result.refresh_from_db() + return result + @transaction.atomic def insert_new( self, alias: str, - cst_type: Union[CstType, None] = None, + cst_type: Optional[CstType] = None, position: int = _INSERT_LAST, **kwargs ) -> Constituenta: @@ -195,27 +224,6 @@ class RSForm: self.resolve_all_text() self.item.save() - @transaction.atomic - def create_cst(self, data: dict, insert_after: Optional[str] = None) -> Constituenta: - ''' Create new cst from data. ''' - resolver = self.resolver() - cst = self._insert_new(data, insert_after) - cst.convention = data.get('convention', '') - cst.definition_formal = data.get('definition_formal', '') - cst.term_forms = data.get('term_forms', []) - cst.term_raw = data.get('term_raw', '') - if cst.term_raw != '': - resolved = resolver.resolve(cst.term_raw) - cst.term_resolved = resolved - resolver.context[cst.alias] = Entity(cst.alias, resolved) - cst.definition_raw = data.get('definition_raw', '') - if cst.definition_raw != '': - cst.definition_resolved = resolver.resolve(cst.definition_raw) - cst.save() - self.on_term_change([cst.id]) - cst.refresh_from_db() - return cst - @transaction.atomic def substitute( self, @@ -363,13 +371,6 @@ class RSForm: cst.save() order += 1 - def _insert_new(self, data: dict, insert_after: Optional[str] = None) -> Constituenta: - if insert_after is not None: - cst_after = Constituenta.objects.get(pk=insert_after) - return self.insert_new(data['alias'], data['cst_type'], cst_after.order + 1) - else: - return self.insert_new(data['alias'], data['cst_type']) - def _graph_formal(self) -> Graph[int]: ''' Graph based on formal definitions. ''' result: Graph[int] = Graph() diff --git a/rsconcept/backend/apps/rsform/tests/EndpointTester.py b/rsconcept/backend/apps/rsform/tests/EndpointTester.py index e2436cc4..0f0a6b63 100644 --- a/rsconcept/backend/apps/rsform/tests/EndpointTester.py +++ b/rsconcept/backend/apps/rsform/tests/EndpointTester.py @@ -26,6 +26,21 @@ class EndpointTester(APITestCase): ''' Abstract base class for Testing endpoints. ''' def setUp(self): + self.factory = APIRequestFactory() + self.user = User.objects.create( + username='UserTest', + email='blank@test.com', + password='password' + ) + self.user2 = User.objects.create( + username='UserTest2', + email='another@test.com', + password='password' + ) + self.client = APIClient() + self.client.force_authenticate(user=self.user) + + def setUpFullUsers(self): self.factory = APIRequestFactory() self.user = User.objects.create_user( username='UserTest', diff --git a/rsconcept/backend/apps/users/tests/t_views.py b/rsconcept/backend/apps/users/tests/t_views.py index 44551a5c..c003a385 100644 --- a/rsconcept/backend/apps/users/tests/t_views.py +++ b/rsconcept/backend/apps/users/tests/t_views.py @@ -9,7 +9,7 @@ class TestUserAPIViews(EndpointTester): ''' Testing Authentication views. ''' def setUp(self): - super().setUp() + super().setUpFullUsers() @decl_endpoint('/users/api/login', method='post') @@ -59,7 +59,7 @@ class TestUserUserProfileAPIView(EndpointTester): ''' Testing User profile views. ''' def setUp(self): - super().setUp() + super().setUpFullUsers() self.user.first_name = 'John' self.user.second_name = 'Smith' self.user.save()