This is the result of Christopher Medrela's 2013 Summer of Code project. Thanks also to Preston Holmes, Tim Graham, Anssi Kääriäinen, Florian Apolloner, and Alex Gaynor for review notes along the way. Also: Fixes #8579, fixes #3055, fixes #19844.
67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import unicode_literals
|
|
|
|
from django.conf import settings
|
|
from django.core import checks
|
|
from django.db import models
|
|
from django.db.models.fields import FieldDoesNotExist
|
|
|
|
|
|
class CurrentSiteManager(models.Manager):
|
|
"Use this to limit objects to those associated with the current site."
|
|
|
|
def __init__(self, field_name=None):
|
|
super(CurrentSiteManager, self).__init__()
|
|
self.__field_name = field_name
|
|
|
|
def check(self, **kwargs):
|
|
errors = super(CurrentSiteManager, self).check(**kwargs)
|
|
errors.extend(self._check_field_name())
|
|
return errors
|
|
|
|
def _check_field_name(self):
|
|
field_name = self._get_field_name()
|
|
try:
|
|
field = self.model._meta.get_field(field_name)
|
|
except FieldDoesNotExist:
|
|
return [
|
|
checks.Error(
|
|
"CurrentSiteManager could not find a field named '%s'." % field_name,
|
|
hint=('Ensure that you did not misspell the field name. '
|
|
'Does the field exist?'),
|
|
obj=self,
|
|
id='sites.E001',
|
|
)
|
|
]
|
|
|
|
if not isinstance(field, (models.ForeignKey, models.ManyToManyField)):
|
|
return [
|
|
checks.Error(
|
|
"CurrentSiteManager requires that '%s.%s' must be a "
|
|
"ForeignKey or ManyToManyField." % (
|
|
self.model._meta.object_name, field_name
|
|
),
|
|
hint=None,
|
|
obj=self,
|
|
id='sites.E002',
|
|
)
|
|
]
|
|
|
|
return []
|
|
|
|
def _get_field_name(self):
|
|
""" Return self.__field_name or 'site' or 'sites'. """
|
|
|
|
if not self.__field_name:
|
|
try:
|
|
self.model._meta.get_field('site')
|
|
except FieldDoesNotExist:
|
|
self.__field_name = 'sites'
|
|
else:
|
|
self.__field_name = 'site'
|
|
return self.__field_name
|
|
|
|
def get_queryset(self):
|
|
return super(CurrentSiteManager, self).get_queryset().filter(
|
|
**{self._get_field_name() + '__id': settings.SITE_ID})
|