from django import newforms as forms
from django.newforms import widgets
from django.newforms import fields
from django.contrib.auth.models import User,Group
############################################################################
#
class UserOrGroupWidget(widgets.MultiWidget):
"""
A multiwidget composed of a user/group selector, and a text field
for entering the name of a user or group.
"""
#######################################################################
#
def __init__(self, attrs=None):
mywidgets = (
widgets.Select(choices=(('user', 'User'),('group', 'Group'))),
widgets.TextInput()
)
super(UserOrGroupWidget, self).__init__(mywidgets, attrs)
#######################################################################
#
def decompress(self, value):
if value:
return value.split(",")
return ['', '']
############################################################################
#
class UserOrGroupField(fields.MultiValueField):
"""
A field that contains a choice of 'user' or 'group' and a field that
is the name of a user or group (depending on the multiple choice field.)
"""
#######################################################################
#
def __init__(self, required=True, widget=UserOrGroupWidget(),
label=None, initial=None, help_text=None):
myfields = (
fields.ChoiceField(choices=(('user', 'User'), ('group', 'Group'))),
fields.CharField(max_length=30)
)
super(UserOrGroupField, self).__init__(myfields, required, widget,
label, initial, help_text)
#######################################################################
#
def compress(self, data_list):
if data_list:
return '%s,%s' % (data_list[0],data_list[1])
return None
#######################################################################
#
def clean(self, value):
"""
I know that in general a multivaluefield will not need a clean
method. However the UserOrGroupField needs to make sure that
the name supplied matches an existing user or group (depending
on the value of the choice field, ie: 'user' or 'group.'
"""
# We call the MultiValueField's clean first. We will get back
# the compressed data so we need to uncompress it first (which
# we can do inline since we know its form) and then lookup the
# User or Group in the database to make sure that they exist.
#
clean_data = super(UserOrGroupField, self).clean(value)
user_or_group, name = clean_data.split(',')
if user_or_group == 'user':
if User.objects.filter(username = name).count() != 1:
raise ValidationError('"%s" does not match any username' % \
name)
else:
if Group.objects.filter(name = name).count() != 1:
raise ValidationError('"%s" does not match any group' % name)
return clean_data
Comments