Skip to content

Commit

Permalink
Merge pull request #328 from Ilhasoft/feature/version_delete_example
Browse files Browse the repository at this point in the history
Feature/version delete example
  • Loading branch information
dyohan9 committed Dec 12, 2019
2 parents 3dee76f + 275fc3d commit c029914
Show file tree
Hide file tree
Showing 11 changed files with 134 additions and 189 deletions.
2 changes: 1 addition & 1 deletion bothub/api/v2/evaluate/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class Meta:
"entities",
"created_at",
]
read_only_fields = ["deleted_in", "created_at"]
read_only_fields = ["created_at"]
ref_name = None

entities = RepositoryEvaluateEntitySerializer(many=True, required=False)
Expand Down
3 changes: 1 addition & 2 deletions bothub/api/v2/example/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,14 @@ class Meta:
fields = [
"id",
"repository_version",
"deleted_in",
"text",
"intent",
"language",
"created_at",
"entities",
"translations",
]
read_only_fields = ["deleted_in", "translations"]
read_only_fields = ["translations"]
ref_name = None

entities = RepositoryExampleEntitySerializer(many=True, read_only=True)
Expand Down
2 changes: 0 additions & 2 deletions bothub/api/v2/repository/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
from bothub.common.models import RepositoryAuthorization
from bothub.common.models import RequestRepositoryAuthorization

# from bothub.common.models import RepositoryUpdate


class RepositoriesFilter(filters.FilterSet):
class Meta:
Expand Down
5 changes: 1 addition & 4 deletions bothub/api/v2/repository/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,6 @@ class Meta:
fields = [
"id",
"repository",
"deleted_in",
"text",
"intent",
"language",
Expand All @@ -491,7 +490,7 @@ class Meta:
"translations",
"repository_version",
]
read_only_fields = ["deleted_in"]
read_only_fields = []
ref_name = None

id = serializers.PrimaryKeyRelatedField(read_only=True, style={"show": False})
Expand Down Expand Up @@ -547,7 +546,6 @@ def create(self, validated_data):
intent=validated_data.get("intent"),
repository_version_language__repository_version__repository=repository,
repository_version_language__language=language,
deleted_in__isnull=True,
):
raise APIExceptionCustom(
detail=_("Intention and Sentence already exists")
Expand All @@ -560,7 +558,6 @@ def create(self, validated_data):
intent=validated_data.get("intent"),
repository_version_language=repository_version_language,
repository_version_language__repository_version__is_default=True,
deleted_in__isnull=True,
repository_version_language__language=language,
):
raise APIExceptionCustom(
Expand Down
5 changes: 0 additions & 5 deletions bothub/api/v2/repository/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -492,8 +492,3 @@ def upload_examples(self, request, **kwargs):
not_added.append(data)

return Response({"added": count_added, "not_added": not_added})

def perform_destroy(self, obj):
if obj.deleted_in:
raise APIException(_("Example already deleted"))
obj.delete()
56 changes: 55 additions & 1 deletion bothub/api/v2/tests/test_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from bothub.api.v2.repository.views import RepositoryVotesViewSet
from bothub.api.v2.repository.views import SearchRepositoriesViewSet
from bothub.api.v2.tests.utils import create_user_and_token
from bothub.api.v2.versionning.views import RepositoryVersionViewSet
from bothub.common import languages
from bothub.common.models import Repository
from bothub.common.models import RepositoryAuthorization
Expand Down Expand Up @@ -1276,7 +1277,7 @@ def test_already_deleted(self):
self.example.delete()

response = self.request(self.example, self.owner_token)
self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)


class RepositoryExampleUpdateTestCase(TestCase):
Expand Down Expand Up @@ -1781,3 +1782,56 @@ def test_text_required(self):
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn("text", content_data.keys())


class VersionsTestCase(TestCase):
def setUp(self):
self.factory = RequestFactory()

self.owner, self.owner_token = create_user_and_token("owner")

self.repository = Repository.objects.create(
owner=self.owner,
name="Testing",
slug="test",
language=languages.LANGUAGE_EN,
)
current_version = self.repository.current_version()
RepositoryExample.objects.create(
repository_version_language=current_version,
text="my name is Douglas",
intent="greet",
)
RepositoryExample.objects.create(
repository_version_language=current_version,
text="my name is John",
intent="greet",
)
current_version.start_training(self.owner)

