Django

Code

Changeset 3624

Show
Ignore:
Timestamp:
08/20/06 15:52:58 (2 years ago)
Author:
clong
Message:

[per-object-permissions] Expanded on has_module_perm to check for row level permissions contained within the module
[per-object-permissions] Created method contains_permission to check if a user has a permission on a model (not hte instance). The difference between this and has_perm is that contains_permission does not require an instance of a model, it only checks that there exists a row level permission for an instance of this object.

Files:

Legend:

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

    r3622 r3624  
    338338        return True 
    339339 
     340    def contains_permission(self, perm, model): 
     341        if self.has_perm(perm): 
     342            return True 
     343        perm = perm[perm.index('.')+1:] 
     344        return self.contains_row_level_perm(perm, model) 
     345 
     346    def contains_row_level_perm(self, perm, model): 
     347        model_ct = ContentType.objects.get_for_model(model) 
     348        count = self.row_level_permissions_owned.filter(model_ct=model_ct.id).count()  
     349        if count>0: 
     350            return True 
     351        return self.contains_group_row_level_perms(perm, model_ct)         
     352 
     353    def contains_group_row_level_perms(self, perm, ct): 
     354        #SELECT COUNT(*) 
     355         #FROM "auth_user_groups" ug, "auth_rowlevelpermission" rlp, "django_content_type" ct 
     356         #WHERE rlp."owner_id" = ug."group_id" 
     357             #AND ug."user_id"=%s 
     358             #AND rlp."negative" = 0 
     359             #AND rlp."owner_ct_id" = %s 
     360             #AND rlp."model_ct_id" = %s 
     361         
     362        cursor = connection.cursor()  
     363        sql = """ 
     364            SELECT COUNT(*) 
     365            FROM %s ug, %s rlp, %s ct 
     366            WHERE rlp.%s = ug.%s 
     367                AND ug.%s=%%s 
     368                AND rlp.%s = 0 
     369                AND rlp.%s = %%s 
     370                AND rlp.%s = %%s""" % ( 
     371            backend.quote_name('auth_user_groups'), backend.quote_name('auth_rowlevelpermission'),  
     372            backend.quote_name('django_content_type'), backend.quote_name('owner_id'), 
     373            backend.quote_name('group_id'), backend.quote_name('user_id'), 
     374            backend.quote_name('negative'), backend.quote_name('owner_ct_id'), 
     375            backend.quote_name('model_ct_id')) 
     376        print sql 
     377        cursor.execute(sql, [self.id, ContentType.objects.get_for_model(Group).id, ct.id]) 
     378        count = int(cursor.fetchone()[0]) 
     379        return (count>0) 
     380 
    340381    def has_module_perms(self, app_label): 
    341382        "Returns True if the user has any permissions in the given app label." 
    342383        if self.is_superuser: 
    343384            return True 
    344         return bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == app_label])) 
     385        if bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == app_label])): 
     386            return True 
     387        return self.has_module_row_level_perms(app_label) 
     388 
     389    def has_module_row_level_perms(self, app_label): 
     390        #SELECT COUNT(*) 
     391        #FROM "django_content_type" ct, "auth_rowlevelpermission" rlp 
     392        #WHERE rlp."model_ct_id" = ct."id" 
     393            #AND ct."app_label"=%s 
     394            #AND rlp."negative" = 0 
     395            #AND rlp."owner_ct_id" = %s 
     396            #AND rlp."owner_id" = %s 
     397        cursor = connection.cursor()         
     398        sql = """ 
     399            SELECT COUNT(*) 
     400            FROM %s ct, %s rlp 
     401            WHERE rlp.%s = ct.%s 
     402                AND ct.%s=%%s 
     403                AND rlp.%s = 0 
     404                AND rlp.%s = %%s 
     405                AND rlp.%s = %%s 
     406                """ % ( 
     407            backend.quote_name('django_content_type'), backend.quote_name('auth_rowlevelpermission'), 
     408            backend.quote_name('model_ct_id'), backend.quote_name('id'), 
     409            backend.quote_name('app_label'), backend.quote_name('negative'), 
     410            backend.quote_name('owner_ct_id'), 
     411            backend.quote_name('owner_id'), ) 
     412        cursor.execute(sql, [app_label, ContentType.objects.get_for_model(User).id, self.id])  
     413        count = int(cursor.fetchone()[0]) 
     414        if count>0: 
     415            return True 
     416        return self.has_module_group_row_level_perms(app_label) 
     417         
     418    def has_module_group_row_level_perms(self, app_label): 
     419        #SELECT COUNT(*) 
     420        #FROM "auth_user_groups" ug, "auth_rowlevelpermission" rlp, "django_content_type" ct 
     421        #WHERE rlp."owner_id" = ug."group_id" 
     422            #AND ug."user_id"=%s 
     423            #AND rlp."model_ct_id" = ct."id" 
     424            #AND ct."app_label"=%s 
     425            #AND rlp."negative" = 0 
     426            #AND rlp."owner_ct_id" = %s 
     427        cursor = connection.cursor()  
     428        sql = """ 
     429            SELECT COUNT(*) 
     430            FROM %s ug, %s rlp, %s ct 
     431            WHERE rlp.%s = ug.%s 
     432                AND ug.%s=%%s 
     433                AND rlp.%s = ct.%s 
     434                AND ct.%s=%%s 
     435                AND rlp.%s = 0 
     436                AND rlp.%s = %%s""" % ( 
     437            backend.quote_name('auth_user_groups'), backend.quote_name('auth_rowlevelpermission'),  
     438            backend.quote_name('django_content_type'), backend.quote_name('owner_id'), 
     439            backend.quote_name('group_id'), backend.quote_name('user_id'), 
     440            backend.quote_name('model_ct_id'), backend.quote_name('id'), 
     441            backend.quote_name('app_label'), backend.quote_name('negative'), 
     442            backend.quote_name('owner_ct_id')) 
     443        cursor.execute(sql, [app_label, self.id, ContentType.objects.get_for_model(Group).id,]) 
     444        count = int(cursor.fetchone()[0]) 
     445        return (count>0)         
     446             
    345447 
    346448    def get_and_delete_messages(self):