Django

Code

Changeset 4025

Show
Ignore:
Timestamp:
11/06/06 15:25:29 (2 years ago)
Author:
jkocherhans
Message:

Applied patch from http://code.djangoproject.org/wiki/GenericAuthorization things are working now, but ugly.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/generic-auth/django/contrib/admin/templatetags/adminapplist.py

    r2999 r4025  
    11from django import template 
    22from django.db.models import get_models 
     3from django.contrib.auth import has_permission 
     4from django.contrib.auth.models import Permission 
    35 
    46register = template.Library() 
     
    2729                for m in app_models: 
    2830                    if m._meta.admin: 
     31                        opts = m._meta 
    2932                        perms = { 
    30                             'add': user.has_perm("%s.%s" % (app_label, m._meta.get_add_permission())), 
    31                             'change': user.has_perm("%s.%s" % (app_label, m._meta.get_change_permission())), 
    32                             'delete': user.has_perm("%s.%s" % (app_label, m._meta.get_delete_permission())), 
     33                            'add': has_permission(user, opts.get_add_permission()), 
     34                            'change': has_permission(user, opts.get_change_permission()), 
     35                            'delete': has_permission(user, opts.get_delete_permission()), 
    3336                        } 
    3437 
  • django/branches/generic-auth/django/contrib/admin/views/main.py

    r4024 r4025  
    11from django import forms, template 
    22from django.conf import settings 
     3from django.contrib.auth import has_permission 
    34from django.contrib.admin.filterspecs import FilterSpec 
    45from django.contrib.admin.views.decorators import staff_member_required 
     
    200201        'add': add, 
    201202        'change': change, 
    202         'has_delete_permission': context['perms'][app_label][opts.get_delete_permission()], 
    203         'has_change_permission': context['perms'][app_label][opts.get_change_permission()], 
     203        'has_delete_permission': context['perms'][app_label][opts.get_delete_permission().codename], 
     204        'has_change_permission': context['perms'][app_label][opts.get_change_permission().codename], 
    204205        'has_file_field': opts.has_field_type(models.FileField), 
    205206        'has_absolute_url': hasattr(model, 'get_absolute_url'), 
     
    230231    opts = model._meta 
    231232 
    232     if not request.user.has_perm(app_label + '.' + opts.get_add_permission()): 
     233    if not has_permission(request.user, opts.get_add_permission()): 
    233234        raise PermissionDenied 
    234  
    235     if post_url is None: 
    236         if request.user.has_perm(app_label + '.' + opts.get_change_permission()): 
    237             # redirect to list view 
    238             post_url = '../' 
    239         else: 
    240             # Object list will give 'Permission Denied', so go back to admin home 
    241             post_url = '../../../' 
    242235 
    243236    manipulator = model.AddManipulator() 
     
    256249            LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), ADDITION) 
    257250            msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': opts.verbose_name, 'obj': new_object} 
     251 
     252            if post_url is None: 
     253                # We want to call has permission WITHOUT passing it the new 
     254                # object here. We're concerned with whether the user can edit 
     255                # ANY instances of this model, not just the one we created. 
     256                if has_permission(request.user, opts.get_change_permission()): 
     257                    # redirect to list view 
     258                    post_url = '../' 
     259                else: 
     260                    # Object list will give 'Permission Denied', so go back to admin home 
     261                    post_url = '../../../' 
     262 
    258263            # Here, we distinguish between different save types by checking for 
    259264            # the presence of keys in request.POST. 
     
    304309    opts = model._meta 
    305310 
    306     if not request.user.has_perm(app_label + '.' + opts.get_change_permission()): 
    307         raise PermissionDenied 
    308  
    309311    if request.POST and request.POST.has_key("_saveasnew"): 
    310312        return add_stage(request, app_label, model_name, form_url='../../add/') 
     
    314316    except ObjectDoesNotExist: 
    315317        raise Http404 
     318 
     319    if not has_permission(request.user, opts.get_change_permission(), manipulator.original_object): 
     320        raise PermissionDenied 
    316321 
    317322    if request.POST: 
     
    420425            else: 
    421426                if related.opts.admin: 
    422                     p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission()) 
    423                     if not user.has_perm(p): 
     427                    if not has_permission(user, related.opts.get_delete_permission(), related): 
    424428                        perms_needed.add(related.opts.verbose_name) 
    425429                        # We don't care about populating deleted_objects now. 
     
    451455            # permission to delete them, add the missing perm to perms_needed. 
    452456            if related.opts.admin and has_related_objs: 
    453                 p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission()) 
    454                 if not user.has_perm(p): 
     457                if not has_permission(user, related.opts.get_delete_permission(), related): 
    455458                    perms_needed.add(rel_opts_name) 
    456459    for related in opts.get_all_related_many_to_many_objects(): 
     
    480483        # permission to change them, add the missing perm to perms_needed. 
    481484        if related.opts.admin and has_related_objs: 
    482             p = '%s.%s' % (related.opts.app_label, related.opts.get_change_permission()) 
    483             if not user.has_perm(p): 
     485            if not has_permission(user, related.opts.get_delete_permission(), related): 
    484486                perms_needed.add(related.opts.verbose_name) 
    485487 
     
    491493        raise Http404, "App %r, model %r, not found" % (app_label, model_name) 
    492494    opts = model._meta 
    493     if not request.user.has_perm(app_label + '.' + opts.get_delete_permission()): 
     495    obj = get_object_or_404(model, pk=object_id) 
     496    if not has_permission(request.user, opts.get_delete_permission(), obj): 
    494497        raise PermissionDenied 
    495     obj = get_object_or_404(model, pk=object_id) 
    496498 
    497499    # Populate deleted_objects, a data structure of all related objects that 
     
    731733    if model is None: 
    732734        raise Http404, "App %r, model %r, not found" % (app_label, model_name) 
    733     if not request.user.has_perm(app_label + '.' + model._meta.get_change_permission()): 
     735    # There isn't a specific object to check here, so don't pass one to  
     736    # has_permission. There should be a has_permission implementation  
     737    # registered that knows when the obj arg is missing. 
     738    if not has_permission(request.user, model._meta.get_change_permission()): 
    734739        raise PermissionDenied 
    735740    try: 
  • django/branches/generic-auth/django/contrib/auth/__init__.py

    r4024 r4025  
    55LOGIN_URL = '/accounts/login/' 
    66REDIRECT_FIELD_NAME = 'next' 
     7 
     8def default_has_permission(user, permission, obj): 
     9    p_name = "%s.%s" % (permission.content_type.app_label, permission.codename) 
     10    return user.has_perm(p_name) 
     11 
     12class HasPermission(object): 
     13    """ 
     14    Function that supports multiple implementations via a type registry. The  
     15    implemetation called depends on the argument types. 
     16    """ 
     17    def __init__(self): 
     18        self.registry = {} 
     19 
     20    def __call__(self, user, permission, obj=None): 
     21        # TODO: this isn't very robust. Only matches on exact types. Support  
     22        # for matching subclasses and caching registry hits would be helpful, 
     23        # but we'll add that later 
     24        types = (type(user), type(permission), type(obj)) 
     25        func = self.registry.get(types) 
     26        if func is not None: 
     27            return func(user, permission, obj) 
     28        else: 
     29            return default_has_permission(user, permission, obj) 
     30 
     31    def register(self, func, user_type, permission_type, obj_type=type(None)): 
     32        types = (user_type, permission_type, obj_type) 
     33        self.registry[types] = func 
     34 
     35has_permission = HasPermission() 
    736 
    837def load_backend(path): 
  • django/branches/generic-auth/django/db/models/options.py

    r4024 r4025  
    107107 
    108108    def get_add_permission(self): 
    109         return 'add_%s' % self.object_name.lower() 
     109        from django.contrib.auth.models import Permission 
     110        codename = 'add_%s' % self.object_name.lower() 
     111        return Permission.objects.get( 
     112            content_type__app_label__exact=self.app_label, 
     113            codename=codename) 
    110114 
    111115    def get_change_permission(self): 
    112         return 'change_%s' % self.object_name.lower() 
     116        from django.contrib.auth.models import Permission 
     117        codename = 'change_%s' % self.object_name.lower() 
     118        return Permission.objects.get( 
     119            content_type__app_label__exact=self.app_label, 
     120            codename=codename) 
    113121 
    114122    def get_delete_permission(self): 
    115         return 'delete_%s' % self.object_name.lower() 
     123        from django.contrib.auth.models import Permission 
     124        codename = 'delete_%s' % self.object_name.lower() 
     125        return Permission.objects.get( 
     126            content_type__app_label__exact=self.app_label, 
     127            codename=codename) 
    116128 
    117129    def get_all_related_objects(self):