diff --git a/shared/utils/fields.py b/shared/utils/fields.py index 888b014..1e509bd 100644 --- a/shared/utils/fields.py +++ b/shared/utils/fields.py @@ -17,17 +17,25 @@ def uniquify_field_value(instance, field_name, value, max_length=None, queryset= FIXME Doesn't work with model inheritance, where the field is part of the parent class. """ - def get_similar_values(value): - return queryset.exclude(pk=instance.pk) \ - .filter(**{"%s__istartswith" % field_name: value}).values_list(field_name, flat=True) + if not queryset: + queryset = instance._meta.default_manager.get_queryset() - if not value: - raise ValueError("Cannot uniquify empty value") - # TODO Instead get value from instance.field, or use a default value? + field = instance._meta.get_field(field_name) if not max_length: max_length = instance._meta.get_field(field_name).max_length - if not queryset: - queryset = instance._meta.default_manager.get_queryset() + if not value: + if field.blank: + # Special case: Make sure only one row has ean empty value + if queryset.exclude(pk=instance.pk).filter(**{field_name: ''}).exists(): + raise ValueError("Only one blank (root) entry allowed.") + return + else: + raise ValueError("Cannot uniquify empty value") + # TODO Instead get value from instance.field, or use a default value? + + def get_similar_values(value): + return queryset.exclude(pk=instance.pk) \ + .filter(**{"%s__istartswith" % field_name: value}).values_list(field_name, flat=True) # Find already existing counter m = re.match(r'(.+)(-\d+)$', value)