1
0
mirror of https://github.com/django/django.git synced 2025-06-05 03:29:12 +00:00

magic-removal: Fixed #1280 -- Removed contenttypes.Package model and changed ContentType field to have a 'model' field

git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2411 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2006-02-27 17:58:28 +00:00
parent f0e185c762
commit dac1a68645
2 changed files with 24 additions and 37 deletions

View File

@ -1,6 +1,6 @@
from django.core import validators from django.core import validators
from django.db import backend, connection, models from django.db import backend, connection, models
from django.contrib.contenttypes.models import Package from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
import datetime import datetime
@ -11,16 +11,16 @@ class SiteProfileNotAvailable(Exception):
class Permission(models.Model): class Permission(models.Model):
name = models.CharField(_('name'), maxlength=50) name = models.CharField(_('name'), maxlength=50)
package = models.ForeignKey(Package, db_column='package') content_type = models.ForeignKey(ContentType)
codename = models.CharField(_('codename'), maxlength=100) codename = models.CharField(_('codename'), maxlength=100)
class Meta: class Meta:
verbose_name = _('Permission') verbose_name = _('Permission')
verbose_name_plural = _('Permissions') verbose_name_plural = _('Permissions')
unique_together = (('package', 'codename'),) unique_together = (('content_type', 'codename'),)
ordering = ('package', 'codename') ordering = ('content_type', 'codename')
def __repr__(self): def __repr__(self):
return "%s | %s" % (self.package_id, self.name) return "%r | %s" % (self.content_type, self.name)
class Group(models.Model): class Group(models.Model):
name = models.CharField(_('name'), maxlength=80, unique=True) name = models.CharField(_('name'), maxlength=80, unique=True)
@ -133,7 +133,7 @@ class User(models.Model):
cursor = connection.cursor() cursor = connection.cursor()
# The SQL below works out to the following, after DB quoting: # The SQL below works out to the following, after DB quoting:
# cursor.execute(""" # cursor.execute("""
# SELECT p.package, p.codename # SELECT p.content_type_id, p.codename
# FROM auth_permission p, auth_group_permissions gp, auth_user_groups ug # FROM auth_permission p, auth_group_permissions gp, auth_user_groups ug
# WHERE p.id = gp.permission_id # WHERE p.id = gp.permission_id
# AND gp.group_id = ug.group_id # AND gp.group_id = ug.group_id
@ -144,7 +144,7 @@ class User(models.Model):
WHERE p.%s = gp.%s WHERE p.%s = gp.%s
AND gp.%s = ug.%s AND gp.%s = ug.%s
AND ug.%s = %%s""" % ( AND ug.%s = %%s""" % (
backend.quote_name('package'), backend.quote_name('codename'), backend.quote_name('content_type_id'), backend.quote_name('codename'),
backend.quote_name('auth_permission'), backend.quote_name('auth_group_permissions'), backend.quote_name('auth_permission'), backend.quote_name('auth_group_permissions'),
backend.quote_name('auth_user_groups'), backend.quote_name('id'), backend.quote_name('auth_user_groups'), backend.quote_name('id'),
backend.quote_name('permission_id'), backend.quote_name('group_id'), backend.quote_name('permission_id'), backend.quote_name('group_id'),
@ -156,7 +156,7 @@ class User(models.Model):
def get_all_permissions(self): def get_all_permissions(self):
if not hasattr(self, '_perm_cache'): if not hasattr(self, '_perm_cache'):
import sets import sets
self._perm_cache = sets.Set(["%s.%s" % (p.package_id, p.codename) for p in self.user_permissions.all()]) self._perm_cache = sets.Set(["%s.%s" % (p.content_type, p.codename) for p in self.user_permissions.all()])
self._perm_cache.update(self.get_group_permissions()) self._perm_cache.update(self.get_group_permissions())
return self._perm_cache return self._perm_cache
@ -175,11 +175,11 @@ class User(models.Model):
return False return False
return True return True
def has_module_perms(self, package_name): def has_module_perms(self, app_label):
"Returns True if the user has any permissions in the given package." "Returns True if the user has any permissions in the given app label."
if self.is_superuser: if self.is_superuser:
return True return True
return bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == package_name])) return bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == app_label]))
def get_and_delete_messages(self): def get_and_delete_messages(self):
messages = [] messages = []

View File

@ -1,18 +1,6 @@
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
class Package(models.Model):
label = models.CharField(_('label'), maxlength=20, primary_key=True)
name = models.CharField(_('name'), maxlength=30, unique=True)
class Meta:
verbose_name = _('package')
verbose_name_plural = _('packages')
db_table = 'django_package'
ordering = ('name',)
def __repr__(self):
return self.name
class ContentTypeManager(models.Manager): class ContentTypeManager(models.Manager):
def get_for_model(self, model): def get_for_model(self, model):
""" """
@ -21,35 +9,34 @@ class ContentTypeManager(models.Manager):
""" """
opts = model._meta opts = model._meta
try: try:
return self.model._default_manager.get(python_module_name__exact=opts.module_name, return self.model._default_manager.get(app_label=opts.app_label,
package__label__exact=opts.app_label) model=opts.object_name.lower())
except self.model.DoesNotExist: except self.model.DoesNotExist:
# The str() is needed around opts.verbose_name because it's a # The str() is needed around opts.verbose_name because it's a
# django.utils.functional.__proxy__ object. # django.utils.functional.__proxy__ object.
ct = self.model(name=str(opts.verbose_name), ct = self.model(name=str(opts.verbose_name),
package=Package.objects.get(label=opts.app_label), app_label=opts.app_label, model=opts.object_name.lower())
python_module_name=opts.module_name)
ct.save() ct.save()
return ct return ct
class ContentType(models.Model): class ContentType(models.Model):
name = models.CharField(_('name'), maxlength=100) name = models.CharField(maxlength=100)
package = models.ForeignKey(Package, db_column='package') app_label = models.CharField(maxlength=100)
python_module_name = models.CharField(_('python module name'), maxlength=50) model = models.CharField(_('python model class name'), maxlength=100, unique=True)
objects = ContentTypeManager() objects = ContentTypeManager()
class Meta: class Meta:
verbose_name = _('content type') verbose_name = _('content type')
verbose_name_plural = _('content types') verbose_name_plural = _('content types')
db_table = 'django_content_type' db_table = 'django_content_type'
ordering = ('package', 'name') ordering = ('name',)
unique_together = (('package', 'python_module_name'),)
def __repr__(self): def __repr__(self):
return "%s | %s" % (self.package_id, self.name) return self.name
def get_model_module(self): def model_class(self):
"Returns the Python model module for accessing this type of content." "Returns the Python model class for this type of content."
return __import__('django.models.%s.%s' % (self.package_id, self.python_module_name), '', '', ['']) from django.db import models
return models.get_model(self.app_label, self.model)
def get_object_for_this_type(self, **kwargs): def get_object_for_this_type(self, **kwargs):
""" """
@ -58,4 +45,4 @@ class ContentType(models.Model):
method. The ObjectNotExist exception, if thrown, will not be caught, method. The ObjectNotExist exception, if thrown, will not be caught,
so code that calls this method should catch it. so code that calls this method should catch it.
""" """
return self.get_model_module().get_object(**kwargs) return self.model_class()._default_manager.get(**kwargs)