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

Fix /api/tasks leads to 500 server error #5700

Merged
merged 37 commits into from
Feb 24, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
bc7f03c
Fix deletion of sublabels
yasakova-anastasia Feb 14, 2023
fcef2fb
Merge branch 'develop' into ay/skeleton-fixes
yasakova-anastasia Feb 14, 2023
754da0e
Update Changelog
yasakova-anastasia Feb 14, 2023
ed87e38
Update Label model, remove code duplication
yasakova-anastasia Feb 14, 2023
f6a7797
Merge with some code from #5662
yasakova-anastasia Feb 15, 2023
9134111
Add tests
yasakova-anastasia Feb 15, 2023
c78eafc
Fix linters
yasakova-anastasia Feb 15, 2023
0ebc55f
Fix tests
yasakova-anastasia Feb 15, 2023
b97d7fa
Update Changelog
yasakova-anastasia Feb 15, 2023
1594449
pdate tests
yasakova-anastasia Feb 15, 2023
a786f26
Fixes
yasakova-anastasia Feb 15, 2023
9d9f2b2
FIx black
yasakova-anastasia Feb 15, 2023
5de8e4b
Fix pylint
yasakova-anastasia Feb 15, 2023
9cecd9e
Small fix
yasakova-anastasia Feb 15, 2023
8f6b6c7
Fix test
yasakova-anastasia Feb 15, 2023
c2d7d82
Merge branch 'develop' into ay/skeleton-fixes
yasakova-anastasia Feb 15, 2023
3448cd0
Resolve conflicts
yasakova-anastasia Feb 20, 2023
54e9ed6
Apply comments
yasakova-anastasia Feb 20, 2023
20012c2
Update migrations
yasakova-anastasia Feb 20, 2023
668f865
Fix linters
yasakova-anastasia Feb 20, 2023
8f3db61
Update validation
yasakova-anastasia Feb 20, 2023
09be228
Fix tests
yasakova-anastasia Feb 20, 2023
d871037
Replace unique_together with UniqueConstraint
yasakova-anastasia Feb 21, 2023
d4c1f89
Merge branch 'develop' into ay/skeleton-fixes
yasakova-anastasia Feb 21, 2023
9fecbaf
Add tests for same labels
yasakova-anastasia Feb 21, 2023
67f2ead
Resolve conflicts
yasakova-anastasia Feb 21, 2023
143a98d
Fix linters
yasakova-anastasia Feb 21, 2023
a03c4a9
Remove invalid checks
yasakova-anastasia Feb 21, 2023
8b0b6f2
Add save() and create() methods to Label model
yasakova-anastasia Feb 22, 2023
4b1855d
Resolve conflicts
yasakova-anastasia Feb 22, 2023
7583d5b
Fix tests
yasakova-anastasia Feb 22, 2023
4ea1c07
Apply comments
yasakova-anastasia Feb 22, 2023
0f3cba0
Update migration
yasakova-anastasia Feb 22, 2023
fe11bd4
Fix linters
yasakova-anastasia Feb 22, 2023
c463bb1
Add @transaction.atomic to tasks and projects serializers
yasakova-anastasia Feb 22, 2023
a76954b
Update migrations
yasakova-anastasia Feb 23, 2023
153c51b
Merge branch 'develop' into ay/skeleton-fixes
yasakova-anastasia Feb 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
27 changes: 22 additions & 5 deletions cvat/apps/engine/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@
from django.conf import settings
from django.contrib.auth.models import User
from django.core.files.storage import FileSystemStorage
from django.db import models
from django.db import IntegrityError, models
from django.db.models.fields import FloatField
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema_field
from rest_framework import exceptions

from cvat.apps.engine.utils import parse_specific_attributes
from cvat.apps.organizations.models import Organization


class SafeCharField(models.CharField):
def get_prep_value(self, value):
value = super().get_prep_value(value)
Expand Down Expand Up @@ -502,10 +505,6 @@ def get_labels(self):
class Meta:
default_permissions = ()


class InvalidLabel(ValueError):
pass

class Label(models.Model):
task = models.ForeignKey(Task, null=True, blank=True, on_delete=models.CASCADE)
project = models.ForeignKey(Project, null=True, blank=True, on_delete=models.CASCADE)
Expand All @@ -520,6 +519,24 @@ def __str__(self):
def has_parent_label(self):
return bool(self.parent)

def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
try:
super().save(force_insert, force_update, using, update_fields)
except ValueError as exc:
raise exceptions.ValidationError(str(exc)) from exc
Fixed Show fixed Hide fixed
except IntegrityError:
raise exceptions.ValidationError("All label names must be unique")
zhiltsov-max marked this conversation as resolved.
Show resolved Hide resolved

@classmethod
def create(cls, **kwargs):
try:
return cls.objects.create(**kwargs)
except ValueError as exc:
raise exceptions.ValidationError(str(exc)) from exc
Fixed Show fixed Hide fixed
except IntegrityError:
raise exceptions.ValidationError("All label names must be unique")

class Meta:
default_permissions = ()
constraints = [
Expand Down
27 changes: 9 additions & 18 deletions cvat/apps/engine/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

from rest_framework import serializers, exceptions
from django.contrib.auth.models import User, Group
from django.db import IntegrityError, transaction
from django.db import transaction

from cvat.apps.dataset_manager.formats.utils import get_label_color
from cvat.apps.engine import models
Expand Down Expand Up @@ -287,15 +287,12 @@ def update_label(

logger.info("Label id {} ({}) was updated".format(db_label.id, db_label.name))
else:
try:
db_label = models.Label.objects.create(
name=validated_data.get('name'),
type=validated_data.get('type'),
parent=parent_label,
**parent_info
)
except IntegrityError as exc:
raise exceptions.ValidationError(str(exc)) from exc
db_label = models.Label.create(
name=validated_data.get('name'),
type=validated_data.get('type'),
parent=parent_label,
**parent_info
)
logger.info("New {} label was created".format(db_label.name))

if validated_data.get('deleted'):
Expand All @@ -312,10 +309,7 @@ def update_label(
else:
db_label.color = validated_data.get('color', db_label.color)

try:
db_label.save()
except models.InvalidLabel as exc:
raise exceptions.ValidationError(str(exc)) from exc
db_label.save()

for attr in attributes:
(db_attr, created) = models.AttributeSpec.objects.get_or_create(
Expand Down Expand Up @@ -361,10 +355,7 @@ def create_labels(cls,

sublabels = label.pop('sublabels', [])
svg = label.pop('svg', '')
try:
db_label = models.Label.objects.create(**label, **parent_info, parent=parent_label)
except IntegrityError as exc:
raise exceptions.ValidationError(str(exc)) from exc
db_label = models.Label.create(**label, **parent_info, parent=parent_label)
logger.info(
f'label:create Label id:{db_label.id} for spec:{label} '
f'with sublabels:{sublabels}, parent_label:{parent_label}'
Expand Down