{"record":{"id":"1ca83e483b4702b7","repo":"HumanSignal/label-studio","slug":"invalid-skipqueue-value-self-project-skip-queue","errorCode":null,"errorMessage":"Invalid SkipQueue value: {self.project.skip_queue}","messagePattern":"Invalid SkipQueue value: (.+?)","errorType":"validation","errorClass":"ValidationError","httpStatus":400,"severity":"error","filePath":"label_studio/tasks/models.py","lineNumber":283,"sourceCode":"        Get query for excluding annotations from the lock check\n        \"\"\"\n        SkipQueue = self.project.SkipQueue\n\n        if self.project.skip_queue == SkipQueue.IGNORE_SKIPPED:\n            # IGNORE_SKIPPED: my skipped tasks don't go anywhere\n            # alien's and my skipped annotations are counted as regular annotations\n            q = Q()\n        else:\n            if self.project.skip_queue == SkipQueue.REQUEUE_FOR_ME:\n                # REQUEUE_FOR_ME means: only my skipped tasks go back to me,\n                # alien's skipped annotations are counted as regular annotations\n                q = Q(was_cancelled=True) & Q(completed_by=user)\n            elif self.project.skip_queue == SkipQueue.REQUEUE_FOR_OTHERS:\n                # REQUEUE_FOR_OTHERS: my skipped tasks go to others\n                # alien's skipped annotations are not counted at all\n                q = Q(was_cancelled=True) & ~Q(completed_by=user)\n            else:\n                raise ValidationError(f'Invalid SkipQueue value: {self.project.skip_queue}')\n\n            # for LSE we also need to exclude rejected queue\n            rejected_q = self.get_rejected_query()\n\n            if rejected_q:\n                q &= rejected_q\n\n        return q | Q(ground_truth=True)\n\n    def has_lock(self, user=None):\n        \"\"\"\n        Check whether current task has been locked by some user\n\n        Also has workaround for fixing not consistent is_labeled flag state\n        \"\"\"\n        from projects.functions.next_task import get_next_task_logging_level\n\n        if self.project.annotator_evaluation_enabled:","sourceCodeStart":265,"sourceCodeEnd":301,"githubUrl":"https://github.com/HumanSignal/label-studio/blob/0b49e9b53917880baf1dd85d574fe5541a9aafb2/label_studio/tasks/models.py#L265-L301","documentation":"Task.get_lock_exclude_query() builds the Q filter deciding how skipped (was_cancelled) annotations affect task locking, based on project.skip_queue. If skip_queue holds a value that is not one of SkipQueue.IGNORE_SKIPPED, REQUEUE_FOR_ME, or REQUEUE_FOR_OTHERS, ValidationError is raised because the task-locking behavior is undefined for that value.","triggerScenarios":"Calling task.has_lock(user) (or get_lock_exclude_query) on a task whose project.skip_queue column contains an unrecognized value — e.g. legacy/renamed enum value persisted in the DB, a value written by an older version, manual DB edit, or import that bypassed enum validation.","commonSituations":"Restoring a DB dump from an older Label Studio version whose SkipQueue enum differed; migrating data between instances; manual SQL updates to project.skip_queue; custom scripts writing raw strings into the column.","solutions":["Inspect the offending project: Project.objects.get(id=<id>).skip_queue and compare with projects.models.SkipQueue enum values","Reset the project's skip_queue to a valid enum value (e.g. via Django admin or Project.objects.filter(id=<id>).update(skip_queue=SkipQueue.IGNORE_SKIPPED))","Check SkipQueue enum for renames between versions and write a data migration mapping old values to new ones","Fix whatever wrote the invalid value (import script / API call) to use SkipQueue enum members"],"exampleFix":"// before\nproject.skip_queue = 'requeue'  # not an enum member\n// after\nfrom projects.models import Project, SkipQueue\nproject.skip_queue = SkipQueue.REQUEUE_FOR_ME\nproject.save(update_fields=['skip_queue'])","handlingStrategy":"validation","validationCode":"from projects.models import SkipQueue\n\ndef assert_skip_queue_valid(project):\n    valid = {SkipQueue.IGNORE_SKIPPED, SkipQueue.REQUEUE_FOR_ME, SkipQueue.REQUEUE_FOR_OTHERS}\n    if project.skip_queue not in valid:\n        raise ValueError(f\"project {project.id} has invalid skip_queue={project.skip_queue!r}\")","typeGuard":"def has_valid_skip_queue(project) -> bool:\n    from projects.models import SkipQueue\n    try:\n        return project.skip_queue in {SkipQueue.IGNORE_SKIPPED, SkipQueue.REQUEUE_FOR_ME, SkipQueue.REQUEUE_FOR_OTHERS}\n    except Exception:\n        return False","tryCatchPattern":"from rest_framework.exceptions import ValidationError\ntry:\n    locked = task.has_lock(user=user)\nexcept ValidationError as e:\n    logger.error(\"bad skip_queue on project %s: %s\", project.id, e)\n    locked = False  # or repair skip_queue first","preventionTips":["Always assign project.skip_queue from SkipQueue enum members, never raw strings","Write a data migration when SkipQueue enum values are renamed between versions","Audit restored/imported project rows for skip_queue values absent from the current enum","Avoid manual SQL edits to project.skip_queue"],"tags":["django","enum","data-integrity","validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"0b49e9b53917880baf1dd85d574fe5541a9aafb2","analyzedAt":"2026-08-29T00:39:52.578Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}