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:
parent
7c986521cf
commit
f180bb6ab3
@ -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)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user