summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Long <indirecthit@gmail.com>2006-08-18 14:23:57 +0000
committerChristopher Long <indirecthit@gmail.com>2006-08-18 14:23:57 +0000
commitf180bb6ab3181eab8096188e39871c15e908550a (patch)
tree42c773ed33b16d57570b93a2fdde3f193844728d
parent7c986521cf37b7384e7f2f3cee8bae4b1e4f624b (diff)
[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
-rw-r--r--django/contrib/admin/row_level_perm_manipulator.py42
1 files changed, 34 insertions, 8 deletions
diff --git a/django/contrib/admin/row_level_perm_manipulator.py b/django/contrib/admin/row_level_perm_manipulator.py
index 8101ee260c..7c2e577da9 100644
--- a/django/contrib/admin/row_level_perm_manipulator.py
+++ b/django/contrib/admin/row_level_perm_manipulator.py
@@ -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,25 +109,51 @@ 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):
- ct = ContentType.objects.get_for_model(obj.__class__)
+ def returnKey(obj, ct=None):
+ if not ct:
+ ct = ContentType.objects.get_for_model(obj.__class__)
return ct.model+"-"+str(obj.id)
returnObject = staticmethod(returnObject)