diff --git a/cvat-core/src/labels.js b/cvat-core/src/labels.js index 7daf84c666c6a9385a801202c6a0340701de2412..7e673245d1193ab5af552ba70849946716276e2a 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 4d7639524dfccc7d518c2b0179701cdea9a6e919..c0f78329a53c37143349b0f7a24003ba525aa0a4 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 fdc306e70abc17b0f48d440592acbb2ae5324e2f..c617b01fff3c48316899a05d707310241a66dad0 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')