Skip to content

Commit

Permalink
Merge a6f0258 into e6ff63e
Browse files Browse the repository at this point in the history
  • Loading branch information
Douglas Paz committed Aug 16, 2018
2 parents e6ff63e + a6f0258 commit ce2aaf0
Show file tree
Hide file tree
Showing 16 changed files with 866 additions and 317 deletions.
5 changes: 3 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ install_requirements:
lint:
@make development_mode_guard
@make check_environment
@pipenv run flake8
@PIPENV_DONT_LOAD_ENV=1 pipenv run flake8
@echo "${SUCCESS}${NC} The code is following the PEP8"

test:
Expand Down Expand Up @@ -92,6 +92,7 @@ development_mode_guard:
_check_environment:
@type pipenv &> /dev/null || (echo "${DANGER}${NC} Install pipenv to continue..." && exit 1)
@echo "${SUCCESS}${NC} pipenv installed"
@if [[ ! -f "${ENVIRONMENT_VARS_FILE}" && ${IS_PRODUCTION} = false ]]; then make create_environment_vars_file; fi
@if [[ ! -f "${ENVIRONMENT_VARS_FILE}" && ${IS_PRODUCTION} = false ]]; \
then make create_environment_vars_file; fi
@make install_requirements
@echo "${SUCCESS}${NC} Environment checked"
37 changes: 37 additions & 0 deletions bothub/api/fields.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
from rest_framework import serializers

from bothub.common.models import RepositoryEntity
from bothub.common.models import RepositoryEntityLabel


class ModelMultipleChoiceField(serializers.ManyRelatedField):
pass
Expand All @@ -17,3 +20,37 @@ def __init__(self, *args, **kwargs):

class EntityText(serializers.CharField):
pass


class EntityValueField(serializers.CharField):
def __init__(self, *args, validators=[], **kwargs):
kwargs.pop('max_length', 0)
kwargs.pop('help_text', '')

value_field = RepositoryEntity._meta.get_field('value')

super().__init__(
*args,
max_length=value_field.max_length,
validators=(validators + value_field.validators),
**kwargs)

def to_representation(self, obj):
return obj.value


class LabelValueField(serializers.CharField):
def __init__(self, *args, validators=[], **kwargs):
kwargs.pop('max_length', 0)
kwargs.pop('help_text', '')

value_field = RepositoryEntityLabel._meta.get_field('value')

super().__init__(
*args,
max_length=value_field.max_length,
validators=(validators + value_field.validators),
**kwargs)

def to_representation(self, obj):
return obj.value
8 changes: 2 additions & 6 deletions bothub/api/routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
from .views import RepositoryExampleViewSet
from .views import NewRepositoryTranslatedExampleViewSet
from .views import RepositoryTranslatedExampleViewSet
from .views import NewRepositoryTranslatedExampleEntityViewSet
from .views import RepositoryTranslatedExampleEntityViewSet
from .views import RepositoryExamplesViewSet
from .views import RegisterUserViewSet
from .views import LoginViewSet
Expand All @@ -26,6 +24,7 @@
from .views import RequestAuthorizationViewSet
from .views import RepositoryAuthorizationRequestsViewSet
from .views import ReviewAuthorizationRequestViewSet
from .views import RepositoryEntitiesViewSet


class Router(routers.SimpleRouter):
Expand Down Expand Up @@ -101,10 +100,6 @@ def get_lookup_regex(self, viewset, lookup_prefix=''):
router.register('example', RepositoryExampleViewSet)
router.register('translate-example', NewRepositoryTranslatedExampleViewSet)
router.register('translation', RepositoryTranslatedExampleViewSet)
router.register('translation-entity/new',
NewRepositoryTranslatedExampleEntityViewSet)
router.register('translation-entity',
RepositoryTranslatedExampleEntityViewSet)
router.register('examples', RepositoryExamplesViewSet)
router.register('register', RegisterUserViewSet)
router.register('login', LoginViewSet)
Expand All @@ -125,3 +120,4 @@ def get_lookup_regex(self, viewset, lookup_prefix=''):
RepositoryAuthorizationRequestsViewSet)
router.register('review-authorization-request',
ReviewAuthorizationRequestViewSet)
router.register('entities', RepositoryEntitiesViewSet)
1 change: 1 addition & 0 deletions bothub/api/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
RepositoryExampleSerializer,
NewRepositoryExampleSerializer,
NewRepositoryExampleEntitySerializer,
RepositoryEntitySerializer,
)
from .translate import ( # noqa: F401
RepositoryTranslatedExampleEntitySeralizer,
Expand Down
105 changes: 94 additions & 11 deletions bothub/api/serializers/example.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
from rest_framework import serializers
from rest_framework.fields import empty

from django.utils.translation import gettext as _

from bothub.common.models import Repository
from bothub.common.models import RepositoryExample
from bothub.common.models import RepositoryExampleEntity
from bothub.common.models import RepositoryEntity
from bothub.common.models import RepositoryEntityLabel
from bothub.common import languages

from ..fields import EntityText
from ..fields import EntityValueField
from ..fields import LabelValueField
from ..validators import CanContributeInRepositoryExampleValidator
from ..validators import CanContributeInRepositoryValidator
from ..validators import ExampleWithIntentOrEntityValidator
from ..validators import EntityNotEqualLabelValidator
from .translate import RepositoryTranslatedExampleSerializer


Expand All @@ -22,6 +29,7 @@ class Meta:
'start',
'end',
'entity',
'label',
'created_at',
'value',
]
Expand All @@ -32,10 +40,16 @@ class Meta:
CanContributeInRepositoryExampleValidator(),
],
help_text=_('Example\'s ID'))
value = serializers.SerializerMethodField()
entity = serializers.SerializerMethodField()
label = serializers.SerializerMethodField()

