Skip to content
Snippets Groups Projects

Dataset unique elements

Merged Valentin Rigal requested to merge dataset-unique-elements into master
All threads resolved!
1 file
+ 17
12
Compare changes
  • Side-by-side
  • Inline
@@ -4,7 +4,7 @@ from collections import defaultdict
from textwrap import dedent
from django.db import transaction
from django.db.models import Count, Exists, OuterRef, Q
from django.db.models import Count, Q
from drf_spectacular.utils import extend_schema_field
from rest_framework import permissions, serializers
from rest_framework.exceptions import PermissionDenied, ValidationError
@@ -576,12 +576,13 @@ class DatasetSerializer(serializers.ModelSerializer):
return set_names
def validate_unique_elements(self, unique):
if unique is True and self.instance and Exists(
if unique is True and self.instance and (
DatasetElement.objects
.filter(set__dataset_id=OuterRef(self.instance.pk))
.filter(set__dataset_id=self.instance.pk)
.values("element")
.annotate(dups=Count("element"))
.filter(dups__gte=2)
.exists()
):
raise ValidationError("Elements are currently contained by multiple sets.")
return unique
@@ -712,20 +713,24 @@ class DatasetElementSerializer(serializers.ModelSerializer):
self.fields["element_id"].queryset = Element.objects.filter(corpus=dataset.corpus)
self.fields["set"].queryset = dataset.sets.all()
def validate(self, data):
data = super().validate(data)
dataset = data.pop("dataset")
if dataset.unique_elements and (
set := (
def validate_element_id(self, element):
dataset = self.context.get("dataset")
if dataset and dataset.unique_elements and (
existing_set := (
dataset.sets
.filter(set_elements__element_id=data["element_id"])
.filter(set_elements__element=element)
.values_list("name", flat=True)
.first()
)
):
raise ValidationError({"element_id": [
f"The dataset prevent duplication and this element is already present in set {set}."
]})
raise ValidationError([
f"The dataset prevent duplication and this element is already present in set {existing_set}."
])
return element
def validate(self, data):
data = super().validate(data)
data.pop("dataset")
return data
Loading