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"))])
|
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")]
|
perm_list = [(o.id, o.name) for o in self.ct.permission_set.order_by("name")]
|
||||||
self.fields = (
|
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.SelectMultipleField(field_name="perm", choices=perm_list, size=3),
|
||||||
forms.CheckboxField(field_name="negative"),
|
forms.CheckboxField(field_name="negative"),
|
||||||
)
|
)
|
||||||
@ -109,25 +109,51 @@ class MultipleObjSelectField(forms.SelectField):
|
|||||||
def __init__(self, field_name, obj_list=None,
|
def __init__(self, field_name, obj_list=None,
|
||||||
default_text=None, size=1, is_required=False, validator_list=None,
|
default_text=None, size=1, is_required=False, validator_list=None,
|
||||||
member_name=None):
|
member_name=None):
|
||||||
if default_text is None:
|
choice_list = []
|
||||||
default_text = "Select an option"
|
self.default_text = default_text
|
||||||
choice_list = [('', default_text)]
|
|
||||||
for obj, obj_choices in obj_list:
|
for obj, obj_choices in obj_list:
|
||||||
ct = ContentType.objects.get(model__exact=obj)
|
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,
|
super(MultipleObjSelectField, self).__init__(field_name, choices=choice_list,
|
||||||
size=size, is_required=is_required,
|
size=size, is_required=is_required,
|
||||||
validator_list=validator_list,
|
validator_list=validator_list,
|
||||||
member_name=member_name)
|
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):
|
def returnObject(data):
|
||||||
data = data.split('-')
|
data = data.split('-')
|
||||||
ct = ContentType.objects.get(model__exact=data[0])
|
ct = ContentType.objects.get(model__exact=data[0])
|
||||||
obj = ct.get_object_for_this_type(pk=data[1])
|
obj = ct.get_object_for_this_type(pk=data[1])
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
def returnKey(obj):
|
def returnKey(obj, ct=None):
|
||||||
ct = ContentType.objects.get_for_model(obj.__class__)
|
if not ct:
|
||||||
|
ct = ContentType.objects.get_for_model(obj.__class__)
|
||||||
return ct.model+"-"+str(obj.id)
|
return ct.model+"-"+str(obj.id)
|
||||||
|
|
||||||
returnObject = staticmethod(returnObject)
|
returnObject = staticmethod(returnObject)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user