def request(self, data, token=None):
authorization_header = (
{"HTTP_AUTHORIZATION": "Token {}".format(token.key)} if token else {}
)
request = self.factory.get(
"/v2/repository/version/", data, **authorization_header
)
response = RepositoryVersionViewSet.as_view({"get": "list"})(request)
response.render()
content_data = json.loads(response.content)
return (response, content_data)

def test_okay(self):
response, content_data = self.request(
{"repository": str(self.repository.uuid)}, self.owner_token
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(content_data.get("count"), 1)

def test_not_authenticated(self):
response, content_data = self.request({"repository": str(self.repository.uuid)})
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)

def test_without_repository(self):
response, content_data = self.request({}, self.owner_token)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
24 changes: 7 additions & 17 deletions bothub/api/v2/versionning/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,23 +84,13 @@ def create(self, validated_data):
)

for example in examples:
if example.deleted_in:
example_id = RepositoryExample.objects.create(
repository_version_language=version_language,
deleted_in=instance,
text=example.text,
intent=example.intent,
created_at=example.created_at,
last_update=example.last_update,
)
else:
example_id = RepositoryExample.objects.create(
repository_version_language=version_language,
text=example.text,
intent=example.intent,
created_at=example.created_at,
last_update=example.last_update,
)
example_id = RepositoryExample.objects.create(
repository_version_language=version_language,
text=example.text,
intent=example.intent,
created_at=example.created_at,
last_update=example.last_update,
)

example_entites = RepositoryExampleEntity.objects.filter(
repository_example=example
Expand Down
17 changes: 17 additions & 0 deletions bothub/common/migrations/0041_delete_examples_isdeleted.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django.db import migrations


def noop(apps, schema_editor): # pragma: no cover
pass


def delete_examples_already_deleted(apps, schema_editor): # pragma: no cover
RepositoryExample = apps.get_model("common", "RepositoryExample")
RepositoryExample.objects.filter(deleted_in__isnull=False).delete()


class Migration(migrations.Migration):

dependencies = [("common", "0040_initial")]

operations = [migrations.RunPython(delete_examples_already_deleted, noop)]
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Generated by Django 2.1.11 on 2019-12-12 17:14
# Generated by Django 2.1.11 on 2019-12-12 20:13

import bothub.common.languages
from django.conf import settings
Expand All @@ -11,7 +11,7 @@ class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("common", "0040_initial"),
("common", "0041_delete_examples_isdeleted"),
]

operations = [
Expand Down Expand Up @@ -122,7 +122,7 @@ class Migration(migrations.Migration):
),
(
"last_update",
models.DateTimeField(auto_now_add=True, verbose_name="last update"),
models.DateTimeField(null=True, verbose_name="last update"),
),
(
"total_training_end",
Expand Down Expand Up @@ -151,6 +151,7 @@ class Migration(migrations.Migration):
migrations.RemoveField(
model_name="repositoryevaluateresult", name="repository_update"
),
migrations.RemoveField(model_name="repositoryexample", name="deleted_in"),
migrations.RemoveField(
model_name="repositoryexample", name="repository_update"
),
Expand All @@ -176,17 +177,6 @@ class Migration(migrations.Migration):
to="common.RepositoryVersionLanguage",
),
),
migrations.AlterField(
model_name="repositoryexample",
name="deleted_in",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="deleted",
to="common.RepositoryVersionLanguage",
),
),
migrations.DeleteModel(name="RepositoryUpdate"),
migrations.AddField(
model_name="repositoryversion",
Expand Down
67 changes: 20 additions & 47 deletions bothub/common/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def order_by_relevance(self):
)

def supported_language(self, language):
valid_examples = RepositoryExample.objects.filter(deleted_in__isnull=True)
valid_examples = RepositoryExample.objects.all()
valid_updates = RepositoryVersionLanguage.objects.filter(
added__in=valid_examples
)
Expand Down Expand Up @@ -402,8 +402,6 @@ def examples(
)
if language:
query = query.filter(repository_version_language__language=language)
if exclude_deleted:
return query.exclude(deleted_in__isnull=False)
return query

