Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/version delete example #328

Merged
merged 4 commits into from
Dec 12, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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