diff --git a/bothub/api/v2/examples/filters.py b/bothub/api/v2/examples/filters.py index 569a012e..206ec581 100644 --- a/bothub/api/v2/examples/filters.py +++ b/bothub/api/v2/examples/filters.py @@ -94,6 +94,8 @@ def filter_order_by_translation(self, queryset, name, value): return result_queryset def filter_label(self, queryset, name, value): + if value == 'other': + return queryset.filter(entities__entity__label__isnull=True) return queryset.filter(entities__entity__label__value=value) def filter_entity(self, queryset, name, value): diff --git a/bothub/api/v2/repository/serializers.py b/bothub/api/v2/repository/serializers.py index 1ada5b29..b2673091 100644 --- a/bothub/api/v2/repository/serializers.py +++ b/bothub/api/v2/repository/serializers.py @@ -26,13 +26,20 @@ class Meta: 'examples__count', ] - entities = serializers.SlugRelatedField( - many=True, - slug_field='value', - read_only=True) + entities = serializers.SerializerMethodField() examples__count = serializers.SerializerMethodField() + def get_entities(self, obj): + entities = obj.repository.other_entities \ + if obj.value == 'other' else obj.entities.all() + return map(lambda e: e.value, entities) + def get_examples__count(self, obj): + if obj.value == 'other': + return obj.repository.examples( + exclude_deleted=True).filter( + entities__entity__in=obj.repository.other_entities) \ + .count() return obj.examples().count() @@ -93,6 +100,7 @@ class Meta: 'intents', 'intents_list', 'labels', + 'other_label', 'examples__count', 'absolute_url', 'authorization', @@ -134,6 +142,7 @@ class Meta: source='current_labels', many=True, read_only=True) + other_label = serializers.SerializerMethodField() examples__count = serializers.SerializerMethodField() absolute_url = serializers.SerializerMethodField() authorization = serializers.SerializerMethodField() @@ -153,6 +162,12 @@ def get_intents(self, obj): def get_intents_list(self, obj): return obj.intents + def get_other_label(self, obj): + return RepositoryEntityLabelSerializer( + RepositoryEntityLabel( + repository=obj, + value='other')).data + def get_examples__count(self, obj): return obj.examples().count() diff --git a/bothub/common/models.py b/bothub/common/models.py index 63a95222..7048136f 100644 --- a/bothub/common/models.py +++ b/bothub/common/models.py @@ -225,11 +225,8 @@ def entities_list(self): @property def current_labels(self): - return self.labels.filter(entities__value__in=self.examples( - exclude_deleted=True).exclude( - entities__entity__value__isnull=True).values_list( - 'entities__entity__value', - flat=True).distinct()).distinct() + return self.labels.filter( + entities__value__in=self.entities_list).distinct() @property def labels_list(self): @@ -237,6 +234,10 @@ def labels_list(self): 'value', flat=True).distinct() + @property + def other_entities(self): + return self.current_entities.filter(label__isnull=True) + @property def admins(self): admins = [self.owner] + [ diff --git a/bothub/common/tests.py b/bothub/common/tests.py index ddb22490..62314d0b 100644 --- a/bothub/common/tests.py +++ b/bothub/common/tests.py @@ -1045,3 +1045,40 @@ def test_set_label_to_none(self): name_entity.set_label(None) self.assertIsNone(name_entity.label) + + +class RepositoryOtherEntitiesTest(TestCase): + def setUp(self): + self.owner = User.objects.create_user('owner@user.com', 'user') + + self.repository = Repository.objects.create( + owner=self.owner, + name='Test', + slug='test', + language=languages.LANGUAGE_EN) + + self.example = RepositoryExample.objects.create( + repository_update=self.repository.current_update(), + text='my name is Douglas') + + self.example_entity_1 = RepositoryExampleEntity.objects.create( + repository_example=self.example, + start=11, + end=18, + entity='douglas') + entity = self.example_entity_1.entity + entity.set_label('name') + entity.save() + + self.example_entity_2 = RepositoryExampleEntity.objects.create( + repository_example=self.example, + start=0, + end=2, + entity='object') + + def test_ok(self): + other_entities = self.repository.other_entities + self.assertEqual( + other_entities.count(), + 1) + self.assertIn(self.example_entity_2.entity, other_entities)