From 5504ba19aab85b4cf7e9c429249f66ab59f906d8 Mon Sep 17 00:00:00 2001 From: Dmitry Kalinin Date: Tue, 16 Feb 2021 12:33:06 +0300 Subject: [PATCH] Label name editing (#2806) * Label name edition * Added wrong label id handling * Restored missed logging --- cvat-core/src/labels.js | 10 +++++++--- .../components/labels-editor/label-form.tsx | 3 +-- cvat/apps/engine/serializers.py | 18 ++++++++++++------ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cvat-core/src/labels.js b/cvat-core/src/labels.js index 7daf84c6..7e673245 100644 --- a/cvat-core/src/labels.js +++ b/cvat-core/src/labels.js @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2020 Intel Corporation +// Copyright (C) 2019-2021 Intel Corporation // // SPDX-License-Identifier: MIT @@ -171,17 +171,21 @@ * @name name * @type {string} * @memberof module:API.cvat.classes.Label - * @readonly * @instance */ name: { get: () => data.name, + set: (name) => { + if (typeof name !== 'string') { + throw new ArgumentError(`Name must be a string, but ${typeof name} was given`); + } + data.name = name; + }, }, /** * @name color * @type {string} * @memberof module:API.cvat.classes.Label - * @readonly * @instance */ color: { diff --git a/cvat-ui/src/components/labels-editor/label-form.tsx b/cvat-ui/src/components/labels-editor/label-form.tsx index 4d763952..c0f78329 100644 --- a/cvat-ui/src/components/labels-editor/label-form.tsx +++ b/cvat-ui/src/components/labels-editor/label-form.tsx @@ -374,7 +374,6 @@ export default class LabelForm extends React.Component { private renderLabelNameInput(): JSX.Element { const { label, labelNames } = this.props; const value = label ? label.name : ''; - const locked = label ? label.id >= 0 : false; return ( { }, ]} > - + ); } diff --git a/cvat/apps/engine/serializers.py b/cvat/apps/engine/serializers.py index fdc306e7..c617b01f 100644 --- a/cvat/apps/engine/serializers.py +++ b/cvat/apps/engine/serializers.py @@ -6,7 +6,7 @@ import os import re import shutil -from rest_framework import serializers +from rest_framework import serializers, exceptions from django.contrib.auth.models import User, Group from cvat.apps.engine import models @@ -66,6 +66,7 @@ class AttributeSerializer(serializers.ModelSerializer): return attribute class LabelSerializer(serializers.ModelSerializer): + id = serializers.IntegerField(required=False) attributes = AttributeSerializer(many=True, source='attributespec_set', default=[]) color = serializers.CharField(allow_blank=True, required=False) @@ -84,12 +85,17 @@ class LabelSerializer(serializers.ModelSerializer): else: instance['task'] = parent_instance logger = slogger.task[parent_instance.id] - (db_label, created) = models.Label.objects.get_or_create(name=validated_data['name'], - **instance) - if created: - logger.info("New {} label was created".format(db_label.name)) + if not validated_data.get('id') is None: + try: + db_label = models.Label.objects.get(id=validated_data['id'], + **instance) + except models.Label.DoesNotExist: + raise exceptions.NotFound(detail='Not found label with id #{} to change'.format(validated_data['id'])) + db_label.name = validated_data.get('name', db_label.name) + logger.info("{}({}) label was updated".format(db_label.name, db_label.id)) else: - logger.info("{} label was updated".format(db_label.name)) + db_label = models.Label.objects.create(name=validated_data.get('name'), **instance) + logger.info("New {} label was created".format(db_label.name)) if not validated_data.get('color', None): label_names = [l.name for l in instance[tuple(instance.keys())[0]].label_set.exclude(id=db_label.id).order_by('id')