Django

Code

Changeset 3610

Show
Ignore:
Timestamp:
08/18/06 09:23:57 (2 years ago)
Author:
clong
Message:

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

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/per-object-permissions/django/contrib/admin/row_level_perm_manipulator.py

    r3586 r3610  
    5757        perm_list = [(o.id, o.name) for o in self.ct.permission_set.order_by("name")] 
    5858        self.fields = ( 
    59             MultipleObjSelectField(field_name="owner", obj_list=obj_list), 
     59            MultipleObjSelectField(field_name="owner", obj_list=obj_list, default_text=_("Select an option")), 
    6060            forms.SelectMultipleField(field_name="perm", choices=perm_list, size=3),             
    6161            forms.CheckboxField(field_name="negative"), 
     
    110110                 default_text=None, size=1, is_required=False, validator_list=None,  
    111111                 member_name=None): 
    112         if default_text is None: 
    113             default_text = "Select an option" 
    114         choice_list = [('', default_text)] 
     112        choice_list = [] 
     113        self.default_text = default_text 
    115114        for obj, obj_choices in obj_list: 
    116115            ct = ContentType.objects.get(model__exact=obj) 
    117             choice_list.extend([(MultipleObjSelectField.returnKey(o), str(o)+" ("+ct.name.title()+")") for o in obj_choices]) 
    118          
     116            object_choice = [(MultipleObjSelectField.returnKey(o, ct=ct), str(o)) for o in obj_choices] 
     117            choice_list.extend([(ct.name.title(), object_choice)]) 
     118            #choice_list.extend([(MultipleObjSelectField.returnKey(o, ct=ct), str(o)+" ("+ct.name.title()+")") for o in obj_choices]) 
     119        print choice_list 
    119120        super(MultipleObjSelectField, self).__init__(field_name, choices=choice_list,  
    120121                                                     size=size, is_required=is_required,  
    121122                                                     validator_list=validator_list,  
    122123                                                     member_name=member_name)             
     124    def render(self, data): 
     125        from django.utils.html import escape 
     126        output = ['<select id="%s" class="v%s%s" name="%s" size="%s">' % \ 
     127            (self.get_id(), self.__class__.__name__, 
     128             self.is_required and ' required' or '', self.field_name, self.size)] 
     129        str_data = str(data) # normalize to string 
     130         
     131        if self.default_text: 
     132            selected_html = '' 
     133            if not str_data: 
     134                selected_html = ' selected="selected"' 
     135            output.append('    <option %s>%s</option>' % (selected_html, escape(self.default_text)))             
     136         
     137        for obj, obj_choices in self.choices: 
     138            output.append('    <optgroup label="%s">' % (obj,)) 
     139            for value, display_name in obj_choices: 
     140                selected_html = '' 
     141                if str(value) == str_data: 
     142                    selected_html = ' selected="selected"' 
     143                output.append('    <option value="%s"%s>%s</option>' % (escape(value), selected_html, escape(display_name))) 
     144            output.append('    </optgroup>') 
     145        output.append('  </select>') 
     146        return '\n'.join(output)         
     147         
    123148    def returnObject(data): 
    124149        data = data.split('-') 
     
    127152        return obj 
    128153 
    129     def returnKey(obj): 
    130         ct = ContentType.objects.get_for_model(obj.__class__) 
     154    def returnKey(obj, ct=None): 
     155        if not ct: 
     156            ct = ContentType.objects.get_for_model(obj.__class__) 
    131157        return ct.model+"-"+str(obj.id) 
    132158