| | 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 | |
|---|
| 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 | |
|---|