Author: clong
Date: 2006-08-18 09:23:57 -0500 (Fri, 18 Aug 2006)
New Revision: 3610

Modified:
   
django/branches/per-object-permissions/django/contrib/admin/row_level_perm_manipulator.py
Log:
[per-object-permissions] Renders multiple object select field using optgroup to 
separate the types of objects

Modified: 
django/branches/per-object-permissions/django/contrib/admin/row_level_perm_manipulator.py
===================================================================
--- 
django/branches/per-object-permissions/django/contrib/admin/row_level_perm_manipulator.py
   2006-08-18 14:06:02 UTC (rev 3609)
+++ 
django/branches/per-object-permissions/django/contrib/admin/row_level_perm_manipulator.py
   2006-08-18 14:23:57 UTC (rev 3610)
@@ -56,7 +56,7 @@
         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 @@
     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)


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates
-~----------~----~----~----~------~----~------~--~---

Reply via email to