1
0
mirror of https://github.com/django/django.git synced 2025-07-05 02:09:13 +00:00

[per-object-permissions] Renders multiple object select field using optgroup to separate the types of objects

git-svn-id: http://code.djangoproject.com/svn/django/branches/per-object-permissions@3610 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Christopher Long 2006-08-18 14:23:57 +00:00
parent 7c986521cf
commit f180bb6ab3

View File

@ -56,7 +56,7 @@ class AddRLPManipulator(ChangeRLPManipulator):
obj_list.extend([('group', Group.objects.order_by("name"))])
perm_list = [(o.id, o.name) for o in self.ct.permission_set.order_by("name")]
self.fields = (
MultipleObjSelectField(field_name="owner", obj_list=obj_list),
MultipleObjSelectField(field_name="owner", obj_list=obj_list, default_text=_("Select an option")),
forms.SelectMultipleField(field_name="perm", choices=perm_list, size=3),
forms.CheckboxField(field_name="negative"),
)
@ -109,24 +109,50 @@ class MultipleObjSelectField(forms.SelectField):
def __init__(self, field_name, obj_list=None,
default_text=None, size=1, is_required=False, validator_list=None,
member_name=None):
if default_text is None:
default_text = "Select an option"
choice_list = [('', default_text)]
choice_list = []
self.default_text = default_text
for obj, obj_choices in obj_list:
ct = ContentType.objects.get(model__exact=obj)
choice_list.extend([(MultipleObjSelectField.returnKey(o), str(o)+" ("+ct.name.title()+")") for o in obj_choices])
object_choice = [(MultipleObjSelectField.returnKey(o, ct=ct), str(o)) for o in obj_choices]
choice_list.extend([(ct.name.title(), object_choice)])
#choice_list.extend([(MultipleObjSelectField.returnKey(o, ct=ct), str(o)+" ("+ct.name.title()+")") for o in obj_choices])
print choice_list
super(MultipleObjSelectField, self).__init__(field_name, choices=choice_list,
size=size, is_required=is_required,
validator_list=validator_list,
member_name=member_name)
def render(self, data):
from django.utils.html import escape
output = ['<select id="%s" class="v%s%s" name="%s" size="%s">' % \
(self.get_id(), self.__class__.__name__,
self.is_required and ' required' or '', self.field_name, self.size)]
str_data = str(data) # normalize to string
if self.default_text:
selected_html = ''
if not str_data:
selected_html = ' selected="selected"'
output.append(' <option %s>%s</option>' % (selected_html, escape(self.default_text)))
for obj, obj_choices in self.choices:
output.append(' <optgroup label="%s">' % (obj,))
for value, display_name in obj_choices:
selected_html = ''
if str(value) == str_data:
selected_html = ' selected="selected"'
output.append(' <option value="%s"%s>%s</option>' % (escape(value), selected_html, escape(display_name)))
output.append(' </optgroup>')
output.append(' </select>')
return '\n'.join(output)
def returnObject(data):
data = data.split('-')
ct = ContentType.objects.get(model__exact=data[0])
obj = ct.get_object_for_this_type(pk=data[1])
return obj
def returnKey(obj):
def returnKey(obj, ct=None):
if not ct:
ct = ContentType.objects.get_for_model(obj.__class__)
return ct.model+"-"+str(obj.id)