From 6e67569dc8635579252cb7deed85c98eaae21135 Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Wed, 17 May 2023 14:11:44 -0300 Subject: [PATCH 01/11] adding evaluate_type on result evaluate --- bothub/api/v2/evaluate/filters.py | 9 +++++ bothub/api/v2/evaluate/serializers.py | 13 ++++++- bothub/api/v2/repository/views.py | 34 ++++++++++++++++--- .../migrations/0118_auto_20230517_1711.py | 24 +++++++++++++ bothub/common/models.py | 12 +++++++ 5 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 bothub/common/migrations/0118_auto_20230517_1711.py diff --git a/bothub/api/v2/evaluate/filters.py b/bothub/api/v2/evaluate/filters.py index 90ef6e4a..46460f8a 100644 --- a/bothub/api/v2/evaluate/filters.py +++ b/bothub/api/v2/evaluate/filters.py @@ -110,6 +110,12 @@ class Meta: help_text=_("Filter for repository cross_validation results."), ) + type = filters.CharFilter( + field_name="type", + method="filter_evaluate_type", + help_text=_("Filter by evaluate type") + ) + def filter_repository_uuid(self, queryset, name, value): request = self.request try: @@ -139,6 +145,9 @@ def filter_repository_version(self, queryset, name, value): def filter_repository_cross_validation(self, queryset, name, value): return queryset.filter(cross_validation=value) + + def filter_evaluate_type(self, queryset, name, value): + return queryset.filter(evaluate_type=value) class EvaluateResultFilter(filters.FilterSet): diff --git a/bothub/api/v2/evaluate/serializers.py b/bothub/api/v2/evaluate/serializers.py index 9469236d..ee622293 100644 --- a/bothub/api/v2/evaluate/serializers.py +++ b/bothub/api/v2/evaluate/serializers.py @@ -118,14 +118,18 @@ def update(self, instance, validated_data): class RepositoryEvaluateResultVersionsSerializer(serializers.ModelSerializer): class Meta: model = RepositoryEvaluateResult - fields = ["id", "language", "created_at", "version", "cross_validation"] + fields = ["id", "language", "created_at", "version", "cross_validation", "accuracy"] ref_name = None language = serializers.SerializerMethodField() + accuracy = serializers.SerializerMethodField() def get_language(self, obj): return obj.repository_version_language.language + def get_accuracy(self, obj): + return obj.intent_results.accuracy + class RepositoryEvaluateResultScore(serializers.ModelSerializer): class Meta: @@ -192,6 +196,8 @@ class Meta: "intent_results", "entity_results", "cross_validation", + "accuracy", + "evaluate_type" ] ref_name = None @@ -201,6 +207,8 @@ class Meta: repository_version = serializers.SerializerMethodField() intent_results = RepositoryEvaluateResultScore(read_only=True) entity_results = RepositoryEvaluateResultScore(read_only=True) + accuracy = serializers.SerializerMethodField() + evaluate_type = serializers.IntegerField(required=False, help_text="type from evaluate") def get_intents_list(self, obj): return RepositoryEvaluateResultIntentSerializer( @@ -297,3 +305,6 @@ def filter_intent(log, intent, min_confidence, max_confidence): } return {"total_pages": 0, "current_page": 1, "results": []} + + def get_accuracy(self, obj): + return obj.intent_results.accuracy \ No newline at end of file diff --git a/bothub/api/v2/repository/views.py b/bothub/api/v2/repository/views.py index cedfb211..5b923b4e 100644 --- a/bothub/api/v2/repository/views.py +++ b/bothub/api/v2/repository/views.py @@ -60,6 +60,8 @@ RepositoryVote, RequestRepositoryAuthorization, RepositoryVersionLanguage, + RepositoryEvaluate, + RepositoryEvaluateResult, Organization, ) @@ -719,17 +721,41 @@ def evaluate(self, request, **kwargs): serializer.is_valid(raise_exception=True) # pragma: no cover try: - request = repository.request_nlp_manual_evaluate( # pragma: no cover + nlp_request = repository.request_nlp_manual_evaluate( # pragma: no cover user_authorization, serializer.data ) except DjangoValidationError as e: raise APIException(e.message, code=400) - if request.status_code != status.HTTP_200_OK: # pragma: no cover + if nlp_request.status_code != status.HTTP_200_OK: # pragma: no cover raise APIException( - {"status_code": request.status_code}, code=request.status_code + {"status_code": nlp_request.status_code}, code=nlp_request.status_code ) # pragma: no cover - return Response(request.json()) # pragma: no cover + + response = nlp_request.json() + + evaluate_id = response.get("evaluate_id") + evaluate_result = RepositoryEvaluateResult.objects.get(pk=evaluate_id) + if request.data.get("evaluate_type", False): + evaluate_result.evaluate_type = request.data.get("evaluate_type") + evaluate_result.save() + logs = json.loads(evaluate_result.log) + intent_count = 0 + intent_success = 0 + + for res in logs: + intent_count += 1 + intent_success += 1 if res.get("intent_status") == "success" else 0 + + result_data = { + "accuracy": evaluate_result.intent_results.accuracy, + "intents_count": intent_count, + "intents_success": intent_success, + "evalute_type": evaluate_result.evaluate_type, + } + response.update(result_data) + + return Response(response) # pragma: no cover @action( detail=True, diff --git a/bothub/common/migrations/0118_auto_20230517_1711.py b/bothub/common/migrations/0118_auto_20230517_1711.py new file mode 100644 index 00000000..6b3d39ff --- /dev/null +++ b/bothub/common/migrations/0118_auto_20230517_1711.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.15 on 2023-05-17 17:11 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0117_alter_zeroshotoptions_option_uuid'), + ] + + operations = [ + migrations.AddField( + model_name='repositoryevaluateresult', + name='evaluate_type', + field=models.PositiveIntegerField(blank=True, choices=[(0, 'manual'), (1, 'automatic')], default=0, null=True, verbose_name='role'), + ), + migrations.AlterField( + model_name='zeroshotoptions', + name='option_uuid', + field=models.UUIDField(default=uuid.UUID('4e0cf37b-a6b2-40fd-a3cb-cce5bda8e14e')), + ), + ] diff --git a/bothub/common/models.py b/bothub/common/models.py index 5b62e94c..52e8aa50 100644 --- a/bothub/common/models.py +++ b/bothub/common/models.py @@ -2381,6 +2381,18 @@ class Meta: cross_validation = models.BooleanField(_("cross validation"), default=False) + TYPE_MANUAL = 0 + TYPE_AUTOMATIC = 1 + + EVALUATE_TYPES_CHOICE = [ + (TYPE_MANUAL, "manual"), + (TYPE_AUTOMATIC, "automatic") + ] + + evaluate_type = models.PositiveIntegerField( + _("role"), choices=EVALUATE_TYPES_CHOICE, default=TYPE_MANUAL, blank=True, null=True + ) + def save(self, *args, **kwargs): repository = self.repository_version_language.repository_version.repository self.version = repository.evaluations_results().count() + 1 From 53371dd4dbe0bd32841ccf0939bfa50a2e88ae68 Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Wed, 17 May 2023 15:21:43 -0300 Subject: [PATCH 02/11] adding qualitity evaluate result --- bothub/api/v2/evaluate/serializers.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bothub/api/v2/evaluate/serializers.py b/bothub/api/v2/evaluate/serializers.py index ee622293..3aedb6af 100644 --- a/bothub/api/v2/evaluate/serializers.py +++ b/bothub/api/v2/evaluate/serializers.py @@ -197,7 +197,8 @@ class Meta: "entity_results", "cross_validation", "accuracy", - "evaluate_type" + "evaluate_type", + "qualitity", ] ref_name = None @@ -209,6 +210,7 @@ class Meta: entity_results = RepositoryEvaluateResultScore(read_only=True) accuracy = serializers.SerializerMethodField() evaluate_type = serializers.IntegerField(required=False, help_text="type from evaluate") + qualitity = serializers.SerializerMethodField() def get_intents_list(self, obj): return RepositoryEvaluateResultIntentSerializer( @@ -307,4 +309,11 @@ def filter_intent(log, intent, min_confidence, max_confidence): return {"total_pages": 0, "current_page": 1, "results": []} def get_accuracy(self, obj): - return obj.intent_results.accuracy \ No newline at end of file + return obj.intent_results.accuracy + + def get_qualitity(self, obj): + intents = json.loads(obj.log) + + for intent in intents: + success_count += 1 if intent.get("intent_status") == "success" else 0 + return (success_count * 100) / len(intents) From 5f6bf1f0ba41f46719a8056325f6ed9bf9e0b282 Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Wed, 17 May 2023 15:40:42 -0300 Subject: [PATCH 03/11] init count --- bothub/api/v2/evaluate/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bothub/api/v2/evaluate/serializers.py b/bothub/api/v2/evaluate/serializers.py index 3aedb6af..f4284644 100644 --- a/bothub/api/v2/evaluate/serializers.py +++ b/bothub/api/v2/evaluate/serializers.py @@ -313,7 +313,7 @@ def get_accuracy(self, obj): def get_qualitity(self, obj): intents = json.loads(obj.log) - + success_count = 0 for intent in intents: success_count += 1 if intent.get("intent_status") == "success" else 0 return (success_count * 100) / len(intents) From 87d75d558c8d7b1d5ebdc33a6955e0f185a89f02 Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Wed, 17 May 2023 17:27:00 -0300 Subject: [PATCH 04/11] adding recommendations to qualitity evaluate --- bothub/api/v2/evaluate/serializers.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/bothub/api/v2/evaluate/serializers.py b/bothub/api/v2/evaluate/serializers.py index f4284644..110ac863 100644 --- a/bothub/api/v2/evaluate/serializers.py +++ b/bothub/api/v2/evaluate/serializers.py @@ -199,6 +199,7 @@ class Meta: "accuracy", "evaluate_type", "qualitity", + "recommendations", ] ref_name = None @@ -211,6 +212,7 @@ class Meta: accuracy = serializers.SerializerMethodField() evaluate_type = serializers.IntegerField(required=False, help_text="type from evaluate") qualitity = serializers.SerializerMethodField() + recommendations = serializers.SerializerMethodField() def get_intents_list(self, obj): return RepositoryEvaluateResultIntentSerializer( @@ -317,3 +319,26 @@ def get_qualitity(self, obj): for intent in intents: success_count += 1 if intent.get("intent_status") == "success" else 0 return (success_count * 100) / len(intents) + +def get_recommendations(obj): + intents = json.loads(obj.log) + count_intents = {} + intent_keys = [] + reccommendations = [] + sum_intents = 0 + qnt_intents = 0 + + for intent in intents: + if intent.get("intent") not in count_intents: + qnt_intents += 1 + count_intents[intent.get("intent")] = 0 + intent_keys.append(intent.get("intent")) + count_intents[intent.get("intent")] += 1 + sum_intents += 1 + + avg_intents = sum_intents / qnt_intents + + for intent in count_intents: + if count_intents.get(intent) < avg_intents: + reccommendations.append(intent) + return {"add_phares_to": reccommendations} From a9fa7c0f254ba2d71c2b64bc7de2b41d1bc462ee Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Thu, 18 May 2023 15:51:48 -0300 Subject: [PATCH 05/11] adding recommendations to evaluates and trains --- bothub/api/v2/evaluate/serializers.py | 42 +++++++++++++------------- bothub/api/v2/repository/views.py | 43 +++++++++++++++++++++++++++ bothub/utils.py | 26 ++++++++++++++++ 3 files changed, 89 insertions(+), 22 deletions(-) diff --git a/bothub/api/v2/evaluate/serializers.py b/bothub/api/v2/evaluate/serializers.py index 110ac863..2297422c 100644 --- a/bothub/api/v2/evaluate/serializers.py +++ b/bothub/api/v2/evaluate/serializers.py @@ -320,25 +320,23 @@ def get_qualitity(self, obj): success_count += 1 if intent.get("intent_status") == "success" else 0 return (success_count * 100) / len(intents) -def get_recommendations(obj): - intents = json.loads(obj.log) - count_intents = {} - intent_keys = [] - reccommendations = [] - sum_intents = 0 - qnt_intents = 0 - - for intent in intents: - if intent.get("intent") not in count_intents: - qnt_intents += 1 - count_intents[intent.get("intent")] = 0 - intent_keys.append(intent.get("intent")) - count_intents[intent.get("intent")] += 1 - sum_intents += 1 - - avg_intents = sum_intents / qnt_intents - - for intent in count_intents: - if count_intents.get(intent) < avg_intents: - reccommendations.append(intent) - return {"add_phares_to": reccommendations} + def get_recommendations(self, obj): + intents = json.loads(obj.log) + count_intents = {} + reccommendations = [] + sum_intents = 0 + qnt_intents = 0 + + for intent in intents: + if intent.get("intent") not in count_intents: + qnt_intents += 1 + count_intents[intent.get("intent")] = 0 + count_intents[intent.get("intent")] += 1 + sum_intents += 1 + + avg_intents = sum_intents / qnt_intents + + for intent in count_intents: + if count_intents.get(intent) < avg_intents: + reccommendations.append(intent) + return {"add_phares_to": reccommendations} diff --git a/bothub/api/v2/repository/views.py b/bothub/api/v2/repository/views.py index 5b923b4e..a71cc397 100644 --- a/bothub/api/v2/repository/views.py +++ b/bothub/api/v2/repository/views.py @@ -129,6 +129,8 @@ ConnectRESTClient as ConnectClient, ) +from bothub.utils import levenshtein_distance + User = get_user_model() @@ -815,6 +817,47 @@ def check_can_automatic_evaluate(self, request, **kwargs): return Response(response) # pragma: no cover + @action( + detail=True, + methods=["GET"], + url_name="get-recommendations-repository", + ) + def get_recommendations_repository(self, request, **kwargs): + repository = self.get_object() + user_authorization = repository.get_user_authorization(request.user) + if not user_authorization.can_write: + raise PermissionDenied() + + examples = RepositoryExample.objects.filter(repository_version_language__repository_version__repository=repository) + intents = {} + sum_intents = 0 + qnt_intents = 0 + sum_distance = 0 + + for example in examples: + if example.intent.text not in intents: + intents[example.intent.text] = {"text": [], "count": 0, "distance": 0} + intents[example.intent.text]["text"].append(example.text) + intents[example.intent.text]["count"] += 1 + sum_intents += 1 + qnt_intents += 1 + response = {"add_phares_to": [], "more_diversity": []} + avg_intents = (sum_intents/qnt_intents) + for intent in intents: + for i in range(0, intents[intent]['count']): + for j in range(i, intents[intent]['count']): + intents[intent]['distance'] += levenshtein_distance(intents[intent]['text'][i], intents[intent]['text'][j]) + sum_distance += intents[intent]['distance'] + + avg_distance = sum_distance / qnt_intents + for intent in intents: + if intents[intent]['count'] < avg_intents: + response["add_phares_to"].append(intent) + if intents[intent]['distance'] < avg_distance: + response["more_diversity"].append(intent) + return Response(data=response) + + @method_decorator( name="list", decorator=swagger_auto_schema( diff --git a/bothub/utils.py b/bothub/utils.py index f5da94cf..03f6bbf1 100644 --- a/bothub/utils.py +++ b/bothub/utils.py @@ -512,3 +512,29 @@ def check_module_permission(claims, user): "categories_list", "repository_type", ] + + +def levenshtein_distance(str1, str2): + size_x = len(str1) + 1 + size_y = len(str2) + 1 + matrix = np.zeros ((size_x, size_y)) + for x in range(size_x): + matrix [x, 0] = x + for y in range(size_y): + matrix [0, y] = y + + for x in range(1, size_x): + for y in range(1, size_y): + if str1[x-1] == str2[y-1]: + matrix [x,y] = min( + matrix[x-1, y] + 1, + matrix[x-1, y-1], + matrix[x, y-1] + 1 + ) + else: + matrix [x,y] = min( + matrix[x-1,y] + 1, + matrix[x-1,y-1] + 1, + matrix[x,y-1] + 1 + ) + return (matrix[size_x - 1, size_y - 1]) From 94aa629c70dadd075c7b57fe3d432356e478cf5e Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Thu, 18 May 2023 17:12:46 -0300 Subject: [PATCH 06/11] adding evaluete to all languages --- bothub/api/v2/repository/views.py | 79 +++++++++++++++++-------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/bothub/api/v2/repository/views.py b/bothub/api/v2/repository/views.py index a71cc397..73f5b48a 100644 --- a/bothub/api/v2/repository/views.py +++ b/bothub/api/v2/repository/views.py @@ -719,44 +719,51 @@ def evaluate(self, request, **kwargs): user_authorization = repository.get_user_authorization(request.user) if not user_authorization.can_write: raise PermissionDenied() - serializer = EvaluateSerializer(data=request.data) # pragma: no cover - serializer.is_valid(raise_exception=True) # pragma: no cover - - try: - nlp_request = repository.request_nlp_manual_evaluate( # pragma: no cover - user_authorization, serializer.data - ) - except DjangoValidationError as e: - raise APIException(e.message, code=400) + data = request.data + response = [] + for version_language in repository.versions.version_languages: + if "language" in data: + data["language"] = version_language.language + else: + data.update({"language": version_language.language}) + serializer = EvaluateSerializer(data=data) # pragma: no cover + serializer.is_valid(raise_exception=True) # pragma: no cover - if nlp_request.status_code != status.HTTP_200_OK: # pragma: no cover - raise APIException( - {"status_code": nlp_request.status_code}, code=nlp_request.status_code - ) # pragma: no cover - - response = nlp_request.json() - - evaluate_id = response.get("evaluate_id") - evaluate_result = RepositoryEvaluateResult.objects.get(pk=evaluate_id) - if request.data.get("evaluate_type", False): - evaluate_result.evaluate_type = request.data.get("evaluate_type") - evaluate_result.save() - logs = json.loads(evaluate_result.log) - intent_count = 0 - intent_success = 0 - - for res in logs: - intent_count += 1 - intent_success += 1 if res.get("intent_status") == "success" else 0 - - result_data = { - "accuracy": evaluate_result.intent_results.accuracy, - "intents_count": intent_count, - "intents_success": intent_success, - "evalute_type": evaluate_result.evaluate_type, - } - response.update(result_data) + try: + nlp_request = repository.request_nlp_manual_evaluate( # pragma: no cover + user_authorization, serializer.data + ) + except DjangoValidationError as e: + raise APIException(e.message, code=400) + if nlp_request.status_code != status.HTTP_200_OK: # pragma: no cover + raise APIException( + {"status_code": nlp_request.status_code}, code=nlp_request.status_code + ) # pragma: no cover + + nlp_response = nlp_request.json() + + evaluate_id = nlp_response.get("evaluate_id") + evaluate_result = RepositoryEvaluateResult.objects.get(pk=evaluate_id) + if request.data.get("evaluate_type", False): + evaluate_result.evaluate_type = request.data.get("evaluate_type") + evaluate_result.save() + logs = json.loads(evaluate_result.log) + intent_count = 0 + intent_success = 0 + + for res in logs: + intent_count += 1 + intent_success += 1 if res.get("intent_status") == "success" else 0 + + result_data = { + "accuracy": evaluate_result.intent_results.accuracy, + "intents_count": intent_count, + "intents_success": intent_success, + "evalute_type": evaluate_result.evaluate_type, + } + nlp_response.update(result_data) + response.append(nlp_response) return Response(response) # pragma: no cover @action( From 427850c5278da912fd84c701b70e64a2dd7768ee Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Thu, 18 May 2023 17:42:55 -0300 Subject: [PATCH 07/11] change the filter of queryset --- bothub/api/v2/repository/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bothub/api/v2/repository/views.py b/bothub/api/v2/repository/views.py index 73f5b48a..3072b913 100644 --- a/bothub/api/v2/repository/views.py +++ b/bothub/api/v2/repository/views.py @@ -721,7 +721,8 @@ def evaluate(self, request, **kwargs): raise PermissionDenied() data = request.data response = [] - for version_language in repository.versions.version_languages: + version_languages = RepositoryVersionLanguage.objects.filter(repository_version__pk=data.get("repository_version")) + for version_language in version_languages: if "language" in data: data["language"] = version_language.language else: From 6358ba8ebb207c21eda584fc50e075bbdf2c2d6f Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Fri, 19 May 2023 11:06:59 -0300 Subject: [PATCH 08/11] adding check if language has phrase test on evaluate --- bothub/api/v2/repository/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bothub/api/v2/repository/views.py b/bothub/api/v2/repository/views.py index 3072b913..b7b8cf74 100644 --- a/bothub/api/v2/repository/views.py +++ b/bothub/api/v2/repository/views.py @@ -723,6 +723,8 @@ def evaluate(self, request, **kwargs): response = [] version_languages = RepositoryVersionLanguage.objects.filter(repository_version__pk=data.get("repository_version")) for version_language in version_languages: + if not repository.have_at_least_one_test_phrase_registered(version_language.language): + continue if "language" in data: data["language"] = version_language.language else: From b20de9c8672b8f69d7bf958c6705fe6e3785198c Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Wed, 7 Jun 2023 12:14:06 -0300 Subject: [PATCH 09/11] adding count test phrases and check if a repository has been trainig --- bothub/api/v2/evaluate/serializers.py | 5 +++++ bothub/api/v2/repository/serializers.py | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/bothub/api/v2/evaluate/serializers.py b/bothub/api/v2/evaluate/serializers.py index 2297422c..7b0abd65 100644 --- a/bothub/api/v2/evaluate/serializers.py +++ b/bothub/api/v2/evaluate/serializers.py @@ -200,6 +200,7 @@ class Meta: "evaluate_type", "qualitity", "recommendations", + "count_logs" ] ref_name = None @@ -213,6 +214,7 @@ class Meta: evaluate_type = serializers.IntegerField(required=False, help_text="type from evaluate") qualitity = serializers.SerializerMethodField() recommendations = serializers.SerializerMethodField() + count_logs = serializers.SerializerMethodField() def get_intents_list(self, obj): return RepositoryEvaluateResultIntentSerializer( @@ -340,3 +342,6 @@ def get_recommendations(self, obj): if count_intents.get(intent) < avg_intents: reccommendations.append(intent) return {"add_phares_to": reccommendations} + + def get_count_logs(self, obj): + return len(json.loads(obj.log)) diff --git a/bothub/api/v2/repository/serializers.py b/bothub/api/v2/repository/serializers.py index 7c7d5feb..1e586188 100644 --- a/bothub/api/v2/repository/serializers.py +++ b/bothub/api/v2/repository/serializers.py @@ -43,6 +43,7 @@ RequestRepositoryAuthorization, RepositoryVersionLanguage, QAKnowledgeBase, + RepositoryNLPLog, ) from bothub.utils import classifier_choice from .validators import ( @@ -504,6 +505,7 @@ class Meta: "count_authorizations", "repository_version_language", "repository_type", + "has_training", ] ref_name = None @@ -617,6 +619,7 @@ class Meta: repository_type = serializers.CharField( style={"show": False}, read_only=True, source="repository.repository_type" ) + has_training = serializers.SerializerMethodField() def get_authorizations(self, obj): auths = RepositoryAuthorization.objects.filter( @@ -874,6 +877,12 @@ def get_repository_score(self, obj): def get_repository_version_language(self, obj): return obj.repositoryversionlanguage_set.all().values("id", "language") + def get_has_training(self, obj): + logs = RepositoryNLPLog.objects.filter( + repository_version_language__repository_version__repository=obj + ) + return logs.exists() + class RepositoryTrainInfoSerializer(serializers.ModelSerializer): class Meta: From 99d4315281eb32efc82e88dd1e20f1eeec365757 Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Wed, 7 Jun 2023 15:12:47 -0300 Subject: [PATCH 10/11] fix the field list --- bothub/api/v2/repository/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bothub/api/v2/repository/serializers.py b/bothub/api/v2/repository/serializers.py index 1e586188..496ce747 100644 --- a/bothub/api/v2/repository/serializers.py +++ b/bothub/api/v2/repository/serializers.py @@ -487,6 +487,7 @@ class Meta: "repository_score", "repository_version_language", "repository_type", + "has_training", ] read_only = [ "uuid", @@ -505,7 +506,6 @@ class Meta: "count_authorizations", "repository_version_language", "repository_type", - "has_training", ] ref_name = None From a8c2c4be5b3178c3a9408d81b1de6a0bb3205d55 Mon Sep 17 00:00:00 2001 From: Jackson Barbosa Date: Wed, 7 Jun 2023 15:33:05 -0300 Subject: [PATCH 11/11] fix repository_nlp_log filter --- bothub/api/v2/repository/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bothub/api/v2/repository/serializers.py b/bothub/api/v2/repository/serializers.py index 496ce747..8e62ac8d 100644 --- a/bothub/api/v2/repository/serializers.py +++ b/bothub/api/v2/repository/serializers.py @@ -879,7 +879,7 @@ def get_repository_version_language(self, obj): def get_has_training(self, obj): logs = RepositoryNLPLog.objects.filter( - repository_version_language__repository_version__repository=obj + repository_version_language__repository_version__repository=obj.repository ) return logs.exists()