Changeset 4100
- Timestamp:
- 11/24/06 23:18:33 (2 years ago)
- Files:
-
- django/branches/per-object-permissions/django/contrib/admin/media/js/row_level_permission.js (modified) (3 diffs)
- django/branches/per-object-permissions/django/contrib/admin/row_level_perm_manipulator.py (modified) (6 diffs)
- django/branches/per-object-permissions/django/contrib/admin/templatetags/admin_modify.py (modified) (2 diffs)
- django/branches/per-object-permissions/django/contrib/admin/utils.py (modified) (1 diff)
- django/branches/per-object-permissions/django/contrib/auth/models.py (modified) (18 diffs)
- django/branches/per-object-permissions/django/contrib/auth/templatetags/auth.py (modified) (6 diffs)
- django/branches/per-object-permissions/django/db/models/manipulators.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/per-object-permissions/django/contrib/admin/media/js/row_level_permission.js
r3578 r4100 1 1 var row_level_permission = { 2 copyToNew: function (id) 3 { 2 copyToNew: function (id) { 4 3 var newForm = document.getElementById("addRLPForm"); 5 4 var form = document.getElementById("editRLPForm-"+id); … … 8 7 newForm.negative.checked = form.negative.checked; 9 8 }, 10 11 apply_selected: function () 12 { 9 10 apply_selected: function () { 13 11 var eleList = document.getElementsByName("apply_checkbox"); 14 12 var formList = []; 15 for (var i=0; eleList.length; i++)13 for (var i=0; eleList.length; i++) 16 14 { 17 15 var ele = eleList[i]; 18 if (ele.tagName == "INPUT") {19 if (ele.checked){16 if (ele.tagName == "INPUT") { 17 if (ele.checked) { 20 18 ele.form.submit(); 21 19 } … … 24 22 return false; 25 23 }, 26 27 24 init: function() { 28 25 29 26 } 30 27 } django/branches/per-object-permissions/django/contrib/admin/row_level_perm_manipulator.py
r3767 r4100 11 11 self.ct = ct 12 12 perm_list = [(o.id, o.name) for o in self.ct.permission_set.order_by("name")] 13 13 14 14 obj_list = [(User, User.objects.order_by("username"))] 15 15 obj_list.extend([(Group, Group.objects.order_by("name"))]) 16 16 17 17 self.fields = ( 18 18 MultipleObjSelectField(field_name="owner", obj_list=obj_list), 19 forms.SelectField(field_name="perm", choices=perm_list), 19 forms.SelectField(field_name="perm", choices=perm_list), 20 20 forms.CheckboxField(field_name="negative"), 21 )22 21 ) 22 23 23 def save(self, new_data): 24 25 24 rlp = RowLevelPermission.objects.get(pk=new_data['id']) 26 25 27 26 self.original_object = rlp 28 27 self.manager = rlp._default_manager 29 28 self.opts = rlp._meta 30 29 31 owner = MultipleObjSelectField.returnObject(new_data['owner']) 32 owner_ct = ContentType.objects.get_for_model(owner) 30 owner = MultipleObjSelectField.returnObject(new_data['owner']) 31 owner_ct = ContentType.objects.get_for_model(owner) 33 32 34 33 model_ct = rlp.model_ct 35 34 model = model_ct.get_object_for_this_type (pk=rlp.model_id) 36 35 model_id = rlp.model_id 37 36 38 37 perm = Permission.objects.get(pk=new_data['perm']) 39 40 38 41 39 field_name_list = ('owner_ct', 'owner_id', 'model_ct', 'model_id', 'permission') 42 40 field_data = owner_ct.id 43 all_data = {'owner_id': owner.id, 'model_ct_id':model_ct.id, 'model_id':model_id, 'permission_id':perm.id}41 all_data = {'owner_id': owner.id, 'model_ct_id': model_ct.id, 'model_id': model_id, 'permission_id': perm.id} 44 42 manipulators.manipulator_validator_unique_together(field_name_list, self.opts, self, field_data, all_data) 45 43 46 44 rlp.owner = owner 47 45 rlp.permission = perm … … 59 57 self.fields = ( 60 58 MultipleObjSelectField(field_name="owner", obj_list=obj_list, default_text=_("Select an option")), 61 forms.SelectMultipleField(field_name="perm", choices=perm_list, size=3), 59 forms.SelectMultipleField(field_name="perm", choices=perm_list, size=3), 62 60 forms.CheckboxField(field_name="negative"), 63 )64 61 ) 62 65 63 def save(self, new_data): 66 67 64 owner = MultipleObjSelectField.returnObject(new_data['owner']) 68 65 … … 72 69 ct = ContentType.objects.get_for_model(owner) 73 70 rlp_list = [] 74 for i in new_data.getlist('perm'):71 for i in new_data.getlist('perm'): 75 72 perm = Permission.objects.get(pk=i) 76 73 77 # Check that the new row level perms are unique74 # Check that the new row level perms are unique. 78 75 field_name_list = ('owner_ct', 'owner_id', 'model_ct', 'model_id', 'permission') 79 76 field_data = ct.id 80 model_id = self.obj_instance._get_pk_val() 81 all_data = {'owner_id': owner.id, 'model_ct_id':self.ct.id, 'model_id':model_id, 'permission_id':perm.id}82 manipulators.manipulator_validator_unique_together(field_name_list, self.opts, self, field_data, all_data) 83 77 model_id = self.obj_instance._get_pk_val() 78 all_data = {'owner_id': owner.id, 'model_ct_id': self.ct.id, 'model_id': model_id, 'permission_id': perm.id} 79 manipulators.manipulator_validator_unique_together(field_name_list, self.opts, self, field_data, all_data) 80 84 81 rlp = RowLevelPermission.objects.create_row_level_permission(self.obj_instance, owner, perm, negative=new_data['negative']) 85 82 rlp_list.append(rlp) 86 87 return rlp_list 88 83 84 return rlp_list 85 89 86 class MultipleObjSelectField(forms.SelectField): 90 87 """ 91 88 Extends a select field to use more then one type of model in a select field. 92 89 Uses optgroup in the select field to differentiate between object types. 93 90 94 91 obj_list should be a list of lists containing the model and a list of objects. 95 92 E.g. ((User, User.objects.all()), (Group, Group.objects.all)) 96 97 If you wish to define a default text to be shown as the default option, use the 93 94 If you wish to define a default text to be shown as the default option, use the 98 95 default_text parameter. An example of default text would be "Select an option" 99 96 100 97 The remaining parameters are very similiar to the normal SelectField. 101 98 102 99 To return the object selected pass the string result to MultipleObjSelectField.returnObject(string), 103 100 it returns the object instance. 104 101 105 102 To create a key for a specific object, use: MultipleObjSelectField.returnKey(object). It has an optional 106 103 parameter for the content type (ct), if you have already determined the content type and want to save on 107 104 db queries. 108 105 """ 109 def __init__(self, field_name, obj_list=None, 110 default_text=None, size=1, is_required=False, validator_list=None, 111 member_name=None): 106 def __init__(self, field_name, obj_list=None, default_text=None, size=1, 107 is_required=False, validator_list=None, member_name=None): 112 108 choice_list = [] 113 109 self.default_text = default_text 114 # Loop through the object list and create the list to be displayed110 # Loop through the object list and create the list to be displayed 115 111 for obj, obj_choices in obj_list: 116 112 ct = ContentType.objects.get_for_model(obj) 117 113 object_choice = [(MultipleObjSelectField.returnKey(o, ct=ct), str(o)) for o in obj_choices] 118 114 choice_list.extend([(ct.name.title(), object_choice)]) 119 super(MultipleObjSelectField, self).__init__(field_name, choices=choice_list, 120 size=size, is_required=is_required, 121 validator_list=validator_list, 122 member_name=member_name) 115 super(MultipleObjSelectField, self).__init__(field_name, choices=choice_list, 116 size=size, is_required=is_required, validator_list=validator_list, member_name=member_name) 117 123 118 def render(self, data): 124 119 from django.utils.html import escape … … 127 122 self.is_required and ' required' or '', self.field_name, self.size)] 128 123 str_data = str(data) # normalize to string 129 124 130 125 if self.default_text: 131 126 selected_html = '' 132 127 if not str_data: 133 128 selected_html = ' selected="selected"' 134 output.append(' <option %s>%s</option>' % (selected_html, escape(self.default_text))) 135 129 output.append(' <option %s>%s</option>' % (selected_html, escape(self.default_text))) 130 136 131 for obj, obj_choices in self.choices: 137 132 output.append(' <optgroup label="%s">' % (obj,)) … … 143 138 output.append(' </optgroup>') 144 139 output.append(' </select>') 145 return '\n'.join(output) 146 140 return '\n'.join(output) 141 147 142 def returnObject(data): 148 143 data = data.split('/') … … 154 149 if not ct: 155 150 ct = ContentType.objects.get_for_model(obj.__class__) 156 return ct.app_label +"/"+ct.model+"/"+str(obj.id)157 151 return ct.app_label + "/" + ct.model + "/" + str(obj.id) 152 158 153 returnObject = staticmethod(returnObject) 159 154 returnKey = staticmethod(returnKey) 160 161 162 django/branches/per-object-permissions/django/contrib/admin/templatetags/admin_modify.py
r4096 r4100 129 129 def __init__(self, related_object, field_mapping, original): 130 130 super(TabularBoundRelatedObject, self).__init__(related_object, field_mapping, original) 131 131 132 132 self.field_wrapper_list = [FieldWrapper(field) for field in self.relation.editable_fields()] 133 133 134 134 fields = self.relation.editable_fields() 135 135 136 136 self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping, fields, i) 137 137 for (i,field_mapping) in self.field_mappings.items() ] 138 138 139 139 self.original_row_needed = max([fw.use_raw_id_admin() for fw in self.field_wrapper_list]) 140 140 if original: … … 156 156 if original: 157 157 self.original = original 158 158 159 159 self.show_url = original and hasattr(self.relation.opts, 'get_absolute_url') 160 160 django/branches/per-object-permissions/django/contrib/admin/utils.py
r3540 r4100 101 101 for name, urlbase in ROLES.items(): 102 102 create_reference_role(name, urlbase) 103 104 # Based off work by Ian Holsman105 # http://svn.zyons.python-hosting.com/trunk/zilbo/common/utils/misc.py103 104 # Based off work by Ian Holsman 105 # http://svn.zyons.python-hosting.com/trunk/zilbo/common/utils/misc.py 106 106 107 107 import sha 108 from django.conf import settings 108 from django.conf import settings 109 109 from django.contrib.contenttypes.models import ContentType 110 110 111 def verify_objref_hash( content_type_id, object_id, hash):111 def verify_objref_hash(content_type_id, object_id, hash_): 112 112 hash_match = sha.new("%s/%s" % (content_type_id, object_id) + settings.SECRET_KEY).hexdigest() 113 if hash == hash_match: 114 return True 115 else: 116 return False 113 return hash_ == hash_match 117 114 118 115 def create_objref(object): 119 content_type_id = ContentType.objects.get_for_model( object).id116 content_type_id = ContentType.objects.get_for_model(object).id 120 117 object_id = object.id 121 return "%s/%d/%s" % ( content_type_id, object_id, sha.new("%s/%d" % (content_type_id, object_id) + settings.SECRET_KEY).hexdigest())118 return "%s/%d/%s" % (content_type_id, object_id, sha.new("%s/%d" % (content_type_id, object_id) + settings.SECRET_KEY).hexdigest()) django/branches/per-object-permissions/django/contrib/auth/models.py
r3940 r4100 50 50 class RowLevelPermissionManager(models.Manager): 51 51 def create_row_level_permission(self, model_instance, owner, permission, negative=False): 52 model_ct =ContentType.objects.get_for_model(model_instance)52 model_ct = ContentType.objects.get_for_model(model_instance) 53 53 if isinstance(permission, str): 54 permission = Permission.objects.get(codename __exact=permission, content_type=model_ct.id)54 permission = Permission.objects.get(codename=permission, content_type=model_ct.id) 55 55 if model_ct != permission.content_type: 56 raise TypeError, " Invalid value: Permission content type(%s) and object content type(%s) do not match" % (permission.content_type, type_ct)56 raise TypeError, "Permission content type (%s) and object content type (%s) do not match" % (permission.content_type, type_ct) 57 57 model_id = model_instance._get_pk_val() 58 row LvlPerm = self.model(model_id=model_id, model_ct=model_ct,59 owner_id=owner.id,owner_ct=ContentType.objects.get_for_model(owner),60 permission=permission, negative=negative)61 row LvlPerm.save()62 return row LvlPerm63 58 row_lvl_perm = self.model(model_id=model_id, model_ct=model_ct, owner_id=owner.id, 59 owner_ct=ContentType.objects.get_for_model(owner), 60 permission=permission, negative=negative) 61 row_lvl_perm.save() 62 return row_lvl_perm 63 64 64 def create_default_row_permissions(self, model_instance, owner, change=True, delete=True, negChange=False, negDel=False): 65 65 ret_dict = {} … … 67 67 if change: 68 68 change_str = "change_%s" % (model_ct.model) 69 ret_dict[change_str] =self.create_row_level_permission(model_instance, owner, change_str, negative=negChange)69 ret_dict[change_str] = self.create_row_level_permission(model_instance, owner, change_str, negative=negChange) 70 70 if delete: 71 71 delete_str = "delete_%s" % (model_ct.model) 72 ret_dict[delete_str] =self.create_row_level_permission(model_instance, owner, delete_str, negative=negDel)73 return ret_dict 74 75 def get_model_list(self, user, model, perm):76 model_ct =ContentType.objects.get_for_model(model)72 ret_dict[delete_str] = self.create_row_level_permission(model_instance, owner, delete_str, negative=negDel) 73 return ret_dict 74 75 def get_model_list(self, user, model, perm): 76 model_ct = ContentType.objects.get_for_model(model) 77 77 if isinstance(perm, str): 78 78 perm = Permission.objects.get(codename__exact=perm, content_type=model_ct.id) 79 user_model_ids = RowLevelPermission.objects.filter(owner_ct=ContentType.objects.get_for_model(User), 80 owner_id=user.id, permission=perm.id, 81 model_ct=model_ct 82 ).values('model_id') 83 id_list = [o['model_id'] for o in user_model_ids] 84 85 user_group_list = [g['id'] for g in user.groups.select_related().values('id')] 79 user_model_ids = RowLevelPermission.objects.filter(owner_ct=ContentType.objects.get_for_model(User), 80 owner_id=user.id, permission=perm.id, model_ct=model_ct).values('model_id') 81 id_list = [o['model_id'] for o in user_model_ids] 82 user_group_list = [g['id'] for g in user.groups.select_related().values('id')] 86 83 if user_group_list: 87 84 group_model_ids = RowLevelPermission.objects.filter(owner_ct=ContentType.objects.get_for_model(Group).id, 88 owner_id__in=user_group_list, 89 model_ct = model_ct 90 ).values('model_id') 91 id_list=id_list + [o['model_id'] for o in group_model_ids] 85 owner_id__in=user_group_list, model_ct = model_ct).values('model_id') 86 id_list = id_list + [o['model_id'] for o in group_model_ids] 92 87 return id_list 93 88 94 89 class RowLevelPermission(models.Model): 95 """ 90 """ 96 91 Similiar to permissions but works on instances of objects instead of types. 97 This uses generic relations to minimize the number of tables, and connects to the 92 This uses generic relations to minimize the number of tables, and connects to the 98 93 permissions table using a many to one relation. 99 100 94 """ 101 95 model_id = models.PositiveIntegerField("'Model' ID") … … 105 99 negative = models.BooleanField() 106 100 permission = models.ForeignKey(Permission) 107 108 101 model = models.GenericForeignKey(fk_field='model_id', ct_field='model_ct') 109 102 owner = models.GenericForeignKey(fk_field='owner_id', ct_field='owner_ct') 110 111 103 objects = RowLevelPermissionManager() 112 104 113 105 class Meta: 114 106 verbose_name = _('row level permission') 115 107 verbose_name_plural = _('row level permissions') 116 unique_together = (('model_ct', 'model_id', 'owner_id', 'owner_ct', 'permission'),) 108 unique_together = (('model_ct', 'model_id', 'owner_id', 'owner_ct', 'permission'),) 117 109 118 110 class Admin: … … 121 113 def __str__(self): 122 114 return "%s | %s:%s | %s:%s" % (self.permission, self.owner_ct, self.owner, self.model_ct, self.model) 123 115 124 116 def __repr__(self): 125 117 return "%s | %s:%s | %s:%s" % (self.permission, self.owner_ct, self.owner, self.model_ct, self.model) 126 127 118 128 119 class Group(models.Model): … … 180 171 help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in.")) 181 172 user_permissions = models.ManyToManyField(Permission, verbose_name=_('user permissions'), blank=True, filter_interface=models.HORIZONTAL) 182 173 183 174 row_level_permissions_owned = models.GenericRelation(RowLevelPermission, object_id_field="owner_id", content_type_field="owner_ct", related_name="owner") 184 175 … … 284 275 285 276 def check_row_level_permission(self, permission, object): 286 object_ct =ContentType.objects.get_for_model(object)277 object_ct = ContentType.objects.get_for_model(object) 287 278 if isinstance(permission, str): 288 279 try: 289 permission = Permission.objects.get(codename __exact=permission, content_type=object_ct.id)280 permission = Permission.objects.get(codename=permission, content_type=object_ct.id) 290 281 except Permission.DoesNotExist: 291 282 return False 292 283 try: 293 284 model_id = object._get_pk_val() 294 row_level_perm=self.row_level_permissions_owned.get(model_id=model_id, 295 model_ct=object_ct.id, 296 permission=permission.id) 285 row_level_perm = self.row_level_permissions_owned.get(model_id=model_id, 286 model_ct=object_ct.id, permission=permission.id) 297 287 except RowLevelPermission.DoesNotExist: 298 288 return self.check_group_row_level_permissions(permission, object) … … 300 290 301 291 def check_group_row_level_permissions(self, permission, object): 302 #SELECT rlp."negative"303 #FROM "auth_user_groups" ug, "auth_rowlevelpermission" rlp304 #WHERE rlp."owner_id"=ug."group_id"305 #AND ug."user_id"=%s306 #AND rlp."owner_ct_id"=%s307 #AND rlp."model_id"=%s308 #AND rlp."model_ct_id"=%s309 #AND rlp."permission_id"=%s;310 292 model_id = object._get_pk_val() 311 cursor = connection.cursor() 293 cursor = connection.cursor() 312 294 sql = """ 313 295 SELECT rlp.%s … … 326 308 backend.quote_name('model_ct_id'), backend.quote_name('permission_id'), 327 309 backend.quote_name('negative')) 328 cursor.execute(sql, [self.id, 329 ContentType.objects.get_for_model(Group).id, 310 cursor.execute(sql, [self.id, 311 ContentType.objects.get_for_model(Group).id, 330 312 model_id, 331 313 ContentType.objects.get_for_model(object).id, 332 314 permission.id,]) 333 315 row = cursor.fetchone() 334 335 316 if row is None: 336 317 return None 337 318 return not row[0] 338 339 319 340 320 def has_perm(self, perm, object=None): … … 345 325 return True 346 326 if object and object._meta.row_level_permissions: 347 # Since we use the content type for row level perms, we don't need the application name327 # Since we use the content type for row level perms, we don't need the application name. 348 328 permission_str = perm[perm.index('.')+1:] 349 329 row_level_permission = self.check_row_level_permission(permission_str, object) … … 361 341 def contains_permission(self, perm, model=None): 362 342 """ 363 This checks if the user has the given permission for any instance 343 This checks if the user has the given permission for any instance 364 344 of the given model. 365 345 """ … … 370 350 return self.contains_row_level_perm(perm, model) 371 351 return False 372 352 373 353 def contains_row_level_perm(self, perm, model): 374 354 model_ct = ContentType.objects.get_for_model(model) … … 377 357 else: 378 358 permission = perm 379 count = self.row_level_permissions_owned.filter(model_ct=model_ct.id, permission=permission.id).count() 380 381 if count>0: 359 count = self.row_level_permissions_owned.filter(model_ct=model_ct.id, permission=permission.id).count() 360 if count > 0: 382 361 return True 383 return self.contains_group_row_level_perms(permission, model_ct) 362 return self.contains_group_row_level_perms(permission, model_ct) 384 363 385 364 def contains_group_row_level_perms(self, perm, ct): 386 #SELECT COUNT(*) 387 #FROM "auth_user_groups" ug, "auth_rowlevelpermission" rlp, "django_content_type" ct 388 #WHERE rlp."owner_id" = ug."group_id" 389 #AND ug."user_id"=%s 390 #AND rlp."negative" = False 391 #AND rlp."owner_ct_id" = %s 392 #AND rlp."model_ct_id" = %s 393 394 cursor = connection.cursor() 365 cursor = connection.cursor() 395 366 sql = """ 396 367 SELECT COUNT(*) … … 402 373 AND rlp.%s = %%s 403 374 AND rlp.%s = %%s""" % ( 404 backend.quote_name('auth_user_groups'), backend.quote_name('auth_rowlevelpermission'), 375 backend.quote_name('auth_user_groups'), backend.quote_name('auth_rowlevelpermission'), 405 376 backend.quote_name('django_content_type'), backend.quote_name('owner_id'), 406 377 backend.quote_name('group_id'), backend.quote_name('user_id'), … … 409 380 cursor.execute(sql, [self.id, False, ContentType.objects.get_for_model(Group).id, ct.id, perm.id]) 410 381 count = int(cursor.fetchone()[0]) 411 return (count>0)382 return count > 0 412 383 413 384 def has_module_perms(self, app_label): … … 417 388 if self.is_superuser: 418 389 return True 419 if bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == app_label])):390 if [p for p in self.get_all_permissions() if p[:p.index('.')] == app_label]: 420 391 return True 421 392 return self.has_module_row_level_perms(app_label) 422 393 423 394 def has_module_row_level_perms(self, app_label): 424 #SELECT COUNT(*) 425 #FROM "django_content_type" ct, "auth_rowlevelpermission" rlp 426 #WHERE rlp."model_ct_id" = ct."id" 427 #AND ct."app_label"=%s 428 #AND rlp."negative" = False 429 #AND rlp."owner_ct_id" = %s 430 #AND rlp."owner_id" = %s 431 cursor = connection.cursor() 395 cursor = connection.cursor() 432 396 sql = """ 433 397 SELECT COUNT(*) … … 438 402 AND rlp.%s = %%s 439 403 AND rlp.%s = %%s 440 """ % ( 404 """ % ( 441 405 backend.quote_name('django_content_type'), backend.quote_name('auth_rowlevelpermission'), 442 406 backend.quote_name('model_ct_id'), backend.quote_name('id'), 443 backend.quote_name('app_label'), 407 backend.quote_name('app_label'), 444 408 backend.quote_name('owner_ct_id'), 445 409 backend.quote_name('owner_id'),backend.quote_name('negative'), ) 446 #import pdb 447 #pdb.set_trace() 448 cursor.execute(sql, [app_label, ContentType.objects.get_for_model(User).id, self.id, False]) 410 cursor.execute(sql, [app_label, ContentType.objects.get_for_model(User).id, self.id, False]) 449 411 count = int(cursor.fetchone()[0]) 450 if count >0:412 if count > 0: 451 413 return True 452 414 return self.has_module_group_row_level_perms(app_label) 453 415 454 416 def has_module_group_row_level_perms(self, app_label): 455 #SELECT COUNT(*) 456 #FROM "auth_user_groups" ug, "auth_rowlevelpermission" rlp, "django_content_type" ct 457 #WHERE rlp."owner_id" = ug."group_id" 458 #AND ug."user_id"=%s 459 #AND rlp."model_ct_id" = ct."id" 460 #AND ct."app_label"=%s 461 #AND rlp."negative" = False 462 #AND rlp."owner_ct_id" = %s 463 cursor = connection.cursor() 417 cursor = connection.cursor() 464 418 sql = """ 465 419 SELECT COUNT(*) … … 471 425 AND rlp.%s = %%s 472 426 AND rlp.%s = %%s""" % ( 473 backend.quote_name('auth_user_groups'), backend.quote_name('auth_rowlevelpermission'), 427 backend.quote_name('auth_user_groups'), backend.quote_name('auth_rowlevelpermission'), 474 428 backend.quote_name('django_content_type'), backend.quote_name('owner_id'), 475 429 backend.quote_name('group_id'), backend.quote_name('user_id'), … … 479 433 cursor.execute(sql, [self.id, app_label, False, ContentType.objects.get_for_model(Group).id]) 480 434 count = int(cursor.fetchone()[0]) 481 return (count>0) 482 435 return (count>0) 483 436 484 437 def get_and_delete_messages(self): django/branches/per-object-permissions/django/contrib/auth/templatetags/auth.py
r3810 r4100 1 1 from django import template 2 2 from django.template import loader 3 from django.conf import settings 3 from django.conf import settings 4 4 5 5 register = template.Library() … … 7 7 def if_has_perm(parser, token): 8 8 """ 9 TODO: Update document 9 10 10 TODO: Update document 11 12 Checks permission on the given user. Will check 13 row level permissions if an object is given. 14 15 Note: Perm name should be in the format of [app_label].[perm codename] 16 17 """ 11 Checks permission on the given user. Checks row-level permissions if an 12 object is given. 13 14 Perm name should be in the format [app_label].[perm codename]. 15 """ 18 16 tokens = token.split_contents() 19 if len(tokens) <2:20 raise template.TemplateSyntaxError, "%r tag requires at least 1 argument s" % tokens[0]21 if len(tokens) >4:17 if len(tokens) < 2: 18 raise template.TemplateSyntaxError, "%r tag requires at least 1 argument" % tokens[0] 19 if len(tokens) > 4: 22 20 raise template.TemplateSyntaxError, "%r tag should have no more then 3 arguments" % tokens[0] 23 21 24 22 nodelist_true = parser.parse(('else', 'end_'+tokens[0],)) 25 23 token = parser.next_token() … … 29 27 else: 30 28 nodelist_false = template.NodeList() 31 29 32 30 object_var = None 33 31 not_flag = False 34 if tokens[1] is"not":32 if tokens[1] == "not": 35 33 not_flag = True 36 permission =tokens[2]37 if len(tokens) >3:34 permission = tokens[2] 35 if len(tokens) > 3: 38 36 object_var = parser.compile_filter(tokens[3]) 39 37 else: 40 permission =tokens[1]41 if len(tokens) >2:38 permission = tokens[1] 39 if len(tokens) > 2: 42 40 object_var = parser.compile_filter(tokens[2]) 43 41 44 if not (permission[0] == permission[-1] and permission[0] in ('"', "'")): 42 if not (permission[0] == permission[-1] and permission[0] in ('"', "'")): 45 43 raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tokens[0] 46 44 47 45 return HasPermNode(permission[1:-1], not_flag, object_var, nodelist_true, nodelist_false) 48 46 49 47 class HasPermNode(template.Node): 50 48 def __init__(self, permission, not_flag, object_var, nodelist_true, nodelist_false): … … 71 69 return nodes 72 70 73 def render(self, context): 71 def render(self, context): 74 72 if self.object_var: 75 73 try: … … 79 77 else: 80 78 object=None 81 79 82 80 try: 83 81 user = template.resolve_variable("user", context) 84 82 except template.VariableDoesNotExist: 85 83 return settings.TEMPLATE_STRING_IF_INVALID 86 84 87 85 bool_perm = user.has_perm(self.permission, object=object) 88 86 if (self.not_flag and not bool_perm) or (not self.not_flag and bool_perm): … … 91 89 return self.nodelist_false.render(context) 92 90 return '' 93 91 94 92 register.tag('if_has_perm', if_has_perm) django/branches/per-object-permissions/django/db/models/manipulators.py
r4096 r4100 233 233 new_rel_obj.delete() 234 234 self.fields_deleted.append('%s "%s"' % (related.opts.verbose_name, old_rel_obj)) 235 236 235 237 236 # Save the order, if applicable.
