Source code for tcms.core.forms.fields
# -*- coding: utf-8 -*-
from django import forms
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError
from django.db.models import Q
User = get_user_model() # pylint: disable=invalid-name
[docs]
class UserField(forms.CharField):
"""
Custom field type.
Will eventually support user selection
"""
def __init__(self, *, queryset=None, **kwargs):
super().__init__(**kwargs)
if queryset is None:
self.queryset = User.objects.all()
else:
self.queryset = queryset
[docs]
def clean(self, value):
"""
Form-validation: accept a string/integer.
Looks at both email address and real name.
"""
if value == "" or value is None:
if self.required:
raise ValidationError("A user name or user ID is required.")
return None
if isinstance(value, int):
try:
return self.queryset.get(pk=value)
except User.DoesNotExist:
raise ValidationError(f'Unknown user_id: "{value}"') from None
else:
value = value.strip()
if value.isdigit():
try:
return self.queryset.get(pk=value)
except User.DoesNotExist:
raise ValidationError(f'Unknown user_id: "{value}"') from None
else:
try:
return self.queryset.get((Q(email=value) | Q(username=value)))
except User.DoesNotExist:
raise ValidationError(f'Unknown user: "{value}"') from None