def evaluations(
Expand All @@ -420,8 +418,6 @@ def evaluations(
)
if language:
query = query.filter(repository_version_language__language=language)
if exclude_deleted:
return query.exclude(deleted_in__isnull=False)
return query # pragma: no cover

def evaluations_results(self, queryset=None, version_default=True):
Expand Down Expand Up @@ -478,10 +474,6 @@ def current_version(self, language=None, is_default=True):

repository_version, created = self.versions.get_or_create(is_default=is_default)

if repository_version.created_by is None:
repository_version.created_by = repository_version.repository.owner
repository_version.save(update_fields=["created_by"])

repository_version_language, created = RepositoryVersionLanguage.objects.get_or_create(
repository_version=repository_version, language=language
)
Expand Down Expand Up @@ -566,12 +558,10 @@ class Meta:
choices=Repository.ALGORITHM_CHOICES,
default=Repository.ALGORITHM_STATISTICAL_MODEL,
)
repository_version = models.ForeignKey(
RepositoryVersion, models.CASCADE
) # updates related_name
repository_version = models.ForeignKey(RepositoryVersion, models.CASCADE)
training_log = models.TextField(_("training log"), blank=True, editable=False)
created_at = models.DateTimeField(_("created at"), auto_now_add=True)
last_update = models.DateTimeField(_("last update"), auto_now_add=True)
last_update = models.DateTimeField(_("last update"), null=True)
total_training_end = models.IntegerField(
_("total training end"), default=0, blank=False, null=False
)
Expand All @@ -585,15 +575,7 @@ def examples(self):
| models.Q(translations__language=self.language)
)
if self.training_end_at and (self.training_end_at >= self.last_update):
t_started_at = self.training_started_at
examples = examples.exclude(
models.Q(last_update__lte=self.training_end_at)
| models.Q(deleted_in=self)
| models.Q(deleted_in__training_started_at__lt=t_started_at)
)

else:
examples = examples.exclude(deleted_in__isnull=False)
examples = examples.exclude(models.Q(last_update__lte=self.training_end_at))
return examples.distinct()

@property
Expand Down Expand Up @@ -695,11 +677,7 @@ def ready_for_train(self):
if previous_update.failed_at:
return True

if (
not self.added.exists()
and not self.translated_added.exists()
and not self.deleted.exists()
):
if not self.added.exists() and not self.translated_added.exists():
return False

if self.examples.count() == 0:
Expand Down Expand Up @@ -731,10 +709,6 @@ def __str__(self):
return "Repository Version Language #{}".format(self.id) # pragma: no cover

def validate_init_train(self, by=None):
# if self.trained_at:
# raise RepositoryUpdateAlreadyTrained()
# if self.training_started_at:
# raise RepositoryUpdateAlreadyStartedTraining()
if by:
authorization = self.repository_version.repository.get_user_authorization(
by
Expand Down Expand Up @@ -764,13 +738,20 @@ def start_training(self, created_by):
self.repository_version.save(update_fields=["created_by"])

def save_training(self, bot_data):
# if self.trained_at:
# raise RepositoryUpdateAlreadyTrained()
last_time = timezone.now()

self.training_end_at = timezone.now()
self.training_end_at = last_time
self.last_update = last_time
self.bot_data = bot_data
self.total_training_end += 1
self.save(update_fields=["total_training_end", "training_end_at", "bot_data"])
self.save(
update_fields=[
"total_training_end",
"training_end_at",
"bot_data",
"last_update",
]
)

def get_bot_data(self):
return self.bot_data
Expand All @@ -789,13 +770,6 @@ class Meta:
repository_version_language = models.ForeignKey(
RepositoryVersionLanguage, models.CASCADE, related_name="added", editable=False
)
deleted_in = models.ForeignKey(
RepositoryVersionLanguage,
models.CASCADE,
related_name="deleted",
blank=True,
null=True,
)
text = models.TextField(_("text"), help_text=_("Example text"))
intent = models.CharField(
_("intent"),
Expand Down Expand Up @@ -838,11 +812,10 @@ def get_entities(self, language): # pragma: no cover
return self.entities.all()
return self.get_translation(language).entities.all()

def delete(self):
self.deleted_in = self.repository_version_language.repository_version.repository.current_version(
self.repository_version_language.language
)
self.save(update_fields=["deleted_in"])
def delete(self, using=None, keep_parents=False):
self.repository_version_language.last_update = timezone.now()
self.repository_version_language.save(update_fields=["last_update"])
return super().delete(using, keep_parents)


class RepositoryTranslatedExampleManager(models.Manager):
Expand Down
Loading

0 comments on commit c029914

Please sign in to comment.