def get_value(self, obj):
return obj.value
def get_entity(self, obj):
return obj.entity.value

def get_label(self, obj):
if not obj.entity.label:
return None
return obj.entity.label.value


class NewRepositoryExampleEntitySerializer(serializers.ModelSerializer):
Expand All @@ -46,8 +60,34 @@ class Meta:
'start',
'end',
'entity',
'label',
]

repository_example = serializers.PrimaryKeyRelatedField(
queryset=RepositoryExample.objects,
required=False)

entity = EntityValueField()
label = LabelValueField(
allow_blank=True,
required=False)

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.validators.append(EntityNotEqualLabelValidator())

def create(self, validated_data):
repository_example = validated_data.pop('repository_example', None)
assert repository_example
label = validated_data.pop('label', empty)
example_entity = self.Meta.model.objects.create(
repository_example=repository_example,
**validated_data)
if label is not empty:
example_entity.entity.set_label(label)
example_entity.entity.save(update_fields=['label'])
return example_entity


class RepositoryExampleSerializer(serializers.ModelSerializer):
class Meta:
Expand Down Expand Up @@ -88,8 +128,9 @@ class Meta:
'repository',
'repository_update',
'text',
'entities',
'language',
'intent',
'entities',
]

id = serializers.PrimaryKeyRelatedField(
Expand All @@ -101,11 +142,15 @@ class Meta:
validators=[
CanContributeInRepositoryValidator(),
],
source='repository_update',
write_only=True,
style={'show': False})
repository_update = serializers.PrimaryKeyRelatedField(
read_only=True,
style={'show': False})
language = serializers.ChoiceField(
languages.LANGUAGE_CHOICES,
allow_blank=True,
required=False)
entities = NewRepositoryExampleEntitySerializer(
many=True,
style={'text_field': 'text'})
Expand All @@ -114,14 +159,52 @@ def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.validators.append(ExampleWithIntentOrEntityValidator())

def validate_repository(self, repository):
return repository.current_update()

def create(self, validated_data):
entities_data = validated_data.pop('entities')
repository = validated_data.pop('repository')
try:
language = validated_data.pop('language')
except KeyError as e:
language = None
repository_update = repository.current_update(language or None)
validated_data.update({'repository_update': repository_update})
example = self.Meta.model.objects.create(**validated_data)
for entity_data in entities_data:
RepositoryExampleEntity.objects.create(
repository_example=example,
**entity_data)
entity_data.update({'repository_example': example.pk})
entity_serializer = NewRepositoryExampleEntitySerializer(
data=entity_data)
entity_serializer.is_valid(raise_exception=True)
entity_serializer.save()
return example


class RepositoryEntitySerializer(serializers.ModelSerializer):
class Meta:
model = RepositoryEntity
fields = [
'repository',
'value',
'label',
]

label = serializers.SerializerMethodField()

def get_label(self, obj):
if not obj.label:
return None
return obj.label.value


class RepositoryEntityLabelSerializer(serializers.ModelSerializer):
class Meta:
model = RepositoryEntityLabel
fields = [
'repository',
'value',
'entities',
]

entities = serializers.SlugRelatedField(
many=True,
slug_field='value',
read_only=True)
12 changes: 12 additions & 0 deletions bothub/api/serializers/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

from .category import RepositoryCategorySerializer
from .request import RequestRepositoryAuthorizationSerializer
from .example import RepositoryEntityLabelSerializer


class NewRepositorySerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -70,6 +71,8 @@ class Meta:
'is_private',
'intents',
'entities',
'labels',
'labels_list',
'examples__count',
'authorization',
'available_request_authorization',
Expand All @@ -87,6 +90,9 @@ class Meta:
slug_field='nickname',
read_only=True)
categories_list = serializers.SerializerMethodField()
entities = serializers.SerializerMethodField()
labels = RepositoryEntityLabelSerializer(many=True)
labels_list = serializers.SerializerMethodField()
authorization = serializers.SerializerMethodField()
examples__count = serializers.SerializerMethodField()
request_authorization = serializers.SerializerMethodField()
Expand All @@ -95,6 +101,12 @@ class Meta:
def get_categories_list(self, obj):
return RepositoryCategorySerializer(obj.categories, many=True).data

def get_entities(self, obj):
return obj.entities_list

def get_labels_list(self, obj):
return obj.labels_list

def get_authorization(self, obj):
request = self.context.get('request')
if not request:
Expand Down
7 changes: 7 additions & 0 deletions bothub/api/serializers/translate.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from bothub.common.models import RepositoryExample
from bothub.common.languages import LANGUAGE_CHOICES

from ..fields import EntityValueField
from ..validators import CanContributeInRepositoryTranslatedExampleValidator
from ..validators import CanContributeInRepositoryExampleValidator
from ..validators import TranslatedExampleEntitiesValidator
Expand All @@ -32,8 +33,12 @@ class Meta:
CanContributeInRepositoryTranslatedExampleValidator(),
],
help_text='Example translation ID')
entity = serializers.SerializerMethodField()
value = serializers.SerializerMethodField()

def get_entity(self, obj):
return obj.entity.value

def get_value(self, obj):
return obj.value

Expand Down Expand Up @@ -81,6 +86,8 @@ class Meta:
'entity',
]

entity = EntityValueField()


class NewRepositoryTranslatedExampleSerializer(serializers.ModelSerializer):
class Meta:
Expand Down
Loading

0 comments on commit ce2aaf0

Please sign in to comment.