1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
1
4
from django.conf import settings
5
from django.core import checks
2
6
from django.db import models
3
7
from django.db.models.fields import FieldDoesNotExist
5
10
class CurrentSiteManager(models.Manager):
6
11
"Use this to limit objects to those associated with the current site."
7
13
def __init__(self, field_name=None):
8
14
super(CurrentSiteManager, self).__init__()
9
15
self.__field_name = field_name
10
self.__is_validated = False
12
def _validate_field_name(self):
13
field_names = self.model._meta.get_all_field_names()
15
# If a custom name is provided, make sure the field exists on the model
16
if self.__field_name is not None and self.__field_name not in field_names:
17
raise ValueError("%s couldn't find a field named %s in %s." % \
18
(self.__class__.__name__, self.__field_name, self.model._meta.object_name))
20
# Otherwise, see if there is a field called either 'site' or 'sites'
22
for potential_name in ['site', 'sites']:
23
if potential_name in field_names:
24
self.__field_name = potential_name
25
self.__is_validated = True
28
# Now do a type check on the field (FK or M2M only)
17
def check(self, **kwargs):
18
errors = super(CurrentSiteManager, self).check(**kwargs)
19
errors.extend(self._check_field_name())
22
def _check_field_name(self):
23
field_name = self._get_field_name()
30
field = self.model._meta.get_field(self.__field_name)
31
if not isinstance(field, (models.ForeignKey, models.ManyToManyField)):
32
raise TypeError("%s must be a ForeignKey or ManyToManyField." %self.__field_name)
25
field = self.model._meta.get_field(field_name)
33
26
except FieldDoesNotExist:
34
raise ValueError("%s couldn't find a field named %s in %s." % \
35
(self.__class__.__name__, self.__field_name, self.model._meta.object_name))
36
self.__is_validated = True
29
"CurrentSiteManager could not find a field named '%s'." % field_name,
36
if not isinstance(field, (models.ForeignKey, models.ManyToManyField)):
39
"CurrentSiteManager cannot use '%s.%s' as it is not a ForeignKey or ManyToManyField." % (
40
self.model._meta.object_name, field_name
50
def _get_field_name(self):
51
""" Return self.__field_name or 'site' or 'sites'. """
53
if not self.__field_name:
55
self.model._meta.get_field('site')
56
except FieldDoesNotExist:
57
self.__field_name = 'sites'
59
self.__field_name = 'site'
60
return self.__field_name
38
62
def get_queryset(self):
39
if not self.__is_validated:
40
self._validate_field_name()
41
return super(CurrentSiteManager, self).get_queryset().filter(**{self.__field_name + '__id__exact': settings.SITE_ID})
63
return super(CurrentSiteManager, self).get_queryset().filter(
64
**{self._get_field_name() + '__id': settings.SITE_